diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/ChartInitializer.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/ChartInitializer.ts index fe071d31ebaf779d0ef8c027b277210675c833be..9fda1ed4e067e6cbea1f81f807610bdc9e116e12 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/ChartInitializer.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/ChartInitializer.ts @@ -11,34 +11,31 @@ * The TYPO3 project - inspiring people to share! */ -import * as $ from 'jquery'; import * as Chart from 'TYPO3/CMS/Dashboard/Contrib/chartjs'; +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); class ChartInitializer { - private selector: string = '.dashboard-item--chart'; + private readonly selector: string = '.dashboard-item--chart'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { - const me = this; - $(document).on('widgetContentRendered', me.selector, (e: JQueryEventObject, config: any): void => { + new RegularEvent('widgetContentRendered', function (this: HTMLElement, e: CustomEvent): void { e.preventDefault(); - const $me = $(e.currentTarget); + const config: any = e.detail; if (typeof undefined === config.graphConfig) { return; } - let _canvas: any = $me.find('canvas:first'); + let _canvas: any = this.querySelector('canvas'); let context; - if (_canvas.length > 0) { - context = _canvas[0].getContext('2d'); + if (_canvas !== null) { + context = _canvas.getContext('2d'); } if (typeof undefined === context) { @@ -46,7 +43,7 @@ class ChartInitializer { } new Chart(context, config.graphConfig) - }); + }).delegateTo(document, this.selector) } } diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardDelete.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardDelete.ts index 946b03bef029c57cf04769978ddab4edee3e05d1..22ee1677028048586227b2d5b2640eccef4c79c8 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardDelete.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardDelete.ts @@ -11,38 +11,33 @@ * The TYPO3 project - inspiring people to share! */ -import * as $ from 'jquery'; import Modal = require('TYPO3/CMS/Backend/Modal'); import {SeverityEnum} from 'TYPO3/CMS/Backend/Enum/Severity'; +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); class DashboardDelete { - private selector: string = '.js-dashboard-delete'; + private readonly selector: string = '.js-dashboard-delete'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { - const me = this; - $(document).on('click', me.selector, (e: JQueryEventObject): void => { + new RegularEvent('click', function (this: HTMLElement, e: Event): void { e.preventDefault(); - const $me = $(e.currentTarget); - const $modal = Modal.confirm( - $me.data('modal-title'), - $me.data('modal-question'), + this.dataset.modalTitle, + this.dataset.modalQuestion, SeverityEnum.warning, [ { - text: $me.data('modal-cancel'), + text: this.dataset.modalCancel, active: true, btnClass: 'btn-default', name: 'cancel', }, { - text: $me.data('modal-ok'), + text: this.dataset.modalOk, btnClass: 'btn-warning', name: 'delete', }, @@ -51,11 +46,11 @@ class DashboardDelete { $modal.on('button.clicked', (e: JQueryEventObject): void => { if (e.target.getAttribute('name') === 'delete') { - window.location.href = $me.attr('href'); + window.location.href = this.getAttribute('href'); } Modal.dismiss(); }); - }); + }).delegateTo(document, this.selector); } } diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardModal.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardModal.ts index b6e4cb377b4410908262ea26ac8277ce99617aea..aec12b9e8457d358477d0e666ce211f90e81742e 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardModal.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/DashboardModal.ts @@ -14,29 +14,25 @@ import * as $ from 'jquery'; import Modal = require('TYPO3/CMS/Backend/Modal'); import {SeverityEnum} from 'TYPO3/CMS/Backend/Enum/Severity'; +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); class DashboardModal { - private selector: string = '.js-dashboard-modal'; + private readonly selector: string = '.js-dashboard-modal'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { - const me = this; - $(document).on('click', me.selector, (e: JQueryEventObject): void => { + new RegularEvent('click', function (this: HTMLElement, e: Event): void { e.preventDefault(); - const $me = $(e.currentTarget); - const configuration = { type: Modal.types.default, - title: $me.data('modal-title'), + title: this.dataset.modalTitle, size: Modal.sizes.medium, severity: SeverityEnum.notice, - content: $($('#dashboardModal-' + $me.data('modal-identifier')).html()), + content: $(document.querySelector(`#dashboardModal-${this.dataset.modalIdentifier}`).innerHTML), additionalCssClasses: ['dashboard-modal'], callback: (currentModal: any): void => { currentModal.on('submit', '.dashboardModal-form', (e: JQueryEventObject): void => { @@ -46,7 +42,7 @@ class DashboardModal { currentModal.on('button.clicked', (e: JQueryEventObject): void => { if (e.target.getAttribute('name') === 'save') { const formElement = currentModal.find('form'); - $('<input type="submit">').hide().appendTo(formElement).click().remove(); + formElement.submit(); } else { currentModal.trigger('modal-dismiss'); } @@ -54,12 +50,12 @@ class DashboardModal { }, buttons: [ { - text: $me.data('button-close-text'), + text: this.dataset.buttonCloseText, btnClass: 'btn-default', name: 'cancel', }, { - text: $me.data('button-ok-text'), + text: this.dataset.buttonOkText, active: true, btnClass: 'btn-warning', name: 'save', @@ -67,7 +63,7 @@ class DashboardModal { ] }; Modal.advanced(configuration); - }); + }).delegateTo(document, this.selector); } } diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/Grid.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/Grid.ts index b3cc9865903cb85b34f006bb0496d4452234a90f..353af8a3524b43d24688d271feaf5b952c478a95 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/Grid.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/Grid.ts @@ -11,18 +11,16 @@ * The TYPO3 project - inspiring people to share! */ -import * as $ from 'jquery'; import * as Muuri from 'muuri'; import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); class Grid { - private selector: string = '.dashboard-grid'; + private readonly selector: string = '.dashboard-grid'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { @@ -57,19 +55,23 @@ class Grid { } }; - if ($(this.selector).length) { + if (document.querySelector(this.selector) !== null) { const dashboard = new Muuri(this.selector, options); dashboard.on('dragStart', (): void => { - $('.dashboard-item').removeClass('dashboard-item--enableSelect'); - }) + document.querySelectorAll('.dashboard-item').forEach((dashboardItem: HTMLDivElement): void => { + dashboardItem.classList.remove('dashboard-item--enableSelect'); + }); + }); dashboard.on('dragReleaseEnd', (): void => { - $('.dashboard-item').addClass('dashboard-item--enableSelect'); + document.querySelectorAll('.dashboard-item').forEach((dashboardItem: HTMLDivElement): void => { + dashboardItem.classList.add('dashboard-item--enableSelect'); + }); this.saveItems(dashboard); - }) + }); - $('.dashboard-item').on('widgetContentRendered', (): void => { + new RegularEvent('widgetContentRendered', (): void => { dashboard.refreshItems().layout(); - }); + }).delegateTo(document, '.dashboard-item'); } } diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetContentCollector.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetContentCollector.ts index 893175fd1b6b47db1963e860a1aaadc2bb72588f..709327a10c5b3eb30142961123960a7718760436 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetContentCollector.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetContentCollector.ts @@ -11,45 +11,59 @@ * The TYPO3 project - inspiring people to share! */ -import * as $ from 'jquery'; import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); class WidgetContentCollector { - private selector: string = '.dashboard-item'; + private readonly selector: string = '.dashboard-item'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { - $(this.selector).each((index: number, triggerElement: Element): void => { + const items = document.querySelectorAll(this.selector); + items.forEach((triggerElement: HTMLElement): void => { + const widgetWaitingElement = triggerElement.querySelector('.widget-waiting'); + const widgetContentElement = triggerElement.querySelector('.widget-content'); + const widgetErrorElement = triggerElement.querySelector('.widget-error'); + const sentRequest = (new AjaxRequest(TYPO3.settings.ajaxUrls['ext-dashboard-get-widget-content'])) .withQueryArguments({ - widget: $(triggerElement).data('widget-key'), + widget: triggerElement.dataset.widgetKey, }) .get() .then(async (response: AjaxResponse): Promise<any> => { const data = await response.resolve(); - $(triggerElement).find('.widget-content').html(data.content); - $(triggerElement).find('.widget-content').removeClass('hide'); - $(triggerElement).find('.widget-waiting').addClass('hide'); + if (widgetContentElement !== null) { + widgetContentElement.innerHTML = data.content; + widgetContentElement.classList.remove('hide'); + } + if (widgetWaitingElement !== null) { + widgetWaitingElement.classList.add('hide'); + } + let event: Event; + const eventInitDict: EventInit = { + bubbles: true, + }; if (Object.keys(data.eventdata).length > 0) { - $(triggerElement).trigger('widgetContentRendered', data.eventdata); + event = new CustomEvent('widgetContentRendered', {...eventInitDict, detail: data.eventdata}); } else { - $(triggerElement).trigger('widgetContentRendered'); + event = new Event('widgetContentRendered', eventInitDict); } - } - ); + triggerElement.dispatchEvent(event); + }); sentRequest.catch((reason: Error): void => { - $(triggerElement).find('.widget-error').removeClass('hide'); - $(triggerElement).find('.widget-waiting').addClass('hide'); - console.warn('Error while retrieving widget [' + $(triggerElement).data('widget-key') + '] content: ' + reason.message) + if (widgetErrorElement !== null) { + widgetErrorElement.classList.remove('hide'); + } + if (widgetWaitingElement !== null) { + widgetWaitingElement.classList.add('hide'); + } + console.warn(`Error while retrieving widget [${triggerElement.dataset.widgetKey}] content: ${reason.message}`); }); }); } diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetRemover.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetRemover.ts index a9c871b9e1064f50464f6e13c971367dacd6123c..6e439ab4edda06ec510b7e00cbcf0ad6b6eed3ab 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetRemover.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetRemover.ts @@ -11,38 +11,33 @@ * The TYPO3 project - inspiring people to share! */ -import * as $ from 'jquery'; import Modal = require('TYPO3/CMS/Backend/Modal'); import {SeverityEnum} from 'TYPO3/CMS/Backend/Enum/Severity'; +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); class WidgetRemover { - private selector: string = '.js-dashboard-remove-widget'; + private readonly selector: string = '.js-dashboard-remove-widget'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { - const me = this; - $(document).on('click', me.selector, (e: JQueryEventObject): void => { + new RegularEvent('click', function (this: HTMLElement, e: Event): void { e.preventDefault(); - const $me = $(e.currentTarget); - const $modal = Modal.confirm( - $me.data('modal-title'), - $me.data('modal-question'), + this.dataset.modalTitle, + this.dataset.modalQuestion, SeverityEnum.warning, [ { - text: $me.data('modal-cancel'), + text: this.dataset.modalCancel, active: true, btnClass: 'btn-default', name: 'cancel', }, { - text: $me.data('modal-ok'), + text: this.dataset.modalOk, btnClass: 'btn-warning', name: 'delete', }, @@ -51,11 +46,11 @@ class WidgetRemover { $modal.on('button.clicked', (e: JQueryEventObject): void => { if (e.target.getAttribute('name') === 'delete') { - window.location.href = $me.attr('href'); + window.location.href = this.getAttribute('href'); } Modal.dismiss(); }); - }); + }).delegateTo(document, this.selector); } } diff --git a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetSelector.ts b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetSelector.ts index 1f96a1118eac0aa19c9a74c77216358dce876670..7a5afb16f8bbace9618b2801439130ce42f2023e 100644 --- a/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetSelector.ts +++ b/Build/Sources/TypeScript/dashboard/Resources/Public/TypeScript/WidgetSelector.ts @@ -14,38 +14,34 @@ import * as $ from 'jquery'; import Modal = require('TYPO3/CMS/Backend/Modal'); import {SeverityEnum} from 'TYPO3/CMS/Backend/Enum/Severity'; +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); class WidgetSelector { - private selector: string = '.js-dashboard-addWidget'; + private readonly selector: string = '.js-dashboard-addWidget'; constructor() { - $((): void => { - this.initialize(); - }); + this.initialize(); } public initialize(): void { - const me = this; - $(document).on('click', me.selector, (e: JQueryEventObject): void => { + new RegularEvent('click', function (this: HTMLElement, e: Event): void { e.preventDefault(); - const $me = $(e.currentTarget); - const configuration = { type: Modal.types.default, - title: $me.data('modal-title'), + title: this.dataset.modalTitle, size: Modal.sizes.medium, severity: SeverityEnum.notice, - content: $($('#widgetSelector').html()), + content: $(document.getElementById('widgetSelector').innerHTML), additionalCssClasses: ['dashboard-modal'], - callback: (currentModal: any): void => { + callback: (currentModal: JQuery): void => { currentModal.on('click', 'a.dashboard-modal-item-block', (e: JQueryEventObject): void => { currentModal.trigger('modal-dismiss'); }); }, }; Modal.advanced(configuration); - }); + }).delegateTo(document, this.selector); } } diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/ChartInitializer.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/ChartInitializer.js index a10005664ecd3f70adf716777411ad534d270e32..4a9a2fb7490f7290e420d53f8a262eef45ef4cc5 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/ChartInitializer.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/ChartInitializer.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Dashboard/Contrib/chartjs"],(function(e,t,n,r){"use strict";return new class{constructor(){this.selector=".dashboard-item--chart",n(()=>{this.initialize()})}initialize(){n(document).on("widgetContentRendered",this.selector,(e,t)=>{e.preventDefault();const i=n(e.currentTarget);if("undefined"===t.graphConfig)return;let s,o=i.find("canvas:first");o.length>0&&(s=o[0].getContext("2d")),"undefined"!==s&&new r(s,t.graphConfig)})}}})); \ No newline at end of file +define(["require","exports","TYPO3/CMS/Dashboard/Contrib/chartjs","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,n,i){"use strict";return new class{constructor(){this.selector=".dashboard-item--chart",this.initialize()}initialize(){new i("widgetContentRendered",(function(e){e.preventDefault();const t=e.detail;if("undefined"===t.graphConfig)return;let i,r=this.querySelector("canvas");null!==r&&(i=r.getContext("2d")),"undefined"!==i&&new n(i,t.graphConfig)})).delegateTo(document,this.selector)}}})); \ No newline at end of file diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardDelete.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardDelete.js index 91c878e445ef77d497e0babed6ae0d0eff1c9784..12c4b3c3820c0f5eab797f3d6878f0b2e17ac959 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardDelete.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardDelete.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity"],(function(e,t,a,n,i){"use strict";return new class{constructor(){this.selector=".js-dashboard-delete",a(()=>{this.initialize()})}initialize(){a(document).on("click",this.selector,e=>{e.preventDefault();const t=a(e.currentTarget);n.confirm(t.data("modal-title"),t.data("modal-question"),i.SeverityEnum.warning,[{text:t.data("modal-cancel"),active:!0,btnClass:"btn-default",name:"cancel"},{text:t.data("modal-ok"),btnClass:"btn-warning",name:"delete"}]).on("button.clicked",e=>{"delete"===e.target.getAttribute("name")&&(window.location.href=t.attr("href")),n.dismiss()})})}}})); \ No newline at end of file +define(["require","exports","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,n,i,a){"use strict";return new class{constructor(){this.selector=".js-dashboard-delete",this.initialize()}initialize(){new a("click",(function(e){e.preventDefault(),n.confirm(this.dataset.modalTitle,this.dataset.modalQuestion,i.SeverityEnum.warning,[{text:this.dataset.modalCancel,active:!0,btnClass:"btn-default",name:"cancel"},{text:this.dataset.modalOk,btnClass:"btn-warning",name:"delete"}]).on("button.clicked",e=>{"delete"===e.target.getAttribute("name")&&(window.location.href=this.getAttribute("href")),n.dismiss()})})).delegateTo(document,this.selector)}}})); \ No newline at end of file diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardModal.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardModal.js index 28a29340f1f7799c83a3da1b4e05ab7050cb70b1..16366201822a0536627b266b106ae171563c2c7a 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardModal.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/DashboardModal.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity"],(function(t,e,a,i,s){"use strict";return new class{constructor(){this.selector=".js-dashboard-modal",a(()=>{this.initialize()})}initialize(){a(document).on("click",this.selector,t=>{t.preventDefault();const e=a(t.currentTarget),n={type:i.types.default,title:e.data("modal-title"),size:i.sizes.medium,severity:s.SeverityEnum.notice,content:a(a("#dashboardModal-"+e.data("modal-identifier")).html()),additionalCssClasses:["dashboard-modal"],callback:t=>{t.on("submit",".dashboardModal-form",e=>{t.trigger("modal-dismiss")}),t.on("button.clicked",e=>{if("save"===e.target.getAttribute("name")){const e=t.find("form");a('<input type="submit">').hide().appendTo(e).click().remove()}else t.trigger("modal-dismiss")})},buttons:[{text:e.data("button-close-text"),btnClass:"btn-default",name:"cancel"},{text:e.data("button-ok-text"),active:!0,btnClass:"btn-warning",name:"save"}]};i.advanced(n)})}}})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity","TYPO3/CMS/Core/Event/RegularEvent"],(function(t,e,a,s,i,n){"use strict";return new class{constructor(){this.selector=".js-dashboard-modal",this.initialize()}initialize(){new n("click",(function(t){t.preventDefault();const e={type:s.types.default,title:this.dataset.modalTitle,size:s.sizes.medium,severity:i.SeverityEnum.notice,content:a(document.querySelector(`#dashboardModal-${this.dataset.modalIdentifier}`).innerHTML),additionalCssClasses:["dashboard-modal"],callback:t=>{t.on("submit",".dashboardModal-form",e=>{t.trigger("modal-dismiss")}),t.on("button.clicked",e=>{if("save"===e.target.getAttribute("name")){t.find("form").submit()}else t.trigger("modal-dismiss")})},buttons:[{text:this.dataset.buttonCloseText,btnClass:"btn-default",name:"cancel"},{text:this.dataset.buttonOkText,active:!0,btnClass:"btn-warning",name:"save"}]};s.advanced(e)})).delegateTo(document,this.selector)}}})); \ No newline at end of file diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/Grid.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/Grid.js index 3c2df370506dc25f2bb8cd984a687404b512ef1c..ad97067b277b95bb694c39840337cd7c39546a6d 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/Grid.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/Grid.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","muuri","TYPO3/CMS/Core/Ajax/AjaxRequest"],(function(e,t,a,s,r){"use strict";return new class{constructor(){this.selector=".dashboard-grid",a(()=>{this.initialize()})}initialize(){const e={dragEnabled:!0,dragSortHeuristics:{sortInterval:50,minDragDistance:10,minBounceBackAngle:1},layoutDuration:400,layoutEasing:"ease",dragPlaceholder:{enabled:!0,duration:400,createElement:e=>e.getElement().cloneNode(!0)},dragSortPredicate:{action:"move",threshold:30},dragStartPredicate:{handle:".js-dashboard-move-widget"},dragReleaseDuration:400,dragReleaseEasing:"ease",layout:{fillGaps:!1,rounding:!1}};if(a(this.selector).length){const t=new s(this.selector,e);t.on("dragStart",()=>{a(".dashboard-item").removeClass("dashboard-item--enableSelect")}),t.on("dragReleaseEnd",()=>{a(".dashboard-item").addClass("dashboard-item--enableSelect"),this.saveItems(t)}),a(".dashboard-item").on("widgetContentRendered",()=>{t.refreshItems().layout()})}}saveItems(e){let t=e.getItems().map((function(e){return[e.getElement().getAttribute("data-widget-key"),e.getElement().getAttribute("data-widget-hash")]}));new r(TYPO3.settings.ajaxUrls["ext-dashboard-save-widget-positions"]).post({widgets:t}).then(async e=>{await e.resolve()})}}})); \ No newline at end of file +define(["require","exports","muuri","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,a,r,s){"use strict";return new class{constructor(){this.selector=".dashboard-grid",this.initialize()}initialize(){const e={dragEnabled:!0,dragSortHeuristics:{sortInterval:50,minDragDistance:10,minBounceBackAngle:1},layoutDuration:400,layoutEasing:"ease",dragPlaceholder:{enabled:!0,duration:400,createElement:e=>e.getElement().cloneNode(!0)},dragSortPredicate:{action:"move",threshold:30},dragStartPredicate:{handle:".js-dashboard-move-widget"},dragReleaseDuration:400,dragReleaseEasing:"ease",layout:{fillGaps:!1,rounding:!1}};if(null!==document.querySelector(this.selector)){const t=new a(this.selector,e);t.on("dragStart",()=>{document.querySelectorAll(".dashboard-item").forEach(e=>{e.classList.remove("dashboard-item--enableSelect")})}),t.on("dragReleaseEnd",()=>{document.querySelectorAll(".dashboard-item").forEach(e=>{e.classList.add("dashboard-item--enableSelect")}),this.saveItems(t)}),new s("widgetContentRendered",()=>{t.refreshItems().layout()}).delegateTo(document,".dashboard-item")}}saveItems(e){let t=e.getItems().map((function(e){return[e.getElement().getAttribute("data-widget-key"),e.getElement().getAttribute("data-widget-hash")]}));new r(TYPO3.settings.ajaxUrls["ext-dashboard-save-widget-positions"]).post({widgets:t}).then(async e=>{await e.resolve()})}}})); \ No newline at end of file diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetContentCollector.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetContentCollector.js index 6f4a9425eaeced830a16cdee5a08cf33e4482fb0..7e3bf0d2d451bc92c95107a3130e273c77275d7f 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetContentCollector.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetContentCollector.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Core/Ajax/AjaxRequest"],(function(e,t,i,n){"use strict";return new class{constructor(){this.selector=".dashboard-item",i(()=>{this.initialize()})}initialize(){i(this.selector).each((e,t)=>{new n(TYPO3.settings.ajaxUrls["ext-dashboard-get-widget-content"]).withQueryArguments({widget:i(t).data("widget-key")}).get().then(async e=>{const n=await e.resolve();i(t).find(".widget-content").html(n.content),i(t).find(".widget-content").removeClass("hide"),i(t).find(".widget-waiting").addClass("hide"),Object.keys(n.eventdata).length>0?i(t).trigger("widgetContentRendered",n.eventdata):i(t).trigger("widgetContentRendered")}).catch(e=>{i(t).find(".widget-error").removeClass("hide"),i(t).find(".widget-waiting").addClass("hide"),console.warn("Error while retrieving widget ["+i(t).data("widget-key")+"] content: "+e.message)})})}}})); \ No newline at end of file +define(["require","exports","TYPO3/CMS/Core/Ajax/AjaxRequest"],(function(e,t,n){"use strict";return new class{constructor(){this.selector=".dashboard-item",this.initialize()}initialize(){document.querySelectorAll(this.selector).forEach(e=>{const t=e.querySelector(".widget-waiting"),s=e.querySelector(".widget-content"),i=e.querySelector(".widget-error");new n(TYPO3.settings.ajaxUrls["ext-dashboard-get-widget-content"]).withQueryArguments({widget:e.dataset.widgetKey}).get().then(async n=>{const i=await n.resolve();let r;null!==s&&(s.innerHTML=i.content,s.classList.remove("hide")),null!==t&&t.classList.add("hide");const a={bubbles:!0};r=Object.keys(i.eventdata).length>0?new CustomEvent("widgetContentRendered",Object.assign(Object.assign({},a),{detail:i.eventdata})):new Event("widgetContentRendered",a),e.dispatchEvent(r)}).catch(n=>{null!==i&&i.classList.remove("hide"),null!==t&&t.classList.add("hide"),console.warn(`Error while retrieving widget [${e.dataset.widgetKey}] content: ${n.message}`)})})}}})); \ No newline at end of file diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetRemover.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetRemover.js index d3dce6d771de103eecce6ddae6a771093f52f26d..8c896bef9fbc8c83afd408c280da9f43793ce6c4 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetRemover.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetRemover.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity"],(function(e,t,a,n,i){"use strict";return new class{constructor(){this.selector=".js-dashboard-remove-widget",a(()=>{this.initialize()})}initialize(){a(document).on("click",this.selector,e=>{e.preventDefault();const t=a(e.currentTarget);n.confirm(t.data("modal-title"),t.data("modal-question"),i.SeverityEnum.warning,[{text:t.data("modal-cancel"),active:!0,btnClass:"btn-default",name:"cancel"},{text:t.data("modal-ok"),btnClass:"btn-warning",name:"delete"}]).on("button.clicked",e=>{"delete"===e.target.getAttribute("name")&&(window.location.href=t.attr("href")),n.dismiss()})})}}})); \ No newline at end of file +define(["require","exports","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,i,n,a){"use strict";return new class{constructor(){this.selector=".js-dashboard-remove-widget",this.initialize()}initialize(){new a("click",(function(e){e.preventDefault(),i.confirm(this.dataset.modalTitle,this.dataset.modalQuestion,n.SeverityEnum.warning,[{text:this.dataset.modalCancel,active:!0,btnClass:"btn-default",name:"cancel"},{text:this.dataset.modalOk,btnClass:"btn-warning",name:"delete"}]).on("button.clicked",e=>{"delete"===e.target.getAttribute("name")&&(window.location.href=this.getAttribute("href")),i.dismiss()})})).delegateTo(document,this.selector)}}})); \ No newline at end of file diff --git a/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetSelector.js b/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetSelector.js index 242fb164bf546ec4e8d5873841030619d6431234..aa4b66fb8c28105c9d6f67abf55e964ad4364321 100644 --- a/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetSelector.js +++ b/typo3/sysext/dashboard/Resources/Public/JavaScript/WidgetSelector.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity"],(function(e,t,i,a,s){"use strict";return new class{constructor(){this.selector=".js-dashboard-addWidget",i(()=>{this.initialize()})}initialize(){i(document).on("click",this.selector,e=>{e.preventDefault();const t=i(e.currentTarget),d={type:a.types.default,title:t.data("modal-title"),size:a.sizes.medium,severity:s.SeverityEnum.notice,content:i(i("#widgetSelector").html()),additionalCssClasses:["dashboard-modal"],callback:e=>{e.on("click","a.dashboard-modal-item-block",t=>{e.trigger("modal-dismiss")})}};a.advanced(d)})}}})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Enum/Severity","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,i,a,s,d){"use strict";return new class{constructor(){this.selector=".js-dashboard-addWidget",this.initialize()}initialize(){new d("click",(function(e){e.preventDefault();const t={type:a.types.default,title:this.dataset.modalTitle,size:a.sizes.medium,severity:s.SeverityEnum.notice,content:i(document.getElementById("widgetSelector").innerHTML),additionalCssClasses:["dashboard-modal"],callback:e=>{e.on("click","a.dashboard-modal-item-block",t=>{e.trigger("modal-dismiss")})}};a.advanced(t)})).delegateTo(document,this.selector)}}})); \ No newline at end of file