Commit 8f7ac7be authored by Andreas Fernandez's avatar Andreas Fernandez Committed by Anja Leichsenring
Browse files

[TASK] Install Tool: Move common code into abstract class

All modules of the Install Tool used in modal windows now share a common
abstract class that contains some boilerplate code required for most
modules.

Resolves: #88518
Releases: master
Change-Id: I0c2f03f098c731e5a0c499ce91400c22a8c1f890
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/60897


Tested-by: default avatarTYPO3com <noreply@typo3.com>
Tested-by: Jonas Eberle's avatarJonas Eberle <flightvision@googlemail.com>
Tested-by: Anja Leichsenring's avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Simon Gilli's avatarSimon Gilli <typo3@gilbertsoft.org>
Reviewed-by: Anja Leichsenring's avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
parent 6805f471
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
export abstract class AbstractInteractableModule {
private readonly selectorModalBody: string = '.t3js-modal-body';
private readonly selectorModalContent: string = '.t3js-module-content';
protected currentModal: JQuery;
abstract initialize(currentModal: JQuery): void;
protected getModalBody(): JQuery {
return this.findInModal(this.selectorModalBody);
}
protected getModuleContent(): JQuery {
return this.findInModal(this.selectorModalContent);
}
protected findInModal(selector: string): JQuery {
return this.currentModal.find(selector);
}
}
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import Router = require('../Router');
import PasswordStrength = require('./PasswordStrength');
......@@ -20,11 +20,8 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/ChangeInstallToolPassword
*/
class ChangeInstallToolPassword implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class ChangeInstallToolPassword extends AbstractInteractableModule {
private selectorChangeForm: string = '#t3js-changeInstallToolPassword-form';
private currentModal: any = {};
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -40,7 +37,7 @@ class ChangeInstallToolPassword implements InteractableModuleInterface {
}
private getData(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
$.ajax({
url: Router.getUrl('changeInstallToolPasswordGetData'),
cache: false,
......@@ -58,8 +55,8 @@ class ChangeInstallToolPassword implements InteractableModuleInterface {
}
private change(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.currentModal.find(this.selectorModuleContent).data('install-tool-token');
const modalContent = this.getModalBody();
const executeToken = this.getModuleContent().data('install-tool-token');
$.ajax({
url: Router.getUrl(),
method: 'POST',
......@@ -67,8 +64,8 @@ class ChangeInstallToolPassword implements InteractableModuleInterface {
'install': {
'action': 'changeInstallToolPassword',
'token': executeToken,
'password': this.currentModal.find('.t3js-changeInstallToolPassword-password').val(),
'passwordCheck': this.currentModal.find('.t3js-changeInstallToolPassword-password-check').val(),
'password': this.findInModal('.t3js-changeInstallToolPassword-password').val(),
'passwordCheck': this.findInModal('.t3js-changeInstallToolPassword-password-check').val(),
},
},
cache: false,
......@@ -85,7 +82,7 @@ class ChangeInstallToolPassword implements InteractableModuleInterface {
Router.handleAjaxError(xhr, modalContent);
},
complete: (): void => {
this.currentModal.find('.t3js-changeInstallToolPassword-password,.t3js-changeInstallToolPassword-password-check').val('');
this.findInModal('.t3js-changeInstallToolPassword-password,.t3js-changeInstallToolPassword-password-check').val('');
},
});
}
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import Router = require('../Router');
import Notification = require('TYPO3/CMS/Backend/Notification');
......@@ -19,9 +19,7 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/ClearTables
*/
class ClearTables implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class ClearTables extends AbstractInteractableModule {
private selectorClearTrigger: string = '.t3js-clearTables-clear';
private selectorStatsTrigger: string = '.t3js-clearTables-stats';
private selectorOutputContainer: string = '.t3js-clearTables-output';
......@@ -30,7 +28,6 @@ class ClearTables implements InteractableModuleInterface {
private selectorStatDescription: string = '.t3js-clearTables-stat-description';
private selectorStatRows: string = '.t3js-clearTables-stat-rows';
private selectorStatName: string = '.t3js-clearTables-stat-name';
private currentModal: any = {};
public initialize(currentModal: any): void {
this.currentModal = currentModal;
......@@ -50,7 +47,7 @@ class ClearTables implements InteractableModuleInterface {
}
private getStats(): void {
const modalContent: JQuery = this.currentModal.find(this.selectorModalBody);
const modalContent: JQuery = this.getModalBody();
$.ajax({
url: Router.getUrl('clearTablesStats'),
cache: false,
......@@ -80,8 +77,8 @@ class ClearTables implements InteractableModuleInterface {
}
private clear(table: string): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.currentModal.find(this.selectorModuleContent).data('clear-tables-clear-token');
const modalContent = this.getModalBody();
const executeToken = this.getModuleContent().data('clear-tables-clear-token');
$.ajax({
url: Router.getUrl(),
method: 'POST',
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import Router = require('../Router');
import Notification = require('TYPO3/CMS/Backend/Notification');
......@@ -19,9 +19,7 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/ClearTypo3tempFiles
*/
class ClearTypo3tempFiles implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class ClearTypo3tempFiles extends AbstractInteractableModule {
private selectorDeleteTrigger: string = '.t3js-clearTypo3temp-delete';
private selectorOutputContainer: string = '.t3js-clearTypo3temp-output';
private selectorStatContainer: string = '.t3js-clearTypo3temp-stat-container';
......@@ -29,7 +27,6 @@ class ClearTypo3tempFiles implements InteractableModuleInterface {
private selectorStatTemplate: string = '.t3js-clearTypo3temp-stat-template';
private selectorStatNumberOfFiles: string = '.t3js-clearTypo3temp-stat-numberOfFiles';
private selectorStatDirectory: string = '.t3js-clearTypo3temp-stat-directory';
private currentModal: JQuery;
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -49,7 +46,7 @@ class ClearTypo3tempFiles implements InteractableModuleInterface {
}
private getStats(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
$.ajax({
url: Router.getUrl('clearTypo3tempFilesStats'),
cache: false,
......@@ -79,8 +76,8 @@ class ClearTypo3tempFiles implements InteractableModuleInterface {
}
private delete(folder: string, storageUid: number): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.currentModal.find(this.selectorModuleContent).data('clear-typo3temp-delete-token');
const modalContent = this.getModalBody();
const executeToken = this.getModuleContent().data('clear-typo3temp-delete-token');
$.ajax({
method: 'POST',
url: Router.getUrl(),
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import Router = require('../Router');
import FlashMessage = require('../Renderable/FlashMessage');
......@@ -28,7 +28,7 @@ interface ActionQueue {
[k: string]: ActionItem;
}
class CoreUpdate implements InteractableModuleInterface {
class CoreUpdate extends AbstractInteractableModule {
private actionQueue: ActionQueue = {
coreUpdateIsUpdateAvailable: {
loadingMessage: 'Checking for possible regular or security update',
......@@ -67,7 +67,6 @@ class CoreUpdate implements InteractableModuleInterface {
},
};
private selectorModalBody: string = '.t3js-modal-body';
private selectorOutput: string = '.t3js-coreUpdate-output';
private selectorTemplate: string = '.t3js-coreUpdate-buttonTemplate';
......@@ -76,8 +75,6 @@ class CoreUpdate implements InteractableModuleInterface {
*/
private buttonTemplate: any = null;
private currentModal: JQuery = null;
/**
* Fetching the templates out of the DOM
*/
......@@ -100,7 +97,7 @@ class CoreUpdate implements InteractableModuleInterface {
}
private getData(): JQueryXHR {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
return $.ajax({
url: Router.getUrl('coreUpdateGetData'),
cache: false,
......@@ -177,7 +174,7 @@ class CoreUpdate implements InteractableModuleInterface {
}
},
error: (xhr: XMLHttpRequest): void => {
Router.handleAjaxError(xhr, this.currentModal.find(this.selectorModalBody));
Router.handleAjaxError(xhr, this.getModalBody());
},
});
}
......@@ -208,14 +205,14 @@ class CoreUpdate implements InteractableModuleInterface {
*/
private addLoadingMessage(messageTitle: string): void {
const domMessage = FlashMessage.render(Severity.loading, messageTitle);
this.currentModal.find(this.selectorOutput).append(domMessage);
this.findInModal(this.selectorOutput).append(domMessage);
}
/**
* Remove an enabled loading message
*/
private removeLoadingMessage(): void {
this.currentModal.find(this.selectorOutput).find('.alert-loading').remove();
this.findInModal(this.selectorOutput).find('.alert-loading').remove();
}
/**
......@@ -259,7 +256,7 @@ class CoreUpdate implements InteractableModuleInterface {
if (title) {
domButton.text(title);
}
this.currentModal.find(this.selectorOutput).append(domButton);
this.findInModal(this.selectorOutput).append(domButton);
}
/**
......@@ -267,7 +264,7 @@ class CoreUpdate implements InteractableModuleInterface {
*/
private addMessage(severity: number, title: string, message?: string): void {
const domMessage = FlashMessage.render(severity, title, message);
this.currentModal.find(this.selectorOutput).append(domMessage);
this.findInModal(this.selectorOutput).append(domMessage);
}
}
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import Router = require('../Router');
import PasswordStrength = require('./PasswordStrength');
......@@ -20,11 +20,8 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/CreateAdmin
*/
class CreateAdmin implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class CreateAdmin extends AbstractInteractableModule {
private selectorCreateForm: string = '#t3js-createAdmin-form';
private currentModal: JQuery;
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -41,7 +38,7 @@ class CreateAdmin implements InteractableModuleInterface {
}
private getData(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
$.ajax({
url: Router.getUrl('createAdminGetData'),
cache: false,
......@@ -59,8 +56,8 @@ class CreateAdmin implements InteractableModuleInterface {
}
private create(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.currentModal.find(this.selectorModuleContent).data('create-admin-token');
const modalContent = this.getModalBody();
const executeToken = this.getModuleContent().data('create-admin-token');
$.ajax({
url: Router.getUrl(),
method: 'POST',
......@@ -68,10 +65,10 @@ class CreateAdmin implements InteractableModuleInterface {
'install': {
'action': 'createAdmin',
'token': executeToken,
'userName': this.currentModal.find('.t3js-createAdmin-user').val(),
'userPassword': this.currentModal.find('.t3js-createAdmin-password').val(),
'userPasswordCheck': this.currentModal.find('.t3js-createAdmin-password-check').val(),
'userSystemMaintainer': (this.currentModal.find('.t3js-createAdmin-system-maintainer').is(':checked')) ? 1 : 0,
'userName': this.findInModal('.t3js-createAdmin-user').val(),
'userPassword': this.findInModal('.t3js-createAdmin-password').val(),
'userPasswordCheck': this.findInModal('.t3js-createAdmin-password-check').val(),
'userSystemMaintainer': (this.findInModal('.t3js-createAdmin-system-maintainer').is(':checked')) ? 1 : 0,
},
},
cache: false,
......@@ -92,10 +89,10 @@ class CreateAdmin implements InteractableModuleInterface {
Router.handleAjaxError(xhr, modalContent);
},
});
this.currentModal.find('.t3js-createAdmin-user').val('');
this.currentModal.find('.t3js-createAdmin-password').val('');
this.currentModal.find('.t3js-createAdmin-password-check').val('');
this.currentModal.find('.t3js-createAdmin-system-maintainer').prop('checked', false);
this.findInModal('.t3js-createAdmin-user').val('');
this.findInModal('.t3js-createAdmin-password').val('');
this.findInModal('.t3js-createAdmin-password-check').val('');
this.findInModal('.t3js-createAdmin-system-maintainer').prop('checked', false);
}
}
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import Router = require('../Router');
import ProgressBar = require('../Renderable/ProgressBar');
......@@ -22,16 +22,13 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/DatabaseAnalyzer
*/
class DatabaseAnalyzer implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class DatabaseAnalyzer extends AbstractInteractableModule {
private selectorAnalyzeTrigger: string = '.t3js-databaseAnalyzer-analyze';
private selectorExecuteTrigger: string = '.t3js-databaseAnalyzer-execute';
private selectorOutputContainer: string = '.t3js-databaseAnalyzer-output';
private selectorSuggestionBlock: string = '.t3js-databaseAnalyzer-suggestion-block';
private selectorSuggestionList: string = '.t3js-databaseAnalyzer-suggestion-list';
private selectorSuggestionLineTemplate: string = '.t3js-databaseAnalyzer-suggestion-line-template';
private currentModal: JQuery;
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -53,7 +50,7 @@ class DatabaseAnalyzer implements InteractableModuleInterface {
}
private getData(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
$.ajax({
url: Router.getUrl('databaseAnalyzer'),
cache: false,
......@@ -72,7 +69,7 @@ class DatabaseAnalyzer implements InteractableModuleInterface {
}
private analyze(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
const outputContainer = modalContent.find(this.selectorOutputContainer);
const executeTrigger = modalContent.find(this.selectorExecuteTrigger);
const analyzeTrigger = modalContent.find(this.selectorAnalyzeTrigger);
......@@ -151,8 +148,8 @@ class DatabaseAnalyzer implements InteractableModuleInterface {
}
private execute(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.currentModal.find(this.selectorModuleContent).data('database-analyzer-execute-token');
const modalContent = this.getModalBody();
const executeToken = this.getModuleContent().data('database-analyzer-execute-token');
const outputContainer = modalContent.find(this.selectorOutputContainer);
const selectedHashes: Array<any> = [];
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import 'bootstrap';
import Router = require('../Router');
......@@ -23,12 +23,10 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/EnvironmentCheck
*/
class EnvironmentCheck implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
class EnvironmentCheck extends AbstractInteractableModule {
private selectorGridderBadge: string = '.t3js-environmentCheck-badge';
private selectorExecuteTrigger: string = '.t3js-environmentCheck-execute';
private selectorOutputContainer: string = '.t3js-environmentCheck-output';
private currentModal: JQuery;
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -43,7 +41,7 @@ class EnvironmentCheck implements InteractableModuleInterface {
}
private runTests(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
const $errorBadge = $(this.selectorGridderBadge);
$errorBadge.text('').hide();
const message = ProgressBar.render(Severity.loading, 'Loading...', '');
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import 'bootstrap';
import Router = require('../Router');
......@@ -23,13 +23,10 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/ExtensionCompatTester
*/
class ExtensionCompatTester implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class ExtensionCompatTester extends AbstractInteractableModule {
private selectorCheckTrigger: string = '.t3js-extensionCompatTester-check';
private selectorUninstallTrigger: string = '.t3js-extensionCompatTester-uninstall';
private selectorOutputContainer: string = '.t3js-extensionCompatTester-output';
private currentModal: JQuery;
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -46,10 +43,10 @@ class ExtensionCompatTester implements InteractableModuleInterface {
}
private getLoadedExtensionList(): void {
this.currentModal.find(this.selectorCheckTrigger).prop('disabled', true);
this.currentModal.find('.modal-loading').hide();
const modalContent = this.currentModal.find(this.selectorModalBody);
const $outputContainer = this.currentModal.find(this.selectorOutputContainer);
this.findInModal(this.selectorCheckTrigger).prop('disabled', true);
this.findInModal('.modal-loading').hide();
const modalContent = this.getModalBody();
const $outputContainer = this.findInModal(this.selectorOutputContainer);
const message = ProgressBar.render(Severity.loading, 'Loading...', '');
$outputContainer.append(message);
......@@ -58,7 +55,7 @@ class ExtensionCompatTester implements InteractableModuleInterface {
cache: false,
success: (data: any): void => {
modalContent.empty().append(data.html);
const $innerOutputContainer: JQuery = this.currentModal.find(this.selectorOutputContainer);
const $innerOutputContainer: JQuery = this.findInModal(this.selectorOutputContainer);
const progressBar = ProgressBar.render(Severity.loading, 'Loading...', '');
$innerOutputContainer.append(progressBar);
......@@ -97,7 +94,7 @@ class ExtensionCompatTester implements InteractableModuleInterface {
.show();
}).always((): void => {
$innerOutputContainer.find('.alert-loading').remove();
this.currentModal.find(this.selectorCheckTrigger).prop('disabled', false);
this.findInModal(this.selectorCheckTrigger).prop('disabled', false);
});
} else {
Notification.error('Something went wrong');
......@@ -110,7 +107,7 @@ class ExtensionCompatTester implements InteractableModuleInterface {
}
private loadExtLocalconf(extension: string): JQueryPromise<{}> {
const executeToken = this.currentModal.find(this.selectorModuleContent).data('extension-compat-tester-load-ext_localconf-token');
const executeToken = this.getModuleContent().data('extension-compat-tester-load-ext_localconf-token');
const $ajax = $.ajax({
url: Router.getUrl(),
method: 'POST',
......@@ -133,7 +130,7 @@ class ExtensionCompatTester implements InteractableModuleInterface {
}
private loadExtTables(extension: string): JQueryPromise<{}> {
const executeToken = this.currentModal.find(this.selectorModuleContent).data('extension-compat-tester-load-ext_tables-token');
const executeToken = this.getModuleContent().data('extension-compat-tester-load-ext_tables-token');
const $ajax = $.ajax({
url: Router.getUrl(),
method: 'POST',
......@@ -161,8 +158,8 @@ class ExtensionCompatTester implements InteractableModuleInterface {
* @param extension string of extension(s) - may be comma separated
*/
private uninstallExtension(extension: string): void {
const executeToken = this.currentModal.find(this.selectorModuleContent).data('extension-compat-tester-uninstall-extension-token');
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.getModuleContent().data('extension-compat-tester-uninstall-extension-token');
const modalContent = this.getModalBody();
const $outputContainer = $(this.selectorOutputContainer);
const message = ProgressBar.render(Severity.loading, 'Loading...', '');
$outputContainer.append(message);
......
......@@ -11,7 +11,7 @@
* The TYPO3 project - inspiring people to share!
*/
import {InteractableModuleInterface} from './InteractableModuleInterface';
import {AbstractInteractableModule} from './AbstractInteractableModule';
import * as $ from 'jquery';
import 'bootstrap';
import Router = require('../Router');
......@@ -20,12 +20,9 @@ import Notification = require('TYPO3/CMS/Backend/Notification');
/**
* Module: TYPO3/CMS/Install/Module/ExtensionConfiguration
*/
class ExtensionConfiguration implements InteractableModuleInterface {
private selectorModalBody: string = '.t3js-modal-body';
private selectorModuleContent: string = '.t3js-module-content';
class ExtensionConfiguration extends AbstractInteractableModule {
private selectorFormListener: string = '.t3js-extensionConfiguration-form';
private selectorSearchInput: string = '.t3js-extensionConfiguration-search';
private currentModal: JQuery;
public initialize(currentModal: JQuery): void {
this.currentModal = currentModal;
......@@ -73,7 +70,7 @@ class ExtensionConfiguration implements InteractableModuleInterface {
}
private getContent(): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const modalContent = this.getModalBody();
$.ajax({
url: Router.getUrl('extensionConfigurationGetContent'),
cache: false,
......@@ -100,8 +97,8 @@ class ExtensionConfiguration implements InteractableModuleInterface {
* @param {JQuery} $form The form of the current extension
*/
private write($form: JQuery): void {
const modalContent = this.currentModal.find(this.selectorModalBody);
const executeToken = this.currentModal.find(this.selectorModuleContent).data('extension-configuration-write-token');
const modalContent = this.getModalBody();