From c911d05c0b3a56ff7cfd1aee9f1768f4f8612795 Mon Sep 17 00:00:00 2001 From: Alexandr Chernyaev Date: Mon, 4 Nov 2024 02:40:12 +0300 Subject: [PATCH] Change working modals and modal-toggle. Repeat restore open modal after validation errors. --- resources/js/controllers/modal_controller.js | 14 +++--- .../js/controllers/modal_toggle_controller.js | 43 ++++++++++++++++--- resources/views/actions/modal.blade.php | 16 ++++--- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/resources/js/controllers/modal_controller.js b/resources/js/controllers/modal_controller.js index 257e85bc99..a2ea561916 100644 --- a/resources/js/controllers/modal_controller.js +++ b/resources/js/controllers/modal_controller.js @@ -116,7 +116,7 @@ export default class extends ApplicationController { // Load deferred data if URL is specified and no validation errors are present if (Object.keys(this.parametersValue).length !== 0 && !options.validateError) { - this.asyncLoadData(JSON.parse(options.params)); + this.asyncLoadData(options.params); } // Store the last open modal options @@ -130,13 +130,13 @@ export default class extends ApplicationController { * Open the last modal if validation errors are present. */ openLastModal() { - const lastOpenModal = this.getLastOpenModal(); - // If no validation errors are present, do nothing if (this.element.querySelectorAll('.invalid-feedback').length === 0) { return; } + const lastOpenModal = this.lastOpenModal(); + // Reopen the last modal if it matches the current slug if (lastOpenModal && lastOpenModal.slug === this.slugValue) { this.element.classList.remove('fade', 'in'); @@ -167,21 +167,21 @@ export default class extends ApplicationController { * @param options - Modal options to store. */ storeLastOpenModal(options) { - sessionStorage.setItem(this.SESSION_KEY_FOR_LAST_OPEN_MODAL, JSON.stringify(options)); + window.sessionStorage.setItem(this.constructor.SESSION_KEY_FOR_LAST_OPEN_MODAL, JSON.stringify(options)); } /** * Retrieve the last opened modal options from session storage. * @returns {Object|false} - The last opened modal options or false if not found. */ - getLastOpenModal() { - return JSON.parse(sessionStorage.getItem(this.SESSION_KEY_FOR_LAST_OPEN_MODAL)) ?? false; + lastOpenModal() { + return JSON.parse(sessionStorage.getItem(this.constructor.SESSION_KEY_FOR_LAST_OPEN_MODAL)) ?? false; } /** * Clear the last opened modal options from session storage. */ clearLastOpenModal() { - sessionStorage.removeItem(this.SESSION_KEY_FOR_LAST_OPEN_MODAL); + sessionStorage.removeItem(this.constructor.SESSION_KEY_FOR_LAST_OPEN_MODAL); } } diff --git a/resources/js/controllers/modal_toggle_controller.js b/resources/js/controllers/modal_toggle_controller.js index 615f2b4cc0..3eef96b049 100644 --- a/resources/js/controllers/modal_toggle_controller.js +++ b/resources/js/controllers/modal_toggle_controller.js @@ -2,14 +2,35 @@ import ApplicationController from "./application_controller"; export default class extends ApplicationController { + static values = { + title: { + type: String, + default: null, + }, + key: { + type: String, + }, + action: { + type: String, + }, + parameters: { + type: Object, + }, + open: { + type: Boolean, + default: false, + }, + } + /** * */ connect() { setTimeout(() => { - if (!this.data.get('open')) { + if (!this.openValue) { return; } + this.modal.classList.remove('fade', 'in'); this.targetModal(); }); @@ -20,14 +41,15 @@ export default class extends ApplicationController { * @returns {*} */ targetModal(event) { - this.application.getControllerForElementAndIdentifier(this.modal, 'modal') + this.application + .getControllerForElementAndIdentifier(this.modal, 'modal') .open({ - title: this.data.get('title') || this.modal.dataset.modalTitle, - submit: this.data.get('action'), - params: this.data.get('params', '[]'), + title: this.titleValue || this.modal.dataset.modalTitle, + submit: this.actionValue, + params: this.parametersValue, }); - if(event) { + if (event) { return event.preventDefault(); } } @@ -37,6 +59,13 @@ export default class extends ApplicationController { * @returns {HTMLElement} */ get modal() { - return document.getElementById(`screen-modal-${this.data.get('key')}`); + + let modal = document.getElementById(`screen-modal-${this.keyValue}`); + + if (modal === null) { + this.toast('The modal element does not exist.', 'warning'); + } + + return modal; } } diff --git a/resources/views/actions/modal.blade.php b/resources/views/actions/modal.blade.php index 93fae87d83..5f3c1d3397 100644 --- a/resources/views/actions/modal.blade.php +++ b/resources/views/actions/modal.blade.php @@ -3,18 +3,20 @@ {{ $attributes }} data-controller="modal-toggle" data-action="click->modal-toggle#targetModal" - data-modal-toggle-title="{{ $modalTitle ?? $title ?? '' }}" - data-modal-toggle-key="{{ $modal ?? '' }}" - data-modal-toggle-async="{{ $async }}" - data-modal-toggle-params='@json($parameters)' - data-modal-toggle-action="{{ $action }}" - data-modal-toggle-open="{{ $open }}" + data-modal-toggle-open-value="{{ var_export($open) }}" + data-modal-toggle-title-value="{{ $modalTitle ?? $title ?? '' }}" + data-modal-toggle-key-value="{{ $modal ?? '' }}" + data-modal-toggle-action-value="{{ $action }}" + + @if(!empty($parameters)) + data-modal-toggle-parameters-value='@json($parameters)' + @endif > @isset($icon) @endisset - {{ $name ?? '' }} + {{ $name ?? '' }} @endcomponent