From 2fdbaa630c2496a1afd610801978348d18508ea7 Mon Sep 17 00:00:00 2001 From: Giuseppe Criscione <18699708+giuscris@users.noreply.github.com> Date: Sun, 23 Feb 2025 13:21:56 +0100 Subject: [PATCH 1/2] Add modals directly from views instead of controllers --- .../Panel/Controllers/AbstractController.php | 13 ++++------- .../Panel/Controllers/DashboardController.php | 4 ---- .../Panel/Controllers/OptionsController.php | 4 ---- .../src/Panel/Controllers/PagesController.php | 20 +---------------- .../src/Panel/Controllers/ToolsController.php | 2 -- .../src/Panel/Controllers/UsersController.php | 10 --------- formwork/src/Panel/Modals/Modal.php | 18 +++++++++++++++ formwork/src/Panel/Modals/ModalCollection.php | 2 ++ formwork/src/Panel/Modals/Modals.php | 22 +++++++++++++++++++ .../Services/Loaders/PanelServiceLoader.php | 2 ++ panel/views/dashboard/index.php | 2 ++ panel/views/fields/markdown.php | 3 +++ panel/views/fields/page/imagepicker.php | 18 ++++++++------- panel/views/fields/partials/filelist.php | 2 ++ panel/views/options/site.php | 2 ++ panel/views/options/system.php | 2 ++ panel/views/pages/editor.php | 3 +++ panel/views/pages/file.php | 3 +++ panel/views/pages/index.php | 2 ++ panel/views/pages/tree.php | 2 ++ panel/views/tools/backups.php | 2 ++ panel/views/users/index.php | 4 +++- panel/views/users/profile.php | 5 ++++- 23 files changed, 89 insertions(+), 58 deletions(-) create mode 100644 formwork/src/Panel/Modals/Modals.php diff --git a/formwork/src/Panel/Controllers/AbstractController.php b/formwork/src/Panel/Controllers/AbstractController.php index 869a8532b..9484ab66b 100644 --- a/formwork/src/Panel/Controllers/AbstractController.php +++ b/formwork/src/Panel/Controllers/AbstractController.php @@ -5,8 +5,7 @@ use Formwork\Cms\Site; use Formwork\Controllers\AbstractController as BaseAbstractController; use Formwork\Panel\Modals\Modal; -use Formwork\Panel\Modals\ModalCollection; -use Formwork\Panel\Modals\ModalFactory; +use Formwork\Panel\Modals\Modals; use Formwork\Panel\Panel; use Formwork\Parsers\Json; use Formwork\Router\Router; @@ -18,20 +17,16 @@ abstract class AbstractController extends BaseAbstractController { - protected ModalCollection $modals; - public function __construct( private Container $container, protected readonly Router $router, protected readonly CsrfToken $csrfToken, protected readonly Translations $translations, - protected readonly ModalFactory $modalFactory, + protected readonly Modals $modals, protected readonly Site $site, protected readonly Panel $panel, ) { $this->container->call(parent::__construct(...)); - - $this->modals = new ModalCollection(); } /** @@ -65,8 +60,8 @@ protected function hasPermission(string $permission): bool */ protected function modal(string $name): Modal { - $this->modals->add($modal = $this->modalFactory->make($name)); - return $modal; + $this->modals->add($name); + return $this->modals->get($name); } /** diff --git a/formwork/src/Panel/Controllers/DashboardController.php b/formwork/src/Panel/Controllers/DashboardController.php index 735a80f0e..e97a58509 100644 --- a/formwork/src/Panel/Controllers/DashboardController.php +++ b/formwork/src/Panel/Controllers/DashboardController.php @@ -17,10 +17,6 @@ public function index(Statistics $statistics): Response return $this->forward(ErrorsController::class, 'forbidden'); } - $this->modal('newPage'); - - $this->modal('deletePage'); - return new Response($this->view('dashboard.index', [ 'title' => $this->translate('panel.dashboard.dashboard'), 'lastModifiedPages' => $this->view('pages.tree', [ diff --git a/formwork/src/Panel/Controllers/OptionsController.php b/formwork/src/Panel/Controllers/OptionsController.php index b82c68c1f..cccd04c88 100644 --- a/formwork/src/Panel/Controllers/OptionsController.php +++ b/formwork/src/Panel/Controllers/OptionsController.php @@ -66,8 +66,6 @@ public function systemOptions(Schemes $schemes): Response $fields->setValues($this->config->get('system')); - $this->modal('changes'); - return new Response($this->view('options.system', [ 'title' => $this->translate('panel.options.options'), 'tabs' => $this->view('options.tabs', [ @@ -111,8 +109,6 @@ public function siteOptions(Schemes $schemes): Response $fields->setValues($this->site->data()); - $this->modal('changes'); - return new Response($this->view('options.site', [ 'title' => $this->translate('panel.options.options'), 'tabs' => $this->view('options.tabs', [ diff --git a/formwork/src/Panel/Controllers/PagesController.php b/formwork/src/Panel/Controllers/PagesController.php index 43768e76c..9343c1c60 100644 --- a/formwork/src/Panel/Controllers/PagesController.php +++ b/formwork/src/Panel/Controllers/PagesController.php @@ -39,10 +39,6 @@ public function index(): Response return $this->forward(ErrorsController::class, 'forbidden'); } - $this->modal('newPage'); - - $this->modal('deletePage'); - $pages = $this->site->pages(); $indexOffset = $pages->indexOf($this->site->indexPage()); @@ -194,17 +190,7 @@ public function edit(RouteParams $routeParams): Response return $this->redirect($this->generateRoute('panel.pages.edit', ['page' => $page->route()])); } - $this->modal('images'); - - $this->modal('link'); - - $this->modal('changes'); - - $this->modal('deletePage'); - - $this->modal('deleteFile'); - - $this->modal('renameFile'); + $this->modal('images')->setFieldsModel($page); $contentHistory = $page->contentPath() ? new ContentHistory($page->contentPath()) @@ -552,10 +538,6 @@ public function file(RouteParams $routeParams): Response return $this->redirect($this->generateRoute('panel.pages.file', ['page' => $page->route(), 'filename' => $filename])); } - $this->modal('renameFile'); - $this->modal('deleteFile'); - $this->modal('changes'); - return new Response($this->view('pages.file', [ 'title' => $file->name(), 'page' => $page, diff --git a/formwork/src/Panel/Controllers/ToolsController.php b/formwork/src/Panel/Controllers/ToolsController.php index 5bac06fc8..5892d8703 100644 --- a/formwork/src/Panel/Controllers/ToolsController.php +++ b/formwork/src/Panel/Controllers/ToolsController.php @@ -49,8 +49,6 @@ public function backups(): Response 'size' => FileSystem::formatSize(FileSystem::size($path)), ]); - $this->modal('deleteFile'); - return new Response($this->view('tools.backups', [ 'title' => $this->translate('panel.tools.backups'), 'tabs' => $this->view('tools.tabs', [ diff --git a/formwork/src/Panel/Controllers/UsersController.php b/formwork/src/Panel/Controllers/UsersController.php index 0765ba37d..c5cb8c846 100644 --- a/formwork/src/Panel/Controllers/UsersController.php +++ b/formwork/src/Panel/Controllers/UsersController.php @@ -30,10 +30,6 @@ public function index(): Response return $this->forward(ErrorsController::class, 'forbidden'); } - $this->modal('newUser'); - - $this->modal('deleteUser'); - return new Response($this->view('users.index', [ 'title' => $this->translate('panel.users.users'), 'users' => $this->site->users()->sortBy('username'), @@ -198,12 +194,6 @@ public function profile(RouteParams $routeParams): Response $fields = $fields->setValues($user); - $this->modal('changes'); - - $this->modal('deleteUser'); - - $this->modal('deleteUserImage'); - return new Response($this->view('users.profile', [ 'title' => $this->translate('panel.users.userProfile', $user->username()), 'user' => $user, diff --git a/formwork/src/Panel/Modals/Modal.php b/formwork/src/Panel/Modals/Modal.php index 69f61e836..4389cbeef 100644 --- a/formwork/src/Panel/Modals/Modal.php +++ b/formwork/src/Panel/Modals/Modal.php @@ -6,6 +6,7 @@ use Formwork\Data\Traits\DataArrayable; use Formwork\Fields\FieldCollection; use Formwork\Fields\FieldFactory; +use Formwork\Model\Model; use Formwork\Translations\Translation; use Formwork\Utils\Arr; use Formwork\Utils\Str; @@ -20,6 +21,11 @@ class Modal implements Arrayable */ protected string $id; + /** + * Fields model + */ + protected Model $fieldsModel; + /** * Modal buttons */ @@ -96,9 +102,21 @@ public function fields(): FieldCollection // @phpstan-ignore argument.templateType $fieldCollection->setMultiple(Arr::map($this->data['fields'] ?? [], fn($data, $name) => $this->fieldFactory->make($this->id . '.' . $name, $data, $fieldCollection))); + if (isset($this->fieldsModel)) { + $fieldCollection->setModel($this->fieldsModel); + } + return $fieldCollection; } + /** + * Set fields model + */ + public function setFieldsModel(Model $model): void + { + $this->fieldsModel = $model; + } + /** * Get modal buttons */ diff --git a/formwork/src/Panel/Modals/ModalCollection.php b/formwork/src/Panel/Modals/ModalCollection.php index 293d9d1f2..6e1ae6886 100644 --- a/formwork/src/Panel/Modals/ModalCollection.php +++ b/formwork/src/Panel/Modals/ModalCollection.php @@ -6,6 +6,8 @@ class ModalCollection extends AbstractCollection { + protected bool $associative = true; + protected ?string $dataType = Modal::class; protected bool $mutable = true; diff --git a/formwork/src/Panel/Modals/Modals.php b/formwork/src/Panel/Modals/Modals.php new file mode 100644 index 000000000..34690a9ed --- /dev/null +++ b/formwork/src/Panel/Modals/Modals.php @@ -0,0 +1,22 @@ +has($name)) { + $this->set($name, $this->modalFactory->make($name)); + } + } +} diff --git a/formwork/src/Services/Loaders/PanelServiceLoader.php b/formwork/src/Services/Loaders/PanelServiceLoader.php index de8380055..14ee9e460 100644 --- a/formwork/src/Services/Loaders/PanelServiceLoader.php +++ b/formwork/src/Services/Loaders/PanelServiceLoader.php @@ -8,6 +8,7 @@ use Formwork\Log\Registry; use Formwork\Panel\Controllers\ErrorsController; use Formwork\Panel\Modals\ModalFactory; +use Formwork\Panel\Modals\Modals; use Formwork\Panel\Panel; use Formwork\Panel\Security\AccessLimiter; use Formwork\Schemes\Schemes; @@ -41,6 +42,7 @@ public function load(Container $container): Panel $this->request->session()->setDuration($this->config->get('system.panel.sessionTimeout') * 60); $container->define(ModalFactory::class); + $container->define(Modals::class); return $container->build(Panel::class); } diff --git a/panel/views/dashboard/index.php b/panel/views/dashboard/index.php index 70aec3189..583890e12 100644 --- a/panel/views/dashboard/index.php +++ b/panel/views/dashboard/index.php @@ -1,5 +1,7 @@ layout('panel') ?> +add('newPage') ?> +
translate('panel.dashboard.dashboard') ?>
diff --git a/panel/views/fields/markdown.php b/panel/views/fields/markdown.php index 5cb299af4..9deb4a35e 100644 --- a/panel/views/fields/markdown.php +++ b/panel/views/fields/markdown.php @@ -1,4 +1,7 @@ layout('fields.field') ?> + +addMultiple(['images', 'link']) ?> +
diff --git a/panel/views/fields/page/imagepicker.php b/panel/views/fields/page/imagepicker.php index 716c805b1..c3035d433 100644 --- a/panel/views/fields/page/imagepicker.php +++ b/panel/views/fields/page/imagepicker.php @@ -3,11 +3,13 @@ icon('image') ?>

translate('panel.modal.images.noImages') ?>

- \ No newline at end of file +parent()->model())?->has('files')): ?> + + \ No newline at end of file diff --git a/panel/views/fields/partials/filelist.php b/panel/views/fields/partials/filelist.php index e6071fdd2..0d787813b 100644 --- a/panel/views/fields/partials/filelist.php +++ b/panel/views/fields/partials/filelist.php @@ -1,3 +1,5 @@ +addMultiple(['deleteFile', 'renameFile']) ?> +
diff --git a/panel/views/options/site.php b/panel/views/options/site.php index fb899a9aa..ddf505d24 100644 --- a/panel/views/options/site.php +++ b/panel/views/options/site.php @@ -1,5 +1,7 @@ layout('panel') ?> +add('changes') ?> +
translate('panel.options.options') ?>
diff --git a/panel/views/options/system.php b/panel/views/options/system.php index e12b485ec..def14eb1f 100644 --- a/panel/views/options/system.php +++ b/panel/views/options/system.php @@ -1,5 +1,7 @@ layout('panel') ?> +add('changes') ?> +
translate('panel.options.options') ?>
diff --git a/panel/views/pages/editor.php b/panel/views/pages/editor.php index fe72f3487..70cd1908a 100644 --- a/panel/views/pages/editor.php +++ b/panel/views/pages/editor.php @@ -1,4 +1,7 @@ layout('panel') ?> + +addMultiple(['changes', 'deletePage']) ?> + attr(['hidden' => true, 'aria-hidden' => 'true', 'tabindex' => -1, 'data-command' => 'save', 'formaction' => $history?->isJustCreated() ? '?publish=false' : null]) ?>>
diff --git a/panel/views/pages/file.php b/panel/views/pages/file.php index e6df7a158..16f00e493 100644 --- a/panel/views/pages/file.php +++ b/panel/views/pages/file.php @@ -1,4 +1,7 @@ layout('panel') ?> + +addMultiple(['changes', 'renameFile', 'deleteFile']) ?> +
diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index cc9edaae9..609278ffd 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -1,5 +1,7 @@ layout('panel') ?> +add('newPage') ?> +
translate('panel.pages.pages') ?> site()->descendants()->count() ?>
diff --git a/panel/views/pages/tree.php b/panel/views/pages/tree.php index 800fc9abd..885c0290c 100644 --- a/panel/views/pages/tree.php +++ b/panel/views/pages/tree.php @@ -1,3 +1,5 @@ +add('deletePage') ?> +