From: Vincent Vanwaelscappel Date: Fri, 17 Feb 2023 18:36:39 +0000 (+0100) Subject: wait #5718 @1.5 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=2e16ed7b4712acf881a72883694de520fd4fd201;p=fluidbook-toolbox.git wait #5718 @1.5 --- diff --git a/app/Http/Controllers/Admin/Operations/Files/DownloadOperation.php b/app/Http/Controllers/Admin/Operations/Files/DownloadOperation.php index 8c6098015..27dbb4a1a 100644 --- a/app/Http/Controllers/Admin/Operations/Files/DownloadOperation.php +++ b/app/Http/Controllers/Admin/Operations/Files/DownloadOperation.php @@ -18,7 +18,6 @@ trait DownloadOperation { Route::match(['get'], $segment . '/{hash}/install', $controller . '@manifestIpa')->withoutMiddleware([CheckIfAdmin::class]); Route::match(['get'], $segment . '/{hash}/{file}', $controller . '@download')->withoutMiddleware([CheckIfAdmin::class]); - } protected function setupDownloadDefaults() @@ -36,6 +35,8 @@ trait DownloadOperation return XSendFileController::sendfile($file->path); } + + /** * @throws IOException */ diff --git a/app/Http/Controllers/Admin/Operations/Files/UploadOperation.php b/app/Http/Controllers/Admin/Operations/Files/UploadOperation.php index 733cd84fc..296c4f0f2 100644 --- a/app/Http/Controllers/Admin/Operations/Files/UploadOperation.php +++ b/app/Http/Controllers/Admin/Operations/Files/UploadOperation.php @@ -4,19 +4,20 @@ namespace App\Http\Controllers\Admin\Operations\Files; use App\Models\File; -use App\Models\Quiz; -use App\Models\QuizTranslation; +use App\Models\User; +use App\Slack\Slack; use Cubist\Util\Files\Files; use Illuminate\Http\UploadedFile; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Route; use Prologue\Alerts\Facades\Alert; -use ZipArchive; trait UploadOperation { protected function setupImportRoutes($segment, $routeName, $controller) { Route::match(['post'], $segment . '/upload', $controller . '@upload'); + Route::match(['post'], $segment . '/{user}/upload', $controller . '@upload'); } protected function setupImportDefaults() @@ -24,7 +25,8 @@ trait UploadOperation $this->crud->addButtonFromView('top', 'import', 'files.upload', 'end'); } - protected function upload() + + protected function upload($user = null) { /** @var UploadedFile[] $files */ $files = request()->allFiles()['file']; @@ -35,14 +37,36 @@ trait UploadOperation } $j = 0; + $paths = []; foreach ($files as $file) { - File::importUploadedFile($file); + $paths[] = File::importUploadedFile($file, $user, false); $j++; } if ($j === 0) { Alert::warning(__('Aucun fichier chargé'))->flash(); } else { + Cache::forget(File::_cacheKeyUserFolder(backpack_user()->id)); + if (null !== $user) { + Cache::forget(File::_cacheKeyUserFolder($user)); + } + File::refreshDatabase(); + + if (null !== $user) { + /** @var User $destUser */ + $destUser = User::withoutGlobalScopes()->find($user); + $subject = __(':nb fichiers chargés pour ' . $destUser->nameWithCompany, ['nb' => $j]); + $destChannel = backpack_user()->slack; + } else { + $subject = __(':nb fichiers chargés par ' . backpack_user()->nameWithCompany, ['nb' => $j]); + $destChannel = Slack::fluidbookFilesChannel; + } + $actions = []; + foreach ($paths as $path) { + $spl = new \SplFileInfo($path); + $actions[$spl->getFilename()] = backpack_url('/file/' . File::hash($path) . '/' . $spl->getFilename()); + } + Slack::send($destChannel, $subject, '', $actions); Alert::success(__(':nb fichiers chargés', ['nb' => '' . $j . '']))->flash(); } return redirect($this->crud->route); diff --git a/app/Http/Controllers/Admin/Operations/Files/UserListOperation.php b/app/Http/Controllers/Admin/Operations/Files/UserListOperation.php new file mode 100644 index 000000000..63e0b8c48 --- /dev/null +++ b/app/Http/Controllers/Admin/Operations/Files/UserListOperation.php @@ -0,0 +1,57 @@ + $routeName . '.userlist', + 'uses' => $controller . '@userlist', + 'operation' => 'list', + ]); + + Route::post($segment . '/{user}/search', [ + 'as' => $routeName . '.usersearch', + 'uses' => $controller . '@search', + 'operation' => 'list', + ]); + } + + public function setupUserListDefaults() + { + $this->crud->operation('list', function () { + $userid = request()->route('user'); + if (null !== $userid) { + $user = User::withoutGlobalScopes()->find($userid); + $this->crud->searchURL = $userid . '/search'; + $this->crud->addClause('whereIn', 'owner', $user->getManagedUsers()); + } + $this->crud->disablePersistentTable(); + $this->crud->orderBy('mtime', 'DESC'); + }); + } + + public function userlist($id) + { + /** @var User $user */ + $user = User::withoutGlobalScopes()->find($id); + + $this->crud->hasAccessOrFail('list'); + $this->crud->setHeading(__('Fichiers de :user', ['user' => $user->nameWithCompany])); + + $this->data['crud'] = $this->crud; + $this->data['title'] = $this->crud->getHeading(); + $this->crud->shareLabel = __('Partager des fichiers avec :user', ['user' => $user->firstname . ' ' . $user->lastname]); + $this->crud->shareURL = $id . '/upload'; + + // load the view from /resources/views/vendor/backpack/crud/ if it exists, otherwise load the one in the package + return view($this->crud->getListView(), $this->data); + } + + +} diff --git a/app/Models/File.php b/app/Models/File.php index 7176ea998..ee9fc2046 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Http\Controllers\Admin\Operations\Files\DownloadOperation; use App\Http\Controllers\Admin\Operations\Files\UploadOperation; +use App\Http\Controllers\Admin\Operations\Files\UserListOperation; use App\Models\Base\ToolboxModel; use Cubist\Backpack\CubistBackpackServiceProvider; use Cubist\Backpack\Magic\Fields\Date; @@ -37,7 +38,7 @@ class File extends ToolboxModel protected $keyType = 'string'; - protected $_operations = [DownloadOperation::class, UploadOperation::class]; + protected $_operations = [DownloadOperation::class, UploadOperation::class, UserListOperation::class]; public static string $basePath = '/application/ftp/'; @@ -162,15 +163,27 @@ class File extends ToolboxModel /** * @param $file UploadedFile - * @return void + * @return string */ - public static function importUploadedFile($file) + public static function importUploadedFile($file, $to = null, $refreshDatabase = true) { - $userId = backpack_user()->id; - $dest = Files::mkdir(self::$basePath . '/' . $userId) . Files::tidyName($file->getClientOriginalName()); + $from = backpack_user()->id; + if (null === $to) { + /** @var User $toUser */ + $dir = self::$basePath . '/' . $from; + } else { + $dir = self::$basePath . '/' . $to . '/.in/' . $from; + } + $dest = Files::mkdir($dir) . Files::tidyName($file->getClientOriginalName()); move_uploaded_file($file->getPathname(), $dest); - Cache::forget(self::_cacheKeyUserFolder($userId)); - static::refreshDatabase(true); + if ($refreshDatabase) { + Cache::forget(self::_cacheKeyUserFolder($from)); + if (null !== $to) { + Cache::forget(self::_cacheKeyUserFolder($to)); + } + static::refreshDatabase(true); + } + return $dest; } public static function hash($pathname) diff --git a/app/Slack/Slack.php b/app/Slack/Slack.php index 8e02bbd7b..57a1dd26c 100644 --- a/app/Slack/Slack.php +++ b/app/Slack/Slack.php @@ -9,6 +9,7 @@ class Slack { const fluidbookQuoteChannel = 'C045CH0UB47'; const fluidbookPreviewAlertsChannel = 'C04Q9LZNPT2'; + const fluidbookFilesChannel='C04QJSY7CEM'; /** * @var \JoliCode\Slack\Client|null diff --git a/config/backpack/base.php b/config/backpack/base.php index bca61281b..a606a65f2 100644 --- a/config/backpack/base.php +++ b/config/backpack/base.php @@ -136,6 +136,7 @@ return [ 'https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js', "https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.9.2/jquery.contextMenu.min.js", "https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.9.2/jquery.ui.position.min.js", + 'https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js', // examples (everything inside the bundle, loaded from CDN) // 'https://code.jquery.com/jquery-3.4.1.min.js', diff --git a/public/packages/fluidbook/toolbox/css/loader.css b/public/packages/fluidbook/toolbox/css/loader.css new file mode 100644 index 000000000..263101c16 --- /dev/null +++ b/public/packages/fluidbook/toolbox/css/loader.css @@ -0,0 +1,57 @@ +#compositionProgress { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.25); +} +#compositionProgress div { + position: absolute; + top: calc(50% - 65px); + left: calc(50% - 200px); + width: 400px; + height: 130px; + padding: 20px; + background-color: #fff; + border-radius: 4px; +} +#compositionProgress span { + display: block; + text-align: center; + font-size: 17px; +} +#compositionProgress progress { + width: 100%; + margin: 10px auto; + height: 25px; + appearance: none; + border-radius: 2px; + border: 1px solid rgba(0, 40, 100, 0.12); +} +#compositionProgress progress::-moz-progress-bar, +#compositionProgress progress::-webkit-progress-value { + border-radius: 2px; +} +#compositionProgress progress[data-step="0"] { + background-color: #fff; +} +#compositionProgress progress[data-step="0"]::-moz-progress-bar, +#compositionProgress progress[data-step="0"]::-webkit-progress-value { + background-color: #3d86ee; +} +#compositionProgress progress[data-step="1"] { + background-color: #3d86ee; +} +#compositionProgress progress[data-step="1"]::-moz-progress-bar, +#compositionProgress progress[data-step="1"]::-webkit-progress-value { + background-color: #3471c8; +} +#compositionProgress progress[data-step="2"] { + background-color: #3471c8; +} +#compositionProgress progress[data-step="2"]::-moz-progress-bar, +#compositionProgress progress[data-step="2"]::-webkit-progress-value { + background-color: #20457b; +} +/*# sourceMappingURL=loader.css.map */ \ No newline at end of file diff --git a/public/packages/fluidbook/toolbox/css/loader.css.map b/public/packages/fluidbook/toolbox/css/loader.css.map new file mode 100644 index 000000000..4bdd4d524 --- /dev/null +++ b/public/packages/fluidbook/toolbox/css/loader.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["loader.less"],"names":[],"mappings":"AAAA;EACI,eAAA;EACA,MAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,qCAAA;;AAGJ,oBAAqB;EACjB,kBAAA;EACA,KAAK,gBAAL;EACA,MAAM,iBAAN;EACA,YAAA;EACA,aAAA;EACA,aAAA;EACA,sBAAA;EACA,kBAAA;;AAGJ,oBAAqB;EACjB,cAAA;EACA,kBAAA;EACA,eAAA;;AAGJ,oBAAqB;EACjB,WAAA;EACA,iBAAA;EACA,YAAA;EACA,gBAAA;EACA,kBAAA;EACA,wCAAA;;AAGJ,oBAAqB,SAAQ;AAAqB,oBAAqB,SAAQ;EAC3E,kBAAA;;AAGJ,oBAAqB,SAAQ;EACzB,sBAAA;;AAGJ,oBAAqB,SAAQ,eAAe;AAAqB,oBAAqB,SAAQ,eAAe;EACzG,yBAAA;;AAGJ,oBAAqB,SAAQ;EACzB,yBAAA;;AAGJ,oBAAqB,SAAQ,eAAe;AAAqB,oBAAqB,SAAQ,eAAe;EACzG,yBAAA;;AAGJ,oBAAqB,SAAQ;EACzB,yBAAA;;AAGJ,oBAAqB,SAAQ,eAAe;AAAqB,oBAAqB,SAAQ,eAAe;EACzG,yBAAA","file":"loader.css"} \ No newline at end of file diff --git a/public/packages/fluidbook/toolbox/css/loader.less b/public/packages/fluidbook/toolbox/css/loader.less new file mode 100644 index 000000000..4028805b9 --- /dev/null +++ b/public/packages/fluidbook/toolbox/css/loader.less @@ -0,0 +1,66 @@ +#loader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.25); + cursor: wait; + + div { + position: absolute; + top: calc(50% - 65px); + left: calc(50% - 200px); + width: 400px; + height: 130px; + padding: 20px; + background-color: #fff; + border-radius: 4px; + pointer-events: none; + } + + span { + display: block; + text-align: center; + font-size: 17px; + } + + progress { + width: 100%; + margin: 10px auto; + height: 25px; + appearance: none; + border-radius: 2px; + border: 1px solid rgba(0, 40, 100, .12); + } + + progress::-moz-progress-bar, progress::-webkit-progress-value { + border-radius: 2px; + } + + progress[data-step="0"] { + background-color: #fff; + } + + progress[data-step="0"]::-moz-progress-bar, progress[data-step="0"]::-webkit-progress-value { + background-color: #3d86ee; + } + + progress[data-step="1"] { + background-color: #3d86ee; + } + + progress[data-step="1"]::-moz-progress-bar, progress[data-step="1"]::-webkit-progress-value { + background-color: #3471c8; + } + + progress[data-step="2"] { + background-color: #3471c8; + } + + progress[data-step="2"]::-moz-progress-bar, progress[data-step="2"]::-webkit-progress-value { + background-color: #20457b; + } + +} + diff --git a/public/packages/fluidbook/toolbox/css/style.less b/public/packages/fluidbook/toolbox/css/style.less index 33bd03e67..c2bbd6013 100644 --- a/public/packages/fluidbook/toolbox/css/style.less +++ b/public/packages/fluidbook/toolbox/css/style.less @@ -448,4 +448,5 @@ body.embeded { } @import "context-menu"; +@import "loader"; diff --git a/public/packages/fluidbook/toolbox/js/bundle.js b/public/packages/fluidbook/toolbox/js/bundle.js index e69de29bb..95a5789d7 100644 --- a/public/packages/fluidbook/toolbox/js/bundle.js +++ b/public/packages/fluidbook/toolbox/js/bundle.js @@ -0,0 +1,70 @@ +$(function () { + $(document).on('submit', 'form.ajaxProgressForm', function () { + var progressMessage = $(this).data('progressmessage'); + var errorMessage = $(this).data('errormessage'); + var endMessage = $(this).data('endmessage'); + var successMessage = $(this).data('successmessage'); + var reloadOnSuccess = $(this).data('reloadonsuccess'); + $(this).ajaxSubmit( + { + success: function (data) { + if (reloadOnSuccess) { + showLoader(successMessage, 1); + setTimeout(function () { + window.location.reload(); + }, 1000) + } else { + hideLoader(); + } + }, + uploadProgress: function (event, position, total, percentComplete) { + var progress = position / total; + showLoader(progressMessage, progress); + if (progress == 1) { + showLoader(endMessage, progress) + } + }, + error: function (data) { + new Noty({ + type: 'error', + text: errorMessage, + }).show(); + } + } + ); + return false; + }); +}); + +function showLoader(message, progress) { + if ($("#loader").length === 0) { + $('body').append('
'); + } + if (message !== '' && progress > 0) { + var pb = $("#loader progress"); + $("#loader span").html(message); + if (pb.attr('data-progress') == progress) { + return; + } + var dp = (progress % 1); + if (dp === 0 && progress > 0) { + dp = 1; + } + var p = Math.round(dp * 100); + var step = progress - dp; + var duration = 0.5; + if (p < pb.attr('value')) { + duration = 0; + } + + gsap.to(pb, { + duration: duration, ease: 'none', attr: {'value': p}, onComplete: function () { + pb.attr('data-step', step); + } + }); + } +} + +function hideLoader() { + $("#loader").remove(); +} diff --git a/resources/views/fields/fluidbook_composition.blade.php b/resources/views/fields/fluidbook_composition.blade.php index d1e18df57..2a97cc0f5 100644 --- a/resources/views/fields/fluidbook_composition.blade.php +++ b/resources/views/fields/fluidbook_composition.blade.php @@ -175,31 +175,7 @@ } function showProgressBar(message, progress, uploadID) { - if ($("#compositionProgress").length === 0) { - $('body').append('
'); - } - if (message !== '' && progress > 0) { - $("#compositionProgress span").html(message); - if ($("#compositionProgress progress").attr('data-progress') == progress) { - return; - } - var dp = (progress % 1); - if (dp === 0 && progress > 0) { - dp = 1; - } - var p = Math.round(dp * 100); - var step = progress - dp; - var duration = 0.5; - if (p < $("#compositionProgress progress").attr('value')) { - duration = 0; - } - - gsap.to($("#compositionProgress progress"), { - duration: duration, ease: 'none', attr: {'value': p}, onComplete: function () { - $("#compositionProgress progress").attr('data-step', step); - } - }); - } + showLoader(message,progress) if (progress >= 3) { hideProgressBar(); @@ -223,7 +199,7 @@ function hideProgressBar() { setTimeout(function () { - $("#compositionProgress").remove(); + hideLoader(); }, 2000); } @@ -801,69 +777,6 @@ left: 12px; } - #compositionProgress { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.25); - } - - #compositionProgress div { - position: absolute; - top: calc(50% - 65px); - left: calc(50% - 200px); - width: 400px; - height: 130px; - padding: 20px; - background-color: #fff; - border-radius: 4px; - } - - #compositionProgress span { - display: block; - text-align: center; - font-size: 17px; - } - - #compositionProgress progress { - width: 100%; - margin: 10px auto; - height: 25px; - appearance: none; - border-radius: 2px; - border: 1px solid rgba(0, 40, 100, .12); - } - - #compositionProgress progress::-moz-progress-bar, #compositionProgress progress::-webkit-progress-value { - border-radius: 2px; - } - - #compositionProgress progress[data-step="0"] { - background-color: #fff; - } - - #compositionProgress progress[data-step="0"]::-moz-progress-bar, #compositionProgress progress[data-step="0"]::-webkit-progress-value { - background-color: #3d86ee; - } - - #compositionProgress progress[data-step="1"] { - background-color: #3d86ee; - } - - #compositionProgress progress[data-step="1"]::-moz-progress-bar, #compositionProgress progress[data-step="1"]::-webkit-progress-value { - background-color: #3471c8; - } - - #compositionProgress progress[data-step="2"] { - background-color: #3471c8; - } - - #compositionProgress progress[data-step="2"]::-moz-progress-bar, #compositionProgress progress[data-step="2"]::-webkit-progress-value { - background-color: #20457b; - } - .pace { opacity: 0; } diff --git a/resources/views/vendor/backpack/crud/buttons/files/upload.blade.php b/resources/views/vendor/backpack/crud/buttons/files/upload.blade.php index 668911228..3fe5286e4 100644 --- a/resources/views/vendor/backpack/crud/buttons/files/upload.blade.php +++ b/resources/views/vendor/backpack/crud/buttons/files/upload.blade.php @@ -1,10 +1,16 @@ - {{__('Partager des fichiers')}} + class="la la-upload"> {{$crud->shareLabel??__('Partager des fichiers')}} @push('after_scripts') diff --git a/resources/views/vendor/backpack/crud/buttons/user/files.blade.php b/resources/views/vendor/backpack/crud/buttons/user/files.blade.php new file mode 100644 index 000000000..80f4d3f4f --- /dev/null +++ b/resources/views/vendor/backpack/crud/buttons/user/files.blade.php @@ -0,0 +1,4 @@ +@if(backpack_user()->isOwner($entry)) + {{__('Partager des fichiers')}} +@endif diff --git a/resources/views/vendor/backpack/crud/inc/datatables_logic.blade.php b/resources/views/vendor/backpack/crud/inc/datatables_logic.blade.php index 3d91ff806..25e55a02e 100644 --- a/resources/views/vendor/backpack/crud/inc/datatables_logic.blade.php +++ b/resources/views/vendor/backpack/crud/inc/datatables_logic.blade.php @@ -213,7 +213,7 @@ serverSide: true, searching: @json($crud->getOperationSetting('searchableTable') ?? true), ajax: { - "url": "{!! url($crud->route.'/search').'?'.Request::getQueryString() !!}", + "url": "{!! url($crud->route.'/'.(isset($crud->searchURL) && $crud->searchURL?$crud->searchURL:'search')).'?'.Request::getQueryString() !!}", "type": "POST" }, dom: