From d4e26a35a6c45342dcac6d8f725d4b3716619021 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Wed, 9 Aug 2023 22:00:29 +0200 Subject: [PATCH] [TASK] Eliminate eslint warnings Also raise the fixed linters to error level in order to not introduce similar errors again. The linter @typescript-eslint/no-explicit-any is disabled for now, in order for errors to be visible at first glance. Resolves: #101645 Releases: main, 12.4 Change-Id: I48229f148298ac13acd6d12deb55d606a3c7ef59 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/80504 Tested-by: core-ci Tested-by: Benjamin Franzke Reviewed-by: Benjamin Franzke --- Build/.eslintrc.json | 9 ++- .../TypeScript/backend/action-dispatcher.ts | 2 +- .../element/immediate-action-element.ts | 4 +- .../backend/event/trigger-request.ts | 22 ++++-- .../TypeScript/backend/form-engine-review.ts | 12 ++- .../backend/form-engine-validation.ts | 4 +- .../container/files-control-container.ts | 44 +++++------ .../container/inline-control-container.ts | 78 +++++++++---------- .../container/site-language-container.ts | 43 +++++----- .../form-engine/element/password-element.ts | 4 +- .../inline-relation/ajax-dispatcher.ts | 2 +- .../inline-response-interface.ts | 2 +- .../TypeScript/backend/link-browser.ts | 2 +- .../TypeScript/backend/localization.ts | 5 +- .../new-content-element-wizard-button.ts | 6 +- .../TypeScript/backend/online-media.ts | 3 +- .../backend/record-download-button.ts | 6 +- Build/Sources/TypeScript/backend/svg-tree.ts | 1 + .../tests/form-engine-validation-test.ts | 2 +- .../backend/tests/notification-test.ts | 2 +- .../toolbar/system-information-menu.ts | 2 +- .../backend/viewport/content-container.ts | 4 +- .../TypeScript/core/event/event-interface.ts | 2 +- .../core/tests/ajax/ajax-request-test.ts | 7 +- .../install/module/upgrade/core-update.ts | 1 - .../Classes/RecordList/DatabaseRecordList.php | 2 +- .../PageLayout/Grid/ColumnHeader.html | 2 +- .../Private/Partials/PageLayout/Record.html | 2 +- .../JavaScript/event/trigger-request.js | 2 +- .../Public/JavaScript/form-engine-review.js | 2 +- .../container/files-control-container.js | 2 +- .../container/inline-control-container.js | 2 +- .../container/site-language-container.js | 2 +- .../form-engine/element/password-element.js | 2 +- .../Public/JavaScript/link-browser.js | 2 +- .../Public/JavaScript/localization.js | 2 +- .../new-content-element-wizard-button.js | 2 +- .../Public/JavaScript/online-media.js | 2 +- .../JavaScript/record-download-button.js | 2 +- 39 files changed, 143 insertions(+), 154 deletions(-) diff --git a/Build/.eslintrc.json b/Build/.eslintrc.json index 1fedd461cdf1..8509abec333f 100644 --- a/Build/.eslintrc.json +++ b/Build/.eslintrc.json @@ -29,9 +29,10 @@ "rules": { "@typescript-eslint/indent": ["error", 2], "@typescript-eslint/no-inferrable-types": "off", // we want to keep explicit type casting - "@typescript-eslint/ban-types": "warn", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-this-alias": "warn", + "@typescript-eslint/ban-types": "error", + "@typescript-eslint/no-explicit-any": "off", // too many warnings/errors for now, needs be fixed step by step + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/member-ordering": "error", "@typescript-eslint/naming-convention": [ "error", @@ -50,7 +51,7 @@ "eol-last": "error", "guard-for-in": "error", "lit/no-duplicate-template-bindings": "error", - "lit/no-native-attributes": "warn", + "lit/no-native-attributes": "error", "lit/no-invalid-escape-sequences": "error", "lit/no-legacy-imports": "error", "lit/no-useless-template-literals": "error", diff --git a/Build/Sources/TypeScript/backend/action-dispatcher.ts b/Build/Sources/TypeScript/backend/action-dispatcher.ts index 005bef18b2a3..b2103ed3c367 100644 --- a/Build/Sources/TypeScript/backend/action-dispatcher.ts +++ b/Build/Sources/TypeScript/backend/action-dispatcher.ts @@ -34,7 +34,7 @@ declare type ActionDispatchArgument = string | HTMLElement | Event; * data-dispatch-disabled> */ class ActionDispatcher { - private delegates: {[key: string]: Function} = {}; + private delegates: {[key: string]: (...args: ActionDispatchArgument[]) => void} = {}; public constructor() { this.createDelegates(); diff --git a/Build/Sources/TypeScript/backend/element/immediate-action-element.ts b/Build/Sources/TypeScript/backend/element/immediate-action-element.ts index 62b9b26f4957..cb7a54cfbb61 100644 --- a/Build/Sources/TypeScript/backend/element/immediate-action-element.ts +++ b/Build/Sources/TypeScript/backend/element/immediate-action-element.ts @@ -34,7 +34,7 @@ export class ImmediateActionElement extends HTMLElement { return ['action', 'args', 'args-list']; } - private static async getDelegate(action: string): Promise { + private static async getDelegate(action: string): Promise<(...args: any[]) => void> { switch (action) { case 'TYPO3.ModuleMenu.App.refreshMenu': const { default: moduleMenuApp } = await import('@typo3/backend/module-menu'); @@ -82,7 +82,7 @@ export class ImmediateActionElement extends HTMLElement { if (!this.action) { throw new Error('Missing mandatory action attribute'); } - ImmediateActionElement.getDelegate(this.action).then((callback: Function): void => callback(...this.args)); + ImmediateActionElement.getDelegate(this.action).then((callback): void => callback(...this.args)); } } diff --git a/Build/Sources/TypeScript/backend/event/trigger-request.ts b/Build/Sources/TypeScript/backend/event/trigger-request.ts index 13ff69a16cd3..5b28d759bb40 100644 --- a/Build/Sources/TypeScript/backend/event/trigger-request.ts +++ b/Build/Sources/TypeScript/backend/event/trigger-request.ts @@ -22,10 +22,12 @@ class TriggerRequest extends InteractionRequest { if (this === ancestorRequest) { return true; } - let request: InteractionRequest = this; - while (request.parentRequest instanceof InteractionRequest) { - request = request.parentRequest; - if (request === ancestorRequest) { + for ( + let parentRequest = this.parentRequest; + parentRequest instanceof InteractionRequest; + parentRequest = parentRequest.parentRequest + ) { + if (parentRequest === ancestorRequest) { return true; } } @@ -36,13 +38,17 @@ class TriggerRequest extends InteractionRequest { if (types.includes(this.type)) { return true; } - let request: InteractionRequest = this; - while (request.parentRequest instanceof InteractionRequest) { - request = request.parentRequest; - if (types.includes(request.type)) { + + for ( + let parentRequest = this.parentRequest; + parentRequest instanceof InteractionRequest; + parentRequest = parentRequest.parentRequest + ) { + if (types.includes(parentRequest.type)) { return true; } } + return false; } } diff --git a/Build/Sources/TypeScript/backend/form-engine-review.ts b/Build/Sources/TypeScript/backend/form-engine-review.ts index d4038629fc49..4210315ee349 100644 --- a/Build/Sources/TypeScript/backend/form-engine-review.ts +++ b/Build/Sources/TypeScript/backend/form-engine-review.ts @@ -83,11 +83,10 @@ class FormEngineReview { * Initialize the events */ public initialize(): void { - const me: any = this; const $document: any = $(document); DocumentService.ready().then((): void => { - FormEngineReview.attachButtonToModuleHeader(me); + FormEngineReview.attachButtonToModuleHeader(this); }); $document.on('t3-formengine-postfieldvalidation', this.checkForReviewableField); } @@ -96,7 +95,6 @@ class FormEngineReview { * Checks if fields have failed validation. In such case, the markup is rendered and the toggle button is unlocked. */ public checkForReviewableField = (): void => { - const me: any = this; const $invalidFields: any = FormEngineReview.findInvalidField(); const toggleButton: HTMLElement = document.querySelector('.' + this.toggleButtonClass); if (toggleButton === null) { @@ -106,15 +104,15 @@ class FormEngineReview { if ($invalidFields.length > 0) { const $list: any = $('
', { class: 'list-group' }); - $invalidFields.each(function(this: Element): void { - const $field: any = $(this); + $invalidFields.each((index: number, element: Element): void => { + const $field: any = $(element); const $input: JQuery = $field.find('[data-formengine-validation-rules]'); const link = document.createElement('a'); link.classList.add('list-group-item'); link.href = '#'; - link.textContent = $field.find(me.labelSelector).text() || $field.find(me.legendSelector).text(); - link.addEventListener('click', (e: Event) => me.switchToField(e, $input)); + link.textContent = $field.find(this.labelSelector).text() || $field.find(this.legendSelector).text(); + link.addEventListener('click', (e: Event) => this.switchToField(e, $input)); $list.append(link); }); diff --git a/Build/Sources/TypeScript/backend/form-engine-validation.ts b/Build/Sources/TypeScript/backend/form-engine-validation.ts index 7df1300bd5b2..12270d15d5c2 100644 --- a/Build/Sources/TypeScript/backend/form-engine-validation.ts +++ b/Build/Sources/TypeScript/backend/form-engine-validation.ts @@ -143,7 +143,7 @@ export default (function() { /** * Format field value */ - FormEngineValidation.formatValue = function(type: string, value: string|number, config: Object): string { + FormEngineValidation.formatValue = function(type: string, value: string|number, config: object): string { let theString = ''; let parsedInt: number; let theTime: Date; @@ -752,7 +752,7 @@ export default (function() { * @param {String} value * @returns {Object} */ - FormEngineValidation.pol = function(foreign: string, value: string): Object { + FormEngineValidation.pol = function(foreign: string, value: string): object { // @todo deprecate // eslint-disable-next-line no-eval return eval(((foreign == '-') ? '-' : '') + value); diff --git a/Build/Sources/TypeScript/backend/form-engine/container/files-control-container.ts b/Build/Sources/TypeScript/backend/form-engine/container/files-control-container.ts index 67bb5737d391..263202c4f7d8 100644 --- a/Build/Sources/TypeScript/backend/form-engine/container/files-control-container.ts +++ b/Build/Sources/TypeScript/backend/form-engine/container/files-control-container.ts @@ -164,24 +164,22 @@ class FilesControlContainer extends HTMLElement { } private registerToggle(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.loadRecordDetails(this.closest(Selectors.toggleSelector).parentElement.dataset.objectId); + this.loadRecordDetails(targetElement.closest(Selectors.toggleSelector).parentElement.dataset.objectId); }).delegateTo(this.container, `${Selectors.toggleSelector} .form-irre-header-cell:not(${Selectors.controlSectionSelector}`); } private registerSort(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.changeSortingByButton( - (this.closest('[data-object-id]')).dataset.objectId, - this.dataset.direction, + this.changeSortingByButton( + (targetElement.closest('[data-object-id]')).dataset.objectId, + targetElement.dataset.direction, ); }).delegateTo(this.container, Selectors.controlSectionSelector + ' [data-action="sort"]'); } @@ -281,22 +279,21 @@ class FilesControlContainer extends HTMLElement { } private registerInfoButton(): void { - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - InfoWindow.showItem(this.dataset.infoTable, this.dataset.infoUid); + InfoWindow.showItem(targetElement.dataset.infoTable, targetElement.dataset.infoUid); }).delegateTo(this.container, Selectors.infoWindowButton); } private registerDeleteButton(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); const title = TYPO3.lang['label.confirm.delete_record.title'] || 'Delete this record?'; - const content = (TYPO3.lang['label.confirm.delete_record.content'] || 'Are you sure you want to delete the record \'%s\'?').replace('%s', this.dataset.recordInfo); + const content = (TYPO3.lang['label.confirm.delete_record.content'] || 'Are you sure you want to delete the record \'%s\'?').replace('%s', targetElement.dataset.recordInfo); Modal.confirm(title, content, Severity.warning, [ { text: TYPO3.lang['buttons.confirm.delete_record.no'] || 'Cancel', @@ -310,7 +307,7 @@ class FilesControlContainer extends HTMLElement { btnClass: 'btn-warning', name: 'yes', trigger: (e: Event, modal: ModalElement): void => { - me.deleteRecord((this.closest('[data-object-id]')).dataset.objectId); + this.deleteRecord((targetElement.closest('[data-object-id]')).dataset.objectId); modal.hideModal(); } }, @@ -319,29 +316,28 @@ class FilesControlContainer extends HTMLElement { } private registerSynchronizeLocalize(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.ajaxDispatcher.send( - me.ajaxDispatcher.newRequest(me.ajaxDispatcher.getEndpoint('file_reference_synchronizelocalize')), - [me.container.dataset.objectGroup, this.dataset.type], + this.ajaxDispatcher.send( + this.ajaxDispatcher.newRequest(this.ajaxDispatcher.getEndpoint('file_reference_synchronizelocalize')), + [this.container.dataset.objectGroup, targetElement.dataset.type], ).then(async (response: InlineResponseInterface): Promise => { - me.recordsContainer.insertAdjacentHTML('beforeend', response.data); + this.recordsContainer.insertAdjacentHTML('beforeend', response.data); - const objectIdPrefix = me.container.dataset.objectGroup + Separators.structureSeparator; + const objectIdPrefix = this.container.dataset.objectGroup + Separators.structureSeparator; for (const itemUid of response.compilerInput.delete) { - me.deleteRecord(objectIdPrefix + itemUid, true); + this.deleteRecord(objectIdPrefix + itemUid, true); } for (const item of Object.values(response.compilerInput.localize)) { if (typeof item.remove !== 'undefined') { - const removableRecordContainer = me.getFileReferenceContainer(objectIdPrefix + item.remove); + const removableRecordContainer = this.getFileReferenceContainer(objectIdPrefix + item.remove); removableRecordContainer.parentElement.removeChild(removableRecordContainer); } - me.memorizeAddRecord(item.uid, null); + this.memorizeAddRecord(item.uid, null); } }); }).delegateTo(this.container, Selectors.synchronizeLocalizeRecordButtonSelector); diff --git a/Build/Sources/TypeScript/backend/form-engine/container/inline-control-container.ts b/Build/Sources/TypeScript/backend/form-engine/container/inline-control-container.ts index 10b96202e9b7..d0052c32d07c 100644 --- a/Build/Sources/TypeScript/backend/form-engine/container/inline-control-container.ts +++ b/Build/Sources/TypeScript/backend/form-engine/container/inline-control-container.ts @@ -280,55 +280,51 @@ class InlineControlContainer { } private registerToggle(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.loadRecordDetails(this.closest(Selectors.toggleSelector).parentElement.dataset.objectId); + this.loadRecordDetails(targetElement.closest(Selectors.toggleSelector).parentElement.dataset.objectId); }).delegateTo(this.container, `${Selectors.toggleSelector} .form-irre-header-cell:not(${Selectors.controlSectionSelector}`); } private registerSort(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.changeSortingByButton( - (this.closest('[data-object-id]')).dataset.objectId, - this.dataset.direction, + this.changeSortingByButton( + (targetElement.closest('[data-object-id]')).dataset.objectId, + targetElement.dataset.direction, ); }).delegateTo(this.container, Selectors.controlSectionSelector + ' [data-action="sort"]'); } private registerCreateRecordButton(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - if (me.isBelowMax()) { - let objectId = me.container.dataset.objectGroup; - if (typeof this.dataset.recordUid !== 'undefined') { - objectId += Separators.structureSeparator + this.dataset.recordUid; + if (this.isBelowMax()) { + let objectId = this.container.dataset.objectGroup; + if (typeof targetElement.dataset.recordUid !== 'undefined') { + objectId += Separators.structureSeparator + targetElement.dataset.recordUid; } - me.importRecord([objectId, (me.container.querySelector(Selectors.createNewRecordBySelectorSelector) as HTMLInputElement)?.value], this.dataset.recordUid ?? null); + this.importRecord([objectId, (this.container.querySelector(Selectors.createNewRecordBySelectorSelector) as HTMLInputElement)?.value], targetElement.dataset.recordUid ?? null); } }).delegateTo(this.container, Selectors.createNewRecordButtonSelector); } private registerCreateRecordBySelector(): void { - const me = this; - new RegularEvent('change', function(this: HTMLElement, e: Event) { + new RegularEvent('change', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - const selectTarget = this; + const selectTarget = targetElement; const recordUid = selectTarget.options[selectTarget.selectedIndex].getAttribute('value'); - me.importRecord([me.container.dataset.objectGroup, recordUid]); + this.importRecord([this.container.dataset.objectGroup, recordUid]); }).delegateTo(this.container, Selectors.createNewRecordBySelectorSelector); } @@ -446,7 +442,7 @@ class InlineControlContainer { } private registerInfoButton(): void { - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', function(this: HTMLElement, e: Event): void { e.preventDefault(); e.stopImmediatePropagation(); @@ -455,13 +451,12 @@ class InlineControlContainer { } private registerDeleteButton(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); const title = TYPO3.lang['label.confirm.delete_record.title'] || 'Delete this record?'; - const content = (TYPO3.lang['label.confirm.delete_record.content'] || 'Are you sure you want to delete the record \'%s\'?').replace('%s', this.dataset.recordInfo); + const content = (TYPO3.lang['label.confirm.delete_record.content'] || 'Are you sure you want to delete the record \'%s\'?').replace('%s', targetElement.dataset.recordInfo); const modal = Modal.confirm(title, content, Severity.warning, [ { text: TYPO3.lang['buttons.confirm.delete_record.no'] || 'Cancel', @@ -477,8 +472,8 @@ class InlineControlContainer { ]); modal.addEventListener('button.clicked', (modalEvent: Event): void => { if ((modalEvent.target).name === 'yes') { - const objectId = (this.closest('[data-object-id]')).dataset.objectId; - me.deleteRecord(objectId); + const objectId = (targetElement.closest('[data-object-id]')).dataset.objectId; + this.deleteRecord(objectId); } modal.hideModal(); @@ -490,20 +485,19 @@ class InlineControlContainer { * @param {Event} e */ private registerSynchronizeLocalize(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.ajaxDispatcher.send( - me.ajaxDispatcher.newRequest(me.ajaxDispatcher.getEndpoint('record_inline_synchronizelocalize')), - [me.container.dataset.objectGroup, this.dataset.type], + this.ajaxDispatcher.send( + this.ajaxDispatcher.newRequest(this.ajaxDispatcher.getEndpoint('record_inline_synchronizelocalize')), + [this.container.dataset.objectGroup, targetElement.dataset.type], ).then(async (response: InlineResponseInterface): Promise => { - document.getElementById(me.container.getAttribute('id') + '_records').insertAdjacentHTML('beforeend', response.data); + document.getElementById(this.container.getAttribute('id') + '_records').insertAdjacentHTML('beforeend', response.data); - const objectIdPrefix = me.container.dataset.objectGroup + Separators.structureSeparator; + const objectIdPrefix = this.container.dataset.objectGroup + Separators.structureSeparator; for (const itemUid of response.compilerInput.delete) { - me.deleteRecord(objectIdPrefix + itemUid, true); + this.deleteRecord(objectIdPrefix + itemUid, true); } for (const item of Object.values(response.compilerInput.localize)) { @@ -512,40 +506,38 @@ class InlineControlContainer { removableRecordContainer.parentElement.removeChild(removableRecordContainer); } - me.memorizeAddRecord(item.uid, null, item.selectedValue); + this.memorizeAddRecord(item.uid, null, item.selectedValue); } }); }).delegateTo(this.container, Selectors.synchronizeLocalizeRecordButtonSelector); } private registerUniqueSelectFieldChanged(): void { - const me = this; - new RegularEvent('change', function(this: HTMLElement, e: Event) { + new RegularEvent('change', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - const recordContainer = (this.closest('[data-object-id]')); + const recordContainer = (targetElement.closest('[data-object-id]')); if (recordContainer !== null) { const objectId = recordContainer.dataset.objectId; const objectUid = recordContainer.dataset.objectUid; - me.handleChangedField(this, objectId); + this.handleChangedField(targetElement, objectId); - const formField = me.getFormFieldForElements(); + const formField = this.getFormFieldForElements(); if (formField === null) { return; } - me.updateUnique(this, formField, objectUid); + this.updateUnique(targetElement, formField, objectUid); } }).delegateTo(this.container, Selectors.uniqueValueSelectors); } private registerRevertUniquenessAction(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.revertUnique(this.dataset.uid); + this.revertUnique(targetElement.dataset.uid); }).delegateTo(this.container, Selectors.revertUniqueness); } diff --git a/Build/Sources/TypeScript/backend/form-engine/container/site-language-container.ts b/Build/Sources/TypeScript/backend/form-engine/container/site-language-container.ts index 37498d31f419..7c4a00b1e079 100644 --- a/Build/Sources/TypeScript/backend/form-engine/container/site-language-container.ts +++ b/Build/Sources/TypeScript/backend/form-engine/container/site-language-container.ts @@ -177,77 +177,72 @@ class SiteLanguageContainer extends HTMLElement { } private registerCreateRecordButton(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - let objectId = me.container.dataset.objectGroup; - if (typeof this.dataset.recordUid !== 'undefined') { - objectId += Separators.structureSeparator + this.dataset.recordUid; + let objectId = this.container.dataset.objectGroup; + if (typeof targetElement.dataset.recordUid !== 'undefined') { + objectId += Separators.structureSeparator + targetElement.dataset.recordUid; } - me.importRecord([objectId], this.dataset.recordUid ?? null); + this.importRecord([objectId], targetElement.dataset.recordUid ?? null); }).delegateTo(this.container, Selectors.createNewRecordButtonSelector); } private registerCreateRecordByPresetSelector(): void { - const me = this; - new RegularEvent('change', function(this: HTMLElement, e: Event) { + new RegularEvent('change', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - const selector = (me.container.querySelector(Selectors.createNewRecordPresetSelector) as HTMLSelectElement); + const selector = (this.container.querySelector(Selectors.createNewRecordPresetSelector) as HTMLSelectElement); const presetValue = selector?.value; if (presetValue === '') { return; } - let objectId = me.container.dataset.objectGroup; - if (typeof this.dataset.recordUid !== 'undefined') { - objectId += Separators.structureSeparator + this.dataset.recordUid; + let objectId = this.container.dataset.objectGroup; + if (typeof targetElement.dataset.recordUid !== 'undefined') { + objectId += Separators.structureSeparator + targetElement.dataset.recordUid; } selector.value = ''; - me.importRecord([objectId, '', presetValue], this.dataset.recordUid ?? null); + this.importRecord([objectId, '', presetValue], targetElement.dataset.recordUid ?? null); }).delegateTo(this.container, Selectors.createNewRecordPresetSelector); } private registerCreateRecordBySelector(): void { - const me = this; - new RegularEvent('change', function(this: HTMLElement, e: Event) { + new RegularEvent('change', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - const selectTarget = this; + const selectTarget = targetElement; const recordUid = selectTarget.options[selectTarget.selectedIndex].getAttribute('value'); if (recordUid === '') { return; } - me.importRecord([me.container.dataset.objectGroup, recordUid]); + this.importRecord([this.container.dataset.objectGroup, recordUid]); }).delegateTo(this.container, Selectors.createNewRecordBySelectorSelector); } private registerRecordToggle(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); - me.loadRecordDetails(this.closest(Selectors.toggleSelector).parentElement.dataset.objectId); + this.loadRecordDetails(targetElement.closest(Selectors.toggleSelector).parentElement.dataset.objectId); }).delegateTo(this.container, `${Selectors.toggleSelector} .form-irre-header-cell:not(${Selectors.controlSectionSelector}`); } private registerDeleteButton(): void { - const me = this; - new RegularEvent('click', function(this: HTMLElement, e: Event) { + new RegularEvent('click', (e: Event, targetElement: HTMLElement): void => { e.preventDefault(); e.stopImmediatePropagation(); const title = TYPO3.lang['label.confirm.delete_record.title'] || 'Delete this record?'; - const content = (TYPO3.lang['label.confirm.delete_record.content'] || 'Are you sure you want to delete the record \'%s\'?').replace('%s', this.dataset.recordInfo); + const content = (TYPO3.lang['label.confirm.delete_record.content'] || 'Are you sure you want to delete the record \'%s\'?').replace('%s', targetElement.dataset.recordInfo); Modal.confirm(title, content, Severity.warning, [ { text: TYPO3.lang['buttons.confirm.delete_record.no'] || 'Cancel', @@ -261,7 +256,7 @@ class SiteLanguageContainer extends HTMLElement { btnClass: 'btn-warning', name: 'yes', trigger: (e: Event, modal: ModalElement): void => { - me.deleteRecord((this.closest('[data-object-id]')).dataset.objectId); + this.deleteRecord((targetElement.closest('[data-object-id]')).dataset.objectId); modal.hideModal(); } }, diff --git a/Build/Sources/TypeScript/backend/form-engine/element/password-element.ts b/Build/Sources/TypeScript/backend/form-engine/element/password-element.ts index 4232d68b13d1..f7e7d16198a8 100644 --- a/Build/Sources/TypeScript/backend/form-engine/element/password-element.ts +++ b/Build/Sources/TypeScript/backend/form-engine/element/password-element.ts @@ -43,11 +43,11 @@ class PasswordElement extends HTMLElement { private registerEventHandler(): void { if (this.passwordPolicySet) { - this.element.addEventListener('focusin', (e: Event): void => { + this.element.addEventListener('focusin', (): void => { this.passwordPolicyInfo.classList.remove('hidden'); }); - this.element.addEventListener('focusout', (e: Event): void => { + this.element.addEventListener('focusout', (): void => { this.passwordPolicyInfo.classList.add('hidden'); }); } diff --git a/Build/Sources/TypeScript/backend/form-engine/inline-relation/ajax-dispatcher.ts b/Build/Sources/TypeScript/backend/form-engine/inline-relation/ajax-dispatcher.ts index 76333c9a15c1..01dee65ab1e0 100644 --- a/Build/Sources/TypeScript/backend/form-engine/inline-relation/ajax-dispatcher.ts +++ b/Build/Sources/TypeScript/backend/form-engine/inline-relation/ajax-dispatcher.ts @@ -18,7 +18,7 @@ import Notification from '../../notification'; import Utility from '../../utility'; interface Context { - config: Object; + config: object; hmac: string; } diff --git a/Build/Sources/TypeScript/backend/form-engine/inline-relation/inline-response-interface.ts b/Build/Sources/TypeScript/backend/form-engine/inline-relation/inline-response-interface.ts index 7044629dbe4e..e9eae0965090 100644 --- a/Build/Sources/TypeScript/backend/form-engine/inline-relation/inline-response-interface.ts +++ b/Build/Sources/TypeScript/backend/form-engine/inline-relation/inline-response-interface.ts @@ -22,7 +22,7 @@ export interface InlineResponseInterface extends AjaxDispatcherResponse{ } interface InlineData { - config: { [key: string]: Object }; + config: { [key: string]: object }; map: { [key: string]: Array }; nested: { [key: string]: Array> }; } diff --git a/Build/Sources/TypeScript/backend/link-browser.ts b/Build/Sources/TypeScript/backend/link-browser.ts index dcd9bdcf2239..bf8cf29416d6 100644 --- a/Build/Sources/TypeScript/backend/link-browser.ts +++ b/Build/Sources/TypeScript/backend/link-browser.ts @@ -82,7 +82,7 @@ class LinkBrowser { } public finalizeFunction(link: string): void { - throw 'The link browser requires the finalizeFunction to be set. Seems like you discovered a major bug.'; + throw 'The link browser requires the finalizeFunction to be set in order for ' + link + ' to be handled. Seems like you discovered a major bug.'; } } diff --git a/Build/Sources/TypeScript/backend/localization.ts b/Build/Sources/TypeScript/backend/localization.ts index 54dc4430b07e..f8d109858fc0 100644 --- a/Build/Sources/TypeScript/backend/localization.ts +++ b/Build/Sources/TypeScript/backend/localization.ts @@ -55,12 +55,11 @@ class Localization { } private initialize(): void { - const me = this; Icons.getIcon('actions-localize', Icons.sizes.large).then((localizeIconMarkup: string): void => { Icons.getIcon('actions-edit-copy', Icons.sizes.large).then((copyIconMarkup: string): void => { - $(me.triggerButton).removeClass('disabled'); + $(this.triggerButton).removeClass('disabled'); - $(document).on('click', me.triggerButton, (e: JQueryEventObject): void => { + $(document).on('click', this.triggerButton, (e: JQueryEventObject): void => { e.preventDefault(); const $triggerButton = $(e.currentTarget); diff --git a/Build/Sources/TypeScript/backend/new-content-element-wizard-button.ts b/Build/Sources/TypeScript/backend/new-content-element-wizard-button.ts index 9f34064b1181..98d3b0a0133f 100644 --- a/Build/Sources/TypeScript/backend/new-content-element-wizard-button.ts +++ b/Build/Sources/TypeScript/backend/new-content-element-wizard-button.ts @@ -21,13 +21,13 @@ import '@typo3/backend/new-content-element-wizard'; * Module: @typo3/backend/new-content-element-wizard-button * * @example - * + * */ @customElement('typo3-backend-new-content-element-wizard-button') export class NewContentElementWizardButton extends LitElement { static styles = [css`:host { cursor: pointer; appearance: button; }`]; @property({ type: String }) url: string; - @property({ type: String }) title: string; + @property({ type: String }) subject: string; public constructor() { super(); @@ -64,7 +64,7 @@ export class NewContentElementWizardButton extends LitElement { Modal.advanced({ content: this.url, - title: this.title, + title: this.subject, severity: SeverityEnum.notice, size: Modal.sizes.large, type: Modal.types.ajax diff --git a/Build/Sources/TypeScript/backend/online-media.ts b/Build/Sources/TypeScript/backend/online-media.ts index d6a12ed7eb14..8a96b183b89f 100644 --- a/Build/Sources/TypeScript/backend/online-media.ts +++ b/Build/Sources/TypeScript/backend/online-media.ts @@ -41,9 +41,8 @@ class OnlineMedia { } private registerEvents(): void { - const me = this; $(document).on('click', '.t3js-online-media-add-btn', (e: JQueryEventObject): void => { - me.triggerModal($(e.currentTarget)); + this.triggerModal($(e.currentTarget)); }); } diff --git a/Build/Sources/TypeScript/backend/record-download-button.ts b/Build/Sources/TypeScript/backend/record-download-button.ts index 6523d8297380..3bea384c8fe1 100644 --- a/Build/Sources/TypeScript/backend/record-download-button.ts +++ b/Build/Sources/TypeScript/backend/record-download-button.ts @@ -27,7 +27,7 @@ enum Selectors { * Module: @typo3/backend/record-download-button * * @example - * + * *