Merge branch 'master' into api

# Conflicts:
#	.env.testing
#	public/mix-manifest.json
#	src/Domain/RemoteUpload/Controllers/UploadFilesRemotelyForUploadRequestController.php
This commit is contained in:
Čarodej
2022-05-11 09:00:42 +02:00
83 changed files with 803 additions and 472 deletions
+27 -20
View File
@@ -11,12 +11,13 @@
- [Nginx Configuration](#nginx-configuration) - [Nginx Configuration](#nginx-configuration)
- [Apache Configuration](#apache-configuration) - [Apache Configuration](#apache-configuration)
- [Migrating to Another Domain](#migrating-to-another-domain) - [Migrating to Another Domain](#migrating-to-another-domain)
- [Broadcasting](#broadcasting) - [Social Authentication](#social-authentication)
- [About Broadcasting](#about-broadcasting)
- [Install Broadcast Server](#install-broadcast-server)
- [Subscription Configuration](#subscription-configuration) - [Subscription Configuration](#subscription-configuration)
- [Configuring Production/Testing Environment](#configuring-productiontesting-environment) - [Configuring Production/Testing Environment](#configuring-productiontesting-environment)
- [Upgrading From Testing Environment to the Production Mode](#upgrading-from-testing-environment-to-the-production-mode) - [Upgrading From Testing Environment to the Production Mode](#upgrading-from-testing-environment-to-the-production-mode)
- [Broadcasting](#broadcasting)
- [About Broadcasting](#about-broadcasting)
- [Install Broadcast Server](#install-broadcast-server)
- [Developers](#developers) - [Developers](#developers)
- [Running Environment On Your Localhost](#running-environment-on-your-localhost) - [Running Environment On Your Localhost](#running-environment-on-your-localhost)
- [Express Installation](#express-installation) - [Express Installation](#express-installation)
@@ -185,6 +186,29 @@ If you move your VueFileManager application into another domain or subdomain, yo
3. Find `SANCTUM_STATEFUL_DOMAINS` variable and write your new domain location without http protocol. 3. Find `SANCTUM_STATEFUL_DOMAINS` variable and write your new domain location without http protocol.
4. Remove your cached config file which is located `/bootstrap/cache/config.php`. 4. Remove your cached config file which is located `/bootstrap/cache/config.php`.
## Social Authentication
If you'd like to allow your users to authenticate via their social accounts, the setup is pretty convenient. Just don't forget to set up redirect url and required permissions.
#### Required permissions:
- Name and profile picture
- Email
# Subscription Configuration
## Configuring Production/Testing Environment
To set up your subscription, please follow these steps below.
1. If you didn't set up your subscription type in Setup Wizard, go to the `Admin / Settings / Application` and find subscription widget. Next set value as `Fixed`.
2. Go to the `Admin / Billings` and fill the inputs with your billing information.
3. Go to the `Admin / Payments` and turn on the switch `Allow Subscription Payments`.
4. Set up credentials for all payment gateway you want. If you set production mode, make sure you fill your credentials with production keys, and vice versa. If needed, don't forget to turn on `live mode` for PayPal.
5. Set up your webhooks, you can find your webhook url in payment gateway widget.
6. Go to the `Admin / Plans` and create your first plan. Make sure all payment gateways support the currency you want, especially for Paystack, it supports only `GHS, NGN, USD and ZAR`.
## Upgrading From Testing Environment to the Production Mode
1. Go to the `Admin / Payments` and set up credentials for all payment gateway you want with production keys type. Don't forget to turn on `live mode` for PayPal.
2. Go to the `Admin / Plans` and delete all your previously created plans. They will be archived.
3. Create new production plans you want offer.
# Broadcasting # Broadcasting
### About Broadcasting ### About Broadcasting
Broadcasting is responsible for real time app experience. If broadcasting is set, you will be able to get just in time updates in your app. Broadcasting is responsible for real time app experience. If broadcasting is set, you will be able to get just in time updates in your app.
@@ -292,23 +316,6 @@ Find Broadcasting form and select `VueFileManager` as broadcasting driver. Set y
That's all, you are running your own Broadcast server. That's all, you are running your own Broadcast server.
# Subscription Configuration
## Configuring Production/Testing Environment
To set up your subscription, please follow these steps below.
1. If you didn't set up your subscription type in Setup Wizard, go to the `Admin / Settings / Application` and find subscription widget. Next set value as `Fixed`.
2. Go to the `Admin / Billings` and fill the inputs with your billing information.
3. Go to the `Admin / Payments` and turn on the switch `Allow Subscription Payments`.
4. Set up credentials for all payment gateway you want. If you set production mode, make sure you fill your credentials with production keys, and vice versa. If needed, don't forget to turn on `live mode` for PayPal.
5. Set up your webhooks, you can find your webhook url in payment gateway widget.
6. Go to the `Admin / Plans` and create your first plan. Make sure all payment gateways support the currency you want, especially for Paystack, it supports only `GHS, NGN, USD and ZAR`.
## Upgrading From Testing Environment to the Production Mode
1. Go to the `Admin / Payments` and set up credentials for all payment gateway you want with production keys type. Don't forget to turn on `live mode` for PayPal.
2. Go to the `Admin / Plans` and delete all your previously created plans. They will be archived.
3. Create new production plans you want offer.
# Developers # Developers
## Running Environment On Your Localhost ## Running Environment On Your Localhost
+19
View File
@@ -1,3 +1,22 @@
## Version 2.1.3
#### Release date: 10. May 2022
- Ability to manually synchronize plans in fixed subscription type
- Improved sanitization for .env values to prevent crash your app
- Improved reCaptcha validation errors
- Fixed issue when upload doesn't start after you drag the file into empty view
- Fixed issue when homepage flash to sign in screen after the homepage was disabled in admin panel
- Fixed trash navigator issue
- Fixed issue when you create plan with 0 team members amount
## Version 2.1.2
#### Release date: 8. May 2022
- Fixed issue with chunk uploads (Critical issue affected since 2.1.1)
- Fixed issue with creating plan with unlimited team members
## Version 2.1.1
#### Release date: 29. April 2022
- Fixed issue with reading image upload
## Version 2.1.0 ## Version 2.1.0
#### Release date: 25. April 2022 #### Release date: 25. April 2022
- New remote upload function - New remote upload function
+1 -1
View File
@@ -29,7 +29,7 @@
"laravel/ui": "^3.4.2", "laravel/ui": "^3.4.2",
"league/flysystem-aws-s3-v3": "^3.0.9", "league/flysystem-aws-s3-v3": "^3.0.9",
"league/flysystem-ftp": "^3.0", "league/flysystem-ftp": "^3.0",
"makingcg/subscription": "^1.0.5", "makingcg/subscription": "^1.0.6",
"matthewbdaly/laravel-azure-storage": "^2.0", "matthewbdaly/laravel-azure-storage": "^2.0",
"pusher/pusher-php-server": "^7.0", "pusher/pusher-php-server": "^7.0",
"spatie/data-transfer-object": "^3.7.3", "spatie/data-transfer-object": "^3.7.3",
Generated
+172 -172
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "da78385bb0354b117852966eab7e288c", "content-hash": "9ec812c4e7c97cf3548f9130c95f644b",
"packages": [ "packages": [
{ {
"name": "amphp/amp", "name": "amphp/amp",
@@ -280,16 +280,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.220.0", "version": "3.222.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "8beb098a2224742b2756e3b40a07593b1e6ff967" "reference": "03d35eef5c509798d2c08587cfd9a7c33afe2260"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8beb098a2224742b2756e3b40a07593b1e6ff967", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/03d35eef5c509798d2c08587cfd9a7c33afe2260",
"reference": "8beb098a2224742b2756e3b40a07593b1e6ff967", "reference": "03d35eef5c509798d2c08587cfd9a7c33afe2260",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -365,9 +365,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.220.0" "source": "https://github.com/aws/aws-sdk-php/tree/3.222.7"
}, },
"time": "2022-04-19T18:17:15+00:00" "time": "2022-05-06T18:16:59+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@@ -1413,21 +1413,21 @@
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
"version": "2.13.8", "version": "2.13.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/dbal.git", "url": "https://github.com/doctrine/dbal.git",
"reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b" "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/dc9b3c3c8592c935a6e590441f9abc0f9eba335b", "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8",
"reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b", "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/cache": "^1.0|^2.0", "doctrine/cache": "^1.0|^2.0",
"doctrine/deprecations": "^0.5.3", "doctrine/deprecations": "^0.5.3|^1",
"doctrine/event-manager": "^1.0", "doctrine/event-manager": "^1.0",
"ext-pdo": "*", "ext-pdo": "*",
"php": "^7.1 || ^8" "php": "^7.1 || ^8"
@@ -1502,7 +1502,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/dbal/issues", "issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/2.13.8" "source": "https://github.com/doctrine/dbal/tree/2.13.9"
}, },
"funding": [ "funding": [
{ {
@@ -1518,29 +1518,29 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-09T15:25:46+00:00" "time": "2022-05-02T20:28:55+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
"version": "v0.5.3", "version": "v1.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/deprecations.git", "url": "https://github.com/doctrine/deprecations.git",
"reference": "9504165960a1f83cc1480e2be1dd0a0478561314" "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
"reference": "9504165960a1f83cc1480e2be1dd0a0478561314", "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1|^8.0" "php": "^7.1|^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^6.0|^7.0|^8.0", "doctrine/coding-standard": "^9",
"phpunit/phpunit": "^7.0|^8.0|^9.0", "phpunit/phpunit": "^7.5|^8.5|^9.5",
"psr/log": "^1.0" "psr/log": "^1|^2|^3"
}, },
"suggest": { "suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation" "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@@ -1559,9 +1559,9 @@
"homepage": "https://www.doctrine-project.org/", "homepage": "https://www.doctrine-project.org/",
"support": { "support": {
"issues": "https://github.com/doctrine/deprecations/issues", "issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/v0.5.3" "source": "https://github.com/doctrine/deprecations/tree/v1.0.0"
}, },
"time": "2021-03-21T12:59:47+00:00" "time": "2022-05-02T15:47:09+00:00"
}, },
{ {
"name": "doctrine/event-manager", "name": "doctrine/event-manager",
@@ -3290,16 +3290,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v9.9.0", "version": "v9.11.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "4d5a07640891b772188d7737348886a0222737d8" "reference": "598a8c84d452a66b90a3213b1d67189cc726c728"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/4d5a07640891b772188d7737348886a0222737d8", "url": "https://api.github.com/repos/laravel/framework/zipball/598a8c84d452a66b90a3213b1d67189cc726c728",
"reference": "4d5a07640891b772188d7737348886a0222737d8", "reference": "598a8c84d452a66b90a3213b1d67189cc726c728",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3465,7 +3465,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2022-04-19T15:01:23+00:00" "time": "2022-05-03T14:47:20+00:00"
}, },
{ {
"name": "laravel/sanctum", "name": "laravel/sanctum",
@@ -3534,16 +3534,16 @@
}, },
{ {
"name": "laravel/scout", "name": "laravel/scout",
"version": "v9.4.7", "version": "v9.4.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/scout.git", "url": "https://github.com/laravel/scout.git",
"reference": "46114761e835ae77e6b6b26abceb5ae63859ba98" "reference": "61ce79ce87fbebb28dcc0dd8f95776aa0dec00c8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/scout/zipball/46114761e835ae77e6b6b26abceb5ae63859ba98", "url": "https://api.github.com/repos/laravel/scout/zipball/61ce79ce87fbebb28dcc0dd8f95776aa0dec00c8",
"reference": "46114761e835ae77e6b6b26abceb5ae63859ba98", "reference": "61ce79ce87fbebb28dcc0dd8f95776aa0dec00c8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3602,7 +3602,7 @@
"issues": "https://github.com/laravel/scout/issues", "issues": "https://github.com/laravel/scout/issues",
"source": "https://github.com/laravel/scout" "source": "https://github.com/laravel/scout"
}, },
"time": "2022-04-06T09:38:17+00:00" "time": "2022-05-05T14:24:18+00:00"
}, },
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
@@ -4051,16 +4051,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.0.17", "version": "3.0.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "29eb78cac0be0c22237c5e0f6f98234d97037d79" "reference": "670df21225d68d165a8df38587ac3f41caf608f8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/29eb78cac0be0c22237c5e0f6f98234d97037d79", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/670df21225d68d165a8df38587ac3f41caf608f8",
"reference": "29eb78cac0be0c22237c5e0f6f98234d97037d79", "reference": "670df21225d68d165a8df38587ac3f41caf608f8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4121,7 +4121,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.0.17" "source": "https://github.com/thephpleague/flysystem/tree/3.0.19"
}, },
"funding": [ "funding": [
{ {
@@ -4137,7 +4137,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-04-14T14:57:13+00:00" "time": "2022-05-03T21:19:02+00:00"
}, },
{ {
"name": "league/flysystem-aws-s3-v3", "name": "league/flysystem-aws-s3-v3",
@@ -4238,16 +4238,16 @@
}, },
{ {
"name": "league/flysystem-ftp", "name": "league/flysystem-ftp",
"version": "3.0.9", "version": "3.0.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem-ftp.git", "url": "https://github.com/thephpleague/flysystem-ftp.git",
"reference": "38d829f6bbb1a5368e9bf9117273df6aaaa51938" "reference": "aa86ee4643ae2093dac68d2821699ce686cd5689"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-ftp/zipball/38d829f6bbb1a5368e9bf9117273df6aaaa51938", "url": "https://api.github.com/repos/thephpleague/flysystem-ftp/zipball/aa86ee4643ae2093dac68d2821699ce686cd5689",
"reference": "38d829f6bbb1a5368e9bf9117273df6aaaa51938", "reference": "aa86ee4643ae2093dac68d2821699ce686cd5689",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4282,7 +4282,7 @@
"ftpd" "ftpd"
], ],
"support": { "support": {
"source": "https://github.com/thephpleague/flysystem-ftp/tree/3.0.9" "source": "https://github.com/thephpleague/flysystem-ftp/tree/3.0.19"
}, },
"funding": [ "funding": [
{ {
@@ -4298,7 +4298,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-22T07:15:18+00:00" "time": "2022-05-03T21:11:18+00:00"
}, },
{ {
"name": "league/mime-type-detection", "name": "league/mime-type-detection",
@@ -4505,16 +4505,16 @@
}, },
{ {
"name": "makingcg/subscription", "name": "makingcg/subscription",
"version": "1.0.5", "version": "1.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "git@github.com:VueFileManager/subscription.git", "url": "git@github.com:VueFileManager/subscription.git",
"reference": "9e9e137c7e0a99cc40a46a8da64d479041a0105e" "reference": "73ef544e3c8f9a27904c4aaa53e39dccca5a8402"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/VueFileManager/subscription/zipball/9e9e137c7e0a99cc40a46a8da64d479041a0105e", "url": "https://api.github.com/repos/VueFileManager/subscription/zipball/73ef544e3c8f9a27904c4aaa53e39dccca5a8402",
"reference": "9e9e137c7e0a99cc40a46a8da64d479041a0105e", "reference": "73ef544e3c8f9a27904c4aaa53e39dccca5a8402",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4600,7 +4600,7 @@
"subscription" "subscription"
], ],
"support": { "support": {
"source": "https://github.com/VueFileManager/subscription/tree/1.0.5", "source": "https://github.com/VueFileManager/subscription/tree/1.0.6",
"issues": "https://github.com/VueFileManager/subscription/issues" "issues": "https://github.com/VueFileManager/subscription/issues"
}, },
"funding": [ "funding": [
@@ -4609,7 +4609,7 @@
"url": "https://github.com/VueFileManager" "url": "https://github.com/VueFileManager"
} }
], ],
"time": "2022-04-19T16:04:20+00:00" "time": "2022-05-09T07:44:28+00:00"
}, },
{ {
"name": "matthewbdaly/laravel-azure-storage", "name": "matthewbdaly/laravel-azure-storage",
@@ -5049,16 +5049,16 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.57.0", "version": "2.58.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "4a54375c21eea4811dbd1149fe6b246517554e78" "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a54375c21eea4811dbd1149fe6b246517554e78", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/97a34af22bde8d0ac20ab34b29d7bfe360902055",
"reference": "4a54375c21eea4811dbd1149fe6b246517554e78", "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5076,7 +5076,8 @@
"phpmd/phpmd": "^2.9", "phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0", "phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^0.12.54 || ^1.0", "phpstan/phpstan": "^0.12.54 || ^1.0",
"phpunit/phpunit": "^7.5.20 || ^8.5.14", "phpunit/php-file-iterator": "^2.0.5",
"phpunit/phpunit": "^7.5.20 || ^8.5.23",
"squizlabs/php_codesniffer": "^3.4" "squizlabs/php_codesniffer": "^3.4"
}, },
"bin": [ "bin": [
@@ -5141,7 +5142,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-13T18:13:33+00:00" "time": "2022-04-25T19:31:17+00:00"
}, },
{ {
"name": "netresearch/jsonmapper", "name": "netresearch/jsonmapper",
@@ -7002,16 +7003,16 @@
}, },
{ {
"name": "psy/psysh", "name": "psy/psysh",
"version": "v0.11.2", "version": "v0.11.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/bobthecow/psysh.git", "url": "https://github.com/bobthecow/psysh.git",
"reference": "7f7da640d68b9c9fec819caae7c744a213df6514" "reference": "05c544b339b112226ad14803e1e5b09a61957454"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/7f7da640d68b9c9fec819caae7c744a213df6514", "url": "https://api.github.com/repos/bobthecow/psysh/zipball/05c544b339b112226ad14803e1e5b09a61957454",
"reference": "7f7da640d68b9c9fec819caae7c744a213df6514", "reference": "05c544b339b112226ad14803e1e5b09a61957454",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -7026,15 +7027,13 @@
"symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.2", "bamarni/composer-bin-plugin": "^1.2"
"hoa/console": "3.17.05.02"
}, },
"suggest": { "suggest": {
"ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
"ext-pdo-sqlite": "The doc command requires SQLite to work.", "ext-pdo-sqlite": "The doc command requires SQLite to work.",
"ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
"ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
"hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
}, },
"bin": [ "bin": [
"bin/psysh" "bin/psysh"
@@ -7074,9 +7073,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/bobthecow/psysh/issues", "issues": "https://github.com/bobthecow/psysh/issues",
"source": "https://github.com/bobthecow/psysh/tree/v0.11.2" "source": "https://github.com/bobthecow/psysh/tree/v0.11.4"
}, },
"time": "2022-02-28T15:28:54+00:00" "time": "2022-05-06T12:49:14+00:00"
}, },
{ {
"name": "pusher/pusher-php-server", "name": "pusher/pusher-php-server",
@@ -9461,16 +9460,16 @@
}, },
{ {
"name": "spatie/laravel-query-builder", "name": "spatie/laravel-query-builder",
"version": "5.0.1", "version": "5.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/laravel-query-builder.git", "url": "https://github.com/spatie/laravel-query-builder.git",
"reference": "2970e54b04306a6de586d23ac3e0bab994ef645a" "reference": "fceb1e1814b117494a277b765050a3a10bfc162f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/2970e54b04306a6de586d23ac3e0bab994ef645a", "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/fceb1e1814b117494a277b765050a3a10bfc162f",
"reference": "2970e54b04306a6de586d23ac3e0bab994ef645a", "reference": "fceb1e1814b117494a277b765050a3a10bfc162f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9529,7 +9528,7 @@
"type": "custom" "type": "custom"
} }
], ],
"time": "2022-03-18T07:44:25+00:00" "time": "2022-04-25T07:07:24+00:00"
}, },
{ {
"name": "spatie/laravel-queueable-action", "name": "spatie/laravel-queueable-action",
@@ -9944,16 +9943,16 @@
}, },
{ {
"name": "stripe/stripe-php", "name": "stripe/stripe-php",
"version": "v7.124.0", "version": "v7.128.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/stripe/stripe-php.git", "url": "https://github.com/stripe/stripe-php.git",
"reference": "548e8ef08a86c6c621446082393dc6a1af51076c" "reference": "c704949c49b72985c76cc61063aa26fefbd2724e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/548e8ef08a86c6c621446082393dc6a1af51076c", "url": "https://api.github.com/repos/stripe/stripe-php/zipball/c704949c49b72985c76cc61063aa26fefbd2724e",
"reference": "548e8ef08a86c6c621446082393dc6a1af51076c", "reference": "c704949c49b72985c76cc61063aa26fefbd2724e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9998,22 +9997,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/stripe/stripe-php/issues", "issues": "https://github.com/stripe/stripe-php/issues",
"source": "https://github.com/stripe/stripe-php/tree/v7.124.0" "source": "https://github.com/stripe/stripe-php/tree/v7.128.0"
}, },
"time": "2022-04-18T23:07:08+00:00" "time": "2022-05-05T17:18:02+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "70dcf7b2ca2ea08ad6ebcc475f104a024fb5632e" "reference": "0d00aa289215353aa8746a31d101f8e60826285c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/70dcf7b2ca2ea08ad6ebcc475f104a024fb5632e", "url": "https://api.github.com/repos/symfony/console/zipball/0d00aa289215353aa8746a31d101f8e60826285c",
"reference": "70dcf7b2ca2ea08ad6ebcc475f104a024fb5632e", "reference": "0d00aa289215353aa8746a31d101f8e60826285c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10079,7 +10078,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v6.0.7" "source": "https://github.com/symfony/console/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -10095,7 +10094,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-31T17:18:25+00:00" "time": "2022-04-20T15:01:42+00:00"
}, },
{ {
"name": "symfony/css-selector", "name": "symfony/css-selector",
@@ -10231,16 +10230,16 @@
}, },
{ {
"name": "symfony/error-handler", "name": "symfony/error-handler",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/error-handler.git", "url": "https://github.com/symfony/error-handler.git",
"reference": "e600c54e5b30555eecea3ffe4314e58f832e78ee" "reference": "5e2795163acbd13b3cd46835c9f8f6c5d0a3a280"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/e600c54e5b30555eecea3ffe4314e58f832e78ee", "url": "https://api.github.com/repos/symfony/error-handler/zipball/5e2795163acbd13b3cd46835c9f8f6c5d0a3a280",
"reference": "e600c54e5b30555eecea3ffe4314e58f832e78ee", "reference": "5e2795163acbd13b3cd46835c9f8f6c5d0a3a280",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10282,7 +10281,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code", "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/error-handler/tree/v6.0.7" "source": "https://github.com/symfony/error-handler/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -10298,7 +10297,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-18T16:21:55+00:00" "time": "2022-04-12T16:11:42+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
@@ -10527,16 +10526,16 @@
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v6.0.3", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "8661b74dbabc23223f38c9b99d3f8ade71170430" "reference": "af7edab28d17caecd1f40a9219fc646ae751c21f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/8661b74dbabc23223f38c9b99d3f8ade71170430", "url": "https://api.github.com/repos/symfony/finder/zipball/af7edab28d17caecd1f40a9219fc646ae751c21f",
"reference": "8661b74dbabc23223f38c9b99d3f8ade71170430", "reference": "af7edab28d17caecd1f40a9219fc646ae751c21f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10568,7 +10567,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v6.0.3" "source": "https://github.com/symfony/finder/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -10584,20 +10583,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-26T17:23:29+00:00" "time": "2022-04-15T08:07:58+00:00"
}, },
{ {
"name": "symfony/http-client", "name": "symfony/http-client",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-client.git", "url": "https://github.com/symfony/http-client.git",
"reference": "a7930c47248b9b57e9d0b8da100ffc1e031536dc" "reference": "d347895193283e08b4c3ebf2f2974a1df3e1f670"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/a7930c47248b9b57e9d0b8da100ffc1e031536dc", "url": "https://api.github.com/repos/symfony/http-client/zipball/d347895193283e08b4c3ebf2f2974a1df3e1f670",
"reference": "a7930c47248b9b57e9d0b8da100ffc1e031536dc", "reference": "d347895193283e08b4c3ebf2f2974a1df3e1f670",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10652,7 +10651,7 @@
"description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-client/tree/v6.0.7" "source": "https://github.com/symfony/http-client/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -10668,7 +10667,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-04-01T12:27:43+00:00" "time": "2022-04-12T16:11:42+00:00"
}, },
{ {
"name": "symfony/http-client-contracts", "name": "symfony/http-client-contracts",
@@ -10750,16 +10749,16 @@
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "c816b26f03b6902dba79b352c84a17f53d815f0d" "reference": "c9c86b02d7ef6f44f3154acc7de42831518afe7c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/c816b26f03b6902dba79b352c84a17f53d815f0d", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c9c86b02d7ef6f44f3154acc7de42831518afe7c",
"reference": "c816b26f03b6902dba79b352c84a17f53d815f0d", "reference": "c9c86b02d7ef6f44f3154acc7de42831518afe7c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10802,7 +10801,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.0.7" "source": "https://github.com/symfony/http-foundation/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -10818,20 +10817,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-24T14:13:59+00:00" "time": "2022-04-22T08:18:02+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "9c03dab07a6aa336ffaadc15352b1d14f4ce01f5" "reference": "7aaf1cdc9cc2ad47e926f624efcb679883a39ca7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/9c03dab07a6aa336ffaadc15352b1d14f4ce01f5", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7aaf1cdc9cc2ad47e926f624efcb679883a39ca7",
"reference": "9c03dab07a6aa336ffaadc15352b1d14f4ce01f5", "reference": "7aaf1cdc9cc2ad47e926f624efcb679883a39ca7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10911,7 +10910,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.0.7" "source": "https://github.com/symfony/http-kernel/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -10927,20 +10926,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-04-02T06:35:11+00:00" "time": "2022-04-27T17:26:02+00:00"
}, },
{ {
"name": "symfony/mailer", "name": "symfony/mailer",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/mailer.git", "url": "https://github.com/symfony/mailer.git",
"reference": "f7343f94e7afecca2ad840b078f9d80200e1bd27" "reference": "706af6b3e99ebcbc639c9c664f5579aaa869409b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/f7343f94e7afecca2ad840b078f9d80200e1bd27", "url": "https://api.github.com/repos/symfony/mailer/zipball/706af6b3e99ebcbc639c9c664f5579aaa869409b",
"reference": "f7343f94e7afecca2ad840b078f9d80200e1bd27", "reference": "706af6b3e99ebcbc639c9c664f5579aaa869409b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10985,7 +10984,7 @@
"description": "Helps sending emails", "description": "Helps sending emails",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/mailer/tree/v6.0.7" "source": "https://github.com/symfony/mailer/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -11001,7 +11000,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-18T16:06:28+00:00" "time": "2022-04-27T17:10:30+00:00"
}, },
{ {
"name": "symfony/mailgun-mailer", "name": "symfony/mailgun-mailer",
@@ -11070,16 +11069,16 @@
}, },
{ {
"name": "symfony/mime", "name": "symfony/mime",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/mime.git", "url": "https://github.com/symfony/mime.git",
"reference": "74266e396f812a2301536397a6360b6e6913c0d8" "reference": "c1701e88ad0ca49fc6ad6cdf360bc0e1209fb5e1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/74266e396f812a2301536397a6360b6e6913c0d8", "url": "https://api.github.com/repos/symfony/mime/zipball/c1701e88ad0ca49fc6ad6cdf360bc0e1209fb5e1",
"reference": "74266e396f812a2301536397a6360b6e6913c0d8", "reference": "c1701e88ad0ca49fc6ad6cdf360bc0e1209fb5e1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -11131,7 +11130,7 @@
"mime-type" "mime-type"
], ],
"support": { "support": {
"source": "https://github.com/symfony/mime/tree/v6.0.7" "source": "https://github.com/symfony/mime/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -11147,7 +11146,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-13T20:10:05+00:00" "time": "2022-04-12T16:11:42+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
@@ -11938,16 +11937,16 @@
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/process.git",
"reference": "e13f6757e267d687e20ec5b26ccfcbbe511cd8f4" "reference": "d074154ea8b1443a96391f6e39f9e547b2dd01b9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/e13f6757e267d687e20ec5b26ccfcbbe511cd8f4", "url": "https://api.github.com/repos/symfony/process/zipball/d074154ea8b1443a96391f6e39f9e547b2dd01b9",
"reference": "e13f6757e267d687e20ec5b26ccfcbbe511cd8f4", "reference": "d074154ea8b1443a96391f6e39f9e547b2dd01b9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -11979,7 +11978,7 @@
"description": "Executes commands in sub-processes", "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/process/tree/v6.0.7" "source": "https://github.com/symfony/process/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -11995,7 +11994,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-18T16:21:55+00:00" "time": "2022-04-12T16:11:42+00:00"
}, },
{ {
"name": "symfony/psr-http-message-bridge", "name": "symfony/psr-http-message-bridge",
@@ -12087,16 +12086,16 @@
}, },
{ {
"name": "symfony/routing", "name": "symfony/routing",
"version": "v6.0.5", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/routing.git", "url": "https://github.com/symfony/routing.git",
"reference": "a738b152426ac7fcb94bdab8188264652238bef1" "reference": "74c40c9fc334acc601a32fcf4274e74fb3bac11e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/a738b152426ac7fcb94bdab8188264652238bef1", "url": "https://api.github.com/repos/symfony/routing/zipball/74c40c9fc334acc601a32fcf4274e74fb3bac11e",
"reference": "a738b152426ac7fcb94bdab8188264652238bef1", "reference": "74c40c9fc334acc601a32fcf4274e74fb3bac11e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12155,7 +12154,7 @@
"url" "url"
], ],
"support": { "support": {
"source": "https://github.com/symfony/routing/tree/v6.0.5" "source": "https://github.com/symfony/routing/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -12171,7 +12170,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-31T19:46:53+00:00" "time": "2022-04-22T08:18:02+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
@@ -12319,16 +12318,16 @@
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v6.0.3", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2" "reference": "ac0aa5c2282e0de624c175b68d13f2c8f2e2649d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2", "url": "https://api.github.com/repos/symfony/string/zipball/ac0aa5c2282e0de624c175b68d13f2c8f2e2649d",
"reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2", "reference": "ac0aa5c2282e0de624c175b68d13f2c8f2e2649d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12384,7 +12383,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v6.0.3" "source": "https://github.com/symfony/string/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -12400,20 +12399,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-02T09:55:41+00:00" "time": "2022-04-22T08:18:02+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v6.0.7", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1" "reference": "3d38cf8f8834148c4457681d539bc204de701501"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1", "url": "https://api.github.com/repos/symfony/translation/zipball/3d38cf8f8834148c4457681d539bc204de701501",
"reference": "b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1", "reference": "3d38cf8f8834148c4457681d539bc204de701501",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12479,7 +12478,7 @@
"description": "Provides tools to internationalize your application", "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/translation/tree/v6.0.7" "source": "https://github.com/symfony/translation/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -12495,7 +12494,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-31T17:18:25+00:00" "time": "2022-04-22T08:18:02+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
@@ -12577,16 +12576,16 @@
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v6.0.6", "version": "v6.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "38358405ae948963c50a3aae3dfea598223ba15e" "reference": "fa61dfb4bd3068df2492013dc65f3190e9f550c0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/38358405ae948963c50a3aae3dfea598223ba15e", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/fa61dfb4bd3068df2492013dc65f3190e9f550c0",
"reference": "38358405ae948963c50a3aae3dfea598223ba15e", "reference": "fa61dfb4bd3068df2492013dc65f3190e9f550c0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12645,7 +12644,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.0.6" "source": "https://github.com/symfony/var-dumper/tree/v6.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -12661,7 +12660,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-02T12:58:14+00:00" "time": "2022-04-26T13:22:23+00:00"
}, },
{ {
"name": "teamtnt/laravel-scout-tntsearch-driver", "name": "teamtnt/laravel-scout-tntsearch-driver",
@@ -12916,16 +12915,16 @@
}, },
{ {
"name": "vimeo/psalm", "name": "vimeo/psalm",
"version": "4.22.0", "version": "4.23.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/vimeo/psalm.git", "url": "https://github.com/vimeo/psalm.git",
"reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703" "reference": "f1fe6ff483bf325c803df9f510d09a03fd796f88"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/fc2c6ab4d5fa5d644d8617089f012f3bb84b8703", "url": "https://api.github.com/repos/vimeo/psalm/zipball/f1fe6ff483bf325c803df9f510d09a03fd796f88",
"reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703", "reference": "f1fe6ff483bf325c803df9f510d09a03fd796f88",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12950,6 +12949,7 @@
"php": "^7.1|^8", "php": "^7.1|^8",
"sebastian/diff": "^3.0 || ^4.0", "sebastian/diff": "^3.0 || ^4.0",
"symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0",
"symfony/polyfill-php80": "^1.25",
"webmozart/path-util": "^2.3" "webmozart/path-util": "^2.3"
}, },
"provide": { "provide": {
@@ -13016,9 +13016,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/vimeo/psalm/issues", "issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm/tree/4.22.0" "source": "https://github.com/vimeo/psalm/tree/4.23.0"
}, },
"time": "2022-02-24T20:34:05+00:00" "time": "2022-04-28T17:35:49+00:00"
}, },
{ {
"name": "vlucas/phpdotenv", "name": "vlucas/phpdotenv",
@@ -14581,16 +14581,16 @@
}, },
{ {
"name": "spatie/ignition", "name": "spatie/ignition",
"version": "1.2.7", "version": "1.2.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/ignition.git", "url": "https://github.com/spatie/ignition.git",
"reference": "2f059cf42b48f7c522efbba1c05ad59fc2c1a3f2" "reference": "db25202fab2d5c14613b8914a1bb374998bbf870"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/ignition/zipball/2f059cf42b48f7c522efbba1c05ad59fc2c1a3f2", "url": "https://api.github.com/repos/spatie/ignition/zipball/db25202fab2d5c14613b8914a1bb374998bbf870",
"reference": "2f059cf42b48f7c522efbba1c05ad59fc2c1a3f2", "reference": "db25202fab2d5c14613b8914a1bb374998bbf870",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -14647,20 +14647,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-03-29T08:48:34+00:00" "time": "2022-04-23T20:37:21+00:00"
}, },
{ {
"name": "spatie/laravel-ignition", "name": "spatie/laravel-ignition",
"version": "1.2.2", "version": "1.2.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/laravel-ignition.git", "url": "https://github.com/spatie/laravel-ignition.git",
"reference": "924d1ae878874ad0bb49f63b69a9af759a34ee78" "reference": "51e5daaa7e43c154fe57f1ddfbba862f9fe57646"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/924d1ae878874ad0bb49f63b69a9af759a34ee78", "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/51e5daaa7e43c154fe57f1ddfbba862f9fe57646",
"reference": "924d1ae878874ad0bb49f63b69a9af759a34ee78", "reference": "51e5daaa7e43c154fe57f1ddfbba862f9fe57646",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -14737,7 +14737,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-04-14T18:04:51+00:00" "time": "2022-05-05T15:53:24+00:00"
}, },
{ {
"name": "symfony/polyfill-php73", "name": "symfony/polyfill-php73",
+7 -6
View File
@@ -39,12 +39,13 @@ return [
'visibility' => 'public', 'visibility' => 'public',
], ],
's3' => [ 's3' => [
'driver' => 's3', 'driver' => 's3',
'key' => env('S3_ACCESS_KEY_ID'), 'key' => env('S3_ACCESS_KEY_ID'),
'secret' => env('S3_SECRET_ACCESS_KEY'), 'secret' => env('S3_SECRET_ACCESS_KEY'),
'region' => env('S3_DEFAULT_REGION'), 'region' => env('S3_DEFAULT_REGION'),
'bucket' => env('S3_BUCKET'), 'bucket' => env('S3_BUCKET'),
'endpoint' => env('S3_URL'), 'endpoint' => env('S3_URL'),
'visibility' => 'private',
], ],
'ftp' => [ 'ftp' => [
'driver' => 'ftp', 'driver' => 'ftp',
+5 -1
View File
@@ -263,6 +263,10 @@ return [
'Description' => 'description', 'Description' => 'description',
'description' => 'description', 'description' => 'description',
'generated_by' => 'Generated by', 'generated_by' => 'Generated by',
'synchronize_plans' => 'Synchronize Plans',
'synchronizing_plans' => 'Synchronizing Plans...',
'plans_are_synchronizing' => 'Your plans are synchronizing with the payment gateways',
'plans_was_synchronized' => 'Plans was successfully synchronized',
], ],
'regular' => [ 'regular' => [
'type' => 'Type', 'type' => 'Type',
@@ -821,7 +825,7 @@ return [
'allow_homepage' => 'Allow Homepage', 'allow_homepage' => 'Allow Homepage',
'allow_homepage_note' => 'When this is turned on, your visitors can visit your default homepage.', 'allow_homepage_note' => 'When this is turned on, your visitors can visit your default homepage.',
'storage_upload' => 'Storage & Upload', 'storage_upload' => 'Storage & Upload',
'allow_recaptcha' => 'Allow ReCaptcha', 'allow_recaptcha' => 'Allow ReCaptcha v3',
'allow_recaptcha_note' => 'ReCaptcha will be allowed on Registration and Contact Us forms.', 'allow_recaptcha_note' => 'ReCaptcha will be allowed on Registration and Contact Us forms.',
'login_and_registration' => 'Login & Registration', 'login_and_registration' => 'Login & Registration',
'account' => 'Account', 'account' => 'Account',
+1 -1
View File
@@ -45,7 +45,7 @@ return [
'facebook' => [ 'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'), 'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'redirect' => env('APP_URL') . '/socialite/facebook/callback', 'redirect' => env('APP_URL') . '/socialite/facebook/callback/',
], ],
'recaptcha' => [ 'recaptcha' => [
+2 -1
View File
@@ -1,7 +1,7 @@
<?php <?php
return [ return [
'version' => '2.1.0.1', 'version' => '2.1.3',
'is_demo' => env('APP_DEMO', false), 'is_demo' => env('APP_DEMO', false),
@@ -68,5 +68,6 @@ return [
'2_0_14', '2_0_14',
'2_0_16', '2_0_16',
'2_1_1', '2_1_1',
'2_1_2',
], ],
]; ];
@@ -1,30 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('exifs', function (Blueprint $table) {
$table->uuid('file_id')->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
};
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5867],{5713:(t,e,n)=>{n.d(e,{Z:()=>i});var r=n(3645),s=n.n(r)()((function(t){return t[1]}));s.push([t.id,".sync-alt[data-v-0c7f3326]{-webkit-animation:spin-data-v-0c7f3326 1s linear infinite;animation:spin-data-v-0c7f3326 1s linear infinite}@-webkit-keyframes spin-data-v-0c7f3326{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes spin-data-v-0c7f3326{0%{transform:rotate(0)}to{transform:rotate(1turn)}}",""]);const i=s},4026:(t,e,n)=>{n.d(e,{Z:()=>s});const r={name:"AuthContent",props:["visible","name"],data:function(){return{isVisible:!1}},created:function(){this.isVisible=this.visible}};const s=(0,n(1900).Z)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isVisible?n("div",{staticClass:"w-full max-w-xl text-center"},[t._t("default")],2):t._e()}),[],!1,null,null,null).exports},5111:(t,e,n)=>{n.d(e,{Z:()=>s});const r={name:"AuthContentWrapper"};const s=(0,n(1900).Z)(r,(function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{staticClass:"flex items-center justify-center px-2.5 md:px-6"},[t._t("default")],2)}),[],!1,null,null,null).exports},371:(t,e,n)=>{n.d(e,{Z:()=>c});var r=n(9101);const s={name:"AuthContent",props:["loading","icon","text"],components:{ChevronRightIcon:r.XCv,RefreshCwIcon:r.Iyk},data:function(){return{isVisible:!1}},created:function(){this.isVisible=this.visible}};var i=n(3379),o=n.n(i),a=n(5713),l={insert:"head",singleton:!1};o()(a.Z,l);a.Z.locals;const c=(0,n(1900).Z)(s,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("button",{staticClass:"group mx-auto inline-block flex items-center whitespace-nowrap rounded-lg border-2 border-black px-7 py-2.5 dark:border-gray-300"},[n("span",{staticClass:"pr-1 text-lg font-extrabold"},[t._v("\n "+t._s(t.text)+"\n ")]),t._v(" "),t.loading?n("refresh-cw-icon",{staticClass:"vue-feather text-theme sync-alt -mr-1",attrs:{size:"20"}}):t._e(),t._v(" "),!t.loading&&t.icon?n("chevron-right-icon",{staticClass:"vue-feather text-theme -mr-1",attrs:{size:"20"}}):t._e()],1)}),[],!1,null,"0c7f3326",null).exports},5993:(t,e,n)=>{n.d(e,{Z:()=>a});function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function s(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?r(Object(n),!0).forEach((function(e){i(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}const o={name:"Headline",props:["description","title"],computed:s(s({},(0,n(629).Se)(["config","isDarkMode"])),{},{logoSrc:function(){return this.isDarkMode&&this.config.app_logo?this.config.app_logo_dark:this.config.app_logo}})};const a=(0,n(1900).Z)(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"mb-14"},[t._t("default"),t._v(" "),t.$slots.default?t._e():n("div",[t.config.app_logo?n("img",{staticClass:"mx-auto mb-6 h-16 md:h-20 mb-10",attrs:{src:t.$getImage(t.logoSrc),alt:t.config.app_name}}):t._e(),t._v(" "),t.config.app_logo?t._e():n("b",{staticClass:"mb-10 block text-xl font-bold"},[t._v("\n "+t._s(t.config.app_name)+"\n ")])]),t._v(" "),n("h1",{staticClass:"mb-0.5 text-3xl font-extrabold md:text-4xl"},[t._v("\n "+t._s(t.title)+"\n ")]),t._v(" "),n("h2",{staticClass:"text-xl font-normal md:text-2xl"},[t._v("\n "+t._s(t.description)+"\n ")])],2)}),[],!1,null,null,null).exports},9493:(t,e,n)=>{n.r(e),n.d(e,{default:()=>l});var r=n(5111),s=n(4026),i=n(371),o=n(5993);const a={name:"Demo",components:{AuthContentWrapper:r.Z,AuthContent:s.Z,AuthButton:i.Z,Headline:o.Z}};const l=(0,n(1900).Z)(a,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("AuthContentWrapper",{ref:"auth",staticClass:"h-screen"},[n("AuthContent",{attrs:{visible:!0}},[n("Headline",{attrs:{title:"You Are Nearly Here!",description:"Just click on the button below."}}),t._v(" "),n("a",{attrs:{href:t.$store.getters.config.host+"/sign-in",target:"_blank"}},[n("AuthButton",{staticClass:"mb-12 w-full justify-center md:w-min",attrs:{icon:"chevron-right",text:"Visit Demo"}})],1)],1)],1)}),[],!1,null,null,null).exports}}]);
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+5
View File
@@ -131,6 +131,11 @@ export default {
this.isLoaded = true this.isLoaded = true
}) })
} }
// Go to sign in page if homepage is disabled
if (!this.$root.$data.config.allowHomepage && window.location.pathname === '/') {
this.$router.push({ name: 'SignIn' })
}
}, },
created() { created() {
if (this.$isWindows()) { if (this.$isWindows()) {
@@ -6,7 +6,7 @@
'grid-view-sidebar': itemViewType === 'grid' && isVisibleSidebar, 'grid-view-sidebar': itemViewType === 'grid' && isVisibleSidebar,
}" }"
class="px-4 lg:h-full lg:w-full lg:overflow-y-auto lg:px-0" class="px-4 lg:h-full lg:w-full lg:overflow-y-auto lg:px-0"
@drop.stop.prevent="uploadDroppedItems($event)" @drop.prevent="dragStop($event)"
@keydown.delete="deleteItems" @keydown.delete="deleteItems"
@dragover="dragEnter" @dragover="dragEnter"
@dragleave="dragLeave" @dragleave="dragLeave"
@@ -62,9 +62,7 @@ export default {
this.$store.dispatch('deleteItem') this.$store.dispatch('deleteItem')
} }
}, },
uploadDroppedItems(event) { dragStop() {
this.$uploadDraggedFiles(event, this.currentFolder.data.id)
this.isDragging = false this.isDragging = false
}, },
dragEnter() { dragEnter() {
@@ -1,13 +1,27 @@
<template> <template>
<transition name="popup"> <transition name="popup">
<div class="popup" v-if="processingPopup"> <div
<div class="popup-wrapper"> v-if="processingPopup"
<div class="popup-content"> class="popup fixed top-0 left-0 right-0 bottom-0 z-50 grid h-full overflow-y-auto p-10 lg:absolute"
<div class="spinner-wrapper"> >
<Spinner /> <div
class="fixed top-0 bottom-0 left-0 right-0 z-10 m-auto w-full bg-white shadow-xl dark:bg-dark-foreground md:relative md:w-[490px] md:rounded-xl"
>
<div
class="flex h-full -translate-y-7 transform items-center justify-center px-8 text-center md:translate-y-0"
>
<div>
<div class="relative pb-16 pt-10">
<Spinner />
</div>
<h1 v-if="processingPopup.title" class="mb-2 text-2xl font-bold">
{{ processingPopup.title }}
</h1>
<p v-if="processingPopup.message" class="mb-4 text-sm">
{{ processingPopup.message }}
</p>
</div> </div>
<h1 class="title">{{ processingPopup.title }}</h1>
<p class="message">{{ processingPopup.message }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -17,10 +31,12 @@
<script> <script>
import Spinner from '../UI/Others/Spinner' import Spinner from '../UI/Others/Spinner'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import PopupWrapper from './Components/PopupWrapper'
export default { export default {
name: 'ProcessingPopup', name: 'ProcessingPopup',
components: { components: {
PopupWrapper,
Spinner, Spinner,
}, },
computed: { computed: {
@@ -28,107 +44,3 @@ export default {
}, },
} }
</script> </script>
<style scoped lang="scss">
@import '../../../sass/vuefilemanager/variables';
@import '../../../sass/vuefilemanager/mixins';
.spinner-wrapper {
padding-bottom: 90px;
position: relative;
}
.popup {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 20;
overflow: auto;
height: 100%;
}
.popup-wrapper {
z-index: 12;
position: absolute;
left: 0;
right: 0;
max-width: 480px;
top: 50%;
transform: translateY(-50%) scale(1);
margin: 0 auto;
padding: 20px;
box-shadow: $light_mode_popup_shadow;
border-radius: 8px;
text-align: center;
background: white;
}
.popup-content {
.title {
@include font-size(22);
font-weight: 700;
color: $text;
}
.message {
@include font-size(16);
color: #333;
margin-top: 5px;
}
}
@media only screen and (max-width: 690px) {
.popup-wrapper {
padding: 20px;
left: 15px;
right: 15px;
}
.popup-content {
.title {
@include font-size(19);
}
.message {
@include font-size(15);
}
}
}
.dark {
.popup-wrapper {
background: $dark_mode_foreground;
}
.popup-content {
.title {
color: $dark_mode_text_primary;
}
.message {
color: $dark_mode_text_secondary;
}
}
}
// Animations
.popup-enter-active {
animation: popup-in 0.35s 0.15s ease both;
}
.popup-leave-active {
animation: popup-in 0.15s ease reverse;
}
@keyframes popup-in {
0% {
opacity: 0;
transform: scale(0.7);
}
100% {
opacity: 1;
transform: scale(1);
}
}
</style>
@@ -63,7 +63,7 @@ export default {
limitations.push({ limitations.push({
message: payload.message[key], message: payload.message[key],
isVisibleBar: item.total !== -1, isVisibleBar: item.total !== -1 && item.total !== 0,
distribution: [ distribution: [
{ {
progress: item.percentage, progress: item.percentage,
@@ -4,7 +4,7 @@
'bg-light-background dark:bg-dark-foreground': isClicked && canHover, 'bg-light-background dark:bg-dark-foreground': isClicked && canHover,
'dark:hover:bg-dark-foreground lg:hover:bg-light-background': canHover, 'dark:hover:bg-dark-foreground lg:hover:bg-light-background': canHover,
}" }"
class="relative z-0 flex h-48 select-none flex-wrap items-center justify-center rounded-lg border-2 border-dashed border-transparent px-1 pt-2 text-center sm:h-56 lg:h-60" class="relative z-0 flex h-48 select-none flex-wrap items-center justify-center rounded-lg border-2 border-dashed border-transparent px-1 pt-2 text-center sm:h-56 lg:h-60 cursor-pointer"
:draggable="canDrag" :draggable="canDrag"
spellcheck="false" spellcheck="false"
> >
@@ -77,7 +77,7 @@
<!--Item Title--> <!--Item Title-->
<span <span
class="inline-block w-full overflow-hidden text-ellipsis whitespace-nowrap text-sm font-bold leading-3 tracking-tight md:px-6" class="inline-block w-full overflow-hidden text-ellipsis whitespace-nowrap text-sm font-bold leading-3 tracking-tight md:px-6"
:class="{ 'hover:underline': canEditName }" :class="{ 'hover:underline cursor-text': canEditName }"
ref="name" ref="name"
@input="renameItem" @input="renameItem"
@keydown.delete.stop @keydown.delete.stop
@@ -4,7 +4,7 @@
'bg-light-background dark:bg-dark-foreground': isClicked && highlight, 'bg-light-background dark:bg-dark-foreground': isClicked && highlight,
'hover:bg-light-background dark:hover:bg-dark-foreground': highlight, 'hover:bg-light-background dark:hover:bg-dark-foreground': highlight,
}" }"
class="flex select-none items-center rounded-xl border-2 border-dashed border-transparent px-2.5 py-2" class="flex select-none items-center rounded-xl border-2 border-dashed border-transparent px-2.5 py-2 cursor-pointer"
:draggable="canDrag" :draggable="canDrag"
spellcheck="false" spellcheck="false"
> >
@@ -55,7 +55,7 @@
<!--Item Title--> <!--Item Title-->
<span <span
class="mb-0.5 block overflow-hidden text-ellipsis whitespace-nowrap text-sm font-bold" class="mb-0.5 block overflow-hidden text-ellipsis whitespace-nowrap text-sm font-bold"
:class="{ 'hover:underline': canEditName }" :class="{ 'hover:underline cursor-text': canEditName }"
style="max-width: 240px" style="max-width: 240px"
ref="name" ref="name"
@input="renameItem" @input="renameItem"
@@ -9,8 +9,6 @@
}" }"
class="chart-wrapper" class="chart-wrapper"
> >
<!--<DotLabel class="label" :class="{'offset-top': chart.progress < 5}" :color="chart.color" :title="chart.value" />-->
<!--Only singe line--> <!--Only singe line-->
<span <span
v-if="data.length === 1" v-if="data.length === 1"
+8 -2
View File
@@ -169,7 +169,7 @@ const FunctionHelpers = {
}) })
// Start uploading if uploading process isn't running // Start uploading if uploading process isn't running
if (store.getters.filesInQueueTotal == 0) this.$handleUploading(store.getters.fileQueue[0]) if (store.getters.filesInQueueTotal === 0) this.$handleUploading(store.getters.fileQueue[0])
// Increase total files in upload bar // Increase total files in upload bar
store.commit('INCREASE_FILES_IN_QUEUES_TOTAL', files.length) store.commit('INCREASE_FILES_IN_QUEUES_TOTAL', files.length)
@@ -177,7 +177,7 @@ const FunctionHelpers = {
Vue.prototype.$uploadDraggedFiles = async function (event, parent_id) { Vue.prototype.$uploadDraggedFiles = async function (event, parent_id) {
// Show alert message when upload is disabled // Show alert message when upload is disabled
if (!store.getters.user.data.meta.restrictions.canUpload) { if (store.getters.user && !store.getters.user.data.meta.restrictions.canUpload) {
Vue.prototype.$temporarilyDisabledUpload() Vue.prototype.$temporarilyDisabledUpload()
return return
@@ -427,6 +427,12 @@ const FunctionHelpers = {
} }
Vue.prototype.$goToFileView = function (id) { Vue.prototype.$goToFileView = function (id) {
// If user is located in trash, then automatically after click on the navigator go to the Files view
if (this.$router.currentRoute.name === 'Trash') {
this.$router.push({ name: 'Files', params: { id: id } })
return
}
let locations = { let locations = {
RequestUpload: {name: 'RequestUpload', params: { token: this.$route.params.token, id: id }}, RequestUpload: {name: 'RequestUpload', params: { token: this.$route.params.token, id: id }},
Public: {name: 'Public', params: { token: this.$route.params.token, id: id }}, Public: {name: 'Public', params: { token: this.$route.params.token, id: id }},
+8
View File
@@ -23,6 +23,14 @@ const routesIndex = [
requiresAuth: false, requiresAuth: false,
}, },
}, },
{
name: 'Demo',
path: '/demo',
component: () => import(/* webpackChunkName: "chunks/demo" */ '../views/Demo'),
meta: {
requiresAuth: false,
},
},
] ]
export default routesIndex export default routesIndex
+3 -1
View File
@@ -114,7 +114,7 @@ const actions = {
}) })
.catch((error) => { .catch((error) => {
events.$emit('alert:open', { events.$emit('alert:open', {
title: error.response.data.message, title: error.response.data.message || i18n.t('popup_error.title'),
message: i18n.t('popup_error.message'), message: i18n.t('popup_error.message'),
}) })
}) })
@@ -179,6 +179,8 @@ const actions = {
if (response.data.data.id) { if (response.data.data.id) {
commit('PROCESSING_FILE', false) commit('PROCESSING_FILE', false)
commit('INCREASE_FOLDER_ITEM', response.data.data.attributes.parent_id)
// Remove first file from file queue // Remove first file from file queue
commit('SHIFT_FROM_FILE_QUEUE') commit('SHIFT_FROM_FILE_QUEUE')
+6 -2
View File
@@ -32,7 +32,7 @@ const actions = {
}) })
}) })
}, },
logOut: ({ commit }) => { logOut: ({ commit, getters }) => {
let popup = setTimeout(() => { let popup = setTimeout(() => {
commit('PROCESSING_POPUP', { commit('PROCESSING_POPUP', {
@@ -50,7 +50,11 @@ const actions = {
commit('DESTROY_DATA') commit('DESTROY_DATA')
commit('SET_AUTHORIZED', false) commit('SET_AUTHORIZED', false)
router.push({name: 'Homepage'}) // Get redirect location
let redirectLocation = getters.config.allowHomepage ? 'Homepage' : 'SignIn'
// Redirect user
router.push({name: redirectLocation})
}) })
}, },
socialiteRedirect: ({ commit }, provider) => { socialiteRedirect: ({ commit }, provider) => {
+3
View File
@@ -15,6 +15,7 @@
<!--ConfirmPopup Popup--> <!--ConfirmPopup Popup-->
<ConfirmPopup /> <ConfirmPopup />
<ProcessingPopup />
<!-- Create language popup --> <!-- Create language popup -->
<CreateLanguage /> <CreateLanguage />
@@ -88,6 +89,7 @@ import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRe
import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup"; import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup";
import NotificationsPopup from "../components/Notifications/NotificationsPopup"; import NotificationsPopup from "../components/Notifications/NotificationsPopup";
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup"; import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
import ProcessingPopup from "../components/Popups/ProcessingPopup";
export default { export default {
name: 'Admin', name: 'Admin',
@@ -192,6 +194,7 @@ export default {
}, },
}, },
components: { components: {
ProcessingPopup,
RemoteUploadPopup, RemoteUploadPopup,
NotificationsPopup, NotificationsPopup,
CreateTeamFolderPopup, CreateTeamFolderPopup,
@@ -12,7 +12,7 @@
:is-last="true" :is-last="true"
> >
<SwitchInput <SwitchInput
@input="$updateText('/admin/settings', 'allowed_payments', allowedPayments)" @input="updateAllowedPayments"
v-model="allowedPayments" v-model="allowedPayments"
:state="allowedPayments" :state="allowedPayments"
/> />
@@ -280,6 +280,17 @@
<FormLabel v-if="!paystack.isConfigured" icon="shield"> <FormLabel v-if="!paystack.isConfigured" icon="shield">
{{ $t('configure_your_credentials') }} {{ $t('configure_your_credentials') }}
</FormLabel> </FormLabel>
<ValidationProvider tag="div" mode="passive" name="Secret Key" rules="required" v-slot="{ errors }">
<AppInputText :title="$t('admin_settings.payments.stripe_sec_key')" :error="errors[0]">
<input
v-model="paystack.credentials.secret"
:placeholder="$t('admin_settings.payments.stripe_sec_key_plac')"
type="text"
:class="{ '!border-rose-600': errors[0] }"
class="focus-border-theme input-dark"
/>
</AppInputText>
</ValidationProvider>
<ValidationProvider <ValidationProvider
tag="div" tag="div"
mode="passive" mode="passive"
@@ -297,17 +308,6 @@
/> />
</AppInputText> </AppInputText>
</ValidationProvider> </ValidationProvider>
<ValidationProvider tag="div" mode="passive" name="Secret Key" rules="required" v-slot="{ errors }">
<AppInputText :title="$t('admin_settings.payments.stripe_sec_key')" :error="errors[0]">
<input
v-model="paystack.credentials.secret"
:placeholder="$t('admin_settings.payments.stripe_sec_key_plac')"
type="text"
:class="{ '!border-rose-600': errors[0] }"
class="focus-border-theme input-dark"
/>
</AppInputText>
</ValidationProvider>
<ButtonBase <ButtonBase
:disabled="isLoading" :disabled="isLoading"
@@ -623,16 +623,33 @@ export default {
}) })
}) })
.catch((error) => { .catch((error) => {
if (error.response.status === 500) { if ([401, 500].includes(error.response.status)) {
this.isError = true events.$emit('alert:open', {
this.errorMessage = error.response.data.message title: error.response.data.title,
} message: error.response.data.message,
})
} else {
events.$emit('toaster', {
type: 'danger',
message: this.$t('popup_error.title'),
})
}
}) })
.finally(() => (this.isLoading = false)) .finally(() => (this.isLoading = false))
}, },
getWebhookEndpoint(service) { getWebhookEndpoint(service) {
return `${this.config.host}/api/subscriptions/${service}/webhooks` return `${this.config.host}/api/subscriptions/${service}/webhooks`
}, },
updateAllowedPayments(val) {
// Update value
this.$updateText('/admin/settings', 'allowed_payments', val)
// Update config value
this.$store.commit('REPLACE_CONFIG_VALUE', {
key: 'allowed_payments',
value: val,
})
}
}, },
created() { created() {
// Set payment description // Set payment description
+35
View File
@@ -9,6 +9,9 @@
{{ $t('create_plan') }} {{ $t('create_plan') }}
</MobileActionButton> </MobileActionButton>
</router-link> </router-link>
<MobileActionButton @click.native="synchronizePlans" icon="refresh">
{{ $t('synchronize_plans') }}
</MobileActionButton>
</div> </div>
<!--Datatable--> <!--Datatable-->
@@ -202,6 +205,7 @@ import ButtonBase from '../../components/UI/Buttons/ButtonBase'
import ColorLabel from '../../components/UI/Labels/ColorLabel' import ColorLabel from '../../components/UI/Labels/ColorLabel'
import { Trash2Icon, Edit2Icon } from 'vue-feather-icons' import { Trash2Icon, Edit2Icon } from 'vue-feather-icons'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import {events} from "../../bus";
export default { export default {
name: 'Plans', name: 'Plans',
@@ -296,5 +300,36 @@ export default {
}[this.config.subscriptionType] }[this.config.subscriptionType]
}, },
}, },
methods: {
synchronizePlans() {
let processingPopup = setTimeout(() => {
this.$store.commit('PROCESSING_POPUP', {
title: this.$t('synchronizing_plans'),
message: this.$t('plans_are_synchronizing'),
})
}, 300)
axios.get('/api/subscriptions/admin/plans/synchronize')
.then(() => {
events.$emit('toaster', {
type: 'success',
message: this.$t('plans_was_synchronized'),
})
})
.catch((error) => {
if (error.response.status === 500 && error.response.data.type) {
events.$emit('alert:open', {
title: error.response.data.title,
message: error.response.data.message,
})
}
})
.finally(() => {
clearTimeout(processingPopup)
this.$store.commit('PROCESSING_POPUP', undefined)
})
}
}
} }
</script> </script>
@@ -134,7 +134,7 @@
v-model="plan.features.max_team_members" v-model="plan.features.max_team_members"
:placeholder="$t('add_max_team_members')" :placeholder="$t('add_max_team_members')"
type="number" type="number"
min="1" min="-1"
max="999999999" max="999999999"
:class="{ '!border-rose-600': errors[0] }" :class="{ '!border-rose-600': errors[0] }"
class="focus-border-theme input-dark" class="focus-border-theme input-dark"
@@ -357,6 +357,10 @@ export default {
}, },
methods: { methods: {
getCallbackEndpoint(service) { getCallbackEndpoint(service) {
if (service === 'facebook') {
return `${this.config.host}/socialite/${service}/callback/`
}
return `${this.config.host}/socialite/${service}/callback` return `${this.config.host}/socialite/${service}/callback`
}, },
async storeCredentials(service) { async storeCredentials(service) {
+12 -5
View File
@@ -1,5 +1,5 @@
<template> <template>
<AuthContentWrapper ref="auth" class="h-screen"> <AuthContentWrapper v-if="isVisible" ref="auth" class="h-screen">
<!--Log In by Email--> <!--Log In by Email-->
<AuthContent name="log-in" :visible="true"> <AuthContent name="log-in" :visible="true">
<Headline :title="$t('welcome_back')" :description="$t('page_login.subtitle')" /> <Headline :title="$t('welcome_back')" :description="$t('page_login.subtitle')" />
@@ -256,6 +256,7 @@ export default {
}, },
data() { data() {
return { return {
isVisible: false,
isLoading: false, isLoading: false,
validSignIn: false, validSignIn: false,
checkedAccount: undefined, checkedAccount: undefined,
@@ -443,14 +444,20 @@ export default {
} }
}, },
}, },
created() { mounted() {
this.$scrollTop()
this.$store.commit('PROCESSING_POPUP', undefined)
// Redirect if user is authenticated // Redirect if user is authenticated
if (this.$root.$data.config.isAuthenticated) { if (this.$root.$data.config.isAuthenticated) {
this.$router.push({name: 'Files'}) this.$router.push({name: 'Files'})
} }
},
created() {
// Show the page when user is not authenticated
if (! this.$root.$data.config.isAuthenticated) {
this.isVisible = true
}
this.$scrollTop()
this.$store.commit('PROCESSING_POPUP', undefined)
if (this.config.isDemo || this.config.isDev) { if (this.config.isDemo || this.config.isDev) {
this.loginEmail = 'howdy@hi5ve.digital' this.loginEmail = 'howdy@hi5ve.digital'
+6
View File
@@ -256,6 +256,12 @@ export default {
'Your New Password': error.response.data.errors['password'], 'Your New Password': error.response.data.errors['password'],
}) })
} }
if (error.response.data.errors['reCaptcha']) {
events.$emit('alert:open', {
title: error.response.data.message,
})
}
} }
}) })
.finally(() => { .finally(() => {
+34
View File
@@ -0,0 +1,34 @@
<template>
<AuthContentWrapper ref="auth" class="h-screen">
<AuthContent :visible="true">
<Headline
title="You Are Nearly Here!"
description="Just click on the button below."
/>
<a :href="`${$store.getters.config.host}/sign-in`" target="_blank">
<AuthButton
class="mb-12 w-full justify-center md:w-min"
icon="chevron-right"
text="Visit Demo"
/>
</a>
</AuthContent>
</AuthContentWrapper>
</template>
<script>
import AuthContentWrapper from '../components/Layout/AuthPages/AuthContentWrapper'
import AuthContent from '../components/Layout/AuthPages/AuthContent'
import AuthButton from '../components/UI/Buttons/AuthButton'
import Headline from '../components/UI/Labels/LogoHeadline'
export default {
name: 'Demo',
components: {
AuthContentWrapper,
AuthContent,
AuthButton,
Headline,
},
}
</script>
@@ -64,8 +64,6 @@ export default {
} }
}, },
mounted() { mounted() {
if (!this.config.allowHomepage) this.$router.push({ name: 'SignIn' })
// Get page content // Get page content
axios axios
.get('/api/settings', { .get('/api/settings', {
+5 -2
View File
@@ -46,7 +46,7 @@
<div v-if="config.allowedAdsense && config.adsenseBanner01" v-html="config.adsenseBanner01" class="mb-5 min-h-[120px]"></div> <div v-if="config.allowedAdsense && config.adsenseBanner01" v-html="config.adsenseBanner01" class="mb-5 min-h-[120px]"></div>
<!--File list & info sidebar--> <!--File list & info sidebar-->
<div class="flex space-x-3 lg:overflow-hidden grow"> <div class="flex space-x-3 lg:overflow-hidden grow" @drop.stop.prevent="uploadDroppedItems($event)" @dragenter.prevent @dragover.prevent>
<router-view id="file-view" class="relative w-full" :key="$route.fullPath" /> <router-view id="file-view" class="relative w-full" :key="$route.fullPath" />
<InfoSidebar v-if="isVisibleSidebar" /> <InfoSidebar v-if="isVisibleSidebar" />
@@ -110,7 +110,7 @@ export default {
DragUI, DragUI,
}, },
computed: { computed: {
...mapGetters(['isVisibleSidebar', 'isLimitedUser', 'config']), ...mapGetters(['isVisibleSidebar', 'isLimitedUser', 'config', 'currentFolder']),
}, },
data() { data() {
return { return {
@@ -118,6 +118,9 @@ export default {
} }
}, },
methods: { methods: {
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder?.data.id)
},
contextMenu(event, item) { contextMenu(event, item) {
events.$emit('context-menu:show', event, item) events.$emit('context-menu:show', event, item)
}, },
+4 -5
View File
@@ -82,7 +82,7 @@
<input <input
v-model="databaseCredentials.name" v-model="databaseCredentials.name"
class="focus-border-theme input-dark" class="focus-border-theme input-dark"
placeholder="Select your database name" placeholder="Type your database name"
type="text" type="text"
:class="{ '!border-rose-600': errors[0] }" :class="{ '!border-rose-600': errors[0] }"
/> />
@@ -100,7 +100,7 @@
<input <input
v-model="databaseCredentials.username" v-model="databaseCredentials.username"
class="focus-border-theme input-dark" class="focus-border-theme input-dark"
placeholder="Select your database name" placeholder="Type your database name"
type="text" type="text"
:class="{ '!border-rose-600': errors[0] }" :class="{ '!border-rose-600': errors[0] }"
/> />
@@ -111,14 +111,13 @@
tag="div" tag="div"
mode="passive" mode="passive"
name="Database Password" name="Database Password"
rules="required"
v-slot="{ errors }" v-slot="{ errors }"
> >
<AppInputText title="Database Password" :error="errors[0]" :is-last="true"> <AppInputText title="Database Password (optional)" :error="errors[0]" :is-last="true">
<input <input
v-model="databaseCredentials.password" v-model="databaseCredentials.password"
class="focus-border-theme input-dark" class="focus-border-theme input-dark"
placeholder="Select your database password" placeholder="Type your database password"
type="text" type="text"
:class="{ '!border-rose-600': errors[0] }" :class="{ '!border-rose-600': errors[0] }"
/> />
@@ -15,7 +15,7 @@
<a href="https://codecanyon.net/item/vue-file-manager-with-laravel-backend/25815986"> <a href="https://codecanyon.net/item/vue-file-manager-with-laravel-backend/25815986">
<AlertBox color="rose" class="text-left"> <AlertBox color="rose" class="text-left">
<p class="text-rose-500">Please make sure you have only legal copy of VueFileManager <b class="text-rose-500 underline">purchased from CodeCanyon</b>. Any illegal copy can contain malicious software, bugs and others security issues which exposes your files to abuse.</p> <p class="text-rose-500">Please make sure you have only legal copy of VueFileManager <b class="text-rose-500 underline">purchased from CodeCanyon</b>. Any illegal copy can contain malicious software, bugs and others security issues which exposes your files to data breach.</p>
</AlertBox> </AlertBox>
</a> </a>
+5 -2
View File
@@ -35,7 +35,7 @@
<div v-if="config.allowedAdsense && config.adsenseBanner01" v-html="config.adsenseBanner01" class="mb-5 min-h-[120px]"></div> <div v-if="config.allowedAdsense && config.adsenseBanner01" v-html="config.adsenseBanner01" class="mb-5 min-h-[120px]"></div>
<!--File list & info sidebar--> <!--File list & info sidebar-->
<div class="flex space-x-3 lg:overflow-hidden grow"> <div class="flex space-x-3 lg:overflow-hidden grow" @drop.stop.prevent="uploadDroppedItems($event)" @dragenter.prevent @dragover.prevent>
<router-view id="file-view" class="relative w-full" :key="$route.fullPath" /> <router-view id="file-view" class="relative w-full" :key="$route.fullPath" />
<InfoSidebar v-if="isVisibleSidebar" /> <InfoSidebar v-if="isVisibleSidebar" />
@@ -87,7 +87,7 @@ export default {
Alert, Alert,
}, },
computed: { computed: {
...mapGetters(['isVisibleSidebar', 'sharedDetail', 'config']), ...mapGetters(['isVisibleSidebar', 'sharedDetail', 'config', 'currentFolder']),
}, },
data() { data() {
return { return {
@@ -95,6 +95,9 @@ export default {
} }
}, },
methods: { methods: {
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder?.data.id)
},
contextMenu(event, item) { contextMenu(event, item) {
events.$emit('context-menu:show', event, item) events.$emit('context-menu:show', event, item)
}, },
+5 -2
View File
@@ -30,7 +30,7 @@
<div v-if="config.allowedAdsense && config.adsenseBanner01" v-html="config.adsenseBanner01" class="mb-5 min-h-[120px]"></div> <div v-if="config.allowedAdsense && config.adsenseBanner01" v-html="config.adsenseBanner01" class="mb-5 min-h-[120px]"></div>
<!--File list & info sidebar--> <!--File list & info sidebar-->
<div class="flex space-x-3 lg:overflow-hidden grow"> <div class="flex space-x-3 lg:overflow-hidden grow" @drop.stop.prevent="uploadDroppedItems($event)" @dragenter.prevent @dragover.prevent>
<router-view id="file-view" class="relative w-full" :key="$route.fullPath" /> <router-view id="file-view" class="relative w-full" :key="$route.fullPath" />
<InfoSidebarUploadRequest v-if="canShowUI && isVisibleSidebar" /> <InfoSidebarUploadRequest v-if="canShowUI && isVisibleSidebar" />
@@ -76,7 +76,7 @@ export default {
DragUI, DragUI,
}, },
computed: { computed: {
...mapGetters(['isVisibleSidebar', 'config', 'uploadRequest', 'fileQueue']), ...mapGetters(['isVisibleSidebar', 'config', 'uploadRequest', 'fileQueue', 'currentFolder']),
canShowUI() { canShowUI() {
return (this.uploadRequest && this.uploadRequest.data.attributes.status === 'filling') || this.fileQueue.length > 0 return (this.uploadRequest && this.uploadRequest.data.attributes.status === 'filling') || this.fileQueue.length > 0
} }
@@ -87,6 +87,9 @@ export default {
} }
}, },
methods: { methods: {
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder?.data.id)
},
contextMenu(event, item) { contextMenu(event, item) {
events.$emit('context-menu:show', event, item) events.$emit('context-menu:show', event, item)
}, },
+30 -4
View File
@@ -1,8 +1,34 @@
@php @php
use Monolog\Handler\MissingExtensionException;
use VueFileManager\Subscription\Domain\Plans\Models\Plan; use VueFileManager\Subscription\Domain\Plans\Models\Plan;
use VueFileManager\Subscription\Domain\Transactions\Models\Transaction; use VueFileManager\Subscription\Domain\Transactions\Models\Transaction;
use VueFileManager\Subscription\Domain\Subscriptions\Models\Subscription; use VueFileManager\Subscription\Domain\Subscriptions\Models\Subscription;
try {
// Bcmath Extension
$storageDefaultSpaceFormatted = isset($settings->default_max_storage_amount)
? format_gigabytes($settings->default_max_storage_amount)
: format_gigabytes(5);
$uploadLimit = isset($settings->upload_limit)
? format_bytes($settings->upload_limit)
: 'undefined';
$chunkSize = isset($settings->chunk_size)
? format_bytes($settings->chunk_size)
: format_bytes(64);
$uploadLimitFormatted = isset($settings->upload_limit)
? format_megabytes($settings->upload_limit)
: null;
} catch (MissingExtensionException $exception) {
$storageDefaultSpaceFormatted = '5GB';
$uploadLimit = 'undefined';
$uploadLimitFormatted = 5;
$chunkSize = 64000000;
}
try { try {
// Subscription // Subscription
$isEmptySubscriptions = Subscription::count() === 0; $isEmptySubscriptions = Subscription::count() === 0;
@@ -98,11 +124,11 @@
storageLimit: {{ $settings->storage_limitation ?? 1 }}, storageLimit: {{ $settings->storage_limitation ?? 1 }},
teamsDefaultMembers: {{ $settings->default_max_team_member ?? 10 }}, teamsDefaultMembers: {{ $settings->default_max_team_member ?? 10 }},
storageDefaultSpace: {{ $settings->default_max_storage_amount ?? 5 }}, storageDefaultSpace: {{ $settings->default_max_storage_amount ?? 5 }},
storageDefaultSpaceFormatted: '{{ isset($settings->default_max_storage_amount) ? format_gigabytes($settings->default_max_storage_amount) : format_gigabytes(5) }}', storageDefaultSpaceFormatted: '{{ $storageDefaultSpaceFormatted }}',
mimetypesBlacklist: '{{ isset($settings->mimetypes_blacklist) ? $settings->mimetypes_blacklist: null}}', mimetypesBlacklist: '{{ isset($settings->mimetypes_blacklist) ? $settings->mimetypes_blacklist: null}}',
uploadLimit: {{ isset($settings->upload_limit) ? format_bytes($settings->upload_limit) : 'undefined' }}, uploadLimit: {{ $uploadLimit }},
uploadLimitFormatted: '{{ isset($settings->upload_limit) ? format_megabytes($settings->upload_limit) : null }}', uploadLimitFormatted: '{{ $uploadLimitFormatted }}',
chunkSize: {{ isset($settings->chunk_size) ? format_bytes($settings->chunk_size) : format_bytes(64) }}, chunkSize: {{ $chunkSize }},
isAuthenticated: {{ $isUser ? 1 : 0 }}, isAuthenticated: {{ $isUser ? 1 : 0 }},
isSaaS: {{ $settings && optional($settings)->license === 'extended' ? 1 : 0 }}, isSaaS: {{ $settings && optional($settings)->license === 'extended' ? 1 : 0 }},
@@ -23,7 +23,7 @@ class SetupWebsocketEnvironment extends Command
public function handle(): void public function handle(): void
{ {
// Get allowed origins // Get allowed origins
$origins = $this->ask('Type host of which you want to allow incoming requests. If you want to accept multiple hosts, separate them with comma(,)'); $origins = $this->ask('Type the host of your VueFileManager front-end application to allow connection with your websocket server. If you want to accept multiple hosts, separate them with comma(,)');
// Store origins to the .env file // Store origins to the .env file
setEnvironmentValue([ setEnvironmentValue([
+6 -1
View File
@@ -94,10 +94,15 @@ class UserLimitation extends Model
$totalUsedEmails = $memberEmails->merge($InvitationEmails) $totalUsedEmails = $memberEmails->merge($InvitationEmails)
->unique(); ->unique();
// Get usage in percent
$percentage = (int) $this->max_team_members === 0
? 100
: ($totalUsedEmails->count() / $this->max_team_members) * 100;
return [ return [
'use' => $totalUsedEmails->count(), 'use' => $totalUsedEmails->count(),
'total' => (int) $this->max_team_members, 'total' => (int) $this->max_team_members,
'percentage' => ($totalUsedEmails->count() / $this->max_team_members) * 100, 'percentage' => $percentage,
'meta' => [ 'meta' => [
'allowed_emails' => $totalUsedEmails, 'allowed_emails' => $totalUsedEmails,
], ],
+36 -25
View File
@@ -2,11 +2,11 @@
namespace Domain\Files\Actions; namespace Domain\Files\Actions;
use App\Users\Models\User; use App\Users\Models\User;
use Illuminate\Support\Str;
use Domain\Files\Models\File; use Domain\Files\Models\File;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Domain\Files\Requests\UploadRequest; use Domain\Files\Requests\UploadRequest;
use Domain\Traffic\Actions\RecordUploadAction; use Domain\Traffic\Actions\RecordUploadAction;
use League\Flysystem\UnableToRetrieveMetadata;
class ProcessFileAction class ProcessFileAction
{ {
@@ -26,19 +26,29 @@ class ProcessFileAction
public function __invoke( public function __invoke(
UploadRequest $request, UploadRequest $request,
User $user, User $user,
string $chunkPath, string $name,
) { ): File {
// Get local disk instance // Get local disk instance
$localDisk = Storage::disk('local'); $localDisk = Storage::disk('local');
// Get file data // Get file path
$size = $localDisk->size($chunkPath); $filePath = "files/$user->id/$name";
$mimetype = $localDisk->mimeType($chunkPath);
$name = Str::uuid() . '.' . $request->input('extension');
// Get upload limit // Get file size
$size = $localDisk->size($filePath);
// Get upload limit size
$uploadLimit = get_settings('upload_limit'); $uploadLimit = get_settings('upload_limit');
// Get mimetype
try {
$fileType = getFileType(
$localDisk->mimeType($filePath)
);
} catch (UnableToRetrieveMetadata $e) {
$fileType = 'file';
}
// File size handling // File size handling
if ($uploadLimit && $size > format_bytes($uploadLimit)) { if ($uploadLimit && $size > format_bytes($uploadLimit)) {
abort(413); abort(413);
@@ -47,26 +57,24 @@ class ProcessFileAction
// Check if user has enough space to upload file // Check if user has enough space to upload file
if (! $user->canUpload($size)) { if (! $user->canUpload($size)) {
// Delete file from chunk directory // Delete file from chunk directory
$localDisk->delete($chunkPath); $localDisk->delete($filePath);
// Set up response
$response = response([
'type' => 'error',
'message' => __t('user_action_not_allowed'),
], 401);
// Abort code // Abort code
abort($response); abort(
response([
'type' => 'error',
'message' => __t('user_action_not_allowed'),
], 401)
);
} }
// Move file to user directory if ($fileType === 'image') {
$localDisk->move($chunkPath, "files/$user->id/$name"); // Create multiple image thumbnails
($this->createImageThumbnail)($name, $user->id);
// Create multiple image thumbnails // Store exif data if exists
($this->createImageThumbnail)($name, $user->id); $exif = ($this->storeExifData)($filePath);
}
// Store exif data if exists
$exif = ($this->storeExifData)("files/$user->id/$name");
// Move file to external storage // Move file to external storage
match (config('filesystems.default')) { match (config('filesystems.default')) {
@@ -78,7 +86,7 @@ class ProcessFileAction
// Create new file // Create new file
$file = File::create([ $file = File::create([
'mimetype' => $request->input('extension'), 'mimetype' => $request->input('extension'),
'type' => getFileType($mimetype), 'type' => $fileType,
'parent_id' => ($this->getFileParentId)($request, $user->id), 'parent_id' => ($this->getFileParentId)($request, $user->id),
'name' => $request->input('name'), 'name' => $request->input('name'),
'basename' => $name, 'basename' => $name,
@@ -88,7 +96,10 @@ class ProcessFileAction
]); ]);
// Attach file into the exif data // Attach file into the exif data
$exif?->update(['file_id' => $file->id]);
if ($fileType === 'image') {
$exif?->update(['file_id' => $file->id]);
}
// Return new file // Return new file
return $file; return $file;
@@ -1,7 +1,6 @@
<?php <?php
namespace Domain\Files\Actions; namespace Domain\Files\Actions;
use Log;
use Str; use Str;
use Storage; use Storage;
use Exception; use Exception;
@@ -31,7 +30,7 @@ class StoreExifDataAction
$exif = json_decode(json_encode($exifRaw)); $exif = json_decode(json_encode($exifRaw));
return Exif::create([ return Exif::create([
'file_id' => Str::uuid(), // TODO: temporary store to prevent crash before app will be successfully upgraded 'file_id' => Str::uuid(),
'date_time_original' => $exif->DateTimeOriginal ?? null, 'date_time_original' => $exif->DateTimeOriginal ?? null,
'artist' => $exif->OwnerName ?? null, 'artist' => $exif->OwnerName ?? null,
'width' => $exif->COMPUTED->Width ?? null, 'width' => $exif->COMPUTED->Width ?? null,
@@ -53,8 +52,6 @@ class StoreExifDataAction
'latitude_ref' => $exif->GPSLatitudeRef ?? null, 'latitude_ref' => $exif->GPSLatitudeRef ?? null,
]); ]);
} catch (Exception $error) { } catch (Exception $error) {
Log::error('Unable to get exif data');
return null; return null;
} }
} }
@@ -1,6 +1,8 @@
<?php <?php
namespace Domain\Files\Controllers; namespace Domain\Files\Controllers;
use Storage;
use Illuminate\Support\Str;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Domain\Files\Requests\UploadRequest; use Domain\Files\Requests\UploadRequest;
@@ -42,8 +44,14 @@ class UploadFileController extends Controller
->user ->user
: auth()->user(); : auth()->user();
// Get file name
$name = Str::uuid() . '.' . $request->input('extension');
// Move file to user directory
Storage::disk('local')->move($chunkPath, "files/$user->id/$name");
// Process file // Process file
$file = ($this->processFie)($request, $user, $chunkPath); $file = ($this->processFie)($request, $user, $name);
return response(new FileResource($file), 201); return response(new FileResource($file), 201);
} }
@@ -1,6 +1,8 @@
<?php <?php
namespace Domain\Files\Controllers; namespace Domain\Files\Controllers;
use Str;
use Storage;
use Domain\Sharing\Models\Share; use Domain\Sharing\Models\Share;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Domain\Files\Requests\UploadRequest; use Domain\Files\Requests\UploadRequest;
@@ -53,8 +55,14 @@ class VisitorUploadFileController extends Controller
// Proceed after last chunk // Proceed after last chunk
if ($request->boolean('is_last')) { if ($request->boolean('is_last')) {
// Get file name
$name = Str::uuid() . '.' . $request->input('extension');
// Move file to user directory
Storage::disk('local')->move($chunkPath, "files/{$shared->user->id}/$name");
// Process file // Process file
$file = ($this->processFie)($request, $shared->user, $chunkPath); $file = ($this->processFie)($request, $shared->user, $name);
// Set public access url // Set public access url
$file->setSharedPublicUrl($shared->token); $file->setSharedPublicUrl($shared->token);
@@ -2,6 +2,7 @@
namespace Domain\Localization\Actions; namespace Domain\Localization\Actions;
use DB; use DB;
use Artisan;
class UpdateLanguageTranslationsAction class UpdateLanguageTranslationsAction
{ {
@@ -10,9 +11,11 @@ class UpdateLanguageTranslationsAction
collect($list) collect($list)
->each( ->each(
fn (...$item) => DB::table('language_translations') fn (...$item) => DB::table('language_translations')
->where('lang', 'en') ->where('lang', 'en')
->where('key', $item[1]) ->where('key', $item[1])
->update(['value' => $item[0]]) ->update(['value' => $item[0]])
); );
Artisan::call('cache:clear');
} }
} }
@@ -0,0 +1,61 @@
<?php
namespace Domain\Settings\Actions;
use ErrorException;
use VueFileManager\Subscription\Support\EngineManager;
use VueFileManager\Subscription\Domain\Plans\DTO\CreateFixedPlanData;
class TestPayPalConnectionAction
{
public function __construct(
public EngineManager $subscription
) {
}
public function __invoke($credentials)
{
try {
// Set temporary stripe connection
config([
'subscription.credentials.paypal' => [
'secret' => $credentials['secret'],
'id' => $credentials['key'],
'webhook_id' => $credentials['webhook'],
'is_live' => $credentials['live'],
],
]);
// Define test plan
$data = CreateFixedPlanData::fromArray([
'type' => 'fixed',
'name' => 'Test Plan',
'description' => null,
'features' => [
'max_storage_amount' => 200,
'max_team_members' => 20,
],
'currency' => 'EUR',
'amount' => 99,
'interval' => 'month',
]);
// Create test plan
$plan = $this->subscription
->driver('paypal')
->createFixedPlan($data);
// Delete plan
$this->subscription
->driver('paypal')
->deletePlan($plan['id']);
} catch (ErrorException $error) {
abort(
response()->json([
'type' => 'service-connection-error',
'title' => 'Service Connection Error',
'message' => $error->getMessage(),
], 401)
);
}
}
}
@@ -0,0 +1,59 @@
<?php
namespace Domain\Settings\Actions;
use ErrorException;
use VueFileManager\Subscription\Support\EngineManager;
use VueFileManager\Subscription\Domain\Plans\DTO\CreateFixedPlanData;
class TestPaystackConnectionAction
{
public function __construct(
public EngineManager $subscription
) {
}
public function __invoke($credentials)
{
try {
// Set temporary paystack connection
config([
'subscription.credentials.paystack' => [
'secret' => $credentials['secret'],
'public_key' => $credentials['key'],
],
]);
// Define test plan
$data = CreateFixedPlanData::fromArray([
'type' => 'fixed',
'name' => 'Test Plan',
'description' => null,
'features' => [
'max_storage_amount' => 200,
'max_team_members' => 20,
],
'currency' => 'ZAR',
'amount' => 99999,
'interval' => 'month',
]);
// Create test plan
$plan = $this->subscription
->driver('paystack')
->createFixedPlan($data);
// Delete plan
$this->subscription
->driver('paystack')
->deletePlan($plan['id']);
} catch (ErrorException $error) {
abort(
response()->json([
'type' => 'service-connection-error',
'title' => 'Service Connection Error',
'message' => $error->getMessage(),
], 401)
);
}
}
}
@@ -0,0 +1,60 @@
<?php
namespace Domain\Settings\Actions;
use ErrorException;
use VueFileManager\Subscription\Support\EngineManager;
use VueFileManager\Subscription\Domain\Plans\DTO\CreateFixedPlanData;
class TestStripeConnectionAction
{
public function __construct(
public EngineManager $subscription
) {
}
public function __invoke($credentials)
{
try {
// Set temporary stripe connection
config([
'subscription.credentials.stripe' => [
'secret' => $credentials['secret'],
'public_key' => $credentials['key'],
'webhook_key' => $credentials['webhook'],
],
]);
// Define test plan
$data = CreateFixedPlanData::fromArray([
'type' => 'fixed',
'name' => 'Test Plan',
'description' => null,
'features' => [
'max_storage_amount' => 200,
'max_team_members' => 20,
],
'currency' => 'EUR',
'amount' => 99,
'interval' => 'month',
]);
// Create test plan
$plan = $this->subscription
->driver('stripe')
->createFixedPlan($data);
// Delete plan
$this->subscription
->driver('stripe')
->deletePlan($plan['id']);
} catch (ErrorException $error) {
abort(
response()->json([
'type' => 'service-connection-error',
'title' => 'Service Connection Error',
'message' => $error->getMessage(),
], 401)
);
}
}
}
@@ -26,7 +26,7 @@ class StoreBroadcastServiceCredentialsController
'PUSHER_APP_CLUSTER' => $request->input('cluster'), 'PUSHER_APP_CLUSTER' => $request->input('cluster'),
'PUSHER_APP_HOST' => '', 'PUSHER_APP_HOST' => '',
'PUSHER_APP_PORT' => '', 'PUSHER_APP_PORT' => '',
'PUSHER_APP_TLS' => true, 'PUSHER_APP_TLS' => 'true',
], ],
'native' => [ 'native' => [
'BROADCAST_DRIVER' => 'pusher', 'BROADCAST_DRIVER' => 'pusher',
@@ -4,10 +4,20 @@ namespace Domain\Settings\Controllers;
use Artisan; use Artisan;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use Domain\Settings\Models\Setting; use Domain\Settings\Models\Setting;
use Domain\Settings\Actions\TestPayPalConnectionAction;
use Domain\Settings\Actions\TestStripeConnectionAction;
use Domain\Settings\Actions\TestPaystackConnectionAction;
use Domain\Settings\Requests\StorePaymentServiceCredentialsRequest; use Domain\Settings\Requests\StorePaymentServiceCredentialsRequest;
class StorePaymentServiceCredentialsController class StorePaymentServiceCredentialsController
{ {
public function __construct(
public TestPaystackConnectionAction $testPaystackConnection,
public TestStripeConnectionAction $testStripeConnection,
public TestPayPalConnectionAction $testPayPalConnection,
) {
}
/** /**
* Configure stripe additionally * Configure stripe additionally
*/ */
@@ -43,6 +53,26 @@ class StorePaymentServiceCredentialsController
// Get and store credentials // Get and store credentials
if (! app()->runningUnitTests()) { if (! app()->runningUnitTests()) {
// Test payment gateway connection
match ($request->input('service')) {
'paystack' => ($this->testPaystackConnection)([
'key' => $request->input('key'),
'secret' => $request->input('secret'),
]),
'stripe' => ($this->testStripeConnection)([
'key' => $request->input('key'),
'secret' => $request->input('secret'),
'webhook' => $request->input('webhook'),
]),
'paypal' => ($this->testPayPalConnection)([
'key' => $request->input('key'),
'secret' => $request->input('secret'),
'webhook' => $request->input('webhook'),
'live' => $request->has('live') ? (string) $request->input('live') : $PayPalDefaultMode,
]),
default => null
};
$credentials = [ $credentials = [
'stripe' => [ 'stripe' => [
'STRIPE_PUBLIC_KEY' => $request->input('key'), 'STRIPE_PUBLIC_KEY' => $request->input('key'),
@@ -27,7 +27,7 @@ class StoreDatabaseCredentialsController extends Controller
'port' => $request->input('port'), 'port' => $request->input('port'),
'database' => $request->input('name'), 'database' => $request->input('name'),
'username' => $request->input('username'), 'username' => $request->input('username'),
'password' => $request->input('password'), 'password' => $request->input('password') ?? '',
], ],
]); ]);
@@ -51,7 +51,7 @@ class StoreDatabaseCredentialsController extends Controller
'DB_PORT' => $request->input('port'), 'DB_PORT' => $request->input('port'),
'DB_DATABASE' => $request->input('name'), 'DB_DATABASE' => $request->input('name'),
'DB_USERNAME' => $request->input('username'), 'DB_USERNAME' => $request->input('username'),
'DB_PASSWORD' => $request->input('password'), 'DB_PASSWORD' => $request->input('password') ?? '',
]); ]);
Artisan::call('config:cache'); Artisan::call('config:cache');
@@ -92,7 +92,7 @@ class StoreEnvironmentSettingsController extends Controller
'PUSHER_APP_CLUSTER' => $request->input('broadcast.cluster'), 'PUSHER_APP_CLUSTER' => $request->input('broadcast.cluster'),
'PUSHER_APP_HOST' => '', 'PUSHER_APP_HOST' => '',
'PUSHER_APP_PORT' => '', 'PUSHER_APP_PORT' => '',
'PUSHER_APP_TLS' => true, 'PUSHER_APP_TLS' => 'true',
], ],
'native' => [ 'native' => [
'BROADCAST_DRIVER' => 'pusher', 'BROADCAST_DRIVER' => 'pusher',
@@ -28,7 +28,7 @@ class StoreDatabaseCredentialsRequest extends FormRequest
'port' => 'required|string', 'port' => 'required|string',
'name' => 'required|string', 'name' => 'required|string',
'username' => 'required|string', 'username' => 'required|string',
'password' => 'required|string', 'password' => 'nullable|sometimes|string',
]; ];
} }
} }
@@ -2,6 +2,8 @@
namespace Domain\UploadRequest\Controllers; namespace Domain\UploadRequest\Controllers;
use DB; use DB;
use Storage;
use Illuminate\Support\Str;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use Domain\Files\Resources\FileResource; use Domain\Files\Resources\FileResource;
use Domain\Files\Actions\ProcessFileAction; use Domain\Files\Actions\ProcessFileAction;
@@ -40,8 +42,14 @@ class UploadFilesForUploadRequestController
// Proceed after last chunk // Proceed after last chunk
if ($request->boolean('is_last')) { if ($request->boolean('is_last')) {
// Get file name
$name = Str::uuid() . '.' . $request->input('extension');
// Move file to user directory
Storage::disk('local')->move($chunkPath, "files/{$uploadRequest->user->id}/$name");
// Process file // Process file
$file = ($this->processFie)($request, $uploadRequest->user, $chunkPath); $file = ($this->processFie)($request, $uploadRequest->user, $name);
// Set public access url // Set public access url
$file->setUploadRequestPublicUrl($uploadRequest->id); $file->setUploadRequestPublicUrl($uploadRequest->id);
@@ -22,6 +22,13 @@ class UpgradingVersionsController
) { ) {
} }
public function upgrade_to_2_1_2(): void
{
($this->updateLanguageStrings)([
'allow_recaptcha' => 'Allow ReCaptcha v3',
]);
}
public function upgrade_to_2_1_1(): void public function upgrade_to_2_1_1(): void
{ {
($this->upgradeDatabase)(); ($this->upgradeDatabase)();
+2 -2
View File
@@ -236,9 +236,9 @@ if (! function_exists('setEnvironmentValue')) {
if ($keyPosition) { if ($keyPosition) {
$endOfLinePosition = strpos($str, "\n", $keyPosition); $endOfLinePosition = strpos($str, "\n", $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition); $oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
$str = str_replace($oldLine, "{$envKey}={$envValue}", $str); $str = str_replace($oldLine, "{$envKey}=\"{$envValue}\"", $str);
} else { } else {
$str .= "\n$envKey=$envValue"; $str .= "\n$envKey=\"$envValue\"";
} }
} }
} }