Skip to content

Commit 90d7fbc

Browse files
committed
feat(Sylius): Move a directory
1 parent df9487d commit 90d7fbc

13 files changed

Lines changed: 209 additions & 9 deletions

File tree

src/Bridge/Sylius/config/app/twig_hooks/media/index.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
return static function (ContainerConfigurator $container): void {
88
$container->extension('sylius_twig_hooks', [
99
'hooks' => [
10+
'joli_media_sylius_admin.media.index' => [
11+
'modal' => [
12+
'template' => '@JoliMediaSylius/admin/media/index/modal/move_directory_modal.html.twig',
13+
'priority' => 100,
14+
],
15+
],
16+
1017
'joli_media_sylius_admin.media.index.content' => [
1118
'header' => [
1219
'template' => '@JoliMediaSylius/admin/media/index/content/header.html.twig',

src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,44 @@ public function renameDirectory(Request $request): Response
151151
}
152152
}
153153

154+
#[Route(path: '/move-directory', name: 'move_directory', methods: [Request::METHOD_POST])]
155+
public function moveDirectory(Request $request): Response
156+
{
157+
$from = Resolver::normalizePath($request->request->getString('from'));
158+
$to = Resolver::normalizePath($request->request->getString('to'));
159+
160+
$csrfToken = $request->request->getString('_csrf_token');
161+
162+
if (!$this->csrfTokenManager->isTokenValid(new CsrfToken('media_move_directory', $csrfToken))) {
163+
$this->addFlash('error', 'Invalid CSRF token');
164+
165+
return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore'));
166+
}
167+
168+
if (!$from) {
169+
$this->addFlash('error', 'Missing parameters');
170+
171+
return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore'));
172+
}
173+
174+
try {
175+
$target = $to ? \sprintf('%s/%s', $to, basename($from)) : basename($from);
176+
$this->getOriginalStorage()->moveFolder($from, $target);
177+
178+
$this->addFlash('success', $this->translator->trans(
179+
'directory.move_success',
180+
['%from%' => $from, '%to%' => $target],
181+
'JoliMediaSyliusBundle'
182+
));
183+
184+
return $this->redirectAfterRename($request, $from, $target);
185+
} catch (\Throwable $e) {
186+
$this->addFlash('error', $e->getMessage());
187+
188+
return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore'));
189+
}
190+
}
191+
154192
#[Route(path: '/rename', name: 'rename', methods: [Request::METHOD_POST])]
155193
public function rename(Request $request): Response
156194
{

src/Bridge/Sylius/src/Admin/Grid/MediaGrid.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public function __invoke(GridBuilderInterface $gridBuilder): void
7272
->setLabel($this->trans('action.rename_directory'))
7373
->setIcon('tabler:pencil')
7474
->setTemplate('@JoliMediaSylius/admin/media/grid/action/rename_directory.html.twig'),
75+
Action::create('move_directory', 'custom')
76+
->setLabel($this->trans('action.move_directory'))
77+
->setIcon('fa7-solid:folder-tree')
78+
->setTemplate('@JoliMediaSylius/admin/media/grid/action/move_directory.html.twig'),
7579
Action::create('create_directory', 'custom')
7680
->setLabel($this->trans('directory.create'))
7781
->setIcon('tabler:folder-plus')
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1+
{% import ['@SyliusBootstrapAdminUi/shared/helper/button.html.twig', '@SyliusAdmin/shared/helper/button.html.twig'] as button %}
2+
13
{% set message = action.label %}
24
{% if message is empty %}
35
{% set message = 'sylius.ui.create' %}
46
{% endif %}
57

6-
<a href="#" class="btn" data-component="directory-create">
7-
{{ ux_icon(action.icon|default('tabler:plus'), {'class': 'icon dropdown-item-icon'}) }}
8-
{{ message|trans }}
9-
</a>
8+
{{ button.default({
9+
url: '#',
10+
icon: action.icon|default('tabler:plus'),
11+
icon_class: 'icon dropdown-item-icon',
12+
icon_only: true,
13+
text: message|trans,
14+
attr: {
15+
'data-bs-toggle': 'tooltip',
16+
'data-bs-title': message|trans,
17+
'data-component': 'directory-create'
18+
}
19+
}) }}

src/Bridge/Sylius/templates/admin/media/grid/action/delete_directory.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
id: key,
99
modal_id: 'delete-directory-modal-' ~ random(),
1010
path: path('joli_media_sylius_admin_delete_directory', {'key': key}),
11-
icon_only: false,
11+
icon_only: true,
1212
label: action.label,
1313
}) }}
1414
{% endif %}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{% import ['@SyliusBootstrapAdminUi/shared/helper/button.html.twig', '@SyliusAdmin/shared/helper/button.html.twig'] as button %}
2+
3+
{% set key = app.request.attributes.get('key', '') %}
4+
5+
{% if key != '' %}
6+
{% set message = action.label %}
7+
{% if message is empty %}
8+
{% set message = 'sylius.ui.update' %}
9+
{% endif %}
10+
11+
<span data-media-key="{{ key }}">
12+
{{ button.default({
13+
url: path('joli_media_sylius_admin_choose'),
14+
icon: action.icon|default('fa7-solid:folder-tree'),
15+
icon_class: 'icon dropdown-item-icon',
16+
icon_only: true,
17+
text: message|trans,
18+
attr: {
19+
'data-bs-toggle': 'tooltip',
20+
'data-bs-title': message|trans,
21+
'data-folder': key|joli_media_admin_dirname,
22+
'data-component': 'media-move'
23+
}
24+
}) }}
25+
</span>
26+
{% endif %}
Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{% import ['@SyliusBootstrapAdminUi/shared/helper/button.html.twig', '@SyliusAdmin/shared/helper/button.html.twig'] as button %}
2+
13
{% set key = app.request.attributes.get('key', '') %}
24

35
{% if key != '' %}
@@ -6,8 +8,18 @@
68
{% set message = 'sylius.ui.update' %}
79
{% endif %}
810

9-
<a href="#" class="btn directory-rename-header-btn" data-component="directory-rename">
10-
{{ ux_icon(action.icon|default('tabler:pencil'), {'class': 'icon dropdown-item-icon'}) }}
11-
{{ message|trans }}
12-
</a>
11+
{{ button.default({
12+
url: '#',
13+
icon: action.icon|default('tabler:pencil'),
14+
icon_class: 'icon dropdown-item-icon',
15+
icon_only: true,
16+
text: message|trans,
17+
class: 'directory-rename-header-btn',
18+
attr: {
19+
'data-bs-toggle': 'tooltip',
20+
'data-bs-title': message|trans,
21+
'data-component': 'directory-rename'
22+
}
23+
}) }}
1324
{% endif %}
25+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% import '@JoliMediaSylius/admin/shared/helper/move_directory_modal.html.twig' as modal %}
2+
3+
{% set directory = hookable_metadata.context.key %}
4+
5+
{{ modal.render(directory) }}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{% trans_default_domain 'JoliMediaSyliusBundle' %}
2+
3+
{% set media = hookable_metadata.context.media %}
4+
5+
<span data-media-key="{{ media.path }}">
6+
<a
7+
href="{{ path('joli_media_sylius_admin_choose') }}"
8+
data-folder="{{ media.folderPath }}"
9+
class="btn media-move-btn"
10+
data-component="media-move"
11+
title="{{ 'action.move_directory'|trans }}"
12+
>
13+
{{ ux_icon('fa7-solid:folder-tree') }}
14+
{{ 'action.move_directory'|trans }}
15+
</a>
16+
</span>
17+
18+
<form method="post" action="{{ path('joli_media_sylius_admin_move_directory') }}" id="move-form" class="d-none">
19+
<input type="hidden" name="_csrf_token" value="{{ csrf_token('media_move_directory') }}">
20+
<input type="hidden" name="from" value="{{ media.path }}">
21+
<input type="hidden" name="to" id="move_to" value="">
22+
</form>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{% macro render(directoryPath) %}
2+
{% trans_default_domain 'JoliMediaSyliusBundle' %}
3+
4+
<div id="modal-folder-choice" class="modal" tabindex="-1">
5+
<div class="modal-dialog">
6+
<div class="modal-content">
7+
<div class="modal-body">
8+
<div class="mb-3 d-flex justify-content-between align-items-center">
9+
<div class="folder-modal-breadcrumb">
10+
{% if directoryPath %}
11+
{% set parts = directoryPath|split('/') %}
12+
<a href="{{ path('joli_media_sylius_admin_choose') }}" data-folder-path="">
13+
{{ 'media_library'|trans }}
14+
</a>
15+
{% for part in parts %}
16+
{% if part %}
17+
<span class="breadcrumb-separator">/</span>
18+
{% set path_so_far = parts|slice(0, loop.index)|join('/') %}
19+
{% if loop.last %}
20+
<span class="breadcrumb-current">{{ part }}</span>
21+
{% else %}
22+
<a href="{{ path('joli_media_sylius_admin_choose', { key: path_so_far }) }}" data-folder-path="{{ path_so_far }}">{{ part }}</a>
23+
{% endif %}
24+
{% endif %}
25+
{% endfor %}
26+
{% else %}
27+
<a href="{{ path('joli_media_sylius_admin_choose') }}" data-folder-path="">
28+
{{ 'media_library'|trans }}
29+
</a>
30+
<span class="breadcrumb-separator">/</span>
31+
<span class="breadcrumb-current">{{ 'root'|trans }}</span>
32+
{% endif %}
33+
</div>
34+
<button type="button" class="btn btn-primary" data-component="folder-create">
35+
{{ ux_icon('tabler:folder-plus') }}
36+
{{ 'directory.create'|trans }}
37+
</button>
38+
</div>
39+
<form method="post" action="{{ path('joli_media_sylius_admin_create_directory') }}" class="folder-create-form d-none mb-3">
40+
<input type="hidden" name="_csrf_token" value="{{ csrf_token('media_create_directory') }}">
41+
<input type="hidden" name="parentPath" value="{{ directoryPath|default('') }}">
42+
<div class="input-group">
43+
<input type="text" name="name" class="form-control folder-create-input" placeholder="{{ 'directory.create'|trans }}">
44+
<button type="submit" class="btn btn-primary">{{ 'action.create'|trans }}</button>
45+
<button type="button" class="btn btn-secondary folder-create-cancel">{{ 'action.cancel'|trans }}</button>
46+
</div>
47+
</form>
48+
<div class="folder-list-container"></div>
49+
</div>
50+
<div class="modal-footer">
51+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
52+
{{ 'action.cancel'|trans }}
53+
</button>
54+
<a
55+
href="#"
56+
class="btn btn-primary folder-move-btn"
57+
data-folder-path=""
58+
>
59+
{{ 'action.move_to_this_directory'|trans }}
60+
</a>
61+
</div>
62+
</div>
63+
</div>
64+
</div>
65+
66+
<form method="post" action="{{ path('joli_media_sylius_admin_move_directory') }}" id="move-form" class="d-none">
67+
<input type="hidden" name="_csrf_token" value="{{ csrf_token('media_move_directory') }}">
68+
<input type="hidden" name="from" value="{{ directoryPath }}">
69+
<input type="hidden" name="to" id="move_to" value="">
70+
</form>
71+
{% endmacro %}

0 commit comments

Comments
 (0)