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)
- [Apache Configuration](#apache-configuration)
- [Migrating to Another Domain](#migrating-to-another-domain)
- [Broadcasting](#broadcasting)
- [About Broadcasting](#about-broadcasting)
- [Install Broadcast Server](#install-broadcast-server)
- [Social Authentication](#social-authentication)
- [Subscription Configuration](#subscription-configuration)
- [Configuring Production/Testing Environment](#configuring-productiontesting-environment)
- [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)
- [Running Environment On Your Localhost](#running-environment-on-your-localhost)
- [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.
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
### 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.
@@ -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.
# 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
## 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
#### Release date: 25. April 2022
- New remote upload function
+1 -1
View File
@@ -29,7 +29,7 @@
"laravel/ui": "^3.4.2",
"league/flysystem-aws-s3-v3": "^3.0.9",
"league/flysystem-ftp": "^3.0",
"makingcg/subscription": "^1.0.5",
"makingcg/subscription": "^1.0.6",
"matthewbdaly/laravel-azure-storage": "^2.0",
"pusher/pusher-php-server": "^7.0",
"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",
"This file is @generated automatically"
],
"content-hash": "da78385bb0354b117852966eab7e288c",
"content-hash": "9ec812c4e7c97cf3548f9130c95f644b",
"packages": [
{
"name": "amphp/amp",
@@ -280,16 +280,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.220.0",
"version": "3.222.7",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "8beb098a2224742b2756e3b40a07593b1e6ff967"
"reference": "03d35eef5c509798d2c08587cfd9a7c33afe2260"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8beb098a2224742b2756e3b40a07593b1e6ff967",
"reference": "8beb098a2224742b2756e3b40a07593b1e6ff967",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/03d35eef5c509798d2c08587cfd9a7c33afe2260",
"reference": "03d35eef5c509798d2c08587cfd9a7c33afe2260",
"shasum": ""
},
"require": {
@@ -365,9 +365,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"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",
@@ -1413,21 +1413,21 @@
},
{
"name": "doctrine/dbal",
"version": "2.13.8",
"version": "2.13.9",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
"reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b"
"reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/dc9b3c3c8592c935a6e590441f9abc0f9eba335b",
"reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8",
"reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8",
"shasum": ""
},
"require": {
"doctrine/cache": "^1.0|^2.0",
"doctrine/deprecations": "^0.5.3",
"doctrine/deprecations": "^0.5.3|^1",
"doctrine/event-manager": "^1.0",
"ext-pdo": "*",
"php": "^7.1 || ^8"
@@ -1502,7 +1502,7 @@
],
"support": {
"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": [
{
@@ -1518,29 +1518,29 @@
"type": "tidelift"
}
],
"time": "2022-03-09T15:25:46+00:00"
"time": "2022-05-02T20:28:55+00:00"
},
{
"name": "doctrine/deprecations",
"version": "v0.5.3",
"version": "v1.0.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "9504165960a1f83cc1480e2be1dd0a0478561314"
"reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314",
"reference": "9504165960a1f83cc1480e2be1dd0a0478561314",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
"reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
"shasum": ""
},
"require": {
"php": "^7.1|^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^6.0|^7.0|^8.0",
"phpunit/phpunit": "^7.0|^8.0|^9.0",
"psr/log": "^1.0"
"doctrine/coding-standard": "^9",
"phpunit/phpunit": "^7.5|^8.5|^9.5",
"psr/log": "^1|^2|^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@@ -1559,9 +1559,9 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"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",
@@ -3290,16 +3290,16 @@
},
{
"name": "laravel/framework",
"version": "v9.9.0",
"version": "v9.11.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "4d5a07640891b772188d7737348886a0222737d8"
"reference": "598a8c84d452a66b90a3213b1d67189cc726c728"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/4d5a07640891b772188d7737348886a0222737d8",
"reference": "4d5a07640891b772188d7737348886a0222737d8",
"url": "https://api.github.com/repos/laravel/framework/zipball/598a8c84d452a66b90a3213b1d67189cc726c728",
"reference": "598a8c84d452a66b90a3213b1d67189cc726c728",
"shasum": ""
},
"require": {
@@ -3465,7 +3465,7 @@
"issues": "https://github.com/laravel/framework/issues",
"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",
@@ -3534,16 +3534,16 @@
},
{
"name": "laravel/scout",
"version": "v9.4.7",
"version": "v9.4.9",
"source": {
"type": "git",
"url": "https://github.com/laravel/scout.git",
"reference": "46114761e835ae77e6b6b26abceb5ae63859ba98"
"reference": "61ce79ce87fbebb28dcc0dd8f95776aa0dec00c8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/scout/zipball/46114761e835ae77e6b6b26abceb5ae63859ba98",
"reference": "46114761e835ae77e6b6b26abceb5ae63859ba98",
"url": "https://api.github.com/repos/laravel/scout/zipball/61ce79ce87fbebb28dcc0dd8f95776aa0dec00c8",
"reference": "61ce79ce87fbebb28dcc0dd8f95776aa0dec00c8",
"shasum": ""
},
"require": {
@@ -3602,7 +3602,7 @@
"issues": "https://github.com/laravel/scout/issues",
"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",
@@ -4051,16 +4051,16 @@
},
{
"name": "league/flysystem",
"version": "3.0.17",
"version": "3.0.19",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "29eb78cac0be0c22237c5e0f6f98234d97037d79"
"reference": "670df21225d68d165a8df38587ac3f41caf608f8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/29eb78cac0be0c22237c5e0f6f98234d97037d79",
"reference": "29eb78cac0be0c22237c5e0f6f98234d97037d79",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/670df21225d68d165a8df38587ac3f41caf608f8",
"reference": "670df21225d68d165a8df38587ac3f41caf608f8",
"shasum": ""
},
"require": {
@@ -4121,7 +4121,7 @@
],
"support": {
"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": [
{
@@ -4137,7 +4137,7 @@
"type": "tidelift"
}
],
"time": "2022-04-14T14:57:13+00:00"
"time": "2022-05-03T21:19:02+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
@@ -4238,16 +4238,16 @@
},
{
"name": "league/flysystem-ftp",
"version": "3.0.9",
"version": "3.0.19",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-ftp.git",
"reference": "38d829f6bbb1a5368e9bf9117273df6aaaa51938"
"reference": "aa86ee4643ae2093dac68d2821699ce686cd5689"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-ftp/zipball/38d829f6bbb1a5368e9bf9117273df6aaaa51938",
"reference": "38d829f6bbb1a5368e9bf9117273df6aaaa51938",
"url": "https://api.github.com/repos/thephpleague/flysystem-ftp/zipball/aa86ee4643ae2093dac68d2821699ce686cd5689",
"reference": "aa86ee4643ae2093dac68d2821699ce686cd5689",
"shasum": ""
},
"require": {
@@ -4282,7 +4282,7 @@
"ftpd"
],
"support": {
"source": "https://github.com/thephpleague/flysystem-ftp/tree/3.0.9"
"source": "https://github.com/thephpleague/flysystem-ftp/tree/3.0.19"
},
"funding": [
{
@@ -4298,7 +4298,7 @@
"type": "tidelift"
}
],
"time": "2022-02-22T07:15:18+00:00"
"time": "2022-05-03T21:11:18+00:00"
},
{
"name": "league/mime-type-detection",
@@ -4505,16 +4505,16 @@
},
{
"name": "makingcg/subscription",
"version": "1.0.5",
"version": "1.0.6",
"source": {
"type": "git",
"url": "git@github.com:VueFileManager/subscription.git",
"reference": "9e9e137c7e0a99cc40a46a8da64d479041a0105e"
"reference": "73ef544e3c8f9a27904c4aaa53e39dccca5a8402"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/VueFileManager/subscription/zipball/9e9e137c7e0a99cc40a46a8da64d479041a0105e",
"reference": "9e9e137c7e0a99cc40a46a8da64d479041a0105e",
"url": "https://api.github.com/repos/VueFileManager/subscription/zipball/73ef544e3c8f9a27904c4aaa53e39dccca5a8402",
"reference": "73ef544e3c8f9a27904c4aaa53e39dccca5a8402",
"shasum": ""
},
"require": {
@@ -4600,7 +4600,7 @@
"subscription"
],
"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"
},
"funding": [
@@ -4609,7 +4609,7 @@
"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",
@@ -5049,16 +5049,16 @@
},
{
"name": "nesbot/carbon",
"version": "2.57.0",
"version": "2.58.0",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
"reference": "4a54375c21eea4811dbd1149fe6b246517554e78"
"reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a54375c21eea4811dbd1149fe6b246517554e78",
"reference": "4a54375c21eea4811dbd1149fe6b246517554e78",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/97a34af22bde8d0ac20ab34b29d7bfe360902055",
"reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055",
"shasum": ""
},
"require": {
@@ -5076,7 +5076,8 @@
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^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"
},
"bin": [
@@ -5141,7 +5142,7 @@
"type": "tidelift"
}
],
"time": "2022-02-13T18:13:33+00:00"
"time": "2022-04-25T19:31:17+00:00"
},
{
"name": "netresearch/jsonmapper",
@@ -7002,16 +7003,16 @@
},
{
"name": "psy/psysh",
"version": "v0.11.2",
"version": "v0.11.4",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
"reference": "7f7da640d68b9c9fec819caae7c744a213df6514"
"reference": "05c544b339b112226ad14803e1e5b09a61957454"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/7f7da640d68b9c9fec819caae7c744a213df6514",
"reference": "7f7da640d68b9c9fec819caae7c744a213df6514",
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/05c544b339b112226ad14803e1e5b09a61957454",
"reference": "05c544b339b112226ad14803e1e5b09a61957454",
"shasum": ""
},
"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"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.2",
"hoa/console": "3.17.05.02"
"bamarni/composer-bin-plugin": "^1.2"
},
"suggest": {
"ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
"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-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."
"ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
},
"bin": [
"bin/psysh"
@@ -7074,9 +7073,9 @@
],
"support": {
"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",
@@ -9461,16 +9460,16 @@
},
{
"name": "spatie/laravel-query-builder",
"version": "5.0.1",
"version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-query-builder.git",
"reference": "2970e54b04306a6de586d23ac3e0bab994ef645a"
"reference": "fceb1e1814b117494a277b765050a3a10bfc162f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/2970e54b04306a6de586d23ac3e0bab994ef645a",
"reference": "2970e54b04306a6de586d23ac3e0bab994ef645a",
"url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/fceb1e1814b117494a277b765050a3a10bfc162f",
"reference": "fceb1e1814b117494a277b765050a3a10bfc162f",
"shasum": ""
},
"require": {
@@ -9529,7 +9528,7 @@
"type": "custom"
}
],
"time": "2022-03-18T07:44:25+00:00"
"time": "2022-04-25T07:07:24+00:00"
},
{
"name": "spatie/laravel-queueable-action",
@@ -9944,16 +9943,16 @@
},
{
"name": "stripe/stripe-php",
"version": "v7.124.0",
"version": "v7.128.0",
"source": {
"type": "git",
"url": "https://github.com/stripe/stripe-php.git",
"reference": "548e8ef08a86c6c621446082393dc6a1af51076c"
"reference": "c704949c49b72985c76cc61063aa26fefbd2724e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/548e8ef08a86c6c621446082393dc6a1af51076c",
"reference": "548e8ef08a86c6c621446082393dc6a1af51076c",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/c704949c49b72985c76cc61063aa26fefbd2724e",
"reference": "c704949c49b72985c76cc61063aa26fefbd2724e",
"shasum": ""
},
"require": {
@@ -9998,22 +9997,22 @@
],
"support": {
"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",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "70dcf7b2ca2ea08ad6ebcc475f104a024fb5632e"
"reference": "0d00aa289215353aa8746a31d101f8e60826285c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/70dcf7b2ca2ea08ad6ebcc475f104a024fb5632e",
"reference": "70dcf7b2ca2ea08ad6ebcc475f104a024fb5632e",
"url": "https://api.github.com/repos/symfony/console/zipball/0d00aa289215353aa8746a31d101f8e60826285c",
"reference": "0d00aa289215353aa8746a31d101f8e60826285c",
"shasum": ""
},
"require": {
@@ -10079,7 +10078,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.0.7"
"source": "https://github.com/symfony/console/tree/v6.0.8"
},
"funding": [
{
@@ -10095,7 +10094,7 @@
"type": "tidelift"
}
],
"time": "2022-03-31T17:18:25+00:00"
"time": "2022-04-20T15:01:42+00:00"
},
{
"name": "symfony/css-selector",
@@ -10231,16 +10230,16 @@
},
{
"name": "symfony/error-handler",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "e600c54e5b30555eecea3ffe4314e58f832e78ee"
"reference": "5e2795163acbd13b3cd46835c9f8f6c5d0a3a280"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/e600c54e5b30555eecea3ffe4314e58f832e78ee",
"reference": "e600c54e5b30555eecea3ffe4314e58f832e78ee",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/5e2795163acbd13b3cd46835c9f8f6c5d0a3a280",
"reference": "5e2795163acbd13b3cd46835c9f8f6c5d0a3a280",
"shasum": ""
},
"require": {
@@ -10282,7 +10281,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v6.0.7"
"source": "https://github.com/symfony/error-handler/tree/v6.0.8"
},
"funding": [
{
@@ -10298,7 +10297,7 @@
"type": "tidelift"
}
],
"time": "2022-03-18T16:21:55+00:00"
"time": "2022-04-12T16:11:42+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -10527,16 +10526,16 @@
},
{
"name": "symfony/finder",
"version": "v6.0.3",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "8661b74dbabc23223f38c9b99d3f8ade71170430"
"reference": "af7edab28d17caecd1f40a9219fc646ae751c21f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/8661b74dbabc23223f38c9b99d3f8ade71170430",
"reference": "8661b74dbabc23223f38c9b99d3f8ade71170430",
"url": "https://api.github.com/repos/symfony/finder/zipball/af7edab28d17caecd1f40a9219fc646ae751c21f",
"reference": "af7edab28d17caecd1f40a9219fc646ae751c21f",
"shasum": ""
},
"require": {
@@ -10568,7 +10567,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v6.0.3"
"source": "https://github.com/symfony/finder/tree/v6.0.8"
},
"funding": [
{
@@ -10584,20 +10583,20 @@
"type": "tidelift"
}
],
"time": "2022-01-26T17:23:29+00:00"
"time": "2022-04-15T08:07:58+00:00"
},
{
"name": "symfony/http-client",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
"reference": "a7930c47248b9b57e9d0b8da100ffc1e031536dc"
"reference": "d347895193283e08b4c3ebf2f2974a1df3e1f670"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/a7930c47248b9b57e9d0b8da100ffc1e031536dc",
"reference": "a7930c47248b9b57e9d0b8da100ffc1e031536dc",
"url": "https://api.github.com/repos/symfony/http-client/zipball/d347895193283e08b4c3ebf2f2974a1df3e1f670",
"reference": "d347895193283e08b4c3ebf2f2974a1df3e1f670",
"shasum": ""
},
"require": {
@@ -10652,7 +10651,7 @@
"description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-client/tree/v6.0.7"
"source": "https://github.com/symfony/http-client/tree/v6.0.8"
},
"funding": [
{
@@ -10668,7 +10667,7 @@
"type": "tidelift"
}
],
"time": "2022-04-01T12:27:43+00:00"
"time": "2022-04-12T16:11:42+00:00"
},
{
"name": "symfony/http-client-contracts",
@@ -10750,16 +10749,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "c816b26f03b6902dba79b352c84a17f53d815f0d"
"reference": "c9c86b02d7ef6f44f3154acc7de42831518afe7c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/c816b26f03b6902dba79b352c84a17f53d815f0d",
"reference": "c816b26f03b6902dba79b352c84a17f53d815f0d",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/c9c86b02d7ef6f44f3154acc7de42831518afe7c",
"reference": "c9c86b02d7ef6f44f3154acc7de42831518afe7c",
"shasum": ""
},
"require": {
@@ -10802,7 +10801,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.0.7"
"source": "https://github.com/symfony/http-foundation/tree/v6.0.8"
},
"funding": [
{
@@ -10818,20 +10817,20 @@
"type": "tidelift"
}
],
"time": "2022-03-24T14:13:59+00:00"
"time": "2022-04-22T08:18:02+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "9c03dab07a6aa336ffaadc15352b1d14f4ce01f5"
"reference": "7aaf1cdc9cc2ad47e926f624efcb679883a39ca7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/9c03dab07a6aa336ffaadc15352b1d14f4ce01f5",
"reference": "9c03dab07a6aa336ffaadc15352b1d14f4ce01f5",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/7aaf1cdc9cc2ad47e926f624efcb679883a39ca7",
"reference": "7aaf1cdc9cc2ad47e926f624efcb679883a39ca7",
"shasum": ""
},
"require": {
@@ -10911,7 +10910,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.0.7"
"source": "https://github.com/symfony/http-kernel/tree/v6.0.8"
},
"funding": [
{
@@ -10927,20 +10926,20 @@
"type": "tidelift"
}
],
"time": "2022-04-02T06:35:11+00:00"
"time": "2022-04-27T17:26:02+00:00"
},
{
"name": "symfony/mailer",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
"reference": "f7343f94e7afecca2ad840b078f9d80200e1bd27"
"reference": "706af6b3e99ebcbc639c9c664f5579aaa869409b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/f7343f94e7afecca2ad840b078f9d80200e1bd27",
"reference": "f7343f94e7afecca2ad840b078f9d80200e1bd27",
"url": "https://api.github.com/repos/symfony/mailer/zipball/706af6b3e99ebcbc639c9c664f5579aaa869409b",
"reference": "706af6b3e99ebcbc639c9c664f5579aaa869409b",
"shasum": ""
},
"require": {
@@ -10985,7 +10984,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/mailer/tree/v6.0.7"
"source": "https://github.com/symfony/mailer/tree/v6.0.8"
},
"funding": [
{
@@ -11001,7 +11000,7 @@
"type": "tidelift"
}
],
"time": "2022-03-18T16:06:28+00:00"
"time": "2022-04-27T17:10:30+00:00"
},
{
"name": "symfony/mailgun-mailer",
@@ -11070,16 +11069,16 @@
},
{
"name": "symfony/mime",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "74266e396f812a2301536397a6360b6e6913c0d8"
"reference": "c1701e88ad0ca49fc6ad6cdf360bc0e1209fb5e1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/74266e396f812a2301536397a6360b6e6913c0d8",
"reference": "74266e396f812a2301536397a6360b6e6913c0d8",
"url": "https://api.github.com/repos/symfony/mime/zipball/c1701e88ad0ca49fc6ad6cdf360bc0e1209fb5e1",
"reference": "c1701e88ad0ca49fc6ad6cdf360bc0e1209fb5e1",
"shasum": ""
},
"require": {
@@ -11131,7 +11130,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v6.0.7"
"source": "https://github.com/symfony/mime/tree/v6.0.8"
},
"funding": [
{
@@ -11147,7 +11146,7 @@
"type": "tidelift"
}
],
"time": "2022-03-13T20:10:05+00:00"
"time": "2022-04-12T16:11:42+00:00"
},
{
"name": "symfony/options-resolver",
@@ -11938,16 +11937,16 @@
},
{
"name": "symfony/process",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "e13f6757e267d687e20ec5b26ccfcbbe511cd8f4"
"reference": "d074154ea8b1443a96391f6e39f9e547b2dd01b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/e13f6757e267d687e20ec5b26ccfcbbe511cd8f4",
"reference": "e13f6757e267d687e20ec5b26ccfcbbe511cd8f4",
"url": "https://api.github.com/repos/symfony/process/zipball/d074154ea8b1443a96391f6e39f9e547b2dd01b9",
"reference": "d074154ea8b1443a96391f6e39f9e547b2dd01b9",
"shasum": ""
},
"require": {
@@ -11979,7 +11978,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v6.0.7"
"source": "https://github.com/symfony/process/tree/v6.0.8"
},
"funding": [
{
@@ -11995,7 +11994,7 @@
"type": "tidelift"
}
],
"time": "2022-03-18T16:21:55+00:00"
"time": "2022-04-12T16:11:42+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
@@ -12087,16 +12086,16 @@
},
{
"name": "symfony/routing",
"version": "v6.0.5",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
"reference": "a738b152426ac7fcb94bdab8188264652238bef1"
"reference": "74c40c9fc334acc601a32fcf4274e74fb3bac11e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/a738b152426ac7fcb94bdab8188264652238bef1",
"reference": "a738b152426ac7fcb94bdab8188264652238bef1",
"url": "https://api.github.com/repos/symfony/routing/zipball/74c40c9fc334acc601a32fcf4274e74fb3bac11e",
"reference": "74c40c9fc334acc601a32fcf4274e74fb3bac11e",
"shasum": ""
},
"require": {
@@ -12155,7 +12154,7 @@
"url"
],
"support": {
"source": "https://github.com/symfony/routing/tree/v6.0.5"
"source": "https://github.com/symfony/routing/tree/v6.0.8"
},
"funding": [
{
@@ -12171,7 +12170,7 @@
"type": "tidelift"
}
],
"time": "2022-01-31T19:46:53+00:00"
"time": "2022-04-22T08:18:02+00:00"
},
{
"name": "symfony/service-contracts",
@@ -12319,16 +12318,16 @@
},
{
"name": "symfony/string",
"version": "v6.0.3",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2"
"reference": "ac0aa5c2282e0de624c175b68d13f2c8f2e2649d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2",
"reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2",
"url": "https://api.github.com/repos/symfony/string/zipball/ac0aa5c2282e0de624c175b68d13f2c8f2e2649d",
"reference": "ac0aa5c2282e0de624c175b68d13f2c8f2e2649d",
"shasum": ""
},
"require": {
@@ -12384,7 +12383,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v6.0.3"
"source": "https://github.com/symfony/string/tree/v6.0.8"
},
"funding": [
{
@@ -12400,20 +12399,20 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:55:41+00:00"
"time": "2022-04-22T08:18:02+00:00"
},
{
"name": "symfony/translation",
"version": "v6.0.7",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1"
"reference": "3d38cf8f8834148c4457681d539bc204de701501"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1",
"reference": "b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1",
"url": "https://api.github.com/repos/symfony/translation/zipball/3d38cf8f8834148c4457681d539bc204de701501",
"reference": "3d38cf8f8834148c4457681d539bc204de701501",
"shasum": ""
},
"require": {
@@ -12479,7 +12478,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v6.0.7"
"source": "https://github.com/symfony/translation/tree/v6.0.8"
},
"funding": [
{
@@ -12495,7 +12494,7 @@
"type": "tidelift"
}
],
"time": "2022-03-31T17:18:25+00:00"
"time": "2022-04-22T08:18:02+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -12577,16 +12576,16 @@
},
{
"name": "symfony/var-dumper",
"version": "v6.0.6",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "38358405ae948963c50a3aae3dfea598223ba15e"
"reference": "fa61dfb4bd3068df2492013dc65f3190e9f550c0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/38358405ae948963c50a3aae3dfea598223ba15e",
"reference": "38358405ae948963c50a3aae3dfea598223ba15e",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/fa61dfb4bd3068df2492013dc65f3190e9f550c0",
"reference": "fa61dfb4bd3068df2492013dc65f3190e9f550c0",
"shasum": ""
},
"require": {
@@ -12645,7 +12644,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.0.6"
"source": "https://github.com/symfony/var-dumper/tree/v6.0.8"
},
"funding": [
{
@@ -12661,7 +12660,7 @@
"type": "tidelift"
}
],
"time": "2022-03-02T12:58:14+00:00"
"time": "2022-04-26T13:22:23+00:00"
},
{
"name": "teamtnt/laravel-scout-tntsearch-driver",
@@ -12916,16 +12915,16 @@
},
{
"name": "vimeo/psalm",
"version": "4.22.0",
"version": "4.23.0",
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
"reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703"
"reference": "f1fe6ff483bf325c803df9f510d09a03fd796f88"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/fc2c6ab4d5fa5d644d8617089f012f3bb84b8703",
"reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/f1fe6ff483bf325c803df9f510d09a03fd796f88",
"reference": "f1fe6ff483bf325c803df9f510d09a03fd796f88",
"shasum": ""
},
"require": {
@@ -12950,6 +12949,7 @@
"php": "^7.1|^8",
"sebastian/diff": "^3.0 || ^4.0",
"symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0",
"symfony/polyfill-php80": "^1.25",
"webmozart/path-util": "^2.3"
},
"provide": {
@@ -13016,9 +13016,9 @@
],
"support": {
"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",
@@ -14581,16 +14581,16 @@
},
{
"name": "spatie/ignition",
"version": "1.2.7",
"version": "1.2.9",
"source": {
"type": "git",
"url": "https://github.com/spatie/ignition.git",
"reference": "2f059cf42b48f7c522efbba1c05ad59fc2c1a3f2"
"reference": "db25202fab2d5c14613b8914a1bb374998bbf870"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/ignition/zipball/2f059cf42b48f7c522efbba1c05ad59fc2c1a3f2",
"reference": "2f059cf42b48f7c522efbba1c05ad59fc2c1a3f2",
"url": "https://api.github.com/repos/spatie/ignition/zipball/db25202fab2d5c14613b8914a1bb374998bbf870",
"reference": "db25202fab2d5c14613b8914a1bb374998bbf870",
"shasum": ""
},
"require": {
@@ -14647,20 +14647,20 @@
"type": "github"
}
],
"time": "2022-03-29T08:48:34+00:00"
"time": "2022-04-23T20:37:21+00:00"
},
{
"name": "spatie/laravel-ignition",
"version": "1.2.2",
"version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-ignition.git",
"reference": "924d1ae878874ad0bb49f63b69a9af759a34ee78"
"reference": "51e5daaa7e43c154fe57f1ddfbba862f9fe57646"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/924d1ae878874ad0bb49f63b69a9af759a34ee78",
"reference": "924d1ae878874ad0bb49f63b69a9af759a34ee78",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/51e5daaa7e43c154fe57f1ddfbba862f9fe57646",
"reference": "51e5daaa7e43c154fe57f1ddfbba862f9fe57646",
"shasum": ""
},
"require": {
@@ -14737,7 +14737,7 @@
"type": "github"
}
],
"time": "2022-04-14T18:04:51+00:00"
"time": "2022-05-05T15:53:24+00:00"
},
{
"name": "symfony/polyfill-php73",
+7 -6
View File
@@ -39,12 +39,13 @@ return [
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key' => env('S3_ACCESS_KEY_ID'),
'secret' => env('S3_SECRET_ACCESS_KEY'),
'region' => env('S3_DEFAULT_REGION'),
'bucket' => env('S3_BUCKET'),
'endpoint' => env('S3_URL'),
'driver' => 's3',
'key' => env('S3_ACCESS_KEY_ID'),
'secret' => env('S3_SECRET_ACCESS_KEY'),
'region' => env('S3_DEFAULT_REGION'),
'bucket' => env('S3_BUCKET'),
'endpoint' => env('S3_URL'),
'visibility' => 'private',
],
'ftp' => [
'driver' => 'ftp',
+5 -1
View File
@@ -263,6 +263,10 @@ return [
'Description' => 'description',
'description' => 'description',
'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' => [
'type' => 'Type',
@@ -821,7 +825,7 @@ return [
'allow_homepage' => 'Allow Homepage',
'allow_homepage_note' => 'When this is turned on, your visitors can visit your default homepage.',
'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.',
'login_and_registration' => 'Login & Registration',
'account' => 'Account',
+1 -1
View File
@@ -45,7 +45,7 @@ return [
'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'redirect' => env('APP_URL') . '/socialite/facebook/callback',
'redirect' => env('APP_URL') . '/socialite/facebook/callback/',
],
'recaptcha' => [
+2 -1
View File
@@ -1,7 +1,7 @@
<?php
return [
'version' => '2.1.0.1',
'version' => '2.1.3',
'is_demo' => env('APP_DEMO', false),
@@ -68,5 +68,6 @@ return [
'2_0_14',
'2_0_16',
'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
})
}
// Go to sign in page if homepage is disabled
if (!this.$root.$data.config.allowHomepage && window.location.pathname === '/') {
this.$router.push({ name: 'SignIn' })
}
},
created() {
if (this.$isWindows()) {
@@ -6,7 +6,7 @@
'grid-view-sidebar': itemViewType === 'grid' && isVisibleSidebar,
}"
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"
@dragover="dragEnter"
@dragleave="dragLeave"
@@ -62,9 +62,7 @@ export default {
this.$store.dispatch('deleteItem')
}
},
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder.data.id)
dragStop() {
this.isDragging = false
},
dragEnter() {
@@ -1,13 +1,27 @@
<template>
<transition name="popup">
<div class="popup" v-if="processingPopup">
<div class="popup-wrapper">
<div class="popup-content">
<div class="spinner-wrapper">
<Spinner />
<div
v-if="processingPopup"
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="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>
<h1 class="title">{{ processingPopup.title }}</h1>
<p class="message">{{ processingPopup.message }}</p>
</div>
</div>
</div>
@@ -17,10 +31,12 @@
<script>
import Spinner from '../UI/Others/Spinner'
import { mapGetters } from 'vuex'
import PopupWrapper from './Components/PopupWrapper'
export default {
name: 'ProcessingPopup',
components: {
PopupWrapper,
Spinner,
},
computed: {
@@ -28,107 +44,3 @@ export default {
},
}
</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({
message: payload.message[key],
isVisibleBar: item.total !== -1,
isVisibleBar: item.total !== -1 && item.total !== 0,
distribution: [
{
progress: item.percentage,
@@ -4,7 +4,7 @@
'bg-light-background dark:bg-dark-foreground': isClicked && 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"
spellcheck="false"
>
@@ -77,7 +77,7 @@
<!--Item Title-->
<span
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"
@input="renameItem"
@keydown.delete.stop
@@ -4,7 +4,7 @@
'bg-light-background dark:bg-dark-foreground': isClicked && 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"
spellcheck="false"
>
@@ -55,7 +55,7 @@
<!--Item Title-->
<span
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"
ref="name"
@input="renameItem"
@@ -9,8 +9,6 @@
}"
class="chart-wrapper"
>
<!--<DotLabel class="label" :class="{'offset-top': chart.progress < 5}" :color="chart.color" :title="chart.value" />-->
<!--Only singe line-->
<span
v-if="data.length === 1"
+8 -2
View File
@@ -169,7 +169,7 @@ const FunctionHelpers = {
})
// 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
store.commit('INCREASE_FILES_IN_QUEUES_TOTAL', files.length)
@@ -177,7 +177,7 @@ const FunctionHelpers = {
Vue.prototype.$uploadDraggedFiles = async function (event, parent_id) {
// 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()
return
@@ -427,6 +427,12 @@ const FunctionHelpers = {
}
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 = {
RequestUpload: {name: 'RequestUpload', 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,
},
},
{
name: 'Demo',
path: '/demo',
component: () => import(/* webpackChunkName: "chunks/demo" */ '../views/Demo'),
meta: {
requiresAuth: false,
},
},
]
export default routesIndex
+3 -1
View File
@@ -114,7 +114,7 @@ const actions = {
})
.catch((error) => {
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'),
})
})
@@ -179,6 +179,8 @@ const actions = {
if (response.data.data.id) {
commit('PROCESSING_FILE', false)
commit('INCREASE_FOLDER_ITEM', response.data.data.attributes.parent_id)
// Remove first file 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(() => {
commit('PROCESSING_POPUP', {
@@ -50,7 +50,11 @@ const actions = {
commit('DESTROY_DATA')
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) => {
+3
View File
@@ -15,6 +15,7 @@
<!--ConfirmPopup Popup-->
<ConfirmPopup />
<ProcessingPopup />
<!-- Create language popup -->
<CreateLanguage />
@@ -88,6 +89,7 @@ import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRe
import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup";
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
import ProcessingPopup from "../components/Popups/ProcessingPopup";
export default {
name: 'Admin',
@@ -192,6 +194,7 @@ export default {
},
},
components: {
ProcessingPopup,
RemoteUploadPopup,
NotificationsPopup,
CreateTeamFolderPopup,
@@ -12,7 +12,7 @@
:is-last="true"
>
<SwitchInput
@input="$updateText('/admin/settings', 'allowed_payments', allowedPayments)"
@input="updateAllowedPayments"
v-model="allowedPayments"
:state="allowedPayments"
/>
@@ -280,6 +280,17 @@
<FormLabel v-if="!paystack.isConfigured" icon="shield">
{{ $t('configure_your_credentials') }}
</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
tag="div"
mode="passive"
@@ -297,17 +308,6 @@
/>
</AppInputText>
</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
:disabled="isLoading"
@@ -623,16 +623,33 @@ export default {
})
})
.catch((error) => {
if (error.response.status === 500) {
this.isError = true
this.errorMessage = error.response.data.message
}
if ([401, 500].includes(error.response.status)) {
events.$emit('alert:open', {
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))
},
getWebhookEndpoint(service) {
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() {
// Set payment description
+35
View File
@@ -9,6 +9,9 @@
{{ $t('create_plan') }}
</MobileActionButton>
</router-link>
<MobileActionButton @click.native="synchronizePlans" icon="refresh">
{{ $t('synchronize_plans') }}
</MobileActionButton>
</div>
<!--Datatable-->
@@ -202,6 +205,7 @@ import ButtonBase from '../../components/UI/Buttons/ButtonBase'
import ColorLabel from '../../components/UI/Labels/ColorLabel'
import { Trash2Icon, Edit2Icon } from 'vue-feather-icons'
import { mapGetters } from 'vuex'
import {events} from "../../bus";
export default {
name: 'Plans',
@@ -296,5 +300,36 @@ export default {
}[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>
@@ -134,7 +134,7 @@
v-model="plan.features.max_team_members"
:placeholder="$t('add_max_team_members')"
type="number"
min="1"
min="-1"
max="999999999"
:class="{ '!border-rose-600': errors[0] }"
class="focus-border-theme input-dark"
@@ -357,6 +357,10 @@ export default {
},
methods: {
getCallbackEndpoint(service) {
if (service === 'facebook') {
return `${this.config.host}/socialite/${service}/callback/`
}
return `${this.config.host}/socialite/${service}/callback`
},
async storeCredentials(service) {
+12 -5
View File
@@ -1,5 +1,5 @@
<template>
<AuthContentWrapper ref="auth" class="h-screen">
<AuthContentWrapper v-if="isVisible" ref="auth" class="h-screen">
<!--Log In by Email-->
<AuthContent name="log-in" :visible="true">
<Headline :title="$t('welcome_back')" :description="$t('page_login.subtitle')" />
@@ -256,6 +256,7 @@ export default {
},
data() {
return {
isVisible: false,
isLoading: false,
validSignIn: false,
checkedAccount: undefined,
@@ -443,14 +444,20 @@ export default {
}
},
},
created() {
this.$scrollTop()
this.$store.commit('PROCESSING_POPUP', undefined)
mounted() {
// Redirect if user is authenticated
if (this.$root.$data.config.isAuthenticated) {
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) {
this.loginEmail = 'howdy@hi5ve.digital'
+6
View File
@@ -256,6 +256,12 @@ export default {
'Your New Password': error.response.data.errors['password'],
})
}
if (error.response.data.errors['reCaptcha']) {
events.$emit('alert:open', {
title: error.response.data.message,
})
}
}
})
.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() {
if (!this.config.allowHomepage) this.$router.push({ name: 'SignIn' })
// Get page content
axios
.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>
<!--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" />
<InfoSidebar v-if="isVisibleSidebar" />
@@ -110,7 +110,7 @@ export default {
DragUI,
},
computed: {
...mapGetters(['isVisibleSidebar', 'isLimitedUser', 'config']),
...mapGetters(['isVisibleSidebar', 'isLimitedUser', 'config', 'currentFolder']),
},
data() {
return {
@@ -118,6 +118,9 @@ export default {
}
},
methods: {
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder?.data.id)
},
contextMenu(event, item) {
events.$emit('context-menu:show', event, item)
},
+4 -5
View File
@@ -82,7 +82,7 @@
<input
v-model="databaseCredentials.name"
class="focus-border-theme input-dark"
placeholder="Select your database name"
placeholder="Type your database name"
type="text"
:class="{ '!border-rose-600': errors[0] }"
/>
@@ -100,7 +100,7 @@
<input
v-model="databaseCredentials.username"
class="focus-border-theme input-dark"
placeholder="Select your database name"
placeholder="Type your database name"
type="text"
:class="{ '!border-rose-600': errors[0] }"
/>
@@ -111,14 +111,13 @@
tag="div"
mode="passive"
name="Database Password"
rules="required"
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
v-model="databaseCredentials.password"
class="focus-border-theme input-dark"
placeholder="Select your database password"
placeholder="Type your database password"
type="text"
:class="{ '!border-rose-600': errors[0] }"
/>
@@ -15,7 +15,7 @@
<a href="https://codecanyon.net/item/vue-file-manager-with-laravel-backend/25815986">
<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>
</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>
<!--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" />
<InfoSidebar v-if="isVisibleSidebar" />
@@ -87,7 +87,7 @@ export default {
Alert,
},
computed: {
...mapGetters(['isVisibleSidebar', 'sharedDetail', 'config']),
...mapGetters(['isVisibleSidebar', 'sharedDetail', 'config', 'currentFolder']),
},
data() {
return {
@@ -95,6 +95,9 @@ export default {
}
},
methods: {
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder?.data.id)
},
contextMenu(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>
<!--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" />
<InfoSidebarUploadRequest v-if="canShowUI && isVisibleSidebar" />
@@ -76,7 +76,7 @@ export default {
DragUI,
},
computed: {
...mapGetters(['isVisibleSidebar', 'config', 'uploadRequest', 'fileQueue']),
...mapGetters(['isVisibleSidebar', 'config', 'uploadRequest', 'fileQueue', 'currentFolder']),
canShowUI() {
return (this.uploadRequest && this.uploadRequest.data.attributes.status === 'filling') || this.fileQueue.length > 0
}
@@ -87,6 +87,9 @@ export default {
}
},
methods: {
uploadDroppedItems(event) {
this.$uploadDraggedFiles(event, this.currentFolder?.data.id)
},
contextMenu(event, item) {
events.$emit('context-menu:show', event, item)
},
+30 -4
View File
@@ -1,8 +1,34 @@
@php
use Monolog\Handler\MissingExtensionException;
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
use VueFileManager\Subscription\Domain\Transactions\Models\Transaction;
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 {
// Subscription
$isEmptySubscriptions = Subscription::count() === 0;
@@ -98,11 +124,11 @@
storageLimit: {{ $settings->storage_limitation ?? 1 }},
teamsDefaultMembers: {{ $settings->default_max_team_member ?? 10 }},
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}}',
uploadLimit: {{ isset($settings->upload_limit) ? format_bytes($settings->upload_limit) : 'undefined' }},
uploadLimitFormatted: '{{ isset($settings->upload_limit) ? format_megabytes($settings->upload_limit) : null }}',
chunkSize: {{ isset($settings->chunk_size) ? format_bytes($settings->chunk_size) : format_bytes(64) }},
uploadLimit: {{ $uploadLimit }},
uploadLimitFormatted: '{{ $uploadLimitFormatted }}',
chunkSize: {{ $chunkSize }},
isAuthenticated: {{ $isUser ? 1 : 0 }},
isSaaS: {{ $settings && optional($settings)->license === 'extended' ? 1 : 0 }},
@@ -23,7 +23,7 @@ class SetupWebsocketEnvironment extends Command
public function handle(): void
{
// 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
setEnvironmentValue([
+6 -1
View File
@@ -94,10 +94,15 @@ class UserLimitation extends Model
$totalUsedEmails = $memberEmails->merge($InvitationEmails)
->unique();
// Get usage in percent
$percentage = (int) $this->max_team_members === 0
? 100
: ($totalUsedEmails->count() / $this->max_team_members) * 100;
return [
'use' => $totalUsedEmails->count(),
'total' => (int) $this->max_team_members,
'percentage' => ($totalUsedEmails->count() / $this->max_team_members) * 100,
'percentage' => $percentage,
'meta' => [
'allowed_emails' => $totalUsedEmails,
],
+36 -25
View File
@@ -2,11 +2,11 @@
namespace Domain\Files\Actions;
use App\Users\Models\User;
use Illuminate\Support\Str;
use Domain\Files\Models\File;
use Illuminate\Support\Facades\Storage;
use Domain\Files\Requests\UploadRequest;
use Domain\Traffic\Actions\RecordUploadAction;
use League\Flysystem\UnableToRetrieveMetadata;
class ProcessFileAction
{
@@ -26,19 +26,29 @@ class ProcessFileAction
public function __invoke(
UploadRequest $request,
User $user,
string $chunkPath,
) {
string $name,
): File {
// Get local disk instance
$localDisk = Storage::disk('local');
// Get file data
$size = $localDisk->size($chunkPath);
$mimetype = $localDisk->mimeType($chunkPath);
$name = Str::uuid() . '.' . $request->input('extension');
// Get file path
$filePath = "files/$user->id/$name";
// Get upload limit
// Get file size
$size = $localDisk->size($filePath);
// Get upload limit size
$uploadLimit = get_settings('upload_limit');
// Get mimetype
try {
$fileType = getFileType(
$localDisk->mimeType($filePath)
);
} catch (UnableToRetrieveMetadata $e) {
$fileType = 'file';
}
// File size handling
if ($uploadLimit && $size > format_bytes($uploadLimit)) {
abort(413);
@@ -47,26 +57,24 @@ class ProcessFileAction
// Check if user has enough space to upload file
if (! $user->canUpload($size)) {
// Delete file from chunk directory
$localDisk->delete($chunkPath);
// Set up response
$response = response([
'type' => 'error',
'message' => __t('user_action_not_allowed'),
], 401);
$localDisk->delete($filePath);
// Abort code
abort($response);
abort(
response([
'type' => 'error',
'message' => __t('user_action_not_allowed'),
], 401)
);
}
// Move file to user directory
$localDisk->move($chunkPath, "files/$user->id/$name");
if ($fileType === 'image') {
// Create multiple image thumbnails
($this->createImageThumbnail)($name, $user->id);
// Create multiple image thumbnails
($this->createImageThumbnail)($name, $user->id);
// Store exif data if exists
$exif = ($this->storeExifData)("files/$user->id/$name");
// Store exif data if exists
$exif = ($this->storeExifData)($filePath);
}
// Move file to external storage
match (config('filesystems.default')) {
@@ -78,7 +86,7 @@ class ProcessFileAction
// Create new file
$file = File::create([
'mimetype' => $request->input('extension'),
'type' => getFileType($mimetype),
'type' => $fileType,
'parent_id' => ($this->getFileParentId)($request, $user->id),
'name' => $request->input('name'),
'basename' => $name,
@@ -88,7 +96,10 @@ class ProcessFileAction
]);
// 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 $file;
@@ -1,7 +1,6 @@
<?php
namespace Domain\Files\Actions;
use Log;
use Str;
use Storage;
use Exception;
@@ -31,7 +30,7 @@ class StoreExifDataAction
$exif = json_decode(json_encode($exifRaw));
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,
'artist' => $exif->OwnerName ?? null,
'width' => $exif->COMPUTED->Width ?? null,
@@ -53,8 +52,6 @@ class StoreExifDataAction
'latitude_ref' => $exif->GPSLatitudeRef ?? null,
]);
} catch (Exception $error) {
Log::error('Unable to get exif data');
return null;
}
}
@@ -1,6 +1,8 @@
<?php
namespace Domain\Files\Controllers;
use Storage;
use Illuminate\Support\Str;
use Domain\Folders\Models\Folder;
use App\Http\Controllers\Controller;
use Domain\Files\Requests\UploadRequest;
@@ -42,8 +44,14 @@ class UploadFileController extends Controller
->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
$file = ($this->processFie)($request, $user, $chunkPath);
$file = ($this->processFie)($request, $user, $name);
return response(new FileResource($file), 201);
}
@@ -1,6 +1,8 @@
<?php
namespace Domain\Files\Controllers;
use Str;
use Storage;
use Domain\Sharing\Models\Share;
use App\Http\Controllers\Controller;
use Domain\Files\Requests\UploadRequest;
@@ -53,8 +55,14 @@ class VisitorUploadFileController extends Controller
// Proceed after last chunk
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
$file = ($this->processFie)($request, $shared->user, $chunkPath);
$file = ($this->processFie)($request, $shared->user, $name);
// Set public access url
$file->setSharedPublicUrl($shared->token);
@@ -2,6 +2,7 @@
namespace Domain\Localization\Actions;
use DB;
use Artisan;
class UpdateLanguageTranslationsAction
{
@@ -10,9 +11,11 @@ class UpdateLanguageTranslationsAction
collect($list)
->each(
fn (...$item) => DB::table('language_translations')
->where('lang', 'en')
->where('key', $item[1])
->update(['value' => $item[0]])
->where('lang', 'en')
->where('key', $item[1])
->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_HOST' => '',
'PUSHER_APP_PORT' => '',
'PUSHER_APP_TLS' => true,
'PUSHER_APP_TLS' => 'true',
],
'native' => [
'BROADCAST_DRIVER' => 'pusher',
@@ -4,10 +4,20 @@ namespace Domain\Settings\Controllers;
use Artisan;
use Illuminate\Http\Response;
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;
class StorePaymentServiceCredentialsController
{
public function __construct(
public TestPaystackConnectionAction $testPaystackConnection,
public TestStripeConnectionAction $testStripeConnection,
public TestPayPalConnectionAction $testPayPalConnection,
) {
}
/**
* Configure stripe additionally
*/
@@ -43,6 +53,26 @@ class StorePaymentServiceCredentialsController
// Get and store credentials
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 = [
'stripe' => [
'STRIPE_PUBLIC_KEY' => $request->input('key'),
@@ -27,7 +27,7 @@ class StoreDatabaseCredentialsController extends Controller
'port' => $request->input('port'),
'database' => $request->input('name'),
'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_DATABASE' => $request->input('name'),
'DB_USERNAME' => $request->input('username'),
'DB_PASSWORD' => $request->input('password'),
'DB_PASSWORD' => $request->input('password') ?? '',
]);
Artisan::call('config:cache');
@@ -92,7 +92,7 @@ class StoreEnvironmentSettingsController extends Controller
'PUSHER_APP_CLUSTER' => $request->input('broadcast.cluster'),
'PUSHER_APP_HOST' => '',
'PUSHER_APP_PORT' => '',
'PUSHER_APP_TLS' => true,
'PUSHER_APP_TLS' => 'true',
],
'native' => [
'BROADCAST_DRIVER' => 'pusher',
@@ -28,7 +28,7 @@ class StoreDatabaseCredentialsRequest extends FormRequest
'port' => 'required|string',
'name' => 'required|string',
'username' => 'required|string',
'password' => 'required|string',
'password' => 'nullable|sometimes|string',
];
}
}
@@ -2,6 +2,8 @@
namespace Domain\UploadRequest\Controllers;
use DB;
use Storage;
use Illuminate\Support\Str;
use Domain\Folders\Models\Folder;
use Domain\Files\Resources\FileResource;
use Domain\Files\Actions\ProcessFileAction;
@@ -40,8 +42,14 @@ class UploadFilesForUploadRequestController
// Proceed after last chunk
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
$file = ($this->processFie)($request, $uploadRequest->user, $chunkPath);
$file = ($this->processFie)($request, $uploadRequest->user, $name);
// Set public access url
$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
{
($this->upgradeDatabase)();
+2 -2
View File
@@ -236,9 +236,9 @@ if (! function_exists('setEnvironmentValue')) {
if ($keyPosition) {
$endOfLinePosition = strpos($str, "\n", $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
$str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
$str = str_replace($oldLine, "{$envKey}=\"{$envValue}\"", $str);
} else {
$str .= "\n$envKey=$envValue";
$str .= "\n$envKey=\"$envValue\"";
}
}
}