Merge remote-tracking branch 'origin/master' into oasis

# Conflicts:
#	composer.json
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance.js
#	public/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js
#	public/chunks/app-billings.js
#	public/chunks/app-email.js
#	public/chunks/app-index.js
#	public/chunks/app-language.js
#	public/chunks/app-others.js
#	public/chunks/app-payments.js
#	public/chunks/app-settings.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/contact-us.js
#	public/chunks/create-new-password.js
#	public/chunks/dashboard.js
#	public/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plans~chunks/user-invoices.js
#	public/chunks/database.js
#	public/chunks/dynamic-page.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/forgotten-password.js
#	public/chunks/homepage.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-delete.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plan.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/platform~chunks/shared.js
#	public/chunks/profile.js
#	public/chunks/profile~chunks/settings-password.js
#	public/chunks/purchase-code.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-password.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-storage.js
#	public/chunks/settings-subscription.js
#	public/chunks/settings.js
#	public/chunks/setup-wizard.js
#	public/chunks/shared-files.js
#	public/chunks/shared.js
#	public/chunks/shared/authenticate.js
#	public/chunks/shared/file-browser.js
#	public/chunks/shared/single-file.js
#	public/chunks/sign-in.js
#	public/chunks/sign-up.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-delete.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-password.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/css/app.css
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/router.js
#	resources/js/store/modules/userAuth.js
This commit is contained in:
Peter Papp
2021-04-07 07:52:07 +02:00
53 changed files with 158 additions and 156 deletions
+20 -22
View File
@@ -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");
});
}
@@ -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")
+2 -2
View File
@@ -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,
]
]
]
+4 -4
View File
@@ -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,
]
],
];
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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');
}
}
+6 -6
View File
@@ -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)
+24 -25
View File
@@ -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
+40 -48
View File
@@ -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;
}
+13 -13
View File
@@ -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,
@@ -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)}}]);
+1
View File
@@ -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<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){c(n,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(n,t,Object.getOwnPropertyDescriptor(a,t))}))}return n}({},Object(d.b)(["config"])),data:function(){return{isLoading:!1}}},u=(a("c/uq"),a("KHd+")),h=Object(u.a)(p,(function(){var n=this,t=n.$createElement,a=n._self._c||t;return a("AuthContentWrapper",{ref:"auth"},[a("AuthContent",{attrs:{name:"not-found",visible:!0}},[n.config.app_logo?a("img",{staticClass:"logo",attrs:{src:n.$getImage(n.config.app_logo),alt:n.config.app_name}}):n._e(),n._v(" "),n.config.app_logo?n._e():a("b",{staticClass:"auth-logo-text"},[n._v(n._s(n.config.app_name))]),n._v(" "),a("h1",[n._v(n._s(n.$t("page_shared_404.title")))]),n._v(" "),a("h2",[n._v(n._s(n.$t("page_shared_404.subtitle")))]),n._v(" "),a("span",{staticClass:"additional-link"},[n._v(n._s(n.$t("page_registration.have_an_account"))+"\n "),a("router-link",{attrs:{to:{name:"SignIn"}}},[n._v("\n "+n._s(n.$t("page_forgotten_password.password_remember_button"))+"\n ")])],1)])],1)}),[],!1,null,"23099f18",null);t.default=h.exports}}]);
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
/**
* vee-validate v3.3.9
* (c) 2020 Abdelrahman Awad
* @license MIT
*/
+11 -4
View File
@@ -1,18 +1,24 @@
<template>
<div id="vuefilemanager" @click="unClick" v-cloak>
<!--UI components-->
<Alert />
<ToastrWrapper />
<router-view v-if="isLoadedTranslations" />
<CookieDisclaimer />
<Vignette />
<!--Show spinner before translations is loaded-->
<Spinner v-if="! isLoadedTranslations"/>
<!--App view-->
<router-view v-if="isLoadedTranslations" />
</div>
</template>
<script>
import ToastrWrapper from '@/components/Others/Notifications/ToastrWrapper'
import CookieDisclaimer from '@/components/Others/CookieDisclaimer'
import Spinner from '@/components/FilesView/Spinner'
import Vignette from '@/components/Others/Vignette'
import Alert from '@/components/FilesView/Alert'
import {events} from './bus'
@@ -23,6 +29,7 @@ export default {
CookieDisclaimer,
ToastrWrapper,
Vignette,
Spinner,
Alert
},
data() {
@@ -39,7 +46,7 @@ export default {
// Get language translations
this.$store.dispatch('getLanguageTranslations', this.$root.$data.config.language)
.then(response => {
.then(() => {
this.isLoadedTranslations = true
// Store config to vuex
@@ -96,7 +96,6 @@
<Option @click.native="addToFavourites" :title="isInFavourites ? $t('context_menu.remove_from_favourites') : $t('context_menu.add_to_favourites')" icon="favourites" />
</OptionGroup>
<OptionGroup v-if="item && isMultiSelectContextMenu">
<Option @click.native="renameItem" :title="$t('context_menu.rename')" icon="rename" />
<Option @click.native="moveItem" v-if="!$isThisLocation(['latest'])" :title="$t('context_menu.move')" icon="move-item" />
@@ -106,7 +105,6 @@
<Option @click.native="deleteItem" :title="$t('context_menu.delete')" icon="trash" />
</OptionGroup>
<OptionGroup v-if="item && isMultiSelectContextMenu ">
<Option @click.native="ItemDetail" :title="$t('context_menu.detail')" icon="detail" />
<Option @click.native="downloadItem" v-if="!isFolder" :title="$t('context_menu.download')" icon="download" />
@@ -139,7 +137,6 @@
</OptionGroup>
<!-- Single options -->
<OptionGroup v-if="item && isMultiSelectContextMenu">
<Option @click.native="renameItem" :title=" $t('context_menu.rename')" icon="rename" />
<Option @click.native="moveItem" :title="$t('context_menu.move')" icon="move-item" />
@@ -153,7 +150,6 @@
</OptionGroup>
<!-- Multi options -->
<OptionGroup v-if="item && !isMultiSelectContextMenu">
<Option @click.native="moveItem" :title="$t('context_menu.move')" icon="move-item" />
<Option @click.native="deleteItem" :title="$t('context_menu.delete')" icon="trash" />
@@ -323,7 +319,9 @@ export default {
}
},
createFolder() {
this.$store.dispatch('createFolder', this.$t('popup_create_folder.folder_default_name'))
this.$store.dispatch('createFolder', {
name: this.$t('popup_create_folder.folder_default_name')
})
},
closeAndResetContextMenu() {
// Close context menu
+1 -1
View File
@@ -207,7 +207,7 @@
this.isLoading = true
axios.
post(`/api/share/${this.shareOptions.token}/send-email`, {
post(`/api/share/${this.shareOptions.token}/email`, {
emails: this.emails
})
.catch(() => {
@@ -52,7 +52,7 @@
reader.readAsDataURL(file)
// Update user avatar
this.$updateImage('/user/profile', 'avatar', event.target.files[0])
this.$updateImage('/user/relationships/settings', 'avatar', event.target.files[0])
} else {
alert( this.$t('validation_errors.wrong_image') )
}
+1 -1
View File
@@ -33,7 +33,7 @@
</router-link>
</div>
<!--User avatar & Logout-->
<!--Logout-->
<ul class="icon-navigation logout">
<li @click="$store.dispatch('logOut')" :title="$t('locations.logout')" class="icon-navigation-item">
<div class="button-icon">
+2 -6
View File
@@ -12,10 +12,10 @@ const Helpers = {
let enableEmptyInput = ['mimetypes_blacklist', 'google_analytics', 'upload_limit']
if (value === '' && !enableEmptyInput.includes(name)) return
if (value === '' || value === ' ' && !enableEmptyInput.includes(name)) return
axios.post(this.$store.getters.api + route, {name, value, _method: 'patch'})
.catch(error => {
.catch(() => {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
@@ -90,10 +90,6 @@ const Helpers = {
win.focus()
}
Vue.prototype.$createFolder = function (folderName) {
this.$store.dispatch('createFolder', folderName)
}
Vue.prototype.$uploadFiles = async function (files) {
if (files.length == 0) return
+1 -1
View File
@@ -139,7 +139,7 @@
this.columns = [
{
label: this.$t('admin_page_user.table.name'),
field: 'name',
field: 'email',
sortable: true
},
{
+1 -1
View File
@@ -178,7 +178,7 @@
methods: {
changeUserName() {
this.$store.commit('UPDATE_NAME', this.userInfo.name)
this.$updateText('/user/profile', 'name', this.userInfo.name)
this.$updateText('/user/relationships/settings', 'name', this.userInfo.name)
}
},
created() {
+1 -1
View File
@@ -2,7 +2,7 @@
@component('mail::layout')
{{-- Header --}}
@slot('header')
@component('mail::header', ['url' => config('app.url')])
@component('mail::header', ['url' => url('/')])
{{ get_setting('app_title') ?? 'VueFileManager' }}
@endcomponent
@endslot
+3 -3
View File
@@ -1,8 +1,8 @@
@component('mail::layout')
{{-- Header --}}
@slot('header')
@component('mail::header', ['url' => config('app.url')])
{{ config('app.name') }}
@component('mail::header', ['url' => url('/')])
{{ get_setting('app_title') }}
@endcomponent
@endslot
@@ -21,7 +21,7 @@
{{-- Footer --}}
@slot('footer')
@component('mail::footer')
© {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
© {{ date('Y') }} {{ get_setting('app_title') }}. @lang('All rights reserved.')
@endcomponent
@endslot
@endcomponent
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB