typo3-typescript-sources 13.4.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/sync-and-publish.yml +265 -0
- package/.last-synced-tag +1 -0
- package/LICENSE.txt +339 -0
- package/README-TYPO3.md +166 -0
- package/README.md +28 -0
- package/adminpanel/admin-panel.ts +375 -0
- package/adminpanel/modules/cache.ts +27 -0
- package/adminpanel/modules/preview.ts +75 -0
- package/backend/action-button/abstract-action.ts +22 -0
- package/backend/action-button/deferred-action.ts +41 -0
- package/backend/action-button/immediate-action.ts +31 -0
- package/backend/action-dispatcher.ts +104 -0
- package/backend/ajax-data-handler/message-interface.ts +18 -0
- package/backend/ajax-data-handler/response-interface.ts +20 -0
- package/backend/ajax-data-handler.ts +214 -0
- package/backend/backend-exception.ts +22 -0
- package/backend/broadcast-message.ts +50 -0
- package/backend/broadcast-service.ts +52 -0
- package/backend/browse-database.ts +38 -0
- package/backend/clear-cache.ts +88 -0
- package/backend/clipboard-panel.ts +240 -0
- package/backend/close-current-window.ts +2 -0
- package/backend/code-editor/autocomplete/completion-result.ts +105 -0
- package/backend/code-editor/autocomplete/ts-code-completion.ts +142 -0
- package/backend/code-editor/autocomplete/ts-parser.ts +485 -0
- package/backend/code-editor/autocomplete/ts-ref.ts +164 -0
- package/backend/code-editor/element/code-mirror-element.ts +282 -0
- package/backend/code-editor/language/typoscript.ts +181 -0
- package/backend/code-editor/stream-parser/typoscript.ts +1600 -0
- package/backend/color-picker.ts +158 -0
- package/backend/color-scheme-switch.ts +179 -0
- package/backend/column-selector-button.ts +302 -0
- package/backend/context-help.ts +68 -0
- package/backend/context-menu-actions.ts +322 -0
- package/backend/context-menu.ts +751 -0
- package/backend/copy-to-clipboard.ts +79 -0
- package/backend/date-time-picker.ts +270 -0
- package/backend/document-save-actions.ts +159 -0
- package/backend/drag-tooltip.ts +285 -0
- package/backend/drag-uploader.ts +914 -0
- package/backend/element/alert-element.ts +116 -0
- package/backend/element/dispatch-modal-button.ts +50 -0
- package/backend/element/draggable-resizable-element.ts +249 -0
- package/backend/element/editable-page-title.ts +306 -0
- package/backend/element/icon-element.ts +84 -0
- package/backend/element/immediate-action-element.ts +89 -0
- package/backend/element/pagination.ts +59 -0
- package/backend/element/progress-bar-element.ts +172 -0
- package/backend/element/progress-tracker-element.ts +119 -0
- package/backend/element/pseudo-button.ts +58 -0
- package/backend/element/spinner-element.ts +51 -0
- package/backend/element/thumbnail-element.ts +80 -0
- package/backend/element-browser.ts +182 -0
- package/backend/enum/data-transfer-types.ts +21 -0
- package/backend/enum/icon-types.ts +31 -0
- package/backend/enum/key-types.ts +27 -0
- package/backend/enum/severity.ts +20 -0
- package/backend/enum/viewport/scaffold-identifier.ts +24 -0
- package/backend/event/client-request.ts +25 -0
- package/backend/event/consumable.ts +18 -0
- package/backend/event/consumer-scope.ts +54 -0
- package/backend/event/event-dispatcher.ts +26 -0
- package/backend/event/interaction-request-assignment.ts +24 -0
- package/backend/event/interaction-request-map.ts +75 -0
- package/backend/event/interaction-request.ts +48 -0
- package/backend/event/trigger-request.ts +56 -0
- package/backend/form/submit-interceptor.ts +66 -0
- package/backend/form-engine/container/files-control-container.ts +716 -0
- package/backend/form-engine/container/flex-form-container-container.ts +166 -0
- package/backend/form-engine/container/flex-form-section-container.ts +210 -0
- package/backend/form-engine/container/inline-control-container.ts +1230 -0
- package/backend/form-engine/container/site-language-container.ts +616 -0
- package/backend/form-engine/element/abstract-sortable-select-items.ts +186 -0
- package/backend/form-engine/element/category-element.ts +160 -0
- package/backend/form-engine/element/color-element.ts +81 -0
- package/backend/form-engine/element/datetime-element.ts +66 -0
- package/backend/form-engine/element/extra/char-counter.ts +112 -0
- package/backend/form-engine/element/extra/select-box-filter.ts +85 -0
- package/backend/form-engine/element/folder-element.ts +66 -0
- package/backend/form-engine/element/group-element.ts +47 -0
- package/backend/form-engine/element/json-element.ts +52 -0
- package/backend/form-engine/element/link-element.ts +121 -0
- package/backend/form-engine/element/mfa-info-element.ts +169 -0
- package/backend/form-engine/element/modifier/resizable.ts +27 -0
- package/backend/form-engine/element/modifier/tabbable.ts +29 -0
- package/backend/form-engine/element/online-media-form-element.ts +65 -0
- package/backend/form-engine/element/password-element.ts +71 -0
- package/backend/form-engine/element/select-multiple-side-by-side-element.ts +83 -0
- package/backend/form-engine/element/select-single-element.ts +82 -0
- package/backend/form-engine/element/select-tree-element.ts +148 -0
- package/backend/form-engine/element/select-tree-toolbar.ts +118 -0
- package/backend/form-engine/element/select-tree.ts +210 -0
- package/backend/form-engine/element/slug-element.ts +243 -0
- package/backend/form-engine/element/suggest/result-container.ts +118 -0
- package/backend/form-engine/element/suggest/result-item.ts +90 -0
- package/backend/form-engine/element/table-permission-element.ts +101 -0
- package/backend/form-engine/element/table-wizard-element.ts +427 -0
- package/backend/form-engine/element/text-element.ts +52 -0
- package/backend/form-engine/element/text-table-element.ts +31 -0
- package/backend/form-engine/field-control/add-record.ts +40 -0
- package/backend/form-engine/field-control/edit-popup.ts +64 -0
- package/backend/form-engine/field-control/insert-clipboard.ts +50 -0
- package/backend/form-engine/field-control/link-popup.ts +53 -0
- package/backend/form-engine/field-control/list-module.ts +40 -0
- package/backend/form-engine/field-control/password-generator.ts +102 -0
- package/backend/form-engine/field-control/reset-selection.ts +48 -0
- package/backend/form-engine/field-wizard/localization-state-selector.ts +67 -0
- package/backend/form-engine/field-wizard/value-picker.ts +123 -0
- package/backend/form-engine/field-wizard/value-slider.ts +86 -0
- package/backend/form-engine/inline-relation/ajax-dispatcher.ts +124 -0
- package/backend/form-engine/inline-relation/inline-response-interface.ts +41 -0
- package/backend/form-engine-link-browser-adapter.ts +129 -0
- package/backend/form-engine-review.ts +155 -0
- package/backend/form-engine-suggest.ts +133 -0
- package/backend/form-engine-validation.ts +686 -0
- package/backend/form-engine.ts +1391 -0
- package/backend/global-event-handler.ts +252 -0
- package/backend/grid-editor.ts +1077 -0
- package/backend/hashing/md5.ts +252 -0
- package/backend/helper.ts +24 -0
- package/backend/hotkeys/hotkey-storage.ts +63 -0
- package/backend/hotkeys.ts +216 -0
- package/backend/icons.ts +236 -0
- package/backend/image-manipulation.ts +885 -0
- package/backend/info-window.ts +46 -0
- package/backend/input/clearable.ts +128 -0
- package/backend/input/index.d.ts +8 -0
- package/backend/java-script-module-import-event-handler.ts +19 -0
- package/backend/key-bindings.ts +42 -0
- package/backend/layout-module/drag-drop.ts +359 -0
- package/backend/layout-module/paste.ts +165 -0
- package/backend/link-browser.ts +89 -0
- package/backend/live-search/element/backend-search.ts +34 -0
- package/backend/live-search/element/hint.ts +33 -0
- package/backend/live-search/element/provider/default-result-item.ts +52 -0
- package/backend/live-search/element/provider/page-provider-result-item.ts +52 -0
- package/backend/live-search/element/result/item/action/action-container.ts +135 -0
- package/backend/live-search/element/result/item/action/action.ts +56 -0
- package/backend/live-search/element/result/item/item-container.ts +224 -0
- package/backend/live-search/element/result/item/item.ts +74 -0
- package/backend/live-search/element/result/result-container.ts +110 -0
- package/backend/live-search/element/result/result-detail-container.ts +50 -0
- package/backend/live-search/element/result/result-pagination.ts +122 -0
- package/backend/live-search/element/search-option-item.ts +70 -0
- package/backend/live-search/live-search-configurator.ts +54 -0
- package/backend/live-search/live-search-shortcut.ts +29 -0
- package/backend/live-search/result-types/backend-module-result-type.ts +8 -0
- package/backend/live-search/result-types/default-result-type.ts +21 -0
- package/backend/live-search/result-types/page-result-type.ts +23 -0
- package/backend/localization.ts +390 -0
- package/backend/login-refresh.ts +525 -0
- package/backend/login.ts +179 -0
- package/backend/mail-link-handler.ts +45 -0
- package/backend/modal-interface.ts +19 -0
- package/backend/modal.ts +685 -0
- package/backend/module/iframe.ts +125 -0
- package/backend/module/router.ts +275 -0
- package/backend/module-menu.ts +550 -0
- package/backend/module.ts +133 -0
- package/backend/multi-record-selection-action.ts +44 -0
- package/backend/multi-record-selection-delete-action.ts +108 -0
- package/backend/multi-record-selection-edit-action.ts +56 -0
- package/backend/multi-record-selection.ts +468 -0
- package/backend/multi-step-wizard.ts +568 -0
- package/backend/new-content-element-wizard-button.ts +51 -0
- package/backend/new-multiple-pages.ts +108 -0
- package/backend/new-record-wizard.ts +680 -0
- package/backend/notification.ts +366 -0
- package/backend/offset.ts +40 -0
- package/backend/online-media.ts +110 -0
- package/backend/page-actions.ts +91 -0
- package/backend/page-link-handler.ts +51 -0
- package/backend/pagetsconfig/pagetsconfig-includes.ts +77 -0
- package/backend/popover.ts +165 -0
- package/backend/record-download-button.ts +104 -0
- package/backend/record-link-handler.ts +31 -0
- package/backend/record-search.ts +44 -0
- package/backend/recordlist.ts +230 -0
- package/backend/resource/resource.ts +35 -0
- package/backend/security/element/csp-reports.ts +406 -0
- package/backend/security/element/sudo-mode.ts +249 -0
- package/backend/security/sudo-mode-interceptor.ts +19 -0
- package/backend/settings/editor/editable-setting.ts +231 -0
- package/backend/settings/editor.ts +451 -0
- package/backend/settings/enum/settings-mode.enum.ts +24 -0
- package/backend/settings/type/base.ts +200 -0
- package/backend/settings/type/bool.ts +56 -0
- package/backend/settings/type/color.ts +64 -0
- package/backend/settings/type/int.ts +85 -0
- package/backend/settings/type/number.ts +61 -0
- package/backend/settings/type/page.ts +100 -0
- package/backend/settings/type/string.ts +77 -0
- package/backend/settings/type/stringlist.ts +87 -0
- package/backend/severity.ts +88 -0
- package/backend/site-inline-actions.ts +32 -0
- package/backend/sortable-table.ts +208 -0
- package/backend/storage/abstract-client-storage.ts +76 -0
- package/backend/storage/browser-session.ts +28 -0
- package/backend/storage/client.ts +28 -0
- package/backend/storage/module-state-storage.ts +118 -0
- package/backend/storage/persistent.ts +204 -0
- package/backend/switch-user.ts +82 -0
- package/backend/tabs.ts +72 -0
- package/backend/telephone-link-handler.ts +40 -0
- package/backend/tests/backend/storage/browser-storage-test.ts +87 -0
- package/backend/tests/backend/storage/client-test.ts +87 -0
- package/backend/tests/backend/utility/dom-helper-test.ts +51 -0
- package/backend/tests/backend-exception-test.ts +28 -0
- package/backend/tests/element/immediate-action-element-test.ts +81 -0
- package/backend/tests/form-engine-validation-test.ts +304 -0
- package/backend/tests/grid-editor-test.ts +29 -0
- package/backend/tests/hashing/md5Test.ts +28 -0
- package/backend/tests/icons-test.ts +23 -0
- package/backend/tests/notification-test.ts +161 -0
- package/backend/tests/popover-test.ts +83 -0
- package/backend/toolbar/clear-cache-menu.ts +88 -0
- package/backend/toolbar/live-search.ts +284 -0
- package/backend/toolbar/shortcut-menu.ts +254 -0
- package/backend/toolbar/system-information-menu.ts +161 -0
- package/backend/toolbar.ts +41 -0
- package/backend/tree/file-storage-browser.ts +194 -0
- package/backend/tree/file-storage-tree-container.ts +465 -0
- package/backend/tree/file-storage-tree.ts +42 -0
- package/backend/tree/page-browser.ts +272 -0
- package/backend/tree/page-tree-element.ts +602 -0
- package/backend/tree/page-tree.ts +152 -0
- package/backend/tree/tree-module-state.ts +159 -0
- package/backend/tree/tree-node-toggle.ts +31 -0
- package/backend/tree/tree-node.ts +97 -0
- package/backend/tree/tree-toolbar.ts +117 -0
- package/backend/tree/tree.ts +1595 -0
- package/backend/url-link-handler.ts +36 -0
- package/backend/user-pass-login.ts +255 -0
- package/backend/user-settings-manager.ts +189 -0
- package/backend/utility/collapse-state-persister.ts +205 -0
- package/backend/utility/collapse-state-search.ts +183 -0
- package/backend/utility/dom-helper.ts +91 -0
- package/backend/utility/drag-drop-utility.ts +47 -0
- package/backend/utility/message-utility.ts +45 -0
- package/backend/utility/top-level-module-import.ts +32 -0
- package/backend/utility.ts +194 -0
- package/backend/viewport/abstract-container.ts +22 -0
- package/backend/viewport/content-container.ts +98 -0
- package/backend/viewport/loader.ts +28 -0
- package/backend/viewport/navigation-container.ts +119 -0
- package/backend/viewport/resizable-navigation.ts +176 -0
- package/backend/viewport/toolbar.ts +27 -0
- package/backend/viewport/topbar.ts +39 -0
- package/backend/viewport.ts +46 -0
- package/backend/window-manager.ts +84 -0
- package/backend/wizard/move-content-element.ts +107 -0
- package/backend/wizard/move-page.ts +74 -0
- package/backend/wizard.ts +331 -0
- package/belog/backend-log.ts +88 -0
- package/beuser/backend-user-listing.ts +40 -0
- package/beuser/permissions.ts +291 -0
- package/core/ajax/ajax-request-types.ts +15 -0
- package/core/ajax/ajax-request.ts +202 -0
- package/core/ajax/ajax-response.ts +57 -0
- package/core/ajax/input-transformer.ts +92 -0
- package/core/ajax/simple-response-interface.ts +5 -0
- package/core/authentication/mfa-provider/totp.ts +54 -0
- package/core/cache/dedupe-async-task.ts +95 -0
- package/core/directive/markdown.ts +82 -0
- package/core/directive/nl2br.ts +16 -0
- package/core/document-service.ts +35 -0
- package/core/event/debounce-event.ts +40 -0
- package/core/event/event-interface.ts +24 -0
- package/core/event/regular-event.ts +58 -0
- package/core/event/request-animation-frame-event.ts +42 -0
- package/core/event/throttle-event.ts +54 -0
- package/core/java-script-item-handler.ts +29 -0
- package/core/java-script-item-processor.ts +171 -0
- package/core/lit-helper.ts +126 -0
- package/core/literals.ts +17 -0
- package/core/referrer-refresh.ts +2 -0
- package/core/security-utility.ts +89 -0
- package/core/tests/ajax/ajax-request-test.ts +290 -0
- package/core/tests/ajax/input-transformer-test.ts +64 -0
- package/core/tests/cache/dedupe-async-task-test.ts +152 -0
- package/core/tests/event/throttle-event-test.ts +47 -0
- package/core/tests/literals-test.ts +24 -0
- package/core/tests/security-utility-test.ts +50 -0
- package/core/utility/types.ts +9 -0
- package/dashboard/chart-initializer.ts +136 -0
- package/dashboard/dashboard.ts +1487 -0
- package/extensionmanager/distribution-image.ts +55 -0
- package/extensionmanager/main.ts +291 -0
- package/extensionmanager/repository.ts +195 -0
- package/extensionmanager/update.ts +118 -0
- package/extensionmanager/upload-form.ts +42 -0
- package/filelist/browse-files.ts +148 -0
- package/filelist/browse-folders.ts +94 -0
- package/filelist/context-menu-actions.ts +335 -0
- package/filelist/create-folder.ts +69 -0
- package/filelist/file-delete.ts +69 -0
- package/filelist/file-list-actions.ts +132 -0
- package/filelist/file-list-dragdrop.ts +139 -0
- package/filelist/file-list-rename-handler.ts +128 -0
- package/filelist/file-list-transfer-handler.ts +138 -0
- package/filelist/file-list.ts +396 -0
- package/filelist/file-replace.ts +37 -0
- package/filelist/linkbrowser-file-handler.ts +94 -0
- package/filelist/linkbrowser-folder-handler.ts +74 -0
- package/filelist/rename-file.ts +109 -0
- package/form/backend/form-editor/component/property-grid-editor.ts +340 -0
- package/form/backend/form-editor/core.ts +2104 -0
- package/form/backend/form-editor/helper.ts +226 -0
- package/form/backend/form-editor/inspector-component.ts +2323 -0
- package/form/backend/form-editor/mediator.ts +941 -0
- package/form/backend/form-editor/modals-component.ts +433 -0
- package/form/backend/form-editor/stage-component.ts +908 -0
- package/form/backend/form-editor/tree-component.ts +548 -0
- package/form/backend/form-editor/view-model.ts +1343 -0
- package/form/backend/form-editor.ts +846 -0
- package/form/backend/form-manager/main.ts +39 -0
- package/form/backend/form-manager/view-model.ts +789 -0
- package/form/backend/form-manager.ts +180 -0
- package/form/backend/helper.ts +60 -0
- package/form/frontend/date-picker.ts +38 -0
- package/frontend/default_frontend.ts +82 -0
- package/impexp/context-menu-actions.ts +50 -0
- package/impexp/import-export.ts +62 -0
- package/indexed-search/pagination.ts +26 -0
- package/indexed-search/statistics.ts +50 -0
- package/info/translation-status.ts +48 -0
- package/install/ajax/ajax-queue.ts +83 -0
- package/install/init-install.ts +2 -0
- package/install/init-installer.ts +2 -0
- package/install/install.ts +25 -0
- package/install/installer.ts +458 -0
- package/install/message-interface.ts +18 -0
- package/install/module/abstract-inline-module.ts +27 -0
- package/install/module/abstract-interactable-module.ts +107 -0
- package/install/module/environment/environment-check.ts +92 -0
- package/install/module/environment/folder-structure.ts +145 -0
- package/install/module/environment/image-processing.ts +141 -0
- package/install/module/environment/mail-test.ts +127 -0
- package/install/module/environment/php-info.ts +50 -0
- package/install/module/environment/system-information.ts +50 -0
- package/install/module/maintenance/cache.ts +59 -0
- package/install/module/maintenance/clear-tables.ts +134 -0
- package/install/module/maintenance/clear-typo3temp-files.ts +137 -0
- package/install/module/maintenance/create-admin.ts +126 -0
- package/install/module/maintenance/database-analyzer.ts +266 -0
- package/install/module/maintenance/dump-autoload.ts +58 -0
- package/install/module/maintenance/language-packs.ts +338 -0
- package/install/module/maintenance/reset-backend-user-uc.ts +58 -0
- package/install/module/password-strength.ts +56 -0
- package/install/module/settings/change-install-tool-password.ts +101 -0
- package/install/module/settings/extension-configuration.ts +224 -0
- package/install/module/settings/features.ts +102 -0
- package/install/module/settings/local-configuration.ts +316 -0
- package/install/module/settings/presets.ts +147 -0
- package/install/module/settings/system-maintainer.ts +111 -0
- package/install/module/upgrade/core-update.ts +255 -0
- package/install/module/upgrade/extension-compat-tester.ts +195 -0
- package/install/module/upgrade/extension-scanner.ts +381 -0
- package/install/module/upgrade/tca-ext-tables-check.ts +93 -0
- package/install/module/upgrade/tca-migrations-check.ts +101 -0
- package/install/module/upgrade/upgrade-docs.ts +310 -0
- package/install/module/upgrade/upgrade-wizards.ts +612 -0
- package/install/renderable/clearable.ts +113 -0
- package/install/renderable/flash-message.ts +64 -0
- package/install/renderable/info-box.ts +66 -0
- package/install/renderable/language-packs.ts +304 -0
- package/install/renderable/offset-group.ts +38 -0
- package/install/renderable/severity.ts +49 -0
- package/install/renderable/wrap-group.ts +36 -0
- package/install/router.ts +468 -0
- package/linkvalidator/linkvalidator-modal.ts +45 -0
- package/linkvalidator/linkvalidator.ts +101 -0
- package/lowlevel/query-generator.ts +132 -0
- package/lowlevel/reference-index.ts +44 -0
- package/opendocs/toolbar/opendocs-menu.ts +117 -0
- package/package.json +34 -0
- package/recycler/recycler.ts +539 -0
- package/redirects/event-handler.ts +108 -0
- package/redirects/form-engine-evaluation.ts +34 -0
- package/redirects/redirects-module.ts +58 -0
- package/rte-ckeditor/ckeditor5.ts +402 -0
- package/rte-ckeditor/css-prefixer.ts +94 -0
- package/rte-ckeditor/legacy/ckeditor5-bundle.ts +17 -0
- package/rte-ckeditor/legacy/ckeditor5-inspector.ts +2 -0
- package/rte-ckeditor/plugin/typo3-link.ts +810 -0
- package/rte-ckeditor/plugin/whitespace.ts +114 -0
- package/rte-ckeditor/rte-link-browser.ts +112 -0
- package/rte-ckeditor/tests/css-prefixer-test.ts +314 -0
- package/scheduler/scheduler-add-group.ts +119 -0
- package/scheduler/scheduler-editable-group-name.ts +307 -0
- package/scheduler/scheduler-sortable-groups.ts +59 -0
- package/scheduler/scheduler.ts +466 -0
- package/setup/setup-module.ts +122 -0
- package/styleguide/checkbox-demo.ts +5 -0
- package/styleguide/element/theme-switcher-element.ts +101 -0
- package/styleguide/filter.ts +22 -0
- package/styleguide/find-icons.ts +78 -0
- package/styleguide/processing-indicator.ts +78 -0
- package/styleguide/render-notifications.ts +64 -0
- package/sys-note/element/delete-button.ts +78 -0
- package/tstemplate/constant-editor.ts +64 -0
- package/tstemplate/information-module.ts +31 -0
- package/tstemplate/template-analyzer.ts +77 -0
- package/viewpage/main.ts +253 -0
- package/workspaces/backend.ts +979 -0
- package/workspaces/preview.ts +232 -0
- package/workspaces/renderable/comment-view.ts +79 -0
- package/workspaces/renderable/diff-view.ts +58 -0
- package/workspaces/renderable/history-view.ts +97 -0
- package/workspaces/renderable/record-information.ts +118 -0
- package/workspaces/renderable/record-table.ts +355 -0
- package/workspaces/renderable/send-to-stage-form.ts +108 -0
- package/workspaces/toolbar/workspaces-menu.ts +190 -0
- package/workspaces/utility/icon-helper.ts +57 -0
- package/workspaces/workspaces.ts +136 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { AbstractInteractableModule, type ModuleLoadedResponseWithButtons } from '../abstract-interactable-module';
|
|
15
|
+
import Modal from '@typo3/backend/modal';
|
|
16
|
+
import Notification from '@typo3/backend/notification';
|
|
17
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
18
|
+
import Router from '../../router';
|
|
19
|
+
import type MessageInterface from '@typo3/install/message-interface';
|
|
20
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
21
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
22
|
+
import type { ModalElement } from '@typo3/backend/modal';
|
|
23
|
+
|
|
24
|
+
type DatabaseTableListResponse = ModuleLoadedResponseWithButtons & {
|
|
25
|
+
stats: {
|
|
26
|
+
description: string,
|
|
27
|
+
name: string,
|
|
28
|
+
rowCount: number,
|
|
29
|
+
}[]
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type DatabaseTableClearedResponse = {
|
|
33
|
+
status: MessageInterface[],
|
|
34
|
+
success: boolean
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
enum Identifiers {
|
|
38
|
+
clearTrigger = '.t3js-clearTables-clear',
|
|
39
|
+
statsTrigger = '.t3js-clearTables-stats',
|
|
40
|
+
statContainer = '.t3js-clearTables-stat-container',
|
|
41
|
+
statTemplate = '#t3js-clearTables-stat-template',
|
|
42
|
+
statDescription = '.t3js-clearTables-stat-description',
|
|
43
|
+
statRows = '.t3js-clearTables-stat-rows',
|
|
44
|
+
statName = '.t3js-clearTables-stat-name'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Module: @typo3/install/module/clear-tables
|
|
49
|
+
*/
|
|
50
|
+
class ClearTables extends AbstractInteractableModule {
|
|
51
|
+
public override initialize(currentModal: ModalElement): void {
|
|
52
|
+
super.initialize(currentModal);
|
|
53
|
+
this.getStats();
|
|
54
|
+
|
|
55
|
+
new RegularEvent('click', (event: Event): void => {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
currentModal.querySelector(Identifiers.statContainer).innerHTML = '';
|
|
58
|
+
this.getStats();
|
|
59
|
+
}).delegateTo(currentModal, Identifiers.statsTrigger);
|
|
60
|
+
|
|
61
|
+
new RegularEvent('click', (event: Event, trigger: HTMLElement): void => {
|
|
62
|
+
const table = trigger.closest<HTMLElement>(Identifiers.clearTrigger).dataset.table;
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
this.clear(table);
|
|
65
|
+
}).delegateTo(currentModal, Identifiers.clearTrigger);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private getStats(): void {
|
|
69
|
+
this.setModalButtonsState(false);
|
|
70
|
+
|
|
71
|
+
const modalContent: HTMLElement = this.getModalBody();
|
|
72
|
+
(new AjaxRequest(Router.getUrl('clearTablesStats')))
|
|
73
|
+
.get({ cache: 'no-cache' })
|
|
74
|
+
.then(
|
|
75
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
76
|
+
const data: DatabaseTableListResponse = await response.resolve();
|
|
77
|
+
if (data.success === true) {
|
|
78
|
+
modalContent.innerHTML = data.html;
|
|
79
|
+
Modal.setButtons(data.buttons);
|
|
80
|
+
if (Array.isArray(data.stats) && data.stats.length > 0) {
|
|
81
|
+
data.stats.forEach((element: any): void => {
|
|
82
|
+
if (element.rowCount > 0) {
|
|
83
|
+
const aStat = (modalContent.querySelector(Identifiers.statTemplate) as HTMLTemplateElement).content.cloneNode(true) as HTMLElement;
|
|
84
|
+
aStat.querySelector<HTMLElement>(Identifiers.statDescription).innerText = element.description;
|
|
85
|
+
aStat.querySelector<HTMLElement>(Identifiers.statName).innerText = element.name;
|
|
86
|
+
aStat.querySelector<HTMLElement>(Identifiers.statRows).innerText = element.rowCount;
|
|
87
|
+
aStat.querySelector<HTMLElement>(Identifiers.clearTrigger).setAttribute('data-table', element.name);
|
|
88
|
+
modalContent.querySelector(Identifiers.statContainer).append(aStat);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
(error: AjaxResponse): void => {
|
|
97
|
+
Router.handleAjaxError(error, modalContent);
|
|
98
|
+
}
|
|
99
|
+
).finally((): void => {
|
|
100
|
+
this.setModalButtonsState(true);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private clear(table: string): void {
|
|
105
|
+
const modalContent = this.getModalBody();
|
|
106
|
+
const executeToken = this.getModuleContent().dataset.clearTablesClearToken;
|
|
107
|
+
(new AjaxRequest(Router.getUrl()))
|
|
108
|
+
.post({
|
|
109
|
+
install: {
|
|
110
|
+
action: 'clearTablesClear',
|
|
111
|
+
token: executeToken,
|
|
112
|
+
table: table,
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
.then(
|
|
116
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
117
|
+
const data: DatabaseTableClearedResponse = await response.resolve();
|
|
118
|
+
if (data.success === true && Array.isArray(data.status)) {
|
|
119
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
120
|
+
Notification.success(element.title, element.message);
|
|
121
|
+
});
|
|
122
|
+
} else {
|
|
123
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
124
|
+
}
|
|
125
|
+
this.getStats();
|
|
126
|
+
},
|
|
127
|
+
(error: AjaxResponse): void => {
|
|
128
|
+
Router.handleAjaxError(error, modalContent);
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export default new ClearTables();
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { AbstractInteractableModule, type ModuleLoadedResponseWithButtons } from '../abstract-interactable-module';
|
|
15
|
+
import Modal from '@typo3/backend/modal';
|
|
16
|
+
import Notification from '@typo3/backend/notification';
|
|
17
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
18
|
+
import Router from '../../router';
|
|
19
|
+
import type MessageInterface from '@typo3/install/message-interface';
|
|
20
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
21
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
22
|
+
import type { ModalElement } from '@typo3/backend/modal';
|
|
23
|
+
|
|
24
|
+
type TemporaryAssetsListResponse = ModuleLoadedResponseWithButtons & {
|
|
25
|
+
stats: {
|
|
26
|
+
description: string,
|
|
27
|
+
name: string,
|
|
28
|
+
rowCount: number,
|
|
29
|
+
}[]
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type TemporaryAssetsClearedResponse = {
|
|
33
|
+
status: MessageInterface[],
|
|
34
|
+
success: boolean
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
enum Identifiers {
|
|
38
|
+
deleteTrigger = '.t3js-clearTypo3temp-delete',
|
|
39
|
+
statContainer = '.t3js-clearTypo3temp-stat-container',
|
|
40
|
+
statsTrigger = '.t3js-clearTypo3temp-stats',
|
|
41
|
+
statTemplate = '#t3js-clearTypo3temp-stat-template',
|
|
42
|
+
statNumberOfFiles = '.t3js-clearTypo3temp-stat-numberOfFiles',
|
|
43
|
+
statDirectory = '.t3js-clearTypo3temp-stat-directory'
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Module: @typo3/install/module/clear-typo3temp-files
|
|
48
|
+
*/
|
|
49
|
+
class ClearTypo3tempFiles extends AbstractInteractableModule {
|
|
50
|
+
public override initialize(currentModal: ModalElement): void {
|
|
51
|
+
super.initialize(currentModal);
|
|
52
|
+
this.getStats();
|
|
53
|
+
|
|
54
|
+
new RegularEvent('click', (event: Event): void => {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
currentModal.querySelector(Identifiers.statContainer).innerHTML = '';
|
|
57
|
+
this.getStats();
|
|
58
|
+
}).delegateTo(currentModal, Identifiers.statsTrigger);
|
|
59
|
+
|
|
60
|
+
new RegularEvent('click', (event: Event, trigger: HTMLElement): void => {
|
|
61
|
+
event.preventDefault();
|
|
62
|
+
const folder = trigger.dataset.folder;
|
|
63
|
+
const storageUid = trigger.dataset.storageUid !== undefined ? parseInt(trigger.dataset.storageUid, 10) : undefined;
|
|
64
|
+
this.delete(folder, storageUid);
|
|
65
|
+
}).delegateTo(currentModal, Identifiers.deleteTrigger);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private getStats(): void {
|
|
69
|
+
this.setModalButtonsState(false);
|
|
70
|
+
|
|
71
|
+
const modalContent = this.getModalBody();
|
|
72
|
+
(new AjaxRequest(Router.getUrl('clearTypo3tempFilesStats')))
|
|
73
|
+
.get({ cache: 'no-cache' })
|
|
74
|
+
.then(
|
|
75
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
76
|
+
const data: TemporaryAssetsListResponse = await response.resolve();
|
|
77
|
+
if (data.success === true) {
|
|
78
|
+
modalContent.innerHTML = data.html;
|
|
79
|
+
Modal.setButtons(data.buttons);
|
|
80
|
+
if (Array.isArray(data.stats) && data.stats.length > 0) {
|
|
81
|
+
data.stats.forEach((element: any): void => {
|
|
82
|
+
if (element.numberOfFiles > 0) {
|
|
83
|
+
const aStat = (modalContent.querySelector(Identifiers.statTemplate) as HTMLTemplateElement).content.cloneNode(true) as HTMLElement;
|
|
84
|
+
aStat.querySelector<HTMLElement>(Identifiers.statNumberOfFiles).innerText = (element.numberOfFiles);
|
|
85
|
+
aStat.querySelector<HTMLElement>(Identifiers.statDirectory).innerText = (element.directory);
|
|
86
|
+
aStat.querySelector<HTMLElement>(Identifiers.deleteTrigger).setAttribute('data-folder', element.directory);
|
|
87
|
+
if (element.storageUid !== undefined) {
|
|
88
|
+
aStat.querySelector<HTMLElement>(Identifiers.deleteTrigger).setAttribute('data-storage-uid', element.storageUid);
|
|
89
|
+
}
|
|
90
|
+
modalContent.querySelector(Identifiers.statContainer).append(aStat);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
(error: AjaxResponse): void => {
|
|
99
|
+
Router.handleAjaxError(error, modalContent);
|
|
100
|
+
}
|
|
101
|
+
).finally((): void => {
|
|
102
|
+
this.setModalButtonsState(true);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private delete(folder: string, storageUid: number|undefined): void {
|
|
107
|
+
const modalContent = this.getModalBody();
|
|
108
|
+
const executeToken = this.getModuleContent().dataset.clearTypo3tempDeleteToken;
|
|
109
|
+
(new AjaxRequest(Router.getUrl()))
|
|
110
|
+
.post({
|
|
111
|
+
install: {
|
|
112
|
+
action: 'clearTypo3tempFiles',
|
|
113
|
+
token: executeToken,
|
|
114
|
+
folder: folder,
|
|
115
|
+
storageUid: storageUid,
|
|
116
|
+
},
|
|
117
|
+
})
|
|
118
|
+
.then(
|
|
119
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
120
|
+
const data: TemporaryAssetsClearedResponse = await response.resolve();
|
|
121
|
+
if (data.success === true && Array.isArray(data.status)) {
|
|
122
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
123
|
+
Notification.success(element.title, element.message);
|
|
124
|
+
});
|
|
125
|
+
this.getStats();
|
|
126
|
+
} else {
|
|
127
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
(error: AjaxResponse): void => {
|
|
131
|
+
Router.handleAjaxError(error, modalContent);
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export default new ClearTypo3tempFiles();
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import Modal from '@typo3/backend/modal';
|
|
15
|
+
import Notification from '@typo3/backend/notification';
|
|
16
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
17
|
+
import Router from '../../router';
|
|
18
|
+
import PasswordStrength from '../password-strength';
|
|
19
|
+
import { AbstractInteractableModule, type ModuleLoadedResponseWithButtons } from '../abstract-interactable-module';
|
|
20
|
+
import type MessageInterface from '@typo3/install/message-interface';
|
|
21
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
22
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
23
|
+
import type { ModalElement } from '@typo3/backend/modal';
|
|
24
|
+
|
|
25
|
+
enum Identifiers {
|
|
26
|
+
adminCreateButton = '.t3js-createAdmin-create',
|
|
27
|
+
adminUserInput = '.t3js-createAdmin-user',
|
|
28
|
+
adminRealNameInput = '.t3js-createAdmin-realname',
|
|
29
|
+
adminPasswordInput = '.t3js-createAdmin-password',
|
|
30
|
+
adminPasswordCheckInput = '.t3js-createAdmin-password-check',
|
|
31
|
+
adminEmailInput = '.t3js-createAdmin-email',
|
|
32
|
+
adminSysMaintainterInput = '.t3js-createAdmin-system-maintainer'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type BackendUserCreatedResponse = {
|
|
36
|
+
status: MessageInterface[],
|
|
37
|
+
success: boolean,
|
|
38
|
+
userCreated: boolean,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Module: @typo3/install/module/create-admin
|
|
43
|
+
*/
|
|
44
|
+
class CreateAdmin extends AbstractInteractableModule {
|
|
45
|
+
public override initialize(currentModal: ModalElement): void {
|
|
46
|
+
super.initialize(currentModal);
|
|
47
|
+
this.getData();
|
|
48
|
+
|
|
49
|
+
new RegularEvent('click', (event: Event): void => {
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
this.create();
|
|
52
|
+
}).delegateTo(currentModal, Identifiers.adminCreateButton);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private getData(): void {
|
|
56
|
+
const modalContent = this.getModalBody();
|
|
57
|
+
(new AjaxRequest(Router.getUrl('createAdminGetData')))
|
|
58
|
+
.get({ cache: 'no-cache' })
|
|
59
|
+
.then(
|
|
60
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
61
|
+
const data: ModuleLoadedResponseWithButtons = await response.resolve();
|
|
62
|
+
if (data.success === true) {
|
|
63
|
+
modalContent.innerHTML = data.html;
|
|
64
|
+
|
|
65
|
+
PasswordStrength.initialize(modalContent.querySelector('.t3-install-form-password-strength'));
|
|
66
|
+
Modal.setButtons(data.buttons);
|
|
67
|
+
} else {
|
|
68
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
(error: AjaxResponse): void => {
|
|
72
|
+
Router.handleAjaxError(error, modalContent);
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private create(): void {
|
|
78
|
+
this.setModalButtonsState(false);
|
|
79
|
+
|
|
80
|
+
const modalContent = this.getModalBody();
|
|
81
|
+
const executeToken = this.getModuleContent().dataset.createAdminToken;
|
|
82
|
+
const payload = {
|
|
83
|
+
install: {
|
|
84
|
+
action: 'createAdmin',
|
|
85
|
+
token: executeToken,
|
|
86
|
+
userName: (this.findInModal(Identifiers.adminUserInput) as HTMLInputElement).value,
|
|
87
|
+
userPassword: (this.findInModal(Identifiers.adminPasswordInput) as HTMLInputElement).value,
|
|
88
|
+
userPasswordCheck: (this.findInModal(Identifiers.adminPasswordCheckInput) as HTMLInputElement).value,
|
|
89
|
+
userEmail: (this.findInModal(Identifiers.adminEmailInput) as HTMLInputElement).value,
|
|
90
|
+
realName: (this.findInModal(Identifiers.adminRealNameInput) as HTMLInputElement).value,
|
|
91
|
+
userSystemMaintainer: (this.findInModal(Identifiers.adminSysMaintainterInput) as HTMLInputElement).checked ? 1 : 0,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
this.getModuleContent().querySelectorAll('input').forEach((input: HTMLInputElement): void => {
|
|
95
|
+
input.disabled = true;
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
(new AjaxRequest(Router.getUrl())).post(payload).then(async (response: AjaxResponse): Promise<void> => {
|
|
99
|
+
const data: BackendUserCreatedResponse = await response.resolve();
|
|
100
|
+
if (data.success === true && Array.isArray(data.status)) {
|
|
101
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
102
|
+
Notification.showMessage(element.title, element.message, element.severity);
|
|
103
|
+
});
|
|
104
|
+
if (data.userCreated) {
|
|
105
|
+
(this.findInModal(Identifiers.adminUserInput) as HTMLInputElement).value = '';
|
|
106
|
+
(this.findInModal(Identifiers.adminPasswordInput) as HTMLInputElement).value = '';
|
|
107
|
+
(this.findInModal(Identifiers.adminPasswordCheckInput) as HTMLInputElement).value = '';
|
|
108
|
+
(this.findInModal(Identifiers.adminEmailInput) as HTMLInputElement).value = '';
|
|
109
|
+
(this.findInModal(Identifiers.adminSysMaintainterInput) as HTMLInputElement).checked = false;
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
113
|
+
}
|
|
114
|
+
}, (error: AjaxResponse): void => {
|
|
115
|
+
Router.handleAjaxError(error, modalContent);
|
|
116
|
+
}).finally((): void => {
|
|
117
|
+
this.setModalButtonsState(true);
|
|
118
|
+
|
|
119
|
+
this.getModuleContent().querySelectorAll('input').forEach((input: HTMLInputElement): void => {
|
|
120
|
+
input.disabled = false;
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export default new CreateAdmin();
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { AbstractInteractableModule, type ModuleLoadedResponseWithButtons } from '../abstract-interactable-module';
|
|
15
|
+
import Modal from '@typo3/backend/modal';
|
|
16
|
+
import Notification from '@typo3/backend/notification';
|
|
17
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
18
|
+
import { InfoBox } from '../../renderable/info-box';
|
|
19
|
+
import Severity from '../../renderable/severity';
|
|
20
|
+
import Router from '../../router';
|
|
21
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
22
|
+
import SecurityUtility from '@typo3/core/security-utility';
|
|
23
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
24
|
+
import type MessageInterface from '@typo3/install/message-interface';
|
|
25
|
+
import type { ModalElement } from '@typo3/backend/modal';
|
|
26
|
+
|
|
27
|
+
enum Identifiers {
|
|
28
|
+
analyzeTrigger = '.t3js-databaseAnalyzer-analyze',
|
|
29
|
+
executeTrigger = '.t3js-databaseAnalyzer-execute',
|
|
30
|
+
outputContainer = '.t3js-databaseAnalyzer-output',
|
|
31
|
+
notificationContainer = '.t3js-databaseAnalyzer-notification',
|
|
32
|
+
suggestionBlock = '#t3js-databaseAnalyzer-suggestion-block',
|
|
33
|
+
suggestionBlockCheckbox = '.t3js-databaseAnalyzer-suggestion-block-checkbox',
|
|
34
|
+
suggestionBlockLegend = '.t3js-databaseAnalyzer-suggestion-block-legend',
|
|
35
|
+
suggestionBlockLabel = '.t3js-databaseAnalyzer-suggestion-block-label',
|
|
36
|
+
suggestionList = '.t3js-databaseAnalyzer-suggestion-list',
|
|
37
|
+
suggestionLineTemplate = '#t3js-databaseAnalyzer-suggestion-line-template',
|
|
38
|
+
suggestionLineCheckbox = '.t3js-databaseAnalyzer-suggestion-line-checkbox',
|
|
39
|
+
suggestionLineLabel = '.t3js-databaseAnalyzer-suggestion-line-label',
|
|
40
|
+
suggestionLineStatement = '.t3js-databaseAnalyzer-suggestion-line-statement',
|
|
41
|
+
suggestionLineCurrent = '.t3js-databaseAnalyzer-suggestion-line-current',
|
|
42
|
+
suggestionLineCurrentValue = '.t3js-databaseAnalyzer-suggestion-line-current-value',
|
|
43
|
+
suggestionLineCount = '.t3js-databaseAnalyzer-suggestion-line-count',
|
|
44
|
+
suggestionLineCountValue = '.t3js-databaseAnalyzer-suggestion-line-count-value'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
type SuggestionsResponse = {
|
|
48
|
+
status: MessageInterface[],
|
|
49
|
+
success: boolean,
|
|
50
|
+
suggestions: {
|
|
51
|
+
children: {
|
|
52
|
+
hash: string,
|
|
53
|
+
statement: string,
|
|
54
|
+
}[],
|
|
55
|
+
enabled: boolean,
|
|
56
|
+
key: string,
|
|
57
|
+
label: string,
|
|
58
|
+
}[]
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
type SuggestionsExecutedResponse = {
|
|
62
|
+
status: MessageInterface[],
|
|
63
|
+
success: boolean,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Module: @typo3/install/module/database-analyzer
|
|
68
|
+
*/
|
|
69
|
+
class DatabaseAnalyzer extends AbstractInteractableModule {
|
|
70
|
+
public override initialize(currentModal: ModalElement): void {
|
|
71
|
+
super.initialize(currentModal);
|
|
72
|
+
this.loadModuleFrameAgnostic('@typo3/install/renderable/info-box.js').then((): void => {
|
|
73
|
+
this.getData();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Select / deselect all checkboxes
|
|
77
|
+
new RegularEvent('click', (event: Event, element: HTMLInputElement): void => {
|
|
78
|
+
element.closest('fieldset').querySelectorAll('input[type="checkbox"]').forEach((checkbox: HTMLInputElement): void => {
|
|
79
|
+
checkbox.checked = element.checked;
|
|
80
|
+
});
|
|
81
|
+
}).delegateTo(currentModal, Identifiers.suggestionBlockCheckbox);
|
|
82
|
+
|
|
83
|
+
new RegularEvent('click', (event: Event): void => {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
this.clearNotifications();
|
|
86
|
+
this.analyze();
|
|
87
|
+
}).delegateTo(currentModal, Identifiers.analyzeTrigger);
|
|
88
|
+
|
|
89
|
+
new RegularEvent('click', (event: Event): void => {
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
this.clearNotifications();
|
|
92
|
+
this.execute();
|
|
93
|
+
}).delegateTo(currentModal, Identifiers.executeTrigger);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private getData(): void {
|
|
97
|
+
const modalContent = this.getModalBody();
|
|
98
|
+
(new AjaxRequest(Router.getUrl('databaseAnalyzer')))
|
|
99
|
+
.get({ cache: 'no-cache' })
|
|
100
|
+
.then(
|
|
101
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
102
|
+
const data: ModuleLoadedResponseWithButtons = await response.resolve();
|
|
103
|
+
if (data.success === true) {
|
|
104
|
+
modalContent.innerHTML = data.html;
|
|
105
|
+
Modal.setButtons(data.buttons);
|
|
106
|
+
this.analyze();
|
|
107
|
+
} else {
|
|
108
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
(error: AjaxResponse): void => {
|
|
112
|
+
Router.handleAjaxError(error, modalContent);
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private analyze(): void {
|
|
118
|
+
this.setModalButtonsState(false);
|
|
119
|
+
|
|
120
|
+
const modalContent = this.getModalBody();
|
|
121
|
+
const outputContainer = modalContent.querySelector<HTMLElement>(Identifiers.outputContainer);
|
|
122
|
+
const progressBar = this.renderProgressBar(outputContainer, {
|
|
123
|
+
label: 'Analyzing current database schema...'
|
|
124
|
+
});
|
|
125
|
+
new RegularEvent('change', (): void => {
|
|
126
|
+
const hasCheckedCheckboxes = outputContainer.querySelectorAll(':checked').length > 0;
|
|
127
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.executeTrigger), hasCheckedCheckboxes);
|
|
128
|
+
}).delegateTo(outputContainer, 'input[type="checkbox"]');
|
|
129
|
+
|
|
130
|
+
(new AjaxRequest(Router.getUrl('databaseAnalyzerAnalyze')))
|
|
131
|
+
.get({ cache: 'no-cache' })
|
|
132
|
+
.then(
|
|
133
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
134
|
+
const data: SuggestionsResponse = await response.resolve();
|
|
135
|
+
if (data.success === true) {
|
|
136
|
+
if (Array.isArray(data.status)) {
|
|
137
|
+
progressBar.remove();
|
|
138
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
139
|
+
outputContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (Array.isArray(data.suggestions)) {
|
|
143
|
+
data.suggestions.forEach((element: any): void => {
|
|
144
|
+
const aBlock = (modalContent.querySelector(Identifiers.suggestionBlock) as HTMLTemplateElement).content.cloneNode(true) as HTMLElement;
|
|
145
|
+
const key = element.key;
|
|
146
|
+
aBlock.querySelector<HTMLElement>(Identifiers.suggestionBlockLegend).innerText = element.label;
|
|
147
|
+
aBlock.querySelector<HTMLElement>(Identifiers.suggestionBlockCheckbox).setAttribute('id', 't3-install-' + key + '-checkbox');
|
|
148
|
+
if (element.enabled) {
|
|
149
|
+
aBlock.querySelector<HTMLElement>(Identifiers.suggestionBlockCheckbox).setAttribute('checked', 'checked');
|
|
150
|
+
}
|
|
151
|
+
aBlock.querySelector<HTMLElement>(Identifiers.suggestionBlockLabel).setAttribute('for', 't3-install-' + key + '-checkbox');
|
|
152
|
+
element.children.forEach((line: any): void => {
|
|
153
|
+
const aLine = (modalContent.querySelector(Identifiers.suggestionLineTemplate) as HTMLTemplateElement).content.cloneNode(true) as HTMLElement;
|
|
154
|
+
const hash = line.hash;
|
|
155
|
+
const checkbox = aLine.querySelector<HTMLInputElement>(Identifiers.suggestionLineCheckbox);
|
|
156
|
+
checkbox.setAttribute('id', 't3-install-db-' + hash);
|
|
157
|
+
checkbox.setAttribute('data-hash', hash);
|
|
158
|
+
if (element.enabled) {
|
|
159
|
+
checkbox.setAttribute('checked', 'checked');
|
|
160
|
+
}
|
|
161
|
+
aLine.querySelector(Identifiers.suggestionLineLabel).setAttribute('for', 't3-install-db-' + hash);
|
|
162
|
+
aLine.querySelector<HTMLElement>(Identifiers.suggestionLineStatement).innerText = line.statement;
|
|
163
|
+
if (typeof line.current !== 'undefined') {
|
|
164
|
+
aLine.querySelector<HTMLElement>(Identifiers.suggestionLineCurrentValue).innerText = line.current;
|
|
165
|
+
aLine.querySelector<HTMLElement>(Identifiers.suggestionLineCurrent).style.display = 'inline';
|
|
166
|
+
}
|
|
167
|
+
if (typeof line.rowCount !== 'undefined') {
|
|
168
|
+
aLine.querySelector<HTMLElement>(Identifiers.suggestionLineCountValue).innerText = line.rowCount;
|
|
169
|
+
aLine.querySelector<HTMLElement>(Identifiers.suggestionLineCount).style.display = 'inline';
|
|
170
|
+
}
|
|
171
|
+
aBlock.querySelector<HTMLElement>(Identifiers.suggestionList).append(aLine);
|
|
172
|
+
});
|
|
173
|
+
outputContainer.append(aBlock);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.analyzeTrigger), true);
|
|
177
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.executeTrigger), outputContainer.querySelectorAll(':checked').length > 0);
|
|
178
|
+
}
|
|
179
|
+
if (data.suggestions.length === 0 && data.status.length === 0) {
|
|
180
|
+
outputContainer.append(InfoBox.create(Severity.ok, 'Database schema is up to date. Good job!'));
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
Notification.error('Something went wrong', 'The request was not processed successfully. Please check the browser\'s console and TYPO3\'s log.');
|
|
184
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.analyzeTrigger), true);
|
|
185
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.executeTrigger), false);
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
(error: AjaxResponse): void => {
|
|
189
|
+
Router.handleAjaxError(error, modalContent);
|
|
190
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.analyzeTrigger), true);
|
|
191
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.executeTrigger), false);
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private execute(): void {
|
|
197
|
+
this.setModalButtonsState(false);
|
|
198
|
+
|
|
199
|
+
const modalContent = this.getModalBody();
|
|
200
|
+
const executeToken = this.getModuleContent().dataset.databaseAnalyzerExecuteToken;
|
|
201
|
+
const outputContainer: HTMLElement = modalContent.querySelector(Identifiers.outputContainer);
|
|
202
|
+
const notificationContainer: HTMLElement = modalContent.querySelector(Identifiers.notificationContainer);
|
|
203
|
+
|
|
204
|
+
const selectedHashes: string[] = [];
|
|
205
|
+
outputContainer.querySelectorAll('.t3js-databaseAnalyzer-suggestion-line input:checked').forEach((element: HTMLElement): void => {
|
|
206
|
+
selectedHashes.push(element.dataset.hash);
|
|
207
|
+
});
|
|
208
|
+
this.renderProgressBar(outputContainer, {
|
|
209
|
+
label: 'Executing database updates...'
|
|
210
|
+
});
|
|
211
|
+
(new AjaxRequest(Router.getUrl()))
|
|
212
|
+
.post({
|
|
213
|
+
install: {
|
|
214
|
+
action: 'databaseAnalyzerExecute',
|
|
215
|
+
token: executeToken,
|
|
216
|
+
hashes: selectedHashes,
|
|
217
|
+
},
|
|
218
|
+
}).then(
|
|
219
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
220
|
+
const data: SuggestionsExecutedResponse = await response.resolve();
|
|
221
|
+
if (Array.isArray(data.status)) {
|
|
222
|
+
let groupedErrors: string = '';
|
|
223
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
224
|
+
if(element.severity === Severity.error) {
|
|
225
|
+
const securityUtility = new SecurityUtility();
|
|
226
|
+
groupedErrors += '<li>' + securityUtility.encodeHtml(element.message) + '</li>';
|
|
227
|
+
} else {
|
|
228
|
+
Notification.showMessage(element.title, element.message, element.severity);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
if(groupedErrors !== '') {
|
|
233
|
+
notificationContainer.innerHTML = `<div class="alert alert-danger">
|
|
234
|
+
<div class="alert-inner">
|
|
235
|
+
<div class="alert-icon">
|
|
236
|
+
<span class="icon-emphasized">
|
|
237
|
+
<typo3-backend-icon identifier="actions-close" size="small"></typo3-backend-icon>
|
|
238
|
+
</span>
|
|
239
|
+
</div>
|
|
240
|
+
<div class="alert-content">
|
|
241
|
+
<div class="alert-title">Database update failed</div>
|
|
242
|
+
<div class="alert-message">
|
|
243
|
+
<ul>${groupedErrors}</ul>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>`;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
this.analyze();
|
|
251
|
+
},
|
|
252
|
+
(error: AjaxResponse): void => {
|
|
253
|
+
Router.handleAjaxError(error, modalContent);
|
|
254
|
+
}
|
|
255
|
+
).finally((): void => {
|
|
256
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.analyzeTrigger), true);
|
|
257
|
+
this.setModalButtonState(this.getModalFooter().querySelector<HTMLButtonElement>(Identifiers.executeTrigger), false);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private clearNotifications() {
|
|
262
|
+
this.currentModal.querySelector(Identifiers.notificationContainer).replaceChildren('');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export default new DatabaseAnalyzer();
|