diff --git a/app/Console/Commands/SetupDevEnvironment.php b/app/Console/Commands/SetupDevEnvironment.php index d601ba2d..d2bfbe8f 100644 --- a/app/Console/Commands/SetupDevEnvironment.php +++ b/app/Console/Commands/SetupDevEnvironment.php @@ -11,6 +11,7 @@ use App\Models\Setting; use App\Models\User; use Illuminate\Console\Command; use Faker; +use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; class SetupDevEnvironment extends Command @@ -114,7 +115,7 @@ class SetupDevEnvironment extends Command 'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']), ]); - \File::copy(storage_path("demo/avatars/avatar-01.png"), storage_path("app/avatars/avatar-01.png")); + Storage::putFileAs("avatars", storage_path("demo/avatars/avatar-01.png"), 'avatar-01.png', "private"); // Show user credentials $this->info('Default admin account created. Email: howdy@hi5ve.digital and Password: vuefilemanager'); @@ -155,7 +156,7 @@ class SetupDevEnvironment extends Command 'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']), ]); - \File::copy(storage_path("demo/avatars/{$user['avatar']}"), storage_path("app/avatars/{$user['avatar']}")); + Storage::putFileAs("avatars", storage_path("demo/avatars/{$user['avatar']}"), $user['avatar'], "private"); $this->info("Generated user with email: $newbie->email and Password: vuefilemanager"); }); @@ -378,7 +379,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file['basename']; // Copy file into app storage - \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, "private"); // Create file record File::create([ @@ -422,7 +423,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file['basename']; // Copy file into app storage - \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, "private"); // Create file record File::create([ @@ -456,7 +457,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file['basename']; // Copy file into app storage - \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, "private"); // Create file record File::create([ @@ -515,7 +516,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file['basename']; // Copy file into app storage - \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, "private"); // Create file record File::create([ @@ -543,7 +544,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file; // Copy file into app storage - \File::copy(storage_path("demo/video/$file"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/video/$file"), $basename, "private"); // Create file record File::create([ @@ -568,7 +569,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file; // Copy file into app storage - \File::copy(storage_path("demo/video/$file"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/video/$file"), $basename, "private"); // Create file record File::create([ @@ -593,7 +594,7 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file; // Copy file into app storage - \File::copy(storage_path("demo/audio/$file"), storage_path("app/files/$user->id/$basename")); + Storage::putFileAs("files/$user->id", storage_path("demo/audio/$file"), $basename, "private"); // Create file record File::create([ @@ -629,9 +630,8 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file; // Copy file into app storage - \File::copy(storage_path("demo/images/memes/$file"), storage_path("app/files/$user->id/$basename")); - - $this->info("Creating thumbnail for image: $file"); + Storage::putFileAs("files/$user->id", storage_path("demo/images/memes/$file"), $basename, "private"); + Storage::putFileAs("files/$user->id", storage_path("demo/images/memes/thumbnail-$file"), "thumbnail-$basename", "private"); // Create file record File::create([ @@ -643,7 +643,7 @@ class SetupDevEnvironment extends Command 'author' => 'user', 'mimetype' => 'jpg', 'filesize' => rand(1000000, 4000000), - 'thumbnail' => $this->helper->create_image_thumbnail("files/$user->id/$basename", $file, $user->id), + 'thumbnail' => "thumbnail-$basename", 'created_at' => now()->subMinutes(rand(1, 5)), ]); }); @@ -663,9 +663,8 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file; // Copy file into app storage - \File::copy(storage_path("demo/images/apartments/$file"), storage_path("app/files/$user->id/$basename")); - - $this->info("Creating thumbnail for image: $file"); + Storage::putFileAs("files/$user->id", storage_path("demo/images/apartments/$file"), $basename, "private"); + Storage::putFileAs("files/$user->id", storage_path("demo/images/apartments/thumbnail-$file"), "thumbnail-$basename", "private"); // Create file record File::create([ @@ -677,7 +676,7 @@ class SetupDevEnvironment extends Command 'author' => 'user', 'mimetype' => 'jpg', 'filesize' => rand(1000000, 4000000), - 'thumbnail' => $this->helper->create_image_thumbnail("files/$user->id/$basename", $file, $user->id), + 'thumbnail' => "thumbnail-$basename", 'created_at' => now()->subMinutes(rand(1, 5)), ]); }); @@ -701,9 +700,8 @@ class SetupDevEnvironment extends Command $basename = Str::random(12) . '-' . $file; // Copy file into app storage - \File::copy(storage_path("demo/images/nature/$file"), storage_path("app/files/$user->id/$basename")); - - $this->info("Creating thumbnail for image: $file"); + Storage::putFileAs("files/$user->id", storage_path("demo/images/nature/$file"), $basename, "private"); + Storage::putFileAs("files/$user->id", storage_path("demo/images/nature/thumbnail-$file"), "thumbnail-$basename", "private"); // Create file record File::create([ @@ -715,7 +713,7 @@ class SetupDevEnvironment extends Command 'author' => 'user', 'mimetype' => 'jpg', 'filesize' => rand(1000000, 4000000), - 'thumbnail' => $this->helper->create_image_thumbnail("files/$user->id/$basename", $file, $user->id), + 'thumbnail' => "thumbnail-$basename", 'created_at' => now()->subMinutes(rand(1, 5)), ]); }); @@ -878,7 +876,7 @@ class SetupDevEnvironment extends Command // Get system images collect(['logo.svg', 'logo-horizontal.svg', 'favicon.png', 'og-image.jpg', 'touch-icon.png']) ->each(function ($file) { - \File::copy(storage_path("demo/app/$file"), storage_path("app/system/$file")); + Storage::putFileAs("system", storage_path("demo/app/$file"), $file, "private"); }); } diff --git a/app/Http/Controllers/Sharing/BrowseShareController.php b/app/Http/Controllers/Sharing/BrowseShareController.php index e38696b4..6f1df3b5 100644 --- a/app/Http/Controllers/Sharing/BrowseShareController.php +++ b/app/Http/Controllers/Sharing/BrowseShareController.php @@ -43,16 +43,19 @@ class BrowseShareController extends Controller $image = File::whereUserId($shared->user_id) ->whereType('image') ->whereId($shared->item_id) - ->firstOrFail(); + ->first(); - // Store user download size - $shared - ->user - ->record_download( - (int)$image->getRawOriginal('filesize') - ); + if ($image) { - return $this->get_single_image($image, $shared->user_id); + // Store user download size + $shared + ->user + ->record_download( + (int)$image->getRawOriginal('filesize') + ); + + return $this->get_single_image($image, $shared->user_id); + } } return view("index") diff --git a/app/Http/Resources/InvoiceAdminResource.php b/app/Http/Resources/InvoiceAdminResource.php index fb20fb3a..d6b8d1c6 100644 --- a/app/Http/Resources/InvoiceAdminResource.php +++ b/app/Http/Resources/InvoiceAdminResource.php @@ -52,8 +52,8 @@ class InvoiceAdminResource extends JsonResource 'id' => $user->id, 'type' => 'user', 'attributes' => [ - 'name' => $user->name, - 'avatar' => $user->avatar, + 'name' => $user->settings->name, + 'avatar' => $user->settings->avatar, ] ] ] diff --git a/app/Http/Resources/LanguageResource.php b/app/Http/Resources/LanguageResource.php index 03e7da34..0d2f5a08 100644 --- a/app/Http/Resources/LanguageResource.php +++ b/app/Http/Resources/LanguageResource.php @@ -19,11 +19,11 @@ class LanguageResource extends JsonResource 'id' => $this->id, 'type' => 'languages', 'attributes' => [ - 'name' => $this->name, - 'locale' => $this->locale, + 'name' => $this->name, + 'locale' => $this->locale, 'translations' => map_language_translations($this->languageTranslations), - 'updated_at' => $this->updated_at, - 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + 'created_at' => $this->created_at, ] ], ]; diff --git a/app/Models/File.php b/app/Models/File.php index 3a75fca2..64d8626b 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -104,7 +104,7 @@ class File extends Model // Get thumbnail from external storage if ($this->attributes['thumbnail'] && ! is_storage_driver(['local'])) { - return Storage::temporaryUrl('files/' . $this->attributes['thumbnail'], now()->addHour()); + return Storage::temporaryUrl("files/$this->user_id/{$this->attributes['thumbnail']}", now()->addHour()); } // Get thumbnail from local storage @@ -145,7 +145,7 @@ class File extends Model 'ResponseContentDisposition' => 'attachment; filename=' . $file_pretty_name, ]; - return Storage::temporaryUrl('files/' . $this->attributes['basename'], now()->addDay(), $header); + return Storage::temporaryUrl("files/$this->user_id/{$this->attributes['basename']}", now()->addDay(), $header); } // Get thumbnail from local storage diff --git a/app/Models/UserSettings.php b/app/Models/UserSettings.php index 4cebe231..3140c73e 100644 --- a/app/Models/UserSettings.php +++ b/app/Models/UserSettings.php @@ -22,7 +22,7 @@ class UserSettings extends Model public function getAvatarAttribute() { // Get avatar from external storage - if ($this->attributes['avatar'] && is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) { + if ($this->attributes['avatar'] && ! is_storage_driver('local')) { return Storage::temporaryUrl($this->attributes['avatar'], now()->addDay()); } @@ -31,6 +31,6 @@ class UserSettings extends Model return url('/' . $this->attributes['avatar']); } - return url('/assets/images/' . 'default-avatar.png'); + return url('/assets/images/default-avatar.png'); } } diff --git a/app/Notifications/SharedSendViaEmail.php b/app/Notifications/SharedSendViaEmail.php index adb8f9a2..3c710fd7 100644 --- a/app/Notifications/SharedSendViaEmail.php +++ b/app/Notifications/SharedSendViaEmail.php @@ -26,7 +26,7 @@ class SharedSendViaEmail extends Notification /** * Get the notification's delivery channels. * - * @param mixed $notifiable + * @param mixed $notifiable * @return array */ public function via($notifiable) @@ -37,23 +37,23 @@ class SharedSendViaEmail extends Notification /** * Get the mail representation of the notification. * - * @param mixed $notifiable + * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) - ->subject(__t('shared_link_email_subject', ['user' => $this->user->name])) + ->subject(__t('shared_link_email_subject', ['user' => $this->user->settings->name])) ->greeting(__t('shared_link_email_greeting')) - ->line(__t('shared_link_email_user', ['user' => $this->user->name, 'email' => $this->user->email])) - ->action(__t('shared_link_email_link'), url('/shared', ['token' => $this->token])) + ->line(__t('shared_link_email_user', ['user' => $this->user->settings->name, 'email' => $this->user->email])) + ->action(__t('shared_link_email_link'), url('/share', ['token' => $this->token])) ->salutation(__t('shared_link_email_salutation', ['app_name' => get_setting('app_title') ?? 'VueFileManager'])); } /** * Get the array representation of the notification. * - * @param mixed $notifiable + * @param mixed $notifiable * @return array */ public function toArray($notifiable) diff --git a/app/Services/FileManagerService.php b/app/Services/FileManagerService.php index b7b2a90a..59f5dc45 100644 --- a/app/Services/FileManagerService.php +++ b/app/Services/FileManagerService.php @@ -52,13 +52,14 @@ class FileManagerService // Move file to local storage from external storage service if (!is_storage_driver('local')) { - $files->each(function ($file) use ($disk_local) { + + foreach ($files as $file) { try { - $disk_local->put("temp/$file->basename", Storage::get("files/$file->user_id/$file->basename")); + $disk_local->put("temp/{$file['basename']}", Storage::get("files/$requested_folder->user_id/{$file['basename']}")); } catch (FileNotFoundException $e) { throw new HttpException(404, 'File not found'); } - }); + } } // Get zip path @@ -67,17 +68,16 @@ class FileManagerService // Create zip $zip = Madzipper::make($disk_local->path("zip/$zip_name")); - // Get files folder on local storage drive - $directory = is_storage_driver('local') ? 'files' : 'temp'; - // Add files to zip foreach ($files as $file) { + + $file_path = is_storage_driver('local') + ? $disk_local->path("files/$requested_folder->user_id/{$file['basename']}") + : $disk_local->path("temp/{$file['basename']}"); + $zip ->folder($file['folder_path']) - ->addString( - "{$file['name']}.{$file['mimetype']}", - File::get($disk_local->path("/$directory/$requested_folder->user_id/{$file['basename']}")) - ); + ->addString("{$file['name']}.{$file['mimetype']}", File::get($file_path)); } // Close zip @@ -114,6 +114,7 @@ class FileManagerService // Move file to local storage from external storage service if (!is_storage_driver('local')) { + $files->each(function ($file) use ($disk_local) { try { $disk_local->put("temp/$file->basename", Storage::get("files/$file->user_id/$file->basename")); @@ -129,14 +130,14 @@ class FileManagerService // Create zip $zip = Madzipper::make($disk_local->path("zip/$zip_name")); - // Get files folder on local storage drive - $directory = is_storage_driver('local') ? 'files' : 'temp'; - // Add files to zip - $files->each(function ($file) use ($zip, $directory, $disk_local) { - $zip->addString( - "$file->name.$file->mimetype", - File::get($disk_local->path("/$directory/$file->user_id/$file->basename"))); + $files->each(function ($file) use ($zip, $disk_local) { + + $file_path = is_storage_driver('local') + ? $disk_local->path("files/$file->user_id/$file->basename") + : $disk_local->path("temp/$file->basename"); + + $zip->addString("$file->name.$file->mimetype", File::get($file_path)); }); // Close zip @@ -388,27 +389,25 @@ class FileManagerService $disk_local = Storage::disk('local'); // Get user data - $user_id = $shared ? $shared->user_id : Auth::id(); + $user_id = $shared->user_id ?? Auth::id(); // File Info - $file_size = $disk_local->size('chunks/' . $temp_filename); + $file_size = $disk_local->size("chunks/$temp_filename"); - $file_mimetype = $disk_local->mimeType('chunks/' . $temp_filename); + $file_mimetype = $disk_local->mimeType("chunks/$temp_filename"); // Check if user has enough space to upload file $this->helper->check_user_storage_capacity($user_id, $file_size, $temp_filename); // Create thumbnail - $thumbnail = $this->helper->create_image_thumbnail('chunks/' . $temp_filename, $disk_file_name, $user_id); + $thumbnail = $this->helper->create_image_thumbnail("chunks/$temp_filename", $disk_file_name, $user_id); // Move finished file from chunk to file-manager directory - $disk_local->move('chunks/' . $temp_filename, "files/$user_id/$disk_file_name"); + $disk_local->move("chunks/$temp_filename", "files/$user_id/$disk_file_name"); // Move files to external storage if (!is_storage_driver(['local'])) { - - // Move file to external storage service - $this->helper->move_file_to_external_storage($disk_file_name, $thumbnail); + $this->helper->move_file_to_external_storage($disk_file_name, $user_id); } // Store user upload size diff --git a/app/Services/HelperService.php b/app/Services/HelperService.php index 6ca24d30..2978f4eb 100644 --- a/app/Services/HelperService.php +++ b/app/Services/HelperService.php @@ -120,66 +120,60 @@ class HelperService /** * Move file to external storage if is set * - * @param string $filename - * @param string|null $thumbnail + * @param string $file + * @param string $user_id */ - function move_file_to_external_storage($filename, $thumbnail = null): void + function move_file_to_external_storage($file, $user_id): void { $disk_local = Storage::disk('local'); - foreach ([$filename, $thumbnail] as $file) { + // Get file size + $filesize = $disk_local->size("files/$user_id/$file"); - // Check if file exist - if (!$file) continue; + // If file is bigger than 5.2MB then run multipart upload + if ($filesize > 5242880) { - // Get file size - $filesize = $disk_local->size('files/' . $file); + // Get driver + $driver = \Storage::getDriver(); - // If file is bigger than 5.2MB then run multipart upload - if ($filesize > 5242880) { + // Get adapter + $adapter = $driver->getAdapter(); - // Get driver - $driver = \Storage::getDriver(); + // Get client + $client = $adapter->getClient(); - // Get adapter - $adapter = $driver->getAdapter(); + // Prepare the upload parameters. + // TODO: replace local files with temp folder + $uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . "/files/$user_id/$file", [ + 'bucket' => $adapter->getBucket(), + 'key' => "/files/$user_id/$file" + ]); - // Get client - $client = $adapter->getClient(); + try { - // Prepare the upload parameters. - // TODO: replace local files with temp folder - $uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . '/files/' . $file, [ - 'bucket' => $adapter->getBucket(), - 'key' => 'files/' . $file - ]); + // Upload content + $uploader->upload(); - try { + } catch (MultipartUploadException $e) { - // Upload content - $uploader->upload(); + // Write error log + Log::error($e->getMessage()); - } catch (MultipartUploadException $e) { + // Delete file after error + $disk_local->delete("/files/$user_id/$file"); - // Write error log - Log::error($e->getMessage()); - - // Delete file after error - $disk_local->delete('files/' . $file); - - throw new HttpException(409, $e->getMessage()); - } - - } else { - - // Stream file object to s3 - // TODO: replace local files with temp folder - Storage::putFileAs('files', config('filesystems.disks.local.root') . '/files/' . $file, $file, 'private'); + throw new HttpException(409, $e->getMessage()); } - // Delete file after upload - $disk_local->delete('files/' . $file); + } else { + + // Stream file object to s3 + // TODO: replace local files with temp folder + Storage::putFileAs("files/$user_id", config('filesystems.disks.local.root') . "/files/$user_id/$file", $file, "private"); } + + // Delete file after upload + $disk_local->delete("/files/$user_id/$file"); } /** @@ -192,16 +186,14 @@ class HelperService */ function create_image_thumbnail($file_path, $filename, $user_id) { - $local_disk = Storage::disk('local'); - // Create thumbnail from image - if (in_array($local_disk->mimeType($file_path), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) { + if (in_array(Storage::disk('local')->mimeType($file_path), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) { // Get thumbnail name $thumbnail = "thumbnail-$filename"; // Create intervention image - $image = Image::make($local_disk->path($file_path)) + $image = Image::make(Storage::disk('local')->path($file_path)) ->orientate(); // Resize image @@ -210,11 +202,11 @@ class HelperService })->stream(); // Store thumbnail to disk - $local_disk->put("files/$user_id/$thumbnail", $image); + Storage::put("files/$user_id/$thumbnail", $image); } // Return thumbnail as svg file - if ($local_disk->mimeType($file_path) === 'image/svg+xml') { + if (Storage::disk('local')->mimeType($file_path) === 'image/svg+xml') { $thumbnail = $filename; } diff --git a/composer.json b/composer.json index 38f15336..a0500705 100644 --- a/composer.json +++ b/composer.json @@ -12,8 +12,8 @@ "brianium/paratest": "^6.2", "cartalyst/stripe-laravel": "^13.1", "doctrine/dbal": "^2.12.1", - "fideloper/proxy": "^4.0", - "fruitcake/laravel-cors": "^2.0", + "fideloper/proxy": "^4.4.1", + "fruitcake/laravel-cors": "^2.0.3", "gabrielelana/byte-units": "^0.5.0", "guzzlehttp/guzzle": "^7.2.0", "intervention/image": "^2.5.1", @@ -24,22 +24,22 @@ "laravel/framework": "^8.30.1", "laravel/sanctum": "^2.9", "laravel/tinker": "^2.6.1", - "laravel/ui": "^3.0", - "league/flysystem-aws-s3-v3": "^1.0", - "league/flysystem-cached-adapter": "^1.0", - "madnest/madzipper": "^1.1", - "teamtnt/laravel-scout-tntsearch-driver": "^11.1", + "laravel/ui": "^3.2.0", + "league/flysystem-aws-s3-v3": "^1.0.29", + "league/flysystem-cached-adapter": "^1.1.0", + "madnest/madzipper": "^1.1.0", + "teamtnt/laravel-scout-tntsearch-driver": "^11.1.0", "ext-json": "*" }, "require-dev": { "ext-json": "*", - "barryvdh/laravel-ide-helper": "^2.7", - "facade/ignition": "^2.3.6", - "fzaninotto/faker": "^1.9.1", - "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^5.0", + "barryvdh/laravel-ide-helper": "^2.9", + "facade/ignition": "^2.5.14", + "fzaninotto/faker": "^1.9.2", + "mockery/mockery": "^1.4.3", + "nunomaduro/collision": "^5.3.0", "phpunit/phpunit": "^9.5.2", - "supliu/laravel-query-monitor": "^1.0" + "supliu/laravel-query-monitor": "^1.0.2" }, "config": { "optimize-autoloader": true, diff --git a/public/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~5f8db287.js b/public/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~5f8db287.js new file mode 100644 index 00000000..8a0ef483 --- /dev/null +++ b/public/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~5f8db287.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{ASoH:function(n,t,a){"use strict";var e={name:"AuthContent",props:["loading","icon","text"],data:function(){return{isVisible:!1}},created:function(){this.isVisible=this.visible}},i=(a("RLEU"),a("KHd+")),o=Object(i.a)(e,(function(){var n=this,t=n.$createElement,a=n._self._c||t;return a("button",{staticClass:"button outline hover-text-theme hover-border-theme"},[a("span",{staticClass:"text-label"},[n._v(n._s(n.text))]),n._v(" "),n.loading?a("span",{staticClass:"icon"},[a("FontAwesomeIcon",{staticClass:"sync-alt svg-color-theme",attrs:{icon:"sync-alt"}})],1):n._e(),n._v(" "),!n.loading&&n.icon?a("span",{staticClass:"icon"},[a("FontAwesomeIcon",{staticClass:"svg-color-theme",attrs:{icon:n.icon}})],1):n._e()])}),[],!1,null,"16e9ad58",null);t.a=o.exports},JHC5:function(n,t,a){var e=a("YUi1");"string"==typeof e&&(e=[[n.i,e,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};a("aET+")(e,i);e.locals&&(n.exports=e.locals)},Jx8r:function(n,t,a){(n.exports=a("I1BE")(!1)).push([n.i,"#auth[data-v-31af8372] {\n height: 100%;\n width: 100%;\n display: table;\n}\n",""])},RLEU:function(n,t,a){"use strict";var e=a("JHC5");a.n(e).a},TJPC:function(n,t,a){"use strict";a.d(t,"a",(function(){return o}));function e(n){return null==n}function i(n){return Array.isArray(n)&&0===n.length}var o={validate:function(n,t){var a=(void 0===t?{allowFalse:!0}:t).allowFalse,o={valid:!1,required:!0};return e(n)||i(n)?o:!1!==n||a?(o.valid=!!String(n).trim().length,o):o},params:[{name:"allowFalse",default:!0}],computesRequired:!0}},YUi1:function(n,t,a){(n.exports=a("I1BE")(!1)).push([n.i,".button[data-v-16e9ad58] {\n cursor: pointer;\n border-radius: 8px;\n text-decoration: none;\n padding: 12px 32px;\n display: inline-block;\n margin-left: 15px;\n margin-right: 15px;\n white-space: nowrap;\n transition: 150ms all ease;\n background: transparent;\n}\n.button .text-label[data-v-16e9ad58] {\n transition: 150ms all ease;\n font-size: 1.0625em;\n font-weight: 800;\n line-height: 0;\n}\n.button .icon[data-v-16e9ad58] {\n margin-left: 12px;\n font-size: 1em;\n}\n.button.solid[data-v-16e9ad58] {\n background: #00BC7E;\n border: 2px solid #00BC7E;\n}\n.button.solid .text-label[data-v-16e9ad58] {\n color: white;\n}\n.button.outline[data-v-16e9ad58] {\n border: 2px solid #1B2539;\n}\n.button.outline .text-label[data-v-16e9ad58] {\n color: #1B2539;\n}\n.button.outline .icon path[data-v-16e9ad58] {\n fill: inherit;\n}\n.button.outline[data-v-16e9ad58]:hover {\n border-color: inherit;\n}\n.button.outline:hover .text-label[data-v-16e9ad58] {\n color: inherit;\n}\n@media (prefers-color-scheme: dark) {\n.button.outline[data-v-16e9ad58] {\n background: #131414;\n border-color: #bec6cf;\n}\n.button.outline .text-label[data-v-16e9ad58] {\n color: #bec6cf;\n}\n}\n.sync-alt[data-v-16e9ad58] {\n -webkit-animation: spin-data-v-16e9ad58 1s linear infinite;\n animation: spin-data-v-16e9ad58 1s linear infinite;\n}\n@-webkit-keyframes spin-data-v-16e9ad58 {\n0% {\n transform: rotate(0);\n}\n100% {\n transform: rotate(360deg);\n}\n}\n@keyframes spin-data-v-16e9ad58 {\n0% {\n transform: rotate(0);\n}\n100% {\n transform: rotate(360deg);\n}\n}\n",""])},bDRN:function(n,t,a){"use strict";var e={name:"AuthContentWrapper"},i=(a("iYAH"),a("KHd+")),o=Object(i.a)(e,(function(){var n=this.$createElement;return(this._self._c||n)("div",{attrs:{id:"auth"}},[this._t("default")],2)}),[],!1,null,"31af8372",null);t.a=o.exports},iYAH:function(n,t,a){"use strict";var e=a("lh0Q");a.n(e).a},j8qy:function(n,t,a){"use strict";var e={name:"AuthContent",props:["visible","name"],data:function(){return{isVisible:!1}},created:function(){this.isVisible=this.visible}},i=a("KHd+"),o=Object(i.a)(e,(function(){var n=this.$createElement,t=this._self._c||n;return this.isVisible?t("div",{staticClass:"auth-form"},[this._t("default")],2):this._e()}),[],!1,null,null,null);t.a=o.exports},lh0Q:function(n,t,a){var e=a("Jx8r");"string"==typeof e&&(e=[[n.i,e,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};a("aET+")(e,i);e.locals&&(n.exports=e.locals)}}]); \ No newline at end of file diff --git a/public/chunks/not-found.js b/public/chunks/not-found.js new file mode 100644 index 00000000..294edb32 --- /dev/null +++ b/public/chunks/not-found.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{BLAx:function(n,t,a){var e=a("hGkI");"string"==typeof e&&(e=[[n.i,e,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};a("aET+")(e,o);e.locals&&(n.exports=e.locals)},"c/uq":function(n,t,a){"use strict";var e=a("BLAx");a.n(e).a},hGkI:function(n,t,a){(n.exports=a("I1BE")(!1)).push([n.i,".auth-logo-text[data-v-23099f18] {\n font-size: 1.375em;\n font-weight: 800;\n margin-bottom: 40px;\n display: block;\n}\n.auth-form[data-v-23099f18] {\n text-align: center;\n max-width: 600px;\n padding: 25px 20px;\n display: table-cell;\n vertical-align: middle;\n}\n.auth-form input[data-v-23099f18] {\n min-width: 310px;\n}\n.auth-form .additional-link a[data-v-23099f18] {\n font-weight: 700;\n text-decoration: none;\n}\n.auth-form .user-avatar[data-v-23099f18] {\n width: 100px;\n height: 100px;\n -o-object-fit: cover;\n object-fit: cover;\n margin-bottom: 20px;\n border-radius: 8px;\n box-shadow: 0 10px 30px rgba(25, 54, 60, 0.2);\n}\n.auth-form .logo[data-v-23099f18] {\n width: 120px;\n margin-bottom: 20px;\n}\n.auth-form h1[data-v-23099f18] {\n font-size: 2.125em;\n font-weight: 800;\n line-height: 1.2;\n margin-bottom: 2px;\n color: #1B2539;\n}\n.auth-form h2[data-v-23099f18] {\n font-size: 1.4375em;\n font-weight: 500;\n margin-bottom: 50px;\n color: #1B2539;\n}\n.auth-form .block-form[data-v-23099f18] {\n margin-left: auto;\n margin-right: auto;\n}\n@media only screen and (min-width: 690px) and (max-width: 960px) {\n.auth-form[data-v-23099f18] {\n padding-left: 20%;\n padding-right: 20%;\n}\n}\n@media only screen and (max-width: 690px) {\n.auth-form[data-v-23099f18] {\n width: 100%;\n}\n.auth-form h1[data-v-23099f18] {\n font-size: 1.875em;\n}\n.auth-form h2[data-v-23099f18] {\n font-size: 1.3125em;\n}\n}\n@media only screen and (max-width: 490px) {\n.auth-form h1[data-v-23099f18] {\n font-size: 1.375em;\n}\n.auth-form h2[data-v-23099f18] {\n font-size: 1.125em;\n}\n.auth-form input[data-v-23099f18] {\n min-width: initial;\n}\n.auth-form .additional-link[data-v-23099f18] {\n font-size: 0.9375em;\n}\n}\n@media (prefers-color-scheme: dark) {\n.auth-form h1[data-v-23099f18], .auth-form h2[data-v-23099f18], .auth-form .additional-link[data-v-23099f18] {\n color: #bec6cf;\n}\n}\n",""])},pAWr:function(n,t,a){"use strict";a.r(t);var e=a("bDRN"),o=a("A5+z"),r=a("j8qy"),i=a("ASoH"),f=a("TJPC"),d=a("L2JU");a("vDqi");function s(n,t){var a=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);t&&(e=e.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),a.push.apply(a,e)}return a}function c(n,t,a){return t in n?Object.defineProperty(n,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[t]=a,n}var p={name:"NotFound",components:{AuthContentWrapper:e.a,ValidationProvider:o.ValidationProvider,ValidationObserver:o.ValidationObserver,AuthContent:r.a,AuthButton:i.a,required:f.a},computed:function(n){for(var t=1;t=e},p={validate:m,params:[{name:"min"},{name:"max"}]},g={validate:function(e,r){var n=r.target;return String(e)===String(n)},params:[{name:"target",isTarget:!0}]},y=function(e,r){var n=r.length;if(Array.isArray(e))return e.every((function(e){return y(e,{length:n})}));var t=String(e);return/^[0-9]*$/.test(t)&&t.length===n},b={validate:y,params:[{name:"length",cast:function(e){return Number(e)}}]},_={validate:function(e,r){var n=r.width,t=r.height,i=[];e=Array.isArray(e)?e:[e];for(var a=0;a()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return n&&!Array.isArray(e)&&(e=String(e).split(",").map((function(e){return e.trim()}))),Array.isArray(e)?e.every((function(e){return t.test(String(e))})):t.test(String(e))},params:[{name:"multiple",default:!1}]};function $(e){return e!=e}function O(e){return null==e}function x(e){return Array.isArray(e)&&0===e.length}var Z=function(e){return null!==e&&e&&"object"==typeof e&&!Array.isArray(e)};function R(e,r){return!(!$(e)||!$(r))||e===r}function w(e,r){if(e instanceof RegExp&&r instanceof RegExp)return w(e.source,r.source)&&w(e.flags,r.flags);if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)return!1;for(var n=0;n=0:Array.isArray(e)?e.every((function(e){return J(e,{length:n})})):String(e).length<=n},X={validate:J,params:[{name:"length",cast:function(e){return Number(e)}}]},G=function(e,r){var n=r.max;return!O(e)&&""!==e&&(Array.isArray(e)?e.length>0&&e.every((function(e){return G(e,{max:n})})):Number(e)<=n)},K={validate:G,params:[{name:"max",cast:function(e){return Number(e)}}]},Y={validate:function(e,r){var n=new RegExp(r.join("|").replace("*",".+")+"$","i");return Array.isArray(e)?e.every((function(e){return n.test(e.type)})):n.test(e.type)}},Q=function(e,r){var n=r.length;return!O(e)&&(Array.isArray(e)?e.every((function(e){return Q(e,{length:n})})):String(e).length>=n)},ee={validate:Q,params:[{name:"length",cast:function(e){return Number(e)}}]},re=function(e,r){var n=r.min;return!O(e)&&""!==e&&(Array.isArray(e)?e.length>0&&e.every((function(e){return re(e,{min:n})})):Number(e)>=n)},ne={validate:re,params:[{name:"min",cast:function(e){return Number(e)}}]},te=/^[٠١٢٣٤٥٦٧٨٩]+$/,ie=/^[0-9]+$/,ae={validate:function(e){var r=function(e){var r=String(e);return ie.test(r)||te.test(r)};return Array.isArray(e)?e.every(r):r(e)}},se=function(e,r){var n=r.regex;return Array.isArray(e)?e.every((function(e){return se(e,{regex:n})})):n.test(String(e))},oe={validate:se,params:[{name:"regex",cast:function(e){return"string"==typeof e?new RegExp(e):e}}]},ue={validate:function(e,r){var n=(void 0===r?{allowFalse:!0}:r).allowFalse,t={valid:!1,required:!0};return O(e)||x(e)?t:!1!==e||n?(t.valid=!!String(e).trim().length,t):t},params:[{name:"allowFalse",default:!0}],computesRequired:!0},le=function(e){return x(e)||S([!1,null,void 0],e)||!String(e).trim().length},de={validate:function(e,r){var n,t=r.target,i=r.values;return i&&i.length?(Array.isArray(i)||"string"!=typeof i||(i=[i]),n=i.some((function(e){return e==String(t).trim()}))):n=!le(t),n?{valid:!le(e),required:n}:{valid:!0,required:n}},params:[{name:"target",isTarget:!0},{name:"values"}],computesRequired:!0},ce={validate:function(e,r){var n=r.size;if(isNaN(n))return!1;var t=1024*n;if(!Array.isArray(e))return e.size<=t;for(var i=0;it)return!1;return!0},params:[{name:"size",cast:function(e){return Number(e)}}]},fe=Object.freeze({__proto__:null,alpha_dash:d,alpha_num:f,alpha_spaces:h,alpha:u,between:p,confirmed:g,digits:b,dimensions:_,email:A,ext:P,image:C,oneOf:M,integer:L,length:U,is_not:H,is:W,max:X,max_value:K,mimes:Y,min:ee,min_value:ne,excluded:B,numeric:ae,regex:oe,required:ue,required_if:de,size:ce}),ve=function(){return(ve=Object.assign||function(e){for(var r,n=1,t=arguments.length;n0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=0&&Re.getRuleDefinition("max")&&(t.max=n.maxlength),n.minlength>=0&&Re.getRuleDefinition("min")&&(t.min=n.minlength),"number"===n.type&&(k(n.min)&&Re.getRuleDefinition("min_value")&&(t.min_value=Number(n.min)),k(n.max)&&Re.getRuleDefinition("max_value")&&(t.max_value=Number(n.max))),t):t}(e))):Ee(t)}function Je(e,r){return e.$scopedSlots.default?e.$scopedSlots.default(r)||[]:e.$slots.default||[]}function Xe(e){return ve(ve({},e.flags),{errors:e.errors,classes:e.classes,failedRules:e.failedRules,reset:function(){return e.reset()},validate:function(){for(var r=[],n=0;n0)){var l=ye().useConstraintAttrs?Ue(e):{};w(r._resolvedRules,l)||(r._needsValidation=!0),S(["input","select","textarea"],e.tag)&&(r.fieldName=(null===(s=null===(a=e.data)||void 0===a?void 0:a.attrs)||void 0===s?void 0:s.name)||(null===(u=null===(o=e.data)||void 0===o?void 0:o.attrs)||void 0===u?void 0:u.id)),r._resolvedRules=l,function(e,r){var n=Be(r);e._inputEventName=e._inputEventName||He(r,Me(r)),Ge(e,null==n?void 0:n.value);var t=Qe(e),i=t.onInput,a=t.onBlur,s=t.onValidate;We(r,e._inputEventName,i),We(r,"blur",a),e.normalizedEvents.forEach((function(e){We(r,e,s)})),e.initialized=!0}(r,e)}})),this.slim&&n.length<=1?n[0]:e(this.tag,n)):this.slim&&n.length<=1?n[0]:e(this.tag,n)},beforeDestroy:function(){this.$_veeObserver.unobserve(this.id)},activated:function(){this.isActive=!0},deactivated:function(){this.isActive=!1},methods:{setFlags:function(e){var r=this;Object.keys(e).forEach((function(n){r.flags[n]=e[n]}))},syncValue:function(e){var r=Fe(e);this.value=r,this.flags.changed=this.initialValue!==r},reset:function(){var e=this;this.errors=[],this.initialValue=this.value;var r={untouched:!0,touched:!1,dirty:!1,pristine:!0,valid:!1,invalid:!1,validated:!1,pending:!1,required:!1,changed:!1,passed:!1,failed:!1};r.required=this.isRequired,this.setFlags(r),this.failedRules={},this.validateSilent(),this._pendingValidation=void 0,this._pendingReset=!0,setTimeout((function(){e._pendingReset=!1}),this.debounce)},validate:function(){for(var e=[],r=0;r0&&this.syncValue(e[0]),[2,Ye(this)]}))}))},validateSilent:function(){return he(this,void 0,void 0,(function(){var e,r;return me(this,(function(n){switch(n.label){case 0:return this.setFlags({pending:!0}),e=ve(ve({},this._resolvedRules),this.normalizedRules),Object.defineProperty(e,"_$$isNormalized",{value:!0,writable:!1,enumerable:!1,configurable:!1}),[4,Te(this.value,e,ve(ve({name:this.name||this.fieldName},(t=this,i=t.$_veeObserver.refs,t.fieldDeps.reduce((function(e,r){return i[r]?(e.values[r]=i[r].value,e.names[r]=i[r].name,e):e}),{names:{},values:{}}))),{bails:this.bails,skipIfEmpty:this.skipIfEmpty,isInitial:!this.initialized,customMessages:this.customMessages}))];case 1:return r=n.sent(),this.setFlags({pending:!1,valid:r.valid,invalid:!r.valid}),[2,r]}var t,i}))}))},setErrors:function(e){this.applyResult({errors:e,failedRules:{}})},applyResult:function(e){var r=e.errors,n=e.failedRules,t=e.regenerateMap;this.errors=r,this._regenerateMap=t,this.failedRules=ve({},n||{}),this.setFlags({valid:!r.length,passed:!r.length,invalid:!!r.length,failed:!!r.length,validated:!0,changed:this.value!==this.initialValue})},registerField:function(){var e,r,n;r=function(e){return e.vid?e.vid:e.name?e.name:e.id?e.id:e.fieldName?e.fieldName:"_vee_"+ ++er}(e=this),n=e.id,!e.isActive||n===r&&e.$_veeObserver.refs[n]||(n!==r&&e.$_veeObserver.refs[n]===e&&e.$_veeObserver.unobserve(n),e.id=r,e.$_veeObserver.observe(e))}}}),nr=[["pristine","every"],["dirty","some"],["touched","some"],["untouched","every"],["valid","every"],["invalid","some"],["pending","some"],["validated","every"],["changed","some"],["passed","every"],["failed","some"]],tr=0,ir=r.extend({name:"ValidationObserver",provide:function(){return{$_veeObserver:this}},inject:{$_veeObserver:{from:"$_veeObserver",default:function(){return this.$vnode.context.$_veeObserver?this.$vnode.context.$_veeObserver:null}}},props:{tag:{type:String,default:"span"},vid:{type:String,default:function(){return"obs_"+tr++}},slim:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},data:function(){return{id:"",refs:{},observers:[],errors:{},flags:or(),fields:{}}},created:function(){var e=this;this.id=this.vid,sr(this);var r=D((function(r){var n=r.errors,t=r.flags,i=r.fields;e.errors=n,e.flags=t,e.fields=i}),16);this.$watch(ur,r)},activated:function(){sr(this)},deactivated:function(){ar(this)},beforeDestroy:function(){ar(this)},render:function(e){var r,n=Je(this,ve(ve({},(r=this).flags),{errors:r.errors,fields:r.fields,validate:r.validate,passes:r.handleSubmit,handleSubmit:r.handleSubmit,reset:r.reset}));return this.slim&&n.length<=1?n[0]:e(this.tag,{on:this.$listeners},n)},methods:{observe:function(e,r){var n;void 0===r&&(r="provider"),"observer"!==r?this.refs=ve(ve({},this.refs),((n={})[e.id]=e,n)):this.observers.push(e)},unobserve:function(e,r){if(void 0===r&&(r="provider"),"provider"!==r){var n=z(this.observers,(function(r){return r.id===e}));-1!==n&&this.observers.splice(n,1)}else{if(!this.refs[e])return;this.$delete(this.refs,e)}},validate:function(e){var r=(void 0===e?{}:e).silent,n=void 0!==r&&r;return he(this,void 0,void 0,(function(){return me(this,(function(e){switch(e.label){case 0:return[4,Promise.all(pe(q(this.refs).filter((function(e){return!e.disabled})).map((function(e){return e[n?"validateSilent":"validate"]().then((function(e){return e.valid}))})),this.observers.filter((function(e){return!e.disabled})).map((function(e){return e.validate({silent:n})}))))];case 1:return[2,e.sent().every((function(e){return e}))]}}))}))},handleSubmit:function(e){return he(this,void 0,void 0,(function(){return me(this,(function(r){switch(r.label){case 0:return[4,this.validate()];case 1:return r.sent()&&e?[2,e()]:[2]}}))}))},reset:function(){return pe(q(this.refs),this.observers).forEach((function(e){return e.reset()}))},setErrors:function(e){var r=this;Object.keys(e).forEach((function(n){var t=r.refs[n];if(t){var i=e[n]||[];i="string"==typeof i?[i]:i,t.setErrors(i)}})),this.observers.forEach((function(r){r.setErrors(e)}))}}});function ar(e){e.$_veeObserver&&e.$_veeObserver.unobserve(e.id,"observer")}function sr(e){e.$_veeObserver&&e.$_veeObserver.observe(e,"observer")}function or(){return ve(ve({},{untouched:!0,touched:!1,dirty:!1,pristine:!0,valid:!1,invalid:!1,validated:!1,pending:!1,required:!1,changed:!1,passed:!1,failed:!1}),{valid:!0,invalid:!1})}function ur(){for(var e=pe(q(this.refs),this.observers),r={},n=or(),t={},i=e.length,a=0;a
+ + - - - + + + + + +