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,25 @@
|
|
|
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 DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import Router from './router';
|
|
16
|
+
|
|
17
|
+
class Install {
|
|
18
|
+
constructor() {
|
|
19
|
+
DocumentService.ready().then((): void => {
|
|
20
|
+
Router.initialize();
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default new Install();
|
|
@@ -0,0 +1,458 @@
|
|
|
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 DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
17
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
18
|
+
import PasswordStrength from './module/password-strength';
|
|
19
|
+
import { InfoBox } from './renderable/info-box';
|
|
20
|
+
import '@typo3/backend/element/icon-element';
|
|
21
|
+
import type MessageInterface from '@typo3/install/message-interface';
|
|
22
|
+
import { selector } from '@typo3/core/literals';
|
|
23
|
+
import '@typo3/backend/element/progress-bar-element';
|
|
24
|
+
import type { ProgressBarElement } from '@typo3/backend/element/progress-bar-element';
|
|
25
|
+
|
|
26
|
+
enum Identifiers {
|
|
27
|
+
body = '.t3js-body',
|
|
28
|
+
moduleContent = '.t3js-module-content',
|
|
29
|
+
mainContent = '.t3js-installer-content',
|
|
30
|
+
progressBar = '.t3js-installer-progress',
|
|
31
|
+
databaseConnectOutput = '.t3js-installer-databaseConnect-output',
|
|
32
|
+
databaseSelectOutput = '.t3js-installer-databaseSelect-output',
|
|
33
|
+
databaseDataOutput = '.t3js-installer-databaseData-output'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Walk through the installation process of TYPO3
|
|
38
|
+
*/
|
|
39
|
+
class Installer {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.initializeEvents();
|
|
42
|
+
DocumentService.ready().then((): void => {
|
|
43
|
+
this.initialize();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private initializeEvents(): void {
|
|
48
|
+
new RegularEvent('click', (e: Event): void => {
|
|
49
|
+
e.preventDefault();
|
|
50
|
+
this.showEnvironmentAndFolders();
|
|
51
|
+
}).delegateTo(document, '.t3js-installer-environmentFolders-retry');
|
|
52
|
+
new RegularEvent('click', (e: Event): void => {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
this.executeEnvironmentAndFolders();
|
|
55
|
+
}).delegateTo(document, '.t3js-installer-environmentFolders-execute');
|
|
56
|
+
new RegularEvent('click', (e: Event): void => {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
this.executeDatabaseConnect();
|
|
59
|
+
}).delegateTo(document, '.t3js-installer-databaseConnect-execute');
|
|
60
|
+
new RegularEvent('click', (e: Event): void => {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
this.executeDatabaseSelect();
|
|
63
|
+
}).delegateTo(document, '.t3js-installer-databaseSelect-execute');
|
|
64
|
+
new RegularEvent('click', (e: Event): void => {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
this.executeDatabaseData();
|
|
67
|
+
}).delegateTo(document, '.t3js-installer-databaseData-execute');
|
|
68
|
+
new RegularEvent('click', (e: Event): void => {
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
this.executeDefaultConfiguration();
|
|
71
|
+
}).delegateTo(document, '.t3js-installer-defaultConfiguration-execute');
|
|
72
|
+
new RegularEvent('click', (evt: Event, element: HTMLElement): void => {
|
|
73
|
+
evt.preventDefault();
|
|
74
|
+
const toggleTarget = document.querySelector(element.dataset.toggleTarget);
|
|
75
|
+
if (element.dataset.toggleState === 'invisible') {
|
|
76
|
+
element.dataset.toggleState = 'visible';
|
|
77
|
+
toggleTarget.setAttribute('type', 'text');
|
|
78
|
+
} else {
|
|
79
|
+
element.dataset.toggleState = 'invisible';
|
|
80
|
+
toggleTarget.setAttribute('type', 'password');
|
|
81
|
+
}
|
|
82
|
+
}).delegateTo(document, '.t3-install-form-password-toggle');
|
|
83
|
+
|
|
84
|
+
// Database connect db driver selection
|
|
85
|
+
new RegularEvent('change', (e: Event, target: HTMLSelectElement): void => {
|
|
86
|
+
const driver: string = target.value;
|
|
87
|
+
document.querySelectorAll('.t3-install-driver-data').forEach(el => el.setAttribute('hidden', ''));
|
|
88
|
+
document.querySelectorAll('.t3-install-driver-data input').forEach(el => el.setAttribute('disabled', 'disabled'));
|
|
89
|
+
document.querySelectorAll(selector`#${driver} input`).forEach(el => el.removeAttribute('disabled'));
|
|
90
|
+
document.querySelector('#' + driver)?.removeAttribute('hidden');
|
|
91
|
+
}).delegateTo(document, '#t3js-connect-database-driver');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private initialize(): void {
|
|
95
|
+
this.setProgress(0);
|
|
96
|
+
this.getMainLayout();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private getUrl(action?: string): string {
|
|
100
|
+
let url: string = location.href;
|
|
101
|
+
url = url.replace(location.search, '');
|
|
102
|
+
if (action !== undefined) {
|
|
103
|
+
url = url + '?install[action]=' + action;
|
|
104
|
+
}
|
|
105
|
+
return url;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private setProgress(done: number): void {
|
|
109
|
+
const progressBar = document.querySelector(Identifiers.progressBar) as ProgressBarElement;
|
|
110
|
+
if (progressBar === null) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (done !== 0) {
|
|
114
|
+
progressBar.value = done;
|
|
115
|
+
progressBar.label = `Step ${done} of 5 completed`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private getMainLayout(): void {
|
|
120
|
+
(new AjaxRequest(this.getUrl('mainLayout')))
|
|
121
|
+
.get({ cache: 'no-cache' })
|
|
122
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
123
|
+
const data = await response.resolve();
|
|
124
|
+
document.querySelector(Identifiers.body).innerHTML = data.html;
|
|
125
|
+
this.checkInstallerAvailable();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private checkInstallerAvailable(): void {
|
|
130
|
+
(new AjaxRequest(this.getUrl('checkInstallerAvailable')))
|
|
131
|
+
.get({ cache: 'no-cache' })
|
|
132
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
133
|
+
const data = await response.resolve();
|
|
134
|
+
if (data.success) {
|
|
135
|
+
this.checkEnvironmentAndFolders();
|
|
136
|
+
} else {
|
|
137
|
+
this.showInstallerNotAvailable();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private showInstallerNotAvailable(): void {
|
|
143
|
+
const outputContainer = document.querySelector(Identifiers.mainContent);
|
|
144
|
+
(new AjaxRequest(this.getUrl('showInstallerNotAvailable')))
|
|
145
|
+
.get({ cache: 'no-cache' })
|
|
146
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
147
|
+
const data = await response.resolve();
|
|
148
|
+
if (data.success === true) {
|
|
149
|
+
outputContainer.innerHTML = data.html;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private checkEnvironmentAndFolders(): void {
|
|
155
|
+
this.setProgress(1);
|
|
156
|
+
(new AjaxRequest(this.getUrl('checkEnvironmentAndFolders')))
|
|
157
|
+
.get({ cache: 'no-cache' })
|
|
158
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
159
|
+
const data = await response.resolve();
|
|
160
|
+
if (data.success === true) {
|
|
161
|
+
this.checkTrustedHostsPattern();
|
|
162
|
+
} else {
|
|
163
|
+
this.showEnvironmentAndFolders();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
private showEnvironmentAndFolders(): void {
|
|
169
|
+
const outputContainer = document.querySelector(Identifiers.mainContent);
|
|
170
|
+
(new AjaxRequest(this.getUrl('showEnvironmentAndFolders')))
|
|
171
|
+
.get({ cache: 'no-cache' })
|
|
172
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
173
|
+
const data = await response.resolve();
|
|
174
|
+
if (data.success === true) {
|
|
175
|
+
outputContainer.innerHTML = data.html;
|
|
176
|
+
const detailContainer = document.querySelector('.t3js-installer-environment-details');
|
|
177
|
+
let hasMessage: boolean = false;
|
|
178
|
+
if (Array.isArray(data.environmentStatusErrors)) {
|
|
179
|
+
data.environmentStatusErrors.forEach((element: any): void => {
|
|
180
|
+
hasMessage = true;
|
|
181
|
+
detailContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
if (Array.isArray(data.environmentStatusWarnings)) {
|
|
185
|
+
data.environmentStatusWarnings.forEach((element: any): void => {
|
|
186
|
+
hasMessage = true;
|
|
187
|
+
detailContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (Array.isArray(data.structureErrors)) {
|
|
191
|
+
data.structureErrors.forEach((element: any): void => {
|
|
192
|
+
hasMessage = true;
|
|
193
|
+
detailContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
if (hasMessage) {
|
|
197
|
+
detailContainer.removeAttribute('hidden');
|
|
198
|
+
document.querySelectorAll('.t3js-installer-environmentFolders-bad')
|
|
199
|
+
.forEach(el => el.removeAttribute('hidden'));
|
|
200
|
+
} else {
|
|
201
|
+
document.querySelectorAll('.t3js-installer-environmentFolders-good')
|
|
202
|
+
.forEach(el => el.removeAttribute('hidden'));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private executeEnvironmentAndFolders(): void {
|
|
209
|
+
(new AjaxRequest(this.getUrl('executeEnvironmentAndFolders')))
|
|
210
|
+
.get({ cache: 'no-cache' })
|
|
211
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
212
|
+
const data = await response.resolve();
|
|
213
|
+
if (data.success === true) {
|
|
214
|
+
this.checkTrustedHostsPattern();
|
|
215
|
+
} else {
|
|
216
|
+
// @todo message output handling
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private checkTrustedHostsPattern(): void {
|
|
222
|
+
(new AjaxRequest(this.getUrl('checkTrustedHostsPattern')))
|
|
223
|
+
.get({ cache: 'no-cache' })
|
|
224
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
225
|
+
const data = await response.resolve();
|
|
226
|
+
if (data.success === true) {
|
|
227
|
+
this.checkDatabaseConnect();
|
|
228
|
+
} else {
|
|
229
|
+
this.executeAdjustTrustedHostsPattern();
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
private executeAdjustTrustedHostsPattern(): void {
|
|
235
|
+
(new AjaxRequest(this.getUrl('executeAdjustTrustedHostsPattern')))
|
|
236
|
+
.get({ cache: 'no-cache' })
|
|
237
|
+
.then((): void => {
|
|
238
|
+
this.checkDatabaseConnect();
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private checkDatabaseConnect(): void {
|
|
243
|
+
this.setProgress(2);
|
|
244
|
+
(new AjaxRequest(this.getUrl('checkDatabaseConnect')))
|
|
245
|
+
.get({ cache: 'no-cache' })
|
|
246
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
247
|
+
const data = await response.resolve();
|
|
248
|
+
if (data.success === true) {
|
|
249
|
+
this.checkDatabaseSelect();
|
|
250
|
+
} else {
|
|
251
|
+
this.showDatabaseConnect();
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
private showDatabaseConnect(): void {
|
|
257
|
+
const outputContainer = document.querySelector(Identifiers.mainContent);
|
|
258
|
+
(new AjaxRequest(this.getUrl('showDatabaseConnect')))
|
|
259
|
+
.get({ cache: 'no-cache' })
|
|
260
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
261
|
+
const data = await response.resolve();
|
|
262
|
+
if (data.success === true) {
|
|
263
|
+
outputContainer.innerHTML = data.html;
|
|
264
|
+
document.querySelector('#t3js-connect-database-driver').dispatchEvent(new Event('change', { bubbles: true }));
|
|
265
|
+
PasswordStrength.initialize(document.querySelector('.t3-install-form-password-strength'));
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private executeDatabaseConnect(): void {
|
|
271
|
+
const outputContainer = document.querySelector(Identifiers.databaseConnectOutput);
|
|
272
|
+
const postData: Record<string, string> = {
|
|
273
|
+
'install[action]': 'executeDatabaseConnect',
|
|
274
|
+
'install[token]': (document.querySelector(Identifiers.moduleContent) as HTMLElement).dataset.installerDatabaseConnectExecuteToken,
|
|
275
|
+
};
|
|
276
|
+
for (const [name, value] of new FormData(document.querySelector(Identifiers.body + ' form'))) {
|
|
277
|
+
postData[name] = value.toString();
|
|
278
|
+
}
|
|
279
|
+
(new AjaxRequest(this.getUrl()))
|
|
280
|
+
.post(postData)
|
|
281
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
282
|
+
const data = await response.resolve();
|
|
283
|
+
if (data.success === true) {
|
|
284
|
+
this.checkDatabaseSelect();
|
|
285
|
+
} else {
|
|
286
|
+
if (Array.isArray(data.status)) {
|
|
287
|
+
outputContainer.replaceChildren();
|
|
288
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
289
|
+
outputContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
private checkDatabaseSelect(): void {
|
|
297
|
+
this.setProgress(3);
|
|
298
|
+
(new AjaxRequest(this.getUrl('checkDatabaseSelect')))
|
|
299
|
+
.get({ cache: 'no-cache' })
|
|
300
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
301
|
+
const data = await response.resolve();
|
|
302
|
+
if (data.success === true) {
|
|
303
|
+
this.checkDatabaseData();
|
|
304
|
+
} else {
|
|
305
|
+
this.showDatabaseSelect();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
private showDatabaseSelect(): void {
|
|
311
|
+
const outputContainer = document.querySelector(Identifiers.mainContent);
|
|
312
|
+
(new AjaxRequest(this.getUrl('showDatabaseSelect')))
|
|
313
|
+
.get({ cache: 'no-cache' })
|
|
314
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
315
|
+
const data = await response.resolve();
|
|
316
|
+
if (data.success === true) {
|
|
317
|
+
outputContainer.innerHTML = data.html;
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
private executeDatabaseSelect(): void {
|
|
323
|
+
const outputContainer = document.querySelector(Identifiers.databaseSelectOutput);
|
|
324
|
+
const postData: { [id: string]: string } = {
|
|
325
|
+
'install[action]': 'executeDatabaseSelect',
|
|
326
|
+
'install[token]': (document.querySelector(Identifiers.moduleContent) as HTMLElement).dataset.installerDatabaseSelectExecuteToken,
|
|
327
|
+
};
|
|
328
|
+
for (const [name, value] of new FormData(document.querySelector(Identifiers.body + ' form'))) {
|
|
329
|
+
postData[name] = value.toString();
|
|
330
|
+
}
|
|
331
|
+
(new AjaxRequest(this.getUrl()))
|
|
332
|
+
.post(postData)
|
|
333
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
334
|
+
const data = await response.resolve();
|
|
335
|
+
if (data.success === true) {
|
|
336
|
+
this.checkDatabaseRequirements();
|
|
337
|
+
} else {
|
|
338
|
+
if (Array.isArray(data.status)) {
|
|
339
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
340
|
+
outputContainer.replaceChildren(InfoBox.create(element.severity, element.title, element.message));
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
private checkDatabaseRequirements(): void {
|
|
348
|
+
const outputContainer = document.querySelector(Identifiers.databaseSelectOutput);
|
|
349
|
+
const postData: Record<string, string> = {
|
|
350
|
+
'install[action]': 'checkDatabaseRequirements',
|
|
351
|
+
'install[token]': (document.querySelector(Identifiers.moduleContent) as HTMLElement).dataset.installerDatabaseCheckRequirementsExecuteToken,
|
|
352
|
+
};
|
|
353
|
+
for (const [name, value] of new FormData(document.querySelector(Identifiers.body + ' form'))) {
|
|
354
|
+
postData[name] = value.toString();
|
|
355
|
+
}
|
|
356
|
+
(new AjaxRequest(this.getUrl()))
|
|
357
|
+
.post(postData)
|
|
358
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
359
|
+
const data = await response.resolve();
|
|
360
|
+
if (data.success === true) {
|
|
361
|
+
this.checkDatabaseData();
|
|
362
|
+
} else {
|
|
363
|
+
if (Array.isArray(data.status)) {
|
|
364
|
+
outputContainer.replaceChildren();
|
|
365
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
366
|
+
outputContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private checkDatabaseData(): void {
|
|
374
|
+
this.setProgress(4);
|
|
375
|
+
(new AjaxRequest(this.getUrl('checkDatabaseData')))
|
|
376
|
+
.get({ cache: 'no-cache' })
|
|
377
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
378
|
+
const data = await response.resolve();
|
|
379
|
+
if (data.success === true) {
|
|
380
|
+
this.showDefaultConfiguration();
|
|
381
|
+
} else {
|
|
382
|
+
this.showDatabaseData();
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
private showDatabaseData(): void {
|
|
388
|
+
const outputContainer = document.querySelector(Identifiers.mainContent);
|
|
389
|
+
(new AjaxRequest(this.getUrl('showDatabaseData')))
|
|
390
|
+
.get({ cache: 'no-cache' })
|
|
391
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
392
|
+
const data = await response.resolve();
|
|
393
|
+
if (data.success === true) {
|
|
394
|
+
outputContainer.innerHTML = data.html;
|
|
395
|
+
PasswordStrength.initialize(document.querySelector('.t3-install-form-password-strength'));
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
private executeDatabaseData(): void {
|
|
401
|
+
const outputContainer = document.querySelector(Identifiers.databaseDataOutput);
|
|
402
|
+
const postData: Record<string, string> = {
|
|
403
|
+
'install[action]': 'executeDatabaseData',
|
|
404
|
+
'install[token]': (document.querySelector(Identifiers.moduleContent) as HTMLElement).dataset.installerDatabaseDataExecuteToken,
|
|
405
|
+
};
|
|
406
|
+
for (const [name, value] of new FormData(document.querySelector(Identifiers.body + ' form'))) {
|
|
407
|
+
postData[name] = value.toString();
|
|
408
|
+
}
|
|
409
|
+
const progressBar = document.createElement('typo3-backend-progress-bar');
|
|
410
|
+
outputContainer.replaceChildren(progressBar);
|
|
411
|
+
(new AjaxRequest(this.getUrl()))
|
|
412
|
+
.post(postData)
|
|
413
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
414
|
+
const data = await response.resolve();
|
|
415
|
+
if (data.success === true) {
|
|
416
|
+
this.showDefaultConfiguration();
|
|
417
|
+
} else {
|
|
418
|
+
if (Array.isArray(data.status)) {
|
|
419
|
+
outputContainer.replaceChildren();
|
|
420
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
421
|
+
outputContainer.append(InfoBox.create(element.severity, element.title, element.message));
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
private showDefaultConfiguration(): void {
|
|
429
|
+
const outputContainer = document.querySelector(Identifiers.mainContent);
|
|
430
|
+
this.setProgress(5);
|
|
431
|
+
(new AjaxRequest(this.getUrl('showDefaultConfiguration')))
|
|
432
|
+
.get({ cache: 'no-cache' })
|
|
433
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
434
|
+
const data = await response.resolve();
|
|
435
|
+
if (data.success === true) {
|
|
436
|
+
outputContainer.innerHTML = data.html;
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
private executeDefaultConfiguration(): void {
|
|
442
|
+
const postData: Record<string, string> = {
|
|
443
|
+
'install[action]': 'executeDefaultConfiguration',
|
|
444
|
+
'install[token]': (document.querySelector(Identifiers.moduleContent) as HTMLElement).dataset.installerDefaultConfigurationExecuteToken,
|
|
445
|
+
};
|
|
446
|
+
for (const [name, value] of new FormData(document.querySelector(Identifiers.body + ' form'))) {
|
|
447
|
+
postData[name] = value.toString();
|
|
448
|
+
}
|
|
449
|
+
(new AjaxRequest(this.getUrl()))
|
|
450
|
+
.post(postData)
|
|
451
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
452
|
+
const data = await response.resolve();
|
|
453
|
+
top.location.href = data.redirect;
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
export default new Installer();
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
export default interface MessageInterface {
|
|
15
|
+
title: string;
|
|
16
|
+
message: string;
|
|
17
|
+
severity: number;
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 type MessageInterface from '@typo3/install/message-interface';
|
|
15
|
+
|
|
16
|
+
export type ActionResponse = {
|
|
17
|
+
status: MessageInterface[],
|
|
18
|
+
success: boolean
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export abstract class AbstractInlineModule {
|
|
22
|
+
protected setButtonState(button: HTMLButtonElement, interactable: boolean): void {
|
|
23
|
+
button.disabled = !interactable;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
abstract initialize(trigger: HTMLElement): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
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 { topLevelModuleImport } from '@typo3/backend/utility/top-level-module-import';
|
|
15
|
+
import type { ModalElement } from '@typo3/backend/modal';
|
|
16
|
+
import type { WritablePart } from '@typo3/core/utility/types';
|
|
17
|
+
import type { ProgressBarElement } from '@typo3/backend/element/progress-bar-element';
|
|
18
|
+
|
|
19
|
+
enum Identifiers {
|
|
20
|
+
modalBody = '.t3js-modal-body',
|
|
21
|
+
modalContent = '.t3js-module-content',
|
|
22
|
+
modalFooter = '.t3js-modal-footer'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type ModuleLoadedResponse = {
|
|
26
|
+
success: boolean,
|
|
27
|
+
html: string,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type ModuleLoadedResponseWithButtons = ModuleLoadedResponse & {
|
|
31
|
+
buttons: { btnClass: string, text: string }[]
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export abstract class AbstractInteractableModule {
|
|
35
|
+
protected currentModal: ModalElement;
|
|
36
|
+
|
|
37
|
+
public initialize(currentModal: ModalElement): void {
|
|
38
|
+
this.currentModal = currentModal;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected getModalBody(): HTMLElement {
|
|
42
|
+
return this.findInModal(Identifiers.modalBody);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected getModuleContent(): HTMLElement {
|
|
46
|
+
return this.findInModal(Identifiers.modalContent);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
protected getModalFooter(): HTMLElement {
|
|
50
|
+
return this.findInModal(Identifiers.modalFooter);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected findInModal<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K] | null;
|
|
54
|
+
protected findInModal<K extends keyof SVGElementTagNameMap>(selector: K): SVGElementTagNameMap[K] | null;
|
|
55
|
+
protected findInModal(selector: string): HTMLElement | null;
|
|
56
|
+
|
|
57
|
+
protected findInModal(selector: string): HTMLElement | null {
|
|
58
|
+
return this.currentModal.querySelector<HTMLElement>(selector);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected setModalButtonsState(interactable: boolean): void {
|
|
62
|
+
this.getModalFooter()?.querySelectorAll('button').forEach((elem: HTMLButtonElement): void => {
|
|
63
|
+
this.setModalButtonState(elem, interactable);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
protected setModalButtonState(button: HTMLButtonElement, interactable: boolean): void {
|
|
68
|
+
button.classList.toggle('disabled', !interactable);
|
|
69
|
+
button.disabled = !interactable;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected async loadModuleFrameAgnostic(module: string): Promise<any> {
|
|
73
|
+
const isInIframe = window.location !== window.parent.location;
|
|
74
|
+
if (isInIframe) {
|
|
75
|
+
await topLevelModuleImport(module);
|
|
76
|
+
} else {
|
|
77
|
+
await import(module);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
protected renderProgressBar(
|
|
82
|
+
target?: HTMLElement,
|
|
83
|
+
properties?: Partial<WritablePart<ProgressBarElement>>,
|
|
84
|
+
mode?: 'replace' | 'prepend' | 'append'
|
|
85
|
+
): ProgressBarElement {
|
|
86
|
+
this.loadModuleFrameAgnostic('@typo3/backend/element/progress-bar-element.js');
|
|
87
|
+
|
|
88
|
+
target = target || this.currentModal;
|
|
89
|
+
|
|
90
|
+
const progressBar = target.ownerDocument.createElement('typo3-backend-progress-bar');
|
|
91
|
+
if (typeof properties === 'object') {
|
|
92
|
+
Object.keys(properties).forEach((key: keyof WritablePart<ProgressBarElement>) => {
|
|
93
|
+
(progressBar[key] as unknown) = properties[key];
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (mode === 'append') {
|
|
98
|
+
target.append(progressBar);
|
|
99
|
+
} else if (mode === 'prepend') {
|
|
100
|
+
target.prepend(progressBar);
|
|
101
|
+
} else {
|
|
102
|
+
target.replaceChildren(progressBar);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return progressBar;
|
|
106
|
+
}
|
|
107
|
+
}
|