- download multiple files in public folder

- frontend build
This commit is contained in:
Peter Papp
2020-12-19 11:34:32 +01:00
parent b16f22b0eb
commit a10d394abb
16 changed files with 520 additions and 464 deletions

View File

@@ -122,6 +122,32 @@ class FileAccessController extends Controller
return Storage::download($zip_path, $zip->basename, $header);
}
/**
* Get generated zip for guest
*
* @param $id
* @param $token
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
public function get_zip_public($id, $token)
{
$zip = Zip::where('id', $id)
->where('shared_token', $token)
->first();
$zip_path = 'zip/' . $zip->basename;
$header = [
"Content-Type" => 'application/zip',
"Content-Length" => Storage::size($zip_path),
"Accept-Ranges" => "bytes",
"Content-Range" => "bytes 0-600/" . Storage::size($zip_path),
"Content-Disposition" => "attachment; filename=" . $zip->basename,
];
return Storage::download($zip_path, $zip->basename, $header);
}
/**
* Get file public
*

View File

@@ -356,6 +356,44 @@ class EditItemsController extends Controller
], 200);
}
/**
* Guest download multiple files via zip
*
* @param Request $request
* @param $token
* @return string
*/
public function guest_zip_multiple_files(Request $request, $token)
{
// Get shared record
$shared = get_shared($token);
$file_parent_folders = FileManagerFile::whereUserId($shared->user_id)
->whereIn('unique_id', $request->input('files'))
->get()
->pluck('folder_id')
->toArray();
// Check access to requested directory
Guardian::check_item_access($file_parent_folders, $shared);
// Get requested files
$files = FileManagerFile::whereUserId($shared->user_id)
->whereIn('unique_id', $request->input('files'))
->get();
$zip = Editor::zip_files($files, $shared);
// Get file
return response([
'url' => route('zip_public', [
'id' => $zip->id,
'token' => $shared->token,
]),
'name' => $zip->basename,
], 200);
}
/**
* Move item for authenticated master|editor user
*

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\FileFunctions;
use App\Http\Requests\Share\CreateShareRequest;
use App\Http\Requests\Share\UpdateShareRequest;
use App\Http\Resources\ShareResource;
use App\Zip;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -95,16 +96,24 @@ class ShareController extends Controller
*/
public function destroy(Request $request)
{
foreach($request->input('folders') as $tokens) {
foreach($request->input('tokens') as $folder) {
// Get sharing record
$shared = Share::where('token', $tokens['token'])
Share::where('token', $folder['token'])
->where('user_id', Auth::id())
->firstOrFail();
->firstOrFail()
->delete();
// Delete shared record
$shared->delete();
// Get zip record
$zip = Zip::where('shared_token', $folder['token'])
->where('user_id', Auth::id())
->first();
if ($zip) {
$zip->delete();
}
}
// Done
return response('Done!', 204);
}

View File

@@ -31,10 +31,11 @@ class Editor
* Zip selected files, store it in /zip folder and retrieve zip record
*
* @param $files
* @param null $shared
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public static function zip_files($files)
public static function zip_files($files, $shared = null)
{
// Local storage instance
$disk_local = Storage::disk('local');
@@ -89,8 +90,9 @@ class Editor
// Store zip record
return Zip::create([
'user_id' => Auth::id(),
'basename' => $zip_name,
'user_id' => $shared->user_id ?? Auth::id(),
'shared_token' => $shared->token ?? null,
'basename' => $zip_name,
]);
}

View File

@@ -16,6 +16,7 @@ class CreateZipsTable extends Migration
Schema::create('zips', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->bigInteger('user_id');
$table->string('shared_token')->nullable();
$table->text('basename');
$table->timestamps();
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{"2wZp":function(t,e,i){"use strict";var n=i("Mlra");i.n(n).a},"6Rdq":function(t,e,i){"use strict";var n=i("s5FU"),r=i("yMep"),o=i("c4kp"),s=i("2QtR"),a=i("L2JU"),c=i("xCqy");function l(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function p(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var u={name:"FilesView",components:{SortingAndPreview:n.a,DesktopToolbar:r.a,FileBrowser:o.a,ContextMenu:s.a},computed:function(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?l(Object(i),!0).forEach((function(e){p(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):l(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}({},Object(a.b)(["config"])),methods:{fileViewClick:function(){c.a.$emit("contextMenu:hide")},contextMenu:function(t,e){c.a.$emit("contextMenu:show",t,e)}}},d=(i("2wZp"),i("KHd+")),f=Object(d.a)(u,(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{attrs:{id:"files-view"},on:{click:t.fileViewClick,"!contextmenu":function(e){return e.preventDefault(),t.contextMenu(e,void 0)}}},[i("ContextMenu"),t._v(" "),i("SortingAndPreview"),t._v(" "),i("DesktopToolbar"),t._v(" "),i("FileBrowser")],1)}),[],!1,null,null,null);e.a=f.exports},CoTS:function(t,e,i){"use strict";i.r(e);var n=i("6Rdq"),r=i("LtV2"),o=i("hXay"),s=i("CjXH"),a={name:"FilesView",components:{ContentFileView:n.a,ContentSidebar:r.a,ContentGroup:o.a,LinkIcon:s.D,UsersIcon:s.Z},methods:{getShared:function(){this.$store.dispatch("getShared",[{back:!1,init:!1}])},getParticipantUploads:function(){this.$store.dispatch("getParticipantUploads")}},mounted:function(){this.getShared()}},c=i("KHd+"),l=Object(c.a)(a,(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("section",{attrs:{id:"viewport"}},[i("ContentSidebar",[i("ContentGroup",{attrs:{title:t.$t("sidebar.locations_title")}},[i("div",{staticClass:"menu-list-wrapper vertical"},[i("li",{staticClass:"menu-list-item link",class:{"is-active":t.$isThisLocation(["shared"])},on:{click:function(e){return t.getShared()}}},[i("div",{staticClass:"icon"},[i("link-icon",{attrs:{size:"17"}})],1),t._v(" "),i("div",{staticClass:"label"},[t._v("\n "+t._s(t.$t("sidebar.my_shared"))+"\n ")])]),t._v(" "),i("li",{staticClass:"menu-list-item link",class:{"is-active":t.$isThisLocation(["participant_uploads"])},on:{click:function(e){return t.getParticipantUploads()}}},[i("div",{staticClass:"icon"},[i("users-icon",{attrs:{size:"17"}})],1),t._v(" "),i("div",{staticClass:"label"},[t._v("\n "+t._s(t.$t("sidebar.participant_uploads"))+"\n ")])])])])],1),t._v(" "),i("ContentFileView")],1)}),[],!1,null,"fd8b19c0",null);e.default=l.exports},Mlra:function(t,e,i){var n=i("Q8SN");"string"==typeof n&&(n=[[t.i,n,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};i("aET+")(n,r);n.locals&&(t.exports=n.locals)},Q8SN:function(t,e,i){(t.exports=i("I1BE")(!1)).push([t.i,"#files-view{font-family:Nunito,sans-serif;font-size:16px;width:100%;height:100%;position:relative;min-width:320px;overflow-x:hidden;padding-left:15px;padding-right:15px;overflow-y:hidden}@media only screen and (max-width:690px){#files-view{padding-left:0;padding-right:0}}",""])}}]);
(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{"2wZp":function(t,e,i){"use strict";var n=i("Mlra");i.n(n).a},"6Rdq":function(t,e,i){"use strict";var n=i("9Q3x"),r=i("yMep"),o=i("c4kp"),s=i("2QtR"),a=i("L2JU"),c=i("xCqy");function l(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function p(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var u={name:"FilesView",components:{DesktopSortingAndPreview:n.a,DesktopToolbar:r.a,FileBrowser:o.a,ContextMenu:s.a},computed:function(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?l(Object(i),!0).forEach((function(e){p(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):l(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}({},Object(a.b)(["config"])),methods:{fileViewClick:function(){c.a.$emit("contextMenu:hide")},contextMenu:function(t,e){c.a.$emit("contextMenu:show",t,e)}}},d=(i("2wZp"),i("KHd+")),f=Object(d.a)(u,(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{attrs:{id:"files-view"},on:{click:t.fileViewClick,"!contextmenu":function(e){return e.preventDefault(),t.contextMenu(e,void 0)}}},[i("ContextMenu"),t._v(" "),i("DesktopSortingAndPreview"),t._v(" "),i("DesktopToolbar"),t._v(" "),i("FileBrowser")],1)}),[],!1,null,null,null);e.a=f.exports},CoTS:function(t,e,i){"use strict";i.r(e);var n=i("6Rdq"),r=i("LtV2"),o=i("hXay"),s=i("CjXH"),a={name:"FilesView",components:{ContentFileView:n.a,ContentSidebar:r.a,ContentGroup:o.a,LinkIcon:s.D,UsersIcon:s.Z},methods:{getShared:function(){this.$store.dispatch("getShared",[{back:!1,init:!1}])},getParticipantUploads:function(){this.$store.dispatch("getParticipantUploads")}},mounted:function(){this.getShared()}},c=i("KHd+"),l=Object(c.a)(a,(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("section",{attrs:{id:"viewport"}},[i("ContentSidebar",[i("ContentGroup",{attrs:{title:t.$t("sidebar.locations_title")}},[i("div",{staticClass:"menu-list-wrapper vertical"},[i("li",{staticClass:"menu-list-item link",class:{"is-active":t.$isThisLocation(["shared"])},on:{click:function(e){return t.getShared()}}},[i("div",{staticClass:"icon"},[i("link-icon",{attrs:{size:"17"}})],1),t._v(" "),i("div",{staticClass:"label"},[t._v("\n "+t._s(t.$t("sidebar.my_shared"))+"\n ")])]),t._v(" "),i("li",{staticClass:"menu-list-item link",class:{"is-active":t.$isThisLocation(["participant_uploads"])},on:{click:function(e){return t.getParticipantUploads()}}},[i("div",{staticClass:"icon"},[i("users-icon",{attrs:{size:"17"}})],1),t._v(" "),i("div",{staticClass:"label"},[t._v("\n "+t._s(t.$t("sidebar.participant_uploads"))+"\n ")])])])])],1),t._v(" "),i("ContentFileView")],1)}),[],!1,null,"fd8b19c0",null);e.default=l.exports},Mlra:function(t,e,i){var n=i("Q8SN");"string"==typeof n&&(n=[[t.i,n,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};i("aET+")(n,r);n.locals&&(t.exports=n.locals)},Q8SN:function(t,e,i){(t.exports=i("I1BE")(!1)).push([t.i,"#files-view{font-family:Nunito,sans-serif;font-size:16px;width:100%;height:100%;position:relative;min-width:320px;overflow-x:hidden;padding-left:15px;padding-right:15px;overflow-y:hidden}@media only screen and (max-width:690px){#files-view{padding-left:0;padding-right:0}}",""])}}]);

File diff suppressed because one or more lines are too long

2
public/js/main.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,83 +1,65 @@
{
"/js/main.js": "/js/main.js",
"/css/app.css": "/css/app.css",
"/chunks/admin.js": "/chunks/admin.js?id=d9ef79cabf24df304657",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=63c04ed6eb66b99be097",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~2d9ff916.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~2d9ff916.js?id=07b0ad73181498d46930",
"/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~01aef58e.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~01aef58e.js?id=6cb8c3f7a9aed769ec61",
"/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared-page.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared-page.js?id=7480293537e480966ae0",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=b99a5c881b7f15a7e8c5",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=9e50edacd8630aa6fc22",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=b6dbd27dc777d0878f4b",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js?id=d2dd97078c9919b69378",
"/chunks/app-billings.js": "/chunks/app-billings.js?id=aac5bd51067578358164",
"/chunks/app-email.js": "/chunks/app-email.js?id=9d1631b19f6492b8cae4",
"/chunks/app-index.js": "/chunks/app-index.js?id=ec7605e0fcf922be3dbc",
"/chunks/app-others.js": "/chunks/app-others.js?id=6fc74fefe17af6d3dd6c",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=187ecc16f9f7fbc4ccac",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=033223b2f39c72c71a73",
"/chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pages~chunks/plan~chunk~8a0e1d25.js": "/chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pages~chunks/plan~chunk~8a0e1d25.js?id=52e8a931f975c4e03a3c",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=8038cc956f309a321a7c",
"/chunks/billings-detail.js": "/chunks/billings-detail.js?id=bbfc290b50cebb202228",
"/chunks/contact-us.js": "/chunks/contact-us.js?id=4dc0385ff5abe06d164e",
"/chunks/contact-us~chunks/dynamic-page~chunks/landing-page.js": "/chunks/contact-us~chunks/dynamic-page~chunks/landing-page.js?id=a4b8a7017c82de28296b",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=108dcc4b5af4c973be56",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=0d6a659fb1deb6dc869f",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~f48e9e59.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~f48e9e59.js?id=6517ff6bfe91291e3335",
"/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js": "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js?id=cc1b4cbd4aa7f70151f7",
"/chunks/database.js": "/chunks/database.js?id=ce57f3e69798319aab7b",
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=f7ff36abf37571173944",
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=48efd0b887fbc804ac90",
"/chunks/files.js": "/chunks/files.js?id=bde4326bbabd3f0bdeb0",
"/chunks/files~chunks/settings-subscription~chunks/shared-files~chunks/shared-page~chunks/user-subscription.js": "/chunks/files~chunks/settings-subscription~chunks/shared-files~chunks/shared-page~chunks/user-subscription.js?id=b646ec02fb9d6a497e74",
"/chunks/files~chunks/shared-files.js": "/chunks/files~chunks/shared-files.js?id=901d5a1126b7dbbcdda8",
"/chunks/files~chunks/shared-files~chunks/shared-page.js": "/chunks/files~chunks/shared-files~chunks/shared-page.js?id=8d6864bd2b6d92b8dadf",
"/chunks/files~chunks/shared-page.js": "/chunks/files~chunks/shared-page.js?id=47ade53389e84dd64310",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=d5e39543eeb619cb5513",
"/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=f037ea11689d01ea489e",
"/chunks/invoices.js": "/chunks/invoices.js?id=f47a0917a085ad2ebfd4",
"/chunks/landing-page.js": "/chunks/landing-page.js?id=963140915655ff33f611",
"/chunks/not-found-shared.js": "/chunks/not-found-shared.js?id=8c8ee101f3445e086040",
"/chunks/page-edit.js": "/chunks/page-edit.js?id=0952cc3fb3aa4797a679",
"/chunks/pages.js": "/chunks/pages.js?id=ca63cff0863297ddf1e5",
"/chunks/plan.js": "/chunks/plan.js?id=41d7a74e57ac07ce3619",
"/chunks/plan-create.js": "/chunks/plan-create.js?id=8d1c89c91afa65224225",
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=4da54a76628aef67ea3e",
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=e608674e1719be65fe6f",
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=8655313c7b71b1019c8f",
"/chunks/plans.js": "/chunks/plans.js?id=24a18f62ef10a422e464",
"/chunks/profile.js": "/chunks/profile.js?id=1e629aa55540ed106ce7",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=f9e2ea1515204b5c63b6",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=91a470e84a34587f3944",
"/chunks/settings.js": "/chunks/settings.js?id=87d29c7fd4e0e6f1a3bd",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=8bc4707d554ffca037a1",
"/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=f5c1b720a5b12060b83b",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=0229d51aca95ffc75902",
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=e7a99d16c2c21bcb9598",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=0ec77e47b2622ee5e253",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=00c6bca64820c4fd3a89",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=b671f4f3198119b48449",
"/chunks/shared-files.js": "/chunks/shared-files.js?id=07cc644014b02adafc69",
"/chunks/shared-page.js": "/chunks/shared-page.js?id=2048702b2eb7d0043bc9",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=0212907c9bf1cdbd99ed",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=91001c0d2c2522eb0d03",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=0e90002c41282e286785",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=6ceb34852ec8a0280aef",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=7176521fbf0047110ae1",
"/chunks/upgrade.js": "/chunks/upgrade.js?id=84fa2517046334070313",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=816be29562b9052cabb1",
"/chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/upgrade-billing~chunks/upgrade-plan.js?id=a589c99d29f03bc71487",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=8bf12e8b93c7eaee4171",
"/chunks/user.js": "/chunks/user.js?id=bdb8a51693952859f5e1",
"/chunks/user-create.js": "/chunks/user-create.js?id=d0056a5db2089bc05508",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=91d17d44835dd32ec36f",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=b5b474dd8fea7b99c766",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=68ea653f6d345e469307",
"/chunks/user-password.js": "/chunks/user-password.js?id=ac51d17a4aa7ae50bc88",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=5cfec8a8f8a8aef24ef2",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=34603496ceacb8bd2da3",
"/chunks/users.js": "/chunks/users.js?id=d97166d7e60c1ec9facb",
"/js/main.b9f23bd6fac9e569cb87.hot-update.js": "/js/main.b9f23bd6fac9e569cb87.hot-update.js",
"/chunks/shared-page.b9f23bd6fac9e569cb87.hot-update.js": "/chunks/shared-page.b9f23bd6fac9e569cb87.hot-update.js",
"/js/main.c8942aac993bcf5a1632.hot-update.js": "/js/main.c8942aac993bcf5a1632.hot-update.js"
"/chunks/files~chunks/shared-files~chunks/shared-page.js": "/chunks/files~chunks/shared-files~chunks/shared-page.js?id=f9e2884f49a692b2dc37",
"/js/main.js": "/js/main.js?id=f84b0c22d69ac92df246",
"/css/app.css": "/css/app.css?id=8f6d5dcb7110a726e142",
"/chunks/admin.js": "/chunks/admin.js?id=5c1ef019716afc67775b",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=16cd99641f6c1cb6788a",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=3043f5ab051b9cac9ab7",
"/chunks/app-billings.js": "/chunks/app-billings.js?id=b4d28bec8835085f885f",
"/chunks/app-email.js": "/chunks/app-email.js?id=24fc0cc212e9b893bb09",
"/chunks/app-index.js": "/chunks/app-index.js?id=c1c8101bd90f630ac6bf",
"/chunks/app-others.js": "/chunks/app-others.js?id=c73372ee9f62d01c74d1",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=83608af3a7e34ac062d4",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=466c6bfc5ab7b883e443",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=652f0ab8a6423dd24906",
"/chunks/billings-detail.js": "/chunks/billings-detail.js?id=b955f8dcd6890a1b45ca",
"/chunks/contact-us.js": "/chunks/contact-us.js?id=a5150dcf81c8e1ab23a4",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=58c543c4f92b5ca9a284",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=6dfd3a558e6c5d943dbc",
"/chunks/database.js": "/chunks/database.js?id=dbb3c73c995c7ee55015",
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=08a0c2de8f93e0222600",
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=3b6455db55e44d265c86",
"/chunks/files.js": "/chunks/files.js?id=6f430d943830045b9386",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=7ff98232e7b4cc5d2c2a",
"/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=f8a13783dc40aad197b5",
"/chunks/invoices.js": "/chunks/invoices.js?id=2bf3d16c86c9a512d7cd",
"/chunks/landing-page.js": "/chunks/landing-page.js?id=00d49e4ffb54dc5abb5b",
"/chunks/not-found-shared.js": "/chunks/not-found-shared.js?id=53d4f9c58bdac1e568c7",
"/chunks/page-edit.js": "/chunks/page-edit.js?id=e3dbad6c75184042d2e6",
"/chunks/pages.js": "/chunks/pages.js?id=178f763a036b4ee9a366",
"/chunks/plan.js": "/chunks/plan.js?id=7ea9ddff467ab749441a",
"/chunks/plan-create.js": "/chunks/plan-create.js?id=b40c3e16a94a55fc9397",
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=61c8edfbdad6904435ed",
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=2be8a0aaf9e6968e158e",
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=60b05b4391ec24649eaf",
"/chunks/plans.js": "/chunks/plans.js?id=dccd289b5aeda9003aca",
"/chunks/profile.js": "/chunks/profile.js?id=91714cf4f6ca568515d6",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=82446c77da50e52cf1bd",
"/chunks/settings.js": "/chunks/settings.js?id=0cfc9ad9196a31d29811",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=72bc6c0599e6d6095ddd",
"/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=daad8173619d5d047c0d",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=9424e701a221958e50e8",
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=66ad9cb43ef678407e3e",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=6af5afc7c03b54e80984",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=1be617484ada2cd04bd7",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=47090233afc7b0cdf855",
"/chunks/shared-files.js": "/chunks/shared-files.js?id=040ad18de0a2504c0f63",
"/chunks/shared-page.js": "/chunks/shared-page.js?id=a563d5d477a6b8c5c536",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=ec080714b24154cf1081",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=0d8b571bcf5a54f073fd",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=099fd6800da190981a1c",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=a1582c9b65d4b9df716e",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=67403d4466f7e7c5701d",
"/chunks/upgrade.js": "/chunks/upgrade.js?id=a414b418fb4f7c37287f",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=985dd231a8395f6a01d2",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=a66c2011e6e99d0880de",
"/chunks/user.js": "/chunks/user.js?id=614b75d3e823cde8ab9f",
"/chunks/user-create.js": "/chunks/user-create.js?id=2bd3bf90450c1ae1a9e1",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=08acb6b552540d60131f",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=cf402ad5f8e4a19bfa6c",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=968a95bf02cb6a5cf064",
"/chunks/user-password.js": "/chunks/user-password.js?id=59afc7db6a7c0b40781e",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=cb0b4bfb94595993795f",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=893d245c41391543de25",
"/chunks/users.js": "/chunks/users.js?id=3b3ae7c11ce24170045c"
}

View File

@@ -1,48 +1,48 @@
<template>
<div class="menu-options" id="menu-list">
<ul class="menu-option-group">
<li v-if="isList" class="menu-option" @click="changePreview('grid')">
<div class="icon">
<grid-icon size="17"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.grid_view') }}
</div>
</li>
<li v-if="isGrid" class="menu-option" @click="changePreview('list')">
<div class="icon">
<list-icon size="17"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.list_view') }}
</div>
</li>
</ul>
<ul class="menu-option-group">
<li class="menu-option" @click.stop="sort('created_at')">
<div class="icon">
<calendar-icon size="17"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.sort_date') }}
</div>
<div class="show-icon">
<arrow-up-icon size="17" v-if="filter.field === 'created_at'" :class="{ 'arrow-down': filter.sort === 'ASC' }"/>
</div>
</li>
<li class="menu-option" @click.stop="sort('name')">
<div class="icon">
<alphabet-icon size="17" class="alphabet-icon"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.sort_alphabet') }}
</div>
<div class="show-icon">
<arrow-up-icon size="17" v-if="filter.field === 'name'" :class="{ 'arrow-down': filter.sort === 'ASC' }"/>
</div>
</li>
</ul>
</div>
<div class="menu-options" id="menu-list">
<ul class="menu-option-group">
<li v-if="isList" class="menu-option" @click="changePreview('grid')">
<div class="icon">
<grid-icon size="17"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.grid_view') }}
</div>
</li>
<li v-if="isGrid" class="menu-option" @click="changePreview('list')">
<div class="icon">
<list-icon size="17"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.list_view') }}
</div>
</li>
</ul>
<ul class="menu-option-group">
<li class="menu-option" @click.stop="sort('created_at')">
<div class="icon">
<calendar-icon size="17"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.sort_date') }}
</div>
<div class="show-icon">
<arrow-up-icon size="17" v-if="filter.field === 'created_at'" :class="{ 'arrow-down': filter.sort === 'ASC' }"/>
</div>
</li>
<li class="menu-option" @click.stop="sort('name')">
<div class="icon">
<alphabet-icon size="17" class="alphabet-icon"/>
</div>
<div class="text-label">
{{ $t('preview_sorting.sort_alphabet') }}
</div>
<div class="show-icon">
<arrow-up-icon size="17" v-if="filter.field === 'name'" :class="{ 'arrow-down': filter.sort === 'ASC' }"/>
</div>
</li>
</ul>
</div>
</template>
<script>
@@ -85,11 +85,11 @@ export default {
this.filter.field = field
// Set sorting direction
if (this.filter.sort === 'DESC') {
if (this.filter.sort === 'DESC')
this.filter.sort = 'ASC'
} else if (this.filter.sort === 'ASC') {
if (this.filter.sort === 'ASC')
this.filter.sort = 'DESC'
}
// Save to localStorage sorting options
localStorage.setItem('sorting', JSON.stringify({ sort: this.filter.sort, field: this.filter.field }))
@@ -104,9 +104,8 @@ export default {
this.$store.dispatch('changePreviewType', previewType)
if(this.$isMobile()) {
events.$emit('mobileSortingAndPreview', false )
}
if (this.$isMobile())
events.$emit('mobileSortingAndPreview', false)
}
},
mounted() {
@@ -116,7 +115,6 @@ export default {
// Set default sorting if in not setup in LocalStorage
this.filter.sort = sorting ? sorting.sort : 'DESC'
this.filter.field = sorting ? sorting.field : 'created_at'
}
}

View File

@@ -1,340 +1,339 @@
import i18n from '@/i18n/index'
import store from './store/index'
import {debounce, includes} from "lodash";
import {events} from './bus'
import { debounce, includes } from 'lodash'
import { events } from './bus'
import axios from 'axios'
import router from '@/router'
const Helpers = {
install(Vue) {
install(Vue) {
Vue.prototype.$updateText = debounce(function (route, name, value) {
let enableEmptyInput = ['mimetypes_blacklist' , 'google_analytics']
if (value === '' && !enableEmptyInput.includes(name)) return
axios.post(this.$store.getters.api + route, {name, value, _method: 'patch'})
.catch(error => {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
})
}, 150)
Vue.prototype.$updateImage = function (route, name, image) {
// Create form
let formData = new FormData()
// Add image to form
formData.append('name', name)
formData.append(name, image)
formData.append('_method', 'PATCH')
axios.post(this.$store.getters.api + route, formData, {
headers: {
'Content-Type': 'multipart/form-data',
}
})
.catch(error => {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
})
}
Vue.prototype.$scrollTop = function () {
var container = document.getElementById('vue-file-manager')
if (container) {
container.scrollTop = 0
}
}
Vue.prototype.$getImage = function (source) {
return source ? this.$store.getters.config.host + '/' + source : ''
}
Vue.prototype.$getCreditCardBrand = function (brand) {
return `/assets/icons/${brand}.svg`
}
Vue.prototype.$getInvoiceLink = function (customer, id) {
return '/invoice/' + customer + '/' + id
}
Vue.prototype.$openImageOnNewTab = function (source) {
let win = window.open(source, '_blank')
win.focus()
}
Vue.prototype.$createFolder = function (folderName) {
this.$store.dispatch('createFolder', folderName)
}
Vue.prototype.$handleUploading = async function (files, parent_id) {
let fileBuffer = []
// Append the file list to fileBuffer array
Array.prototype.push.apply(fileBuffer, files);
let fileSucceed = 0
// Update files count in progressbar
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
current: fileSucceed,
total: files.length
})
// Reset upload progress to 0
store.commit('UPLOADING_FILE_PROGRESS', 0)
// Get parent id
let parentFolder = this.$store.getters.currentFolder ? this.$store.getters.currentFolder.unique_id : 0
let rootFolder = parent_id ? parent_id : parentFolder
Vue.prototype.$updateText = debounce(function(route, name, value) {
// Upload files
do {
let file = fileBuffer.shift(),
chunks = []
let enableEmptyInput = ['mimetypes_blacklist', 'google_analytics']
// Calculate ceils
let size = this.$store.getters.config.chunkSize,
chunksCeil = Math.ceil(file.size / size);
if (value === '' && !enableEmptyInput.includes(name)) return
// Create chunks
for (let i = 0; i < chunksCeil; i++) {
chunks.push(file.slice(
i * size, Math.min(i * size + size, file.size), file.type
));
}
axios.post(this.$store.getters.api + route, { name, value, _method: 'patch' })
.catch(error => {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message')
})
})
}, 150)
Vue.prototype.$updateImage = function(route, name, image) {
// Create form
let formData = new FormData()
// Add image to form
formData.append('name', name)
formData.append(name, image)
formData.append('_method', 'PATCH')
axios.post(this.$store.getters.api + route, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
.catch(error => {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message')
})
})
}
Vue.prototype.$scrollTop = function() {
var container = document.getElementById('vue-file-manager')
if (container) {
container.scrollTop = 0
}
}
Vue.prototype.$getImage = function(source) {
return source ? this.$store.getters.config.host + '/' + source : ''
}
Vue.prototype.$getCreditCardBrand = function(brand) {
return `/assets/icons/${brand}.svg`
}
Vue.prototype.$getInvoiceLink = function(customer, id) {
return '/invoice/' + customer + '/' + id
}
Vue.prototype.$openImageOnNewTab = function(source) {
let win = window.open(source, '_blank')
win.focus()
}
Vue.prototype.$createFolder = function(folderName) {
this.$store.dispatch('createFolder', folderName)
}
Vue.prototype.$handleUploading = async function(files, parent_id) {
let fileBuffer = []
// Set Data
let formData = new FormData(),
uploadedSize = 0,
isNotGeneralError = true,
striped_name = file.name.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, ''),
filename = Array(16).fill(0).map(x => Math.random().toString(36).charAt(2)).join('') + '-' + striped_name + '.part'
// Append the file list to fileBuffer array
Array.prototype.push.apply(fileBuffer, files)
do {
let isLast = chunks.length === 1,
chunk = chunks.shift(),
attempts = 0
let fileSucceed = 0
// Set form data
formData.set('file', chunk, filename);
formData.set('parent_id', rootFolder)
formData.set('is_last', isLast);
// Update files count in progressbar
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
current: fileSucceed,
total: files.length
})
// Upload chunks
do {
await store.dispatch('uploadFiles', {
form: formData,
fileSize: file.size,
totalUploadedSize: uploadedSize
}).then(() => {
uploadedSize = uploadedSize + chunk.size
}).catch((error) => {
// Reset upload progress to 0
store.commit('UPLOADING_FILE_PROGRESS', 0)
// Count attempts
attempts++
// Get parent id
let parentFolder = this.$store.getters.currentFolder ? this.$store.getters.currentFolder.unique_id : 0
let rootFolder = parent_id ? parent_id : parentFolder
// Break uploading proccess
if (error.response.status === 500)
isNotGeneralError = false
// Upload files
do {
let file = fileBuffer.shift(),
chunks = []
//Break if mimetype of file is in blacklist
if(error.response.status === 415)
isNotGeneralError = false
// Calculate ceils
let size = this.$store.getters.config.chunkSize,
chunksCeil = Math.ceil(file.size / size)
// Show Error
if (attempts === 3)
this.$isSomethingWrong()
})
} while (isNotGeneralError && attempts !== 0 && attempts !== 3)
// Create chunks
for (let i = 0; i < chunksCeil; i++) {
chunks.push(file.slice(
i * size, Math.min(i * size + size, file.size), file.type
))
}
} while (isNotGeneralError && chunks.length !== 0)
// Set Data
let formData = new FormData(),
uploadedSize = 0,
isNotGeneralError = true,
striped_name = file.name.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, ''),
filename = Array(16).fill(0).map(x => Math.random().toString(36).charAt(2)).join('') + '-' + striped_name + '.part'
fileSucceed++
do {
let isLast = chunks.length === 1,
chunk = chunks.shift(),
attempts = 0
// Progress file log
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
current: fileSucceed,
total: files.length
})
// Set form data
formData.set('file', chunk, filename)
formData.set('parent_id', rootFolder)
formData.set('is_last', isLast)
} while (fileBuffer.length !== 0)
// Upload chunks
do {
await store.dispatch('uploadFiles', {
form: formData,
fileSize: file.size,
totalUploadedSize: uploadedSize
}).then(() => {
uploadedSize = uploadedSize + chunk.size
}).catch((error) => {
store.commit('UPDATE_FILE_COUNT_PROGRESS', undefined)
}
// Count attempts
attempts++
Vue.prototype.$uploadFiles = async function (files) {
// Break uploading proccess
if (error.response.status === 500)
isNotGeneralError = false
if (files.length == 0) return
//Break if mimetype of file is in blacklist
if (error.response.status === 415)
isNotGeneralError = false
if (!this.$checkFileMimetype(files)) return
this.$handleUploading(files, undefined)
}
// Show Error
if (attempts === 3)
this.$isSomethingWrong()
})
} while (isNotGeneralError && attempts !== 0 && attempts !== 3)
Vue.prototype.$uploadExternalFiles = async function (event, parent_id) {
} while (isNotGeneralError && chunks.length !== 0)
// Prevent submit empty files
if (event.dataTransfer.items.length == 0) return
fileSucceed++
// Get files
let files = [...event.dataTransfer.items].map(item => item.getAsFile());
// Progress file log
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
current: fileSucceed,
total: files.length
})
this.$handleUploading(files, parent_id)
}
} while (fileBuffer.length !== 0)
Vue.prototype.$downloadFile = function (url, filename) {
var anchor = document.createElement('a')
store.commit('UPDATE_FILE_COUNT_PROGRESS', undefined)
}
anchor.href = url
Vue.prototype.$uploadFiles = async function(files) {
anchor.download = filename
if (files.length == 0) return
document.body.appendChild(anchor)
if (!this.$checkFileMimetype(files)) return
anchor.click()
}
Vue.prototype.$closePopup = function () {
events.$emit('popup:close')
}
this.$handleUploading(files, undefined)
}
Vue.prototype.$isThisRoute = function (route, locations) {
Vue.prototype.$uploadExternalFiles = async function(event, parent_id) {
return includes(locations, route.name)
}
// Prevent submit empty files
if (event.dataTransfer.items.length == 0) return
Vue.prototype.$isThisLocation = function (location) {
// Get current location
let currentLocation = store.getters.currentFolder && store.getters.currentFolder.location ? store.getters.currentFolder.location : undefined
// Get files
let files = [...event.dataTransfer.items].map(item => item.getAsFile())
// Check if type is object
if (typeof location === 'Object' || location instanceof Object) {
return includes(location, currentLocation)
} else {
return currentLocation === location
}
}
Vue.prototype.$checkPermission = function (type) {
let currentPermission = store.getters.permission
// Check if type is object
if (typeof type === 'Object' || type instanceof Object) {
return includes(type, currentPermission)
} else {
return currentPermission === type
}
}
this.$handleUploading(files, parent_id)
}
Vue.prototype.$isMobile = function () {
const toMatch = [
/Android/i,
/webOS/i,
/iPhone/i,
/iPad/i,
/iPod/i,
/BlackBerry/i,
/Windows Phone/i
]
return toMatch.some(toMatchItem => {
return navigator.userAgent.match(toMatchItem)
})
}
Vue.prototype.$downloadFile = function(url, filename) {
var anchor = document.createElement('a')
Vue.prototype.$isMinimalScale = function () {
let sizeType = store.getters.filesViewWidth
return sizeType === 'minimal-scale'
}
Vue.prototype.$isCompactScale = function () {
let sizeType = store.getters.filesViewWidth
return sizeType === 'compact-scale'
}
Vue.prototype.$isFullScale = function () {
let sizeType = store.getters.filesViewWidth
return sizeType === 'full-scale'
}
Vue.prototype.$isSomethingWrong = function () {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
}
Vue.prototype.$checkFileMimetype = function(files) {
let validated = true
let mimetypesBlacklist = store.getters.config.mimetypesBlacklist
for (let i = 0 ; i<files.length; i++ ) {
let fileType = files[i].type.split('/')
if(!fileType[0]) {
fileType[1] = _.last(files[i].name.split('.'))
}
if(mimetypesBlacklist.includes(fileType[1])) {
validated = false
events.$emit('alert:open', {
emoji: '😬😬😬',
title: i18n.t('popup_mimetypes_blacklist.title'),
message: i18n.t('popup_mimetypes_blacklist.message', {mimetype: fileType[1]}),
})
}
}
return validated
}
Vue.prototype.$getDataByLocation = function() {
let folder = store.getters.currentFolder
let actions = {
'base' : ['getFolder', [{ folder: folder, back: true, init: false, sorting:true}]],
'public' : ['browseShared', [{ folder: folder, back: true, init: false, sorting:true}]],
'trash' : ['getFolder', [{ folder: folder, back: true, init: false, sorting:true}]],
'participant_uploads' : ['getParticipantUploads'],
'trash-root' : ['getTrash'],
'latest' : ['getLatest'],
'shared' : ['getShared'],
}
this.$store.dispatch(...actions[folder.location])
// Get dara of user with favourites tree
this.$store.dispatch('getAppData')
// Get data of Navigator tree
this.$store.dispatch('getFolderTree')
}
Vue.prototype.$checkOS = function() {
// Handle styled scrollbar for Windows
if (navigator.userAgent.indexOf('Windows') != -1) {
let body = document.body
body.classList.add('windows')
}
}
}
anchor.href = url
anchor.download = filename
document.body.appendChild(anchor)
anchor.click()
}
Vue.prototype.$closePopup = function() {
events.$emit('popup:close')
}
Vue.prototype.$isThisRoute = function(route, locations) {
return includes(locations, route.name)
}
Vue.prototype.$isThisLocation = function(location) {
// Get current location
let currentLocation = store.getters.currentFolder && store.getters.currentFolder.location ? store.getters.currentFolder.location : undefined
// Check if type is object
if (typeof location === 'Object' || location instanceof Object) {
return includes(location, currentLocation)
} else {
return currentLocation === location
}
}
Vue.prototype.$checkPermission = function(type) {
let currentPermission = store.getters.permission
// Check if type is object
if (typeof type === 'Object' || type instanceof Object) {
return includes(type, currentPermission)
} else {
return currentPermission === type
}
}
Vue.prototype.$isMobile = function() {
const toMatch = [
/Android/i,
/webOS/i,
/iPhone/i,
/iPad/i,
/iPod/i,
/BlackBerry/i,
/Windows Phone/i
]
return toMatch.some(toMatchItem => {
return navigator.userAgent.match(toMatchItem)
})
}
Vue.prototype.$isMinimalScale = function() {
let sizeType = store.getters.filesViewWidth
return sizeType === 'minimal-scale'
}
Vue.prototype.$isCompactScale = function() {
let sizeType = store.getters.filesViewWidth
return sizeType === 'compact-scale'
}
Vue.prototype.$isFullScale = function() {
let sizeType = store.getters.filesViewWidth
return sizeType === 'full-scale'
}
Vue.prototype.$isSomethingWrong = function() {
events.$emit('alert:open', {
title: i18n.t('popup_error.title'),
message: i18n.t('popup_error.message')
})
}
Vue.prototype.$checkFileMimetype = function(files) {
let validated = true
let mimetypesBlacklist = store.getters.config.mimetypesBlacklist
for (let i = 0; i < files.length; i++) {
let fileType = files[i].type.split('/')
if (!fileType[0]) {
fileType[1] = _.last(files[i].name.split('.'))
}
if (mimetypesBlacklist.includes(fileType[1])) {
validated = false
events.$emit('alert:open', {
emoji: '😬😬😬',
title: i18n.t('popup_mimetypes_blacklist.title'),
message: i18n.t('popup_mimetypes_blacklist.message', { mimetype: fileType[1] })
})
}
}
return validated
}
Vue.prototype.$getDataByLocation = function() {
let folder = store.getters.currentFolder
let actions = {
'base': ['getFolder', [{ folder: folder, back: true, init: false, sorting: true }]],
'public': ['browseShared', [{ folder: folder, back: true, init: false, sorting: true }]],
'trash': ['getFolder', [{ folder: folder, back: true, init: false, sorting: true }]],
'participant_uploads': ['getParticipantUploads'],
'trash-root': ['getTrash'],
'latest': ['getLatest'],
'shared': ['getShared']
}
this.$store.dispatch(...actions[folder.location])
// Get dara of user with favourites tree
this.$store.dispatch('getAppData')
// Get data of Navigator tree
this.$store.dispatch('getFolderTree')
}
Vue.prototype.$checkOS = function() {
// Handle styled scrollbar for Windows
if (navigator.userAgent.indexOf('Windows') != -1) {
let body = document.body
body.classList.add('windows')
}
}
}
}
export default Helpers

View File

@@ -14,7 +14,10 @@ const actions = {
// get unique_ids of selected files
getters.fileInfoDetail.forEach(file => files.push(file.unique_id))
let route = '/download'
// Get route
let route = getters.sharedDetail && ! getters.sharedDetail.protected
? '/api/zip/public/' + router.currentRoute.params.token
: '/api/zip'
axios.post(route, {
files: files
@@ -30,24 +33,20 @@ const actions = {
let itemsToMove = []
let items = [noSelectedItem]
//If coming no selected item dont get items to move from fileInfoDetail
if(!noSelectedItem) {
items = getters.fileInfoDetail
}
items.forEach((data) => {
itemsToMove.push({
'force_delete': data.deleted_at ? true : false,
'type': data.type,
"unique_id": data.unique_id
})
})
// If coming no selected item dont get items to move from fileInfoDetail
if (!noSelectedItem)
items = getters.fileInfoDetail
items.forEach(data => itemsToMove.push({
'force_delete': data.deleted_at ? true : false,
"unique_id": data.unique_id,
'type': data.type
}))
// Remove file preview
if(!noSelectedItem){
if (!noSelectedItem)
commit('CLEAR_FILEINFO_DETAIL')
}
// Get route
let route = getters.sharedDetail && ! getters.sharedDetail.protected
@@ -57,17 +56,17 @@ const actions = {
axios
.post(route, {
_method: 'post',
to_unique_id:to_item.unique_id,
to_unique_id: to_item.unique_id,
items: itemsToMove
})
.then(() => {
itemsToMove.forEach(item=> {
itemsToMove.forEach(item => {
commit('REMOVE_ITEM', item.unique_id)
commit('INCREASE_FOLDER_ITEM', to_item.unique_id)
if (item.type === 'folder' && getters.currentFolder.location !== 'public')
dispatch('getAppData')
})
})
})
.catch(() => Vue.prototype.$isSomethingWrong())
},

View File

@@ -44,11 +44,12 @@ Route::group(['middleware' => ['api'], 'prefix' => 'public'], function () {
Route::group(['middleware' => ['api']], function () {
// Edit Functions
Route::post('/remove-item/public/{token}', 'FileFunctions\EditItemsController@guest_delete_item');
Route::patch('/rename-item/{unique_id}/public/{token}', 'FileFunctions\EditItemsController@guest_rename_item');
Route::post('/create-folder/public/{token}', 'FileFunctions\EditItemsController@guest_create_folder');
Route::post('/move/public/{token}', 'FileFunctions\EditItemsController@guest_move');
Route::post('/remove-item/public/{token}', 'FileFunctions\EditItemsController@guest_delete_item');
Route::post('/zip/public/{token}', 'FileFunctions\EditItemsController@guest_zip_multiple_files');
Route::post('/upload/public/{token}', 'FileFunctions\EditItemsController@guest_upload');
Route::post('/move/public/{token}', 'FileFunctions\EditItemsController@guest_move');
// Sharing page browsing
Route::get('/folders/{unique_id}/public/{token}', 'Sharing\FileSharingController@get_public_folders');
@@ -183,9 +184,10 @@ Route::group(['middleware' => ['auth:api', 'auth.shared', 'scope:visitor,editor'
Route::group(['middleware' => ['auth:api', 'auth.shared', 'auth.master', 'scope:master,editor']], function () {
// Edit items
Route::post('/remove-item', 'FileFunctions\EditItemsController@user_delete_item');
Route::patch('/rename-item/{unique_id}', 'FileFunctions\EditItemsController@user_rename_item');
Route::post('/create-folder', 'FileFunctions\EditItemsController@user_create_folder');
Route::post('/move', 'FileFunctions\EditItemsController@user_move');
Route::post('/remove-item', 'FileFunctions\EditItemsController@user_delete_item');
Route::post('/zip', 'FileFunctions\EditItemsController@user_zip_multiple_files');
Route::post('/upload', 'FileFunctions\EditItemsController@user_upload');
Route::post('/move', 'FileFunctions\EditItemsController@user_move');
});

View File

@@ -24,12 +24,12 @@ Route::get('/system/{image}', 'FileAccessController@get_system_image');
// Get public thumbnails and files
Route::get('/thumbnail/{name}/public/{token}', 'FileAccessController@get_thumbnail_public');
Route::get('/file/{name}/public/{token}', 'FileAccessController@get_file_public');
Route::get('/zip/{id}/public/{token}', 'FileAccessController@get_zip_public')->name('zip_public');
// User master,editor,visitor access to image thumbnails and file downloads
Route::group(['middleware' => ['auth:api', 'auth.shared', 'auth.master', 'scope:master,editor,visitor']], function () {
Route::get('/thumbnail/{name}', 'FileAccessController@get_thumbnail')->name('thumbnail');
Route::get('/file/{name}', 'FileAccessController@get_file')->name('file');
Route::post('/download', 'FileFunctions\EditItemsController@user_zip_multiple_files');
Route::get('/zip/{id}', 'FileAccessController@get_zip')->name('zip');
});