diff --git a/Classes/Domain/Model/Dto/JsonDateTime.php b/Classes/Domain/Model/Dto/JsonDateTime.php
index 032a1c2..317430a 100644
--- a/Classes/Domain/Model/Dto/JsonDateTime.php
+++ b/Classes/Domain/Model/Dto/JsonDateTime.php
@@ -4,6 +4,7 @@
class JsonDateTime extends \DateTime implements \JsonSerializable
{
+ #[\ReturnTypeWillChange]
public function jsonSerialize(): string
{
return $this->format('c');
diff --git a/Resources/Private/TypeScript/MailCatcher.ts b/Resources/Private/TypeScript/MailCatcher.ts
deleted file mode 100644
index e6b3e2a..0000000
--- a/Resources/Private/TypeScript/MailCatcher.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import $ = require('jquery');
-import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest');
-import Modal = require('TYPO3/CMS/Backend/Modal');
-import Severity = require('TYPO3/CMS/Backend/Severity');
-
-class MailCatcher {
- constructor() {
- this.bindListener();
- }
-
- public bindListener() {
- $('.content-type-switches a').on('click', this.onContentTypeSwitchClick.bind(this));
- $('button[data-delete]').on('click', this.onDeleteButtonClick.bind(this));
- $('#delete-all-messages').on('click', this.onDeleteAllMessagesClick.bind(this));
- $('.panel').on('click', this.onPanelClick.bind(this));
- }
-
- protected onPanelClick(e: Event)
- {
- // load html mail if no plain text body available
- const htmlIsLoaded = $(e.currentTarget).attr('data-html-loaded') === 'true';
- const onlyHtmlButton = $('.content-type-switches a[data-content-type="html"]:only-child', e.currentTarget);
- if (onlyHtmlButton.length && !htmlIsLoaded) {
- const messageId = $(e.currentTarget).attr('data-message-file');
- this.loadHtmlMail(messageId);
- }
- }
-
- protected onDeleteAllMessagesClick(e: Event)
- {
- e.preventDefault();
- const self = this;
-
- Modal.confirm('Delete Messages', 'Are you sure, you want to delete all messages?', Severity.warning, [
- {
- text: 'Yes, delete',
- btnClass: 'btn-danger',
- trigger: function() {
- self.deleteAllMessages();
- Modal.dismiss();
- }
- },
- {
- text: 'No, abort',
- btnClass: 'primary-outline',
- active: true,
- trigger: function() {
- Modal.dismiss();
- }
- }
- ]);
- }
-
- protected deleteAllMessages()
- {
- const self = this;
- const $panel = $('.panel[data-message-file]');
-
- new AjaxRequest(TYPO3.settings.ajaxUrls.mailcatcher_delete_all)
- .get()
- .then(async function (response) {
- const resolved = await response.resolve();
- if (resolved.success) {
- $panel.remove();
- self.refreshMessageCount();
- top.TYPO3.Notification.success('Success', 'All messages have been deleted', 3);
- return;
- }
- top.TYPO3.Notification.error('Error', 'Could not delete messages', 3);
- });
- }
-
- protected refreshMessageCount()
- {
- const count = $('.panel[data-message-file]').length;
- $('*[data-message-count]').attr('data-message-count', count);
- $('.message-count').html(count.toString());
- }
-
- protected onDeleteButtonClick(e: Event) {
- e.preventDefault();
- const $panel = $(e.currentTarget).closest('.panel');
- const messageFile = $panel.attr('data-message-file');
- const self = this;
-
- new AjaxRequest(TYPO3.settings.ajaxUrls.mailcatcher_delete)
- .withQueryArguments({messageFile: messageFile})
- .get()
- .then(async function (response) {
- const resolved = await response.resolve();
- if (resolved.success) {
- $panel.remove();
- self.refreshMessageCount();
- return;
- }
- top.TYPO3.Notification.error('Error', 'Could not delete message', 3);
- });
- }
-
- protected onContentTypeSwitchClick(e: Event) {
- e.preventDefault();
-
- const contentType = $(e.currentTarget).attr('data-content-type');
- const mId = $(e.currentTarget).attr('data-m-id');
-
- $('.content-type-switches a[data-m-id="' + mId + '"]').addClass('btn-outline-primary').removeClass('btn-primary');
- $('.content-type-switches a[data-m-id="' + mId + '"][data-content-type="' + contentType + '"]').removeClass('btn-outline-primary').addClass('btn-primary');
-
- $('.form-section[data-m-id="' + mId + '"]').addClass('hidden');
- const $formSection = $('.form-section[data-m-id="' + mId + '"][data-content-type="' + contentType + '"]');
- $formSection.removeClass('hidden');
-
- const $panel = $(e.currentTarget).closest('.panel');
-
- if ($panel.attr('data-html-loaded') === 'false' && contentType === 'html') {
- this.loadHtmlMail($panel.attr('data-message-file'));
- }
- }
-
- protected loadHtmlMail(messageFile: string) {
- new AjaxRequest(TYPO3.settings.ajaxUrls.mailcatcher_html)
- .withQueryArguments({messageFile: messageFile})
- .get()
- .then(async function (response) {
- const resolved = await response.resolve();
- const $iframe = $('')
- .attr('width', '100%')
- .attr('height', '500px')
- .attr('srcdoc', resolved.src);
- // @ts-ignore
- $('.panel[data-message-file="' + messageFile + '"] .form-section[data-content-type="html"]').html($iframe);
- });
- }
-}
-
-export const XmMailCatcher = new MailCatcher();
diff --git a/Resources/Private/TypeScript/index.d.ts b/Resources/Private/TypeScript/index.d.ts
deleted file mode 100644
index acb8455..0000000
--- a/Resources/Private/TypeScript/index.d.ts
+++ /dev/null
@@ -1,165 +0,0 @@
-declare namespace TYPO3 {
- export let Backend: any;
- export let DebugConsole: any;
- export let ExtensionManager: any;
- export let Icons: any;
- export let InfoWindow: any;
- export let LoginRefresh: any;
- export let ModuleMenu: any;
- export let MultiStepWizard: any;
- export let Notification: any;
- export let Modal: any;
- export let OpendocsMenu: any;
- export let Permissions: any;
- export let Severity: any;
- export let ShortcutMenu: any;
- export let Storage: any;
- export let Tooltip: any;
- export let Utility: any;
- export let WindowManager: any;
- export let Wizard: any;
- export let WorkspacesMenu: any;
- export let settings: any;
- export const lang: { [key: string]: string };
- export const configuration: any;
- export namespace CMS {
- export namespace Backend {
- export class FormEngineValidation {
- public readonly errorClass: string;
-
- public markFieldAsChanged(field: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | JQuery): void;
-
- public initializeInputFields(): void;
-
- public validate(section?: Element): void;
-
- public validateField(field: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | JQuery, value?: string): void;
- }
-
- export namespace FormEngine {
- export namespace Element {
- export class SelectTree {
- public dispatch: { [key: string]: Function };
-
- public constructor();
-
- public initialize(selector: HTMLElement | JQuery, settings: { [key: string]: any }): boolean;
- }
- }
- }
-
- export class FormEngine {
- public readonly Validation: FormEngineValidation;
-
- public legacyFieldChangedCb(): void;
-
- public getFieldElement(fieldName: string, appendix?: string, noFallback?: boolean): JQuery;
-
- public updateHiddenFieldValueFromSelect(selectFieldEl: HTMLElement, originalFieldEl: HTMLElement): void;
-
- public preventFollowLinkIfNotSaved(href: string): boolean;
-
- public setSelectOptionFromExternalSource(
- fieldName: string,
- value: string,
- label: string,
- title: string,
- exclusiveValues?: string,
- optionEl?: HTMLOptionElement | JQuery,
- ): void;
-
- public reinitialize(): void;
-
- public openPopupWindow(mode: string, params: string): JQuery;
-
- public initializeNullNoPlaceholderCheckboxes(): void;
-
- public initializeNullWithPlaceholderCheckboxes(): void;
-
- public requestFormEngineUpdate(askForUpdate: boolean): void
- }
-
- export class MultiStepWizard {
- public addSlide(identifier: string, title: string, content: string, severity: number, callback?: Function): MultiStepWizard;
-
- public lockNextStep(): JQuery;
-
- public unlockNextStep(): JQuery;
-
- public lockPrevStep(): JQuery;
-
- public unlockPrevStep(): JQuery;
-
- public blurCancelStep(): JQuery;
-
- public getComponent(): JQuery;
-
- public addFinalProcessingSlide(callback?: Function): JQueryXHR;
-
- public show(): MultiStepWizard;
-
- public dismiss(): MultiStepWizard;
- }
- }
- }
-}
-
-/**
- * Current AMD/RequireJS modules are returning *instances* of ad-hoc *classes*, make that known to TypeScript
- */
-declare module 'TYPO3/CMS/Backend/FormEngineValidation' {
- const _exported: TYPO3.CMS.Backend.FormEngineValidation;
- export = _exported;
-}
-
-declare module 'TYPO3/CMS/Backend/FormEngine' {
- const _exported: TYPO3.CMS.Backend.FormEngine;
- export = _exported;
-}
-
-// type definition for global namespace object
-interface Window {
- TYPO3: any;
- $: any; // only required in ImageManipulation.ts
- require: Function;
- list_frame: Window;
- jump: Function;
- currentSubScript: string;
- currentModuleLoaded: string;
- fsMod: { [key: string]: any };
- nextLoadModuleUrl: string;
-
- // required for Paste.ts
- // TODO these should be passed as data attributes
- pasteAfterLinkTemplate: string;
- pasteIntoLinkTemplate: string;
-}
-
-/**
- * Needed type declarations for provided libs
- */
-declare module 'muuri';
-declare module 'codemirror';
-declare module 'flatpickr/flatpickr.min';
-declare module 'moment';
-declare module 'TYPO3/CMS/Backend/LegacyTree';
-declare module 'TYPO3/CMS/Recordlist/LinkBrowser';
-declare module 'TYPO3/CMS/Dashboard/Contrib/chartjs';
-
-interface JQueryTypedEvent extends JQueryEventObject {
- originalEvent: T;
-}
-
-/**
- * Required to make jQuery plugins "available" in TypeScript
- */
-interface JQuery {
- datetimepicker(options?: any): JQuery;
-
- dragUploader(options?: any): JQuery;
-
- // To be able to use devbridge-autocomplete we have to override the definition of jquerui
- autocomplete(options?: { [key: string]: any }): any;
-
- disablePagingAction(): void;
-}
diff --git a/Resources/Public/JavaScript/MailCatcher.js b/Resources/Public/JavaScript/MailCatcher.js
index eee04ed..a809f2d 100644
--- a/Resources/Public/JavaScript/MailCatcher.js
+++ b/Resources/Public/JavaScript/MailCatcher.js
@@ -1 +1 @@
-define("TYPO3/CMS/XmMailCatcher/MailCatcher",["TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Severity","TYPO3/CMS/Core/Ajax/AjaxRequest","jquery"],((e,t,s,a)=>{return n={735:(e,t,s)=>{var a,n;a=[s,t,s(404),s(901),s(580),s(339)],n=function(e,t,s,a,n,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.XmMailCatcher=void 0,t.XmMailCatcher=new class{constructor(){this.bindListener()}bindListener(){s(".content-type-switches a").on("click",this.onContentTypeSwitchClick.bind(this)),s("button[data-delete]").on("click",this.onDeleteButtonClick.bind(this)),s("#delete-all-messages").on("click",this.onDeleteAllMessagesClick.bind(this)),s(".panel").on("click",this.onPanelClick.bind(this))}onPanelClick(e){const t="true"===s(e.currentTarget).attr("data-html-loaded");if(s('.content-type-switches a[data-content-type="html"]:only-child',e.currentTarget).length&&!t){const t=s(e.currentTarget).attr("data-message-file");this.loadHtmlMail(t)}}onDeleteAllMessagesClick(e){e.preventDefault();const t=this;n.confirm("Delete Messages","Are you sure, you want to delete all messages?",r.warning,[{text:"Yes, delete",btnClass:"btn-danger",trigger:function(){t.deleteAllMessages(),n.dismiss()}},{text:"No, abort",btnClass:"primary-outline",active:!0,trigger:function(){n.dismiss()}}])}deleteAllMessages(){const e=this,t=s(".panel[data-message-file]");new a(TYPO3.settings.ajaxUrls.mailcatcher_delete_all).get().then((async function(s){if((await s.resolve()).success)return t.remove(),e.refreshMessageCount(),void top.TYPO3.Notification.success("Success","All messages have been deleted",3);top.TYPO3.Notification.error("Error","Could not delete messages",3)}))}refreshMessageCount(){const e=s(".panel[data-message-file]").length;s("*[data-message-count]").attr("data-message-count",e),s(".message-count").html(e.toString())}onDeleteButtonClick(e){e.preventDefault();const t=s(e.currentTarget).closest(".panel"),n=t.attr("data-message-file"),r=this;new a(TYPO3.settings.ajaxUrls.mailcatcher_delete).withQueryArguments({messageFile:n}).get().then((async function(e){if((await e.resolve()).success)return t.remove(),void r.refreshMessageCount();top.TYPO3.Notification.error("Error","Could not delete message",3)}))}onContentTypeSwitchClick(e){e.preventDefault();const t=s(e.currentTarget).attr("data-content-type"),a=s(e.currentTarget).attr("data-m-id");s('.content-type-switches a[data-m-id="'+a+'"]').addClass("btn-outline-primary").removeClass("btn-primary"),s('.content-type-switches a[data-m-id="'+a+'"][data-content-type="'+t+'"]').removeClass("btn-outline-primary").addClass("btn-primary"),s('.form-section[data-m-id="'+a+'"]').addClass("hidden"),s('.form-section[data-m-id="'+a+'"][data-content-type="'+t+'"]').removeClass("hidden");const n=s(e.currentTarget).closest(".panel");"false"===n.attr("data-html-loaded")&&"html"===t&&this.loadHtmlMail(n.attr("data-message-file"))}loadHtmlMail(e){new a(TYPO3.settings.ajaxUrls.mailcatcher_html).withQueryArguments({messageFile:e}).get().then((async function(t){const a=await t.resolve(),n=s("").attr("width","100%").attr("height","500px").attr("srcdoc",a.src);s('.panel[data-message-file="'+e+'"] .form-section[data-content-type="html"]').html(n)}))}}}.apply(t,a),void 0===n||(e.exports=n)},580:t=>{"use strict";t.exports=e},339:e=>{"use strict";e.exports=t},901:e=>{"use strict";e.exports=s},404:e=>{"use strict";e.exports=a}},r={},function e(t){var s=r[t];if(void 0!==s)return s.exports;var a=r[t]={exports:{}};return n[t](a,a.exports,e),a.exports}(735);var n,r}));
+define("TYPO3/CMS/XmMailCatcher/MailCatcher",["TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Severity","TYPO3/CMS/Core/Ajax/AjaxRequest","jquery"],((e,t,s,a)=>{return n={735:(e,t,s)=>{var a,n;a=[s,t,s(404),s(901),s(580),s(339)],n=function(e,t,s,a,n,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.XmMailCatcher=void 0,t.XmMailCatcher=new class{constructor(){this.bindListener()}bindListener(){s(".content-type-switches a").on("click",this.onContentTypeSwitchClick.bind(this)),s("button[data-delete]").on("click",this.onDeleteButtonClick.bind(this)),s("#delete-all-messages").on("click",this.onDeleteAllMessagesClick.bind(this)),s(".panel").on("click",this.onPanelClick.bind(this))}onPanelClick(e){const t="true"===s(e.currentTarget).attr("data-html-loaded");if(s('.content-type-switches a[data-content-type="html"]:only-child',e.currentTarget).length&&!t){const t=s(e.currentTarget).attr("data-message-file");this.loadHtmlMail(t)}}onDeleteAllMessagesClick(e){e.preventDefault();const t=this;n.confirm("Delete Messages","Are you sure, you want to delete all messages?",r.warning,[{text:"Yes, delete",btnClass:"btn-danger",trigger:function(){t.deleteAllMessages(),n.dismiss()}},{text:"No, abort",btnClass:"primary-outline",active:!0,trigger:function(){n.dismiss()}}])}deleteAllMessages(){const e=this,t=s(".panel[data-message-file]");new a(TYPO3.settings.ajaxUrls.mailcatcher_delete_all).get().then((async function(s){if((await s.resolve()).success)return t.remove(),e.refreshMessageCount(),void top.TYPO3.Notification.success("Success","All messages have been deleted",3);top.TYPO3.Notification.error("Error","Could not delete messages",3)}))}refreshMessageCount(){const e=s(".panel[data-message-file]").length;s("*[data-message-count]").attr("data-message-count",e),s(".message-count").html(e.toString())}onDeleteButtonClick(e){e.preventDefault();const t=s(e.currentTarget).closest(".panel"),n=t.attr("data-message-file"),r=this;new a(TYPO3.settings.ajaxUrls.mailcatcher_delete).withQueryArguments({messageFile:n}).get().then((async function(e){if((await e.resolve()).success)return t.remove(),void r.refreshMessageCount();top.TYPO3.Notification.error("Error","Could not delete message",3)}))}onContentTypeSwitchClick(e){e.preventDefault();const t=s(e.currentTarget).attr("data-content-type"),a=s(e.currentTarget).attr("data-m-id");s('.content-type-switches a[data-m-id="'+a+'"]').addClass("btn-outline-primary").removeClass("btn-primary"),s('.content-type-switches a[data-m-id="'+a+'"][data-content-type="'+t+'"]').removeClass("btn-outline-primary").addClass("btn-primary"),s('.form-section[data-m-id="'+a+'"]').addClass("hidden"),s('.form-section[data-m-id="'+a+'"][data-content-type="'+t+'"]').removeClass("hidden");const n=s(e.currentTarget).closest(".panel");"false"===n.attr("data-html-loaded")&&"html"===t&&this.loadHtmlMail(n.attr("data-message-file"))}loadHtmlMail(e){new a(TYPO3.settings.ajaxUrls.mailcatcher_html).withQueryArguments({messageFile:e}).get().then((async function(t){const a=await t.resolve(),n=s("").attr("width","100%").attr("height","500px").attr("srcdoc",a.src);s('.panel[data-message-file="'+e+'"] .form-section[data-content-type="html"]').html(n)}))}}}.apply(t,a),void 0===n||(e.exports=n)},580:t=>{"use strict";t.exports=e},339:e=>{"use strict";e.exports=t},901:e=>{"use strict";e.exports=s},404:e=>{"use strict";e.exports=a}},r={},function e(t){var s=r[t];if(void 0!==s)return s.exports;var a=r[t]={exports:{}};return n[t](a,a.exports,e),a.exports}(735);var n,r}));
\ No newline at end of file
diff --git a/ext_emconf.php b/ext_emconf.php
index cc7c027..4528a1d 100644
--- a/ext_emconf.php
+++ b/ext_emconf.php
@@ -12,7 +12,7 @@
'uploadfolder' => 0,
'createDirs' => '',
'clearCacheOnLoad' => 0,
- 'version' => '11.1.0',
+ 'version' => '11.1.1',
'constraints' => [
'depends' => [
'typo3' => '11.0.0-11.99.99',