Skip to content

Commit

Permalink
[TASK] Enhance custom event dispatching in modal dialog
Browse files Browse the repository at this point in the history
* allows custom events to bubble up in DOM tree
* ensures that custom events are dispatched at those elements
  that initially contained the `data-event-name` attributes

Resolves: #91186
Releases: master
Change-Id: I0c5951a573bba0bbe73967ffcecf5dcfeae2e2f2
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64311
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Susanne Moog <look@susi.dev>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
  • Loading branch information
ohader authored and andreaskienast committed May 4, 2020
1 parent 760f209 commit 8c38ca6
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,24 @@ class Modal {

private readonly securityUtility: SecurityUtility;

private static resolveEventNameTargetElement(evt: Event): HTMLElement | null {
const target = evt.target as HTMLElement;
const currentTarget = evt.currentTarget as HTMLElement;
if (target.dataset && target.dataset.eventName) {
return target;
} else if (currentTarget.dataset && currentTarget.dataset.eventName) {
return currentTarget;
}
return null;
}

private static createModalResponseEventFromElement(element: HTMLElement, result: boolean): ModalResponseEvent | null {
if (!element.dataset.eventName) {
if (!element || !element.dataset.eventName) {
return null;
}
return new CustomEvent(
element.dataset.eventName, {
bubbles: true,
detail: { result, payload: element.dataset.eventPayload || null }
});
}
Expand Down Expand Up @@ -388,9 +400,11 @@ class Modal {
btnClass: 'btn-default',
trigger: (): void => {
this.currentModal.trigger('modal-dismiss');
const event = Modal.createModalResponseEventFromElement(evt.currentTarget as HTMLElement, false);
const eventNameTarget = Modal.resolveEventNameTargetElement(evt);
const event = Modal.createModalResponseEventFromElement(eventNameTarget, false);
if (event !== null) {
evt.currentTarget.dispatchEvent(event);
// dispatch event at the element having `data-event-name` declared
eventNameTarget.dispatchEvent(event);
}
},
},
Expand All @@ -399,9 +413,11 @@ class Modal {
btnClass: 'btn-' + Severity.getCssClass(severity),
trigger: (): void => {
this.currentModal.trigger('modal-dismiss');
const event = Modal.createModalResponseEventFromElement(evt.currentTarget as HTMLElement, true);
const eventNameTarget = Modal.resolveEventNameTargetElement(evt);
const event = Modal.createModalResponseEventFromElement(eventNameTarget, true);
if (event !== null) {
evt.currentTarget.dispatchEvent(event);
// dispatch event at the element having `data-event-name` declared
eventNameTarget.dispatchEvent(event);
}
const href = $element.data('href') || $element.attr('href');
if (href && href !== '#') {
Expand Down
2 changes: 1 addition & 1 deletion typo3/sysext/backend/Resources/Public/JavaScript/Modal.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 8c38ca6

Please sign in to comment.