diff --git a/src/Bridge/Sylius/config/app/twig_hooks/media/index.php b/src/Bridge/Sylius/config/app/twig_hooks/media/index.php index b17584ab..73735fca 100644 --- a/src/Bridge/Sylius/config/app/twig_hooks/media/index.php +++ b/src/Bridge/Sylius/config/app/twig_hooks/media/index.php @@ -7,6 +7,13 @@ return static function (ContainerConfigurator $container): void { $container->extension('sylius_twig_hooks', [ 'hooks' => [ + 'joli_media_sylius_admin.media.index' => [ + 'modal' => [ + 'template' => '@JoliMediaSylius/admin/media/index/modal/move_directory_modal.html.twig', + 'priority' => 100, + ], + ], + 'joli_media_sylius_admin.media.index.content' => [ 'header' => [ 'template' => '@JoliMediaSylius/admin/media/index/content/header.html.twig', diff --git a/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php b/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php index 1e917c28..2e15cfce 100644 --- a/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php +++ b/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php @@ -151,6 +151,44 @@ public function renameDirectory(Request $request): Response } } + #[Route(path: '/move-directory', name: 'move_directory', methods: [Request::METHOD_POST])] + public function moveDirectory(Request $request): Response + { + $from = Resolver::normalizePath($request->request->getString('from')); + $to = Resolver::normalizePath($request->request->getString('to')); + + $csrfToken = $request->request->getString('_csrf_token'); + + if (!$this->csrfTokenManager->isTokenValid(new CsrfToken('media_move_directory', $csrfToken))) { + $this->addFlash('error', 'Invalid CSRF token'); + + return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore')); + } + + if (!$from) { + $this->addFlash('error', 'Missing parameters'); + + return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore')); + } + + try { + $target = $to ? \sprintf('%s/%s', $to, basename($from)) : basename($from); + $this->getOriginalStorage()->moveFolder($from, $target); + + $this->addFlash('success', $this->translator->trans( + 'directory.move_success', + ['%from%' => $from, '%to%' => $target], + 'JoliMediaSyliusBundle' + )); + + return $this->redirectAfterRename($request, $from, $target); + } catch (\Throwable $e) { + $this->addFlash('error', $e->getMessage()); + + return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore')); + } + } + #[Route(path: '/rename', name: 'rename', methods: [Request::METHOD_POST])] public function rename(Request $request): Response { diff --git a/src/Bridge/Sylius/src/Admin/Grid/MediaGrid.php b/src/Bridge/Sylius/src/Admin/Grid/MediaGrid.php index b410e72e..5298c3df 100644 --- a/src/Bridge/Sylius/src/Admin/Grid/MediaGrid.php +++ b/src/Bridge/Sylius/src/Admin/Grid/MediaGrid.php @@ -72,6 +72,10 @@ public function __invoke(GridBuilderInterface $gridBuilder): void ->setLabel($this->trans('action.rename_directory')) ->setIcon('tabler:pencil') ->setTemplate('@JoliMediaSylius/admin/media/grid/action/rename_directory.html.twig'), + Action::create('move_directory', 'custom') + ->setLabel($this->trans('action.move_directory')) + ->setIcon('fa7-solid:folder-tree') + ->setTemplate('@JoliMediaSylius/admin/media/grid/action/move_directory.html.twig'), Action::create('create_directory', 'custom') ->setLabel($this->trans('directory.create')) ->setIcon('tabler:folder-plus') diff --git a/src/Bridge/Sylius/templates/admin/media/grid/action/create_directory.html.twig b/src/Bridge/Sylius/templates/admin/media/grid/action/create_directory.html.twig index 7b6f418a..4e8bad21 100644 --- a/src/Bridge/Sylius/templates/admin/media/grid/action/create_directory.html.twig +++ b/src/Bridge/Sylius/templates/admin/media/grid/action/create_directory.html.twig @@ -1,9 +1,19 @@ +{% import ['@SyliusBootstrapAdminUi/shared/helper/button.html.twig', '@SyliusAdmin/shared/helper/button.html.twig'] as button %} + {% set message = action.label %} {% if message is empty %} {% set message = 'sylius.ui.create' %} {% endif %} - - {{ ux_icon(action.icon|default('tabler:plus'), {'class': 'icon dropdown-item-icon'}) }} - {{ message|trans }} - +{{ button.default({ + url: '#', + icon: action.icon|default('tabler:plus'), + icon_class: 'icon dropdown-item-icon', + icon_only: true, + text: message|trans, + attr: { + 'data-bs-toggle': 'tooltip', + 'data-bs-title': message|trans, + 'data-component': 'directory-create' + } +}) }} diff --git a/src/Bridge/Sylius/templates/admin/media/grid/action/delete_directory.html.twig b/src/Bridge/Sylius/templates/admin/media/grid/action/delete_directory.html.twig index 1805b167..bc0d35da 100644 --- a/src/Bridge/Sylius/templates/admin/media/grid/action/delete_directory.html.twig +++ b/src/Bridge/Sylius/templates/admin/media/grid/action/delete_directory.html.twig @@ -8,7 +8,7 @@ id: key, modal_id: 'delete-directory-modal-' ~ random(), path: path('joli_media_sylius_admin_delete_directory', {'key': key}), - icon_only: false, + icon_only: true, label: action.label, }) }} {% endif %} diff --git a/src/Bridge/Sylius/templates/admin/media/grid/action/move_directory.html.twig b/src/Bridge/Sylius/templates/admin/media/grid/action/move_directory.html.twig new file mode 100644 index 00000000..7cdb23bd --- /dev/null +++ b/src/Bridge/Sylius/templates/admin/media/grid/action/move_directory.html.twig @@ -0,0 +1,26 @@ +{% import ['@SyliusBootstrapAdminUi/shared/helper/button.html.twig', '@SyliusAdmin/shared/helper/button.html.twig'] as button %} + +{% set key = app.request.attributes.get('key', '') %} + +{% if key != '' %} + {% set message = action.label %} + {% if message is empty %} + {% set message = 'sylius.ui.update' %} + {% endif %} + + + {{ button.default({ + url: path('joli_media_sylius_admin_choose'), + icon: action.icon|default('fa7-solid:folder-tree'), + icon_class: 'icon dropdown-item-icon', + icon_only: true, + text: message|trans, + attr: { + 'data-bs-toggle': 'tooltip', + 'data-bs-title': message|trans, + 'data-folder': key|joli_media_admin_dirname, + 'data-component': 'media-move' + } + }) }} + +{% endif %} diff --git a/src/Bridge/Sylius/templates/admin/media/grid/action/rename_directory.html.twig b/src/Bridge/Sylius/templates/admin/media/grid/action/rename_directory.html.twig index 4e072229..41c71fe2 100644 --- a/src/Bridge/Sylius/templates/admin/media/grid/action/rename_directory.html.twig +++ b/src/Bridge/Sylius/templates/admin/media/grid/action/rename_directory.html.twig @@ -1,3 +1,5 @@ +{% import ['@SyliusBootstrapAdminUi/shared/helper/button.html.twig', '@SyliusAdmin/shared/helper/button.html.twig'] as button %} + {% set key = app.request.attributes.get('key', '') %} {% if key != '' %} @@ -6,8 +8,18 @@ {% set message = 'sylius.ui.update' %} {% endif %} - - {{ ux_icon(action.icon|default('tabler:pencil'), {'class': 'icon dropdown-item-icon'}) }} - {{ message|trans }} - + {{ button.default({ + url: '#', + icon: action.icon|default('tabler:pencil'), + icon_class: 'icon dropdown-item-icon', + icon_only: true, + text: message|trans, + class: 'directory-rename-header-btn', + attr: { + 'data-bs-toggle': 'tooltip', + 'data-bs-title': message|trans, + 'data-component': 'directory-rename' + } + }) }} {% endif %} + diff --git a/src/Bridge/Sylius/templates/admin/media/index/modal/move_directory_modal.html.twig b/src/Bridge/Sylius/templates/admin/media/index/modal/move_directory_modal.html.twig new file mode 100644 index 00000000..7e2b77f6 --- /dev/null +++ b/src/Bridge/Sylius/templates/admin/media/index/modal/move_directory_modal.html.twig @@ -0,0 +1,5 @@ +{% import '@JoliMediaSylius/admin/shared/helper/move_directory_modal.html.twig' as modal %} + +{% set directory = hookable_metadata.context.key %} + +{{ modal.render(directory) }} diff --git a/src/Bridge/Sylius/templates/admin/shared/helper/move_directory_modal.html.twig b/src/Bridge/Sylius/templates/admin/shared/helper/move_directory_modal.html.twig new file mode 100644 index 00000000..a16670c4 --- /dev/null +++ b/src/Bridge/Sylius/templates/admin/shared/helper/move_directory_modal.html.twig @@ -0,0 +1,71 @@ +{% macro render(directoryPath) %} + {% trans_default_domain 'JoliMediaSyliusBundle' %} + +