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,468 @@
|
|
|
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 { html } from 'lit';
|
|
15
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
16
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
17
|
+
import type { AbstractInteractableModule } from './module/abstract-interactable-module';
|
|
18
|
+
import type { AbstractInlineModule } from './module/abstract-inline-module';
|
|
19
|
+
import { default as Modal, type ModalElement } from '@typo3/backend/modal';
|
|
20
|
+
import { InfoBox } from './renderable/info-box';
|
|
21
|
+
import Severity from './renderable/severity';
|
|
22
|
+
import '@typo3/backend/element/spinner-element';
|
|
23
|
+
import type MessageInterface from '@typo3/install/message-interface';
|
|
24
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
25
|
+
import '@typo3/backend/element/progress-bar-element';
|
|
26
|
+
|
|
27
|
+
class Router {
|
|
28
|
+
private readonly rootSelector: string = '.t3js-body';
|
|
29
|
+
private readonly contentSelector: string = '.t3js-module-body';
|
|
30
|
+
|
|
31
|
+
private readonly scaffoldSelector: string = '.t3js-scaffold';
|
|
32
|
+
private readonly scaffoldContentOverlaySelector: string = '.t3js-scaffold-content-overlay';
|
|
33
|
+
private readonly scaffoldMenuToggleSelector: string = '.t3js-topbar-button-modulemenu';
|
|
34
|
+
|
|
35
|
+
private rootContainer: HTMLElement;
|
|
36
|
+
private controller: string;
|
|
37
|
+
private context: string;
|
|
38
|
+
|
|
39
|
+
public setContent(content: string|Element|DocumentFragment): void {
|
|
40
|
+
const container = this.rootContainer.querySelector(this.contentSelector) as HTMLElement;
|
|
41
|
+
if (typeof content === 'string') {
|
|
42
|
+
content = document.createRange().createContextualFragment(content);
|
|
43
|
+
}
|
|
44
|
+
container.replaceChildren(content);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public initialize(): void {
|
|
48
|
+
this.rootContainer = document.querySelector(this.rootSelector);
|
|
49
|
+
this.context = this.rootContainer.dataset.context ?? '';
|
|
50
|
+
this.controller = this.rootContainer.dataset.controller ?? '';
|
|
51
|
+
|
|
52
|
+
this.registerInstallToolRoutes();
|
|
53
|
+
|
|
54
|
+
new RegularEvent('click', (event: Event): void => {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
this.logout();
|
|
57
|
+
}).delegateTo(document, '.t3js-login-lockInstallTool');
|
|
58
|
+
|
|
59
|
+
new RegularEvent('click', (event: Event): void => {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
this.login();
|
|
62
|
+
}).delegateTo(document, '.t3js-login-login');
|
|
63
|
+
|
|
64
|
+
new RegularEvent('keydown', (event: KeyboardEvent): void => {
|
|
65
|
+
if (event.key === 'Enter') {
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
this.login();
|
|
68
|
+
}
|
|
69
|
+
}).delegateTo(document, '#t3-install-form-password');
|
|
70
|
+
|
|
71
|
+
new RegularEvent('click', (event: Event, target: HTMLElement): void => {
|
|
72
|
+
event.preventDefault();
|
|
73
|
+
|
|
74
|
+
const importModule = target.dataset.import;
|
|
75
|
+
const inlineState = target.dataset.inline;
|
|
76
|
+
const isInline = typeof inlineState !== 'undefined' && parseInt(inlineState, 10) === 1;
|
|
77
|
+
if (isInline) {
|
|
78
|
+
import(importModule).then(({ default: aModule }: {default: AbstractInlineModule}): void => {
|
|
79
|
+
aModule.initialize(target);
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
const modalTitle = target.closest('.card').querySelector('.card-title').innerHTML;
|
|
83
|
+
const modalSize = target.dataset.modalSize as any || Modal.sizes.large;
|
|
84
|
+
Modal.advanced({
|
|
85
|
+
type: Modal.types.default,
|
|
86
|
+
title: modalTitle,
|
|
87
|
+
size: modalSize,
|
|
88
|
+
content: html`<div class="modal-loading"><typo3-backend-spinner size="large"></typo3-backend-spinner></div>`,
|
|
89
|
+
additionalCssClasses: ['install-tool-modal'],
|
|
90
|
+
staticBackdrop: true,
|
|
91
|
+
callback: (currentModal: ModalElement): void => {
|
|
92
|
+
import(importModule).then(({ default: aModule }: {default: AbstractInteractableModule}): void => {
|
|
93
|
+
aModule.initialize(currentModal);
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}).delegateTo(document, '.card .btn');
|
|
99
|
+
|
|
100
|
+
if (this.context === 'backend') {
|
|
101
|
+
this.executeSilentConfigurationUpdate();
|
|
102
|
+
} else {
|
|
103
|
+
this.preAccessCheck();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public registerInstallToolRoutes(): void {
|
|
108
|
+
if (typeof TYPO3.settings === 'undefined') {
|
|
109
|
+
TYPO3.settings = {
|
|
110
|
+
ajaxUrls: {
|
|
111
|
+
icons: window.location.origin + window.location.pathname + '?install[controller]=icon&install[action]=getIcon',
|
|
112
|
+
},
|
|
113
|
+
} as unknown as typeof TYPO3.settings;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public getUrl(action?: string, controller?: string, additionalQueryParams?: Record<string, string>): string {
|
|
118
|
+
const url = new URL(location.href, window.origin);
|
|
119
|
+
url.searchParams.set('install[controller]', controller ?? this.controller);
|
|
120
|
+
url.searchParams.set('install[context]', this.context);
|
|
121
|
+
if (action !== undefined) {
|
|
122
|
+
url.searchParams.set('install[action]', action);
|
|
123
|
+
}
|
|
124
|
+
if (additionalQueryParams !== undefined) {
|
|
125
|
+
for (const [key, value] of Object.entries(additionalQueryParams)) {
|
|
126
|
+
url.searchParams.set(key, value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return url.toString();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public executeSilentConfigurationUpdate(): void {
|
|
133
|
+
this.updateLoadingInfo('Checking session and executing silent configuration update');
|
|
134
|
+
(new AjaxRequest(this.getUrl('executeSilentConfigurationUpdate', 'layout')))
|
|
135
|
+
.get({ cache: 'no-cache' })
|
|
136
|
+
.then(
|
|
137
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
138
|
+
const data = await response.resolve();
|
|
139
|
+
if (data.success === true) {
|
|
140
|
+
this.executeSilentTemplateFileUpdate();
|
|
141
|
+
} else {
|
|
142
|
+
this.executeSilentConfigurationUpdate();
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
(error: AjaxResponse): void => {
|
|
146
|
+
this.handleAjaxError(error);
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public executeSilentTemplateFileUpdate(): void {
|
|
152
|
+
this.updateLoadingInfo('Checking session and executing silent template file update');
|
|
153
|
+
(new AjaxRequest(this.getUrl('executeSilentTemplateFileUpdate', 'layout')))
|
|
154
|
+
.get({ cache: 'no-cache' })
|
|
155
|
+
.then(
|
|
156
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
157
|
+
const data = await response.resolve();
|
|
158
|
+
if (data.success === true) {
|
|
159
|
+
this.executeSilentExtensionConfigurationSynchronization();
|
|
160
|
+
} else {
|
|
161
|
+
this.executeSilentTemplateFileUpdate();
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
(error: AjaxResponse): void => {
|
|
165
|
+
this.handleAjaxError(error);
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Extensions which come with new default settings in ext_conf_template.txt extension
|
|
172
|
+
* configuration files get their new defaults written to system/settings.php
|
|
173
|
+
*/
|
|
174
|
+
public executeSilentExtensionConfigurationSynchronization(): void {
|
|
175
|
+
this.updateLoadingInfo('Executing silent extension configuration synchronization');
|
|
176
|
+
(new AjaxRequest(this.getUrl('executeSilentExtensionConfigurationSynchronization', 'layout')))
|
|
177
|
+
.get({ cache: 'no-cache' })
|
|
178
|
+
.then(
|
|
179
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
180
|
+
const data = await response.resolve();
|
|
181
|
+
if (data.success === true) {
|
|
182
|
+
this.loadMainLayout();
|
|
183
|
+
} else {
|
|
184
|
+
this.setContent(InfoBox.create(Severity.error, 'Something went wrong'));
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
(error: AjaxResponse): void => {
|
|
188
|
+
this.handleAjaxError(error);
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
public loadMainLayout(): void {
|
|
194
|
+
this.updateLoadingInfo('Loading main layout');
|
|
195
|
+
(new AjaxRequest(this.getUrl('mainLayout', 'layout', { 'install[module]': this.controller })))
|
|
196
|
+
.get({ cache: 'no-cache' })
|
|
197
|
+
.then(
|
|
198
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
199
|
+
const data = await response.resolve();
|
|
200
|
+
if (data.success === true && data.html !== 'undefined' && data.html.length > 0) {
|
|
201
|
+
this.rootContainer.innerHTML = data.html;
|
|
202
|
+
// Mark main module as active in standalone
|
|
203
|
+
if (this.context !== 'backend') {
|
|
204
|
+
this.rootContainer.querySelector('[data-installroute-controller="' + this.controller + '"]').classList.add('modulemenu-action-active');
|
|
205
|
+
this.registerScaffoldEvents();
|
|
206
|
+
}
|
|
207
|
+
this.loadCards();
|
|
208
|
+
} else {
|
|
209
|
+
this.rootContainer.replaceChildren(InfoBox.create(Severity.error, 'Something went wrong'));
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
(error: AjaxResponse): void => {
|
|
213
|
+
this.handleAjaxError(error);
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
public async handleAjaxError(error: AjaxResponse, outputContainer?: HTMLElement): Promise<void> {
|
|
219
|
+
if (error.response?.status === 403) {
|
|
220
|
+
// Install Tool session expired - depending on context render error message or login
|
|
221
|
+
if (this.context === 'backend') {
|
|
222
|
+
this.rootContainer.replaceChildren(
|
|
223
|
+
InfoBox.create(Severity.error, 'The Install Tool session expired. Please reload the backend and try again.')
|
|
224
|
+
);
|
|
225
|
+
} else {
|
|
226
|
+
this.checkEnableInstallToolFile();
|
|
227
|
+
}
|
|
228
|
+
} else {
|
|
229
|
+
// @todo Recovery tests should be started here
|
|
230
|
+
const url = this.getUrl(undefined, 'upgrade');
|
|
231
|
+
const message =
|
|
232
|
+
'<div class="t3js-infobox callout callout-sm callout-danger">'
|
|
233
|
+
+ '<div class="callout-content">'
|
|
234
|
+
+ '<div class="callout-title">Something went wrong</div>'
|
|
235
|
+
+ '<div class="callout-body">'
|
|
236
|
+
+ '<p>Please use <b><a href="' + url + '">Check for broken'
|
|
237
|
+
+ ' extensions</a></b> to see if a loaded extension breaks this part of the Install Tool'
|
|
238
|
+
+ ' and unload it.</p>'
|
|
239
|
+
+ '<p>The box below may additionally reveal further details on what went wrong depending on your debug settings.'
|
|
240
|
+
+ ' It may help to temporarily switch to debug mode using <b>Settings > Configuration Presets > Debug settings.</b></p>'
|
|
241
|
+
+ '<p>If this error happens at an early state and no full exception back trace is shown, it may also help'
|
|
242
|
+
+ ' to manually increase debugging output in <strong>%config-dir%/system/settings.php</strong>:'
|
|
243
|
+
+ '<code>[\'BE\'][\'debug\'] => true</code>, <code>[\'SYS\'][\'devIPmask\'] => \'*\'</code>, '
|
|
244
|
+
+ '<code>[\'SYS\'][\'displayErrors\'] => 1</code>,'
|
|
245
|
+
+ '<code>[\'SYS\'][\'exceptionalErrors\'] => 12290</code></p>'
|
|
246
|
+
+ '</div>'
|
|
247
|
+
+ '</div>'
|
|
248
|
+
+ '</div>'
|
|
249
|
+
+ '<div class="panel-group" role="tablist" aria-multiselectable="true">'
|
|
250
|
+
+ '<div class="panel panel-default">'
|
|
251
|
+
+ '<h3 class="panel-heading" role="tab" id="heading-error">'
|
|
252
|
+
+ '<div class="panel-heading-row">'
|
|
253
|
+
+ '<button type="button" data-bs-toggle="collapse" data-bs-parent="#accordion" data-bs-target="#collapse-error" aria-expanded="true" aria-controls="collapse-error" class="panel-button collapsed">'
|
|
254
|
+
+ '<div class="panel-title"><strong>Ajax error</strong></div>'
|
|
255
|
+
+ '<span class="caret"></span>'
|
|
256
|
+
+ '</button>'
|
|
257
|
+
+ '</div>'
|
|
258
|
+
+ '</h3>'
|
|
259
|
+
+ '<div id="collapse-error" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-error">'
|
|
260
|
+
+ '<div class="panel-body">'
|
|
261
|
+
+ (error.response ? await error.response.text() : (error as unknown as Error).message)
|
|
262
|
+
+ '</div>'
|
|
263
|
+
+ '</div>'
|
|
264
|
+
+ '</div>'
|
|
265
|
+
+ '</div>'
|
|
266
|
+
;
|
|
267
|
+
|
|
268
|
+
if (typeof outputContainer !== 'undefined') {
|
|
269
|
+
outputContainer.innerHTML = message;
|
|
270
|
+
} else {
|
|
271
|
+
// Else write to main frame
|
|
272
|
+
this.rootContainer.innerHTML = message;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
public checkEnableInstallToolFile(): void {
|
|
278
|
+
(new AjaxRequest(this.getUrl('checkEnableInstallToolFile')))
|
|
279
|
+
.get({ cache: 'no-cache' })
|
|
280
|
+
.then(
|
|
281
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
282
|
+
const data = await response.resolve();
|
|
283
|
+
if (data.success === true) {
|
|
284
|
+
this.checkLogin();
|
|
285
|
+
} else {
|
|
286
|
+
this.showEnableInstallTool();
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
(error: AjaxResponse): void => {
|
|
290
|
+
this.handleAjaxError(error);
|
|
291
|
+
}
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
public showEnableInstallTool(): void {
|
|
296
|
+
(new AjaxRequest(this.getUrl('showEnableInstallToolFile')))
|
|
297
|
+
.get({ cache: 'no-cache' })
|
|
298
|
+
.then(
|
|
299
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
300
|
+
const data = await response.resolve();
|
|
301
|
+
if (data.success === true) {
|
|
302
|
+
this.rootContainer.innerHTML = data.html;
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
(error: AjaxResponse): void => {
|
|
306
|
+
this.handleAjaxError(error);
|
|
307
|
+
}
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
public checkLogin(): void {
|
|
312
|
+
(new AjaxRequest(this.getUrl('checkLogin')))
|
|
313
|
+
.get({ cache: 'no-cache' })
|
|
314
|
+
.then(
|
|
315
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
316
|
+
const data = await response.resolve();
|
|
317
|
+
if (data.success === true) {
|
|
318
|
+
this.loadMainLayout();
|
|
319
|
+
} else {
|
|
320
|
+
this.showLogin();
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
(error: AjaxResponse): void => {
|
|
324
|
+
this.handleAjaxError(error);
|
|
325
|
+
}
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
public showLogin(): void {
|
|
330
|
+
(new AjaxRequest(this.getUrl('showLogin')))
|
|
331
|
+
.get({ cache: 'no-cache' })
|
|
332
|
+
.then(
|
|
333
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
334
|
+
const data = await response.resolve();
|
|
335
|
+
if (data.success === true) {
|
|
336
|
+
this.rootContainer.innerHTML = data.html;
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
(error: AjaxResponse): void => {
|
|
340
|
+
this.handleAjaxError(error);
|
|
341
|
+
}
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
public login(): void {
|
|
346
|
+
const outputContainer: HTMLElement = document.querySelector('.t3js-login-output');
|
|
347
|
+
outputContainer.innerHTML = '';
|
|
348
|
+
(new AjaxRequest(this.getUrl()))
|
|
349
|
+
.post({
|
|
350
|
+
install: {
|
|
351
|
+
action: 'login',
|
|
352
|
+
token: (document.querySelector('[data-login-token]') as HTMLFormElement).dataset.loginToken,
|
|
353
|
+
password: (document.querySelector('.t3-install-form-input-text') as HTMLInputElement).value,
|
|
354
|
+
},
|
|
355
|
+
})
|
|
356
|
+
.then(
|
|
357
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
358
|
+
const data = await response.resolve();
|
|
359
|
+
if (data.success === true) {
|
|
360
|
+
this.executeSilentConfigurationUpdate();
|
|
361
|
+
} else {
|
|
362
|
+
data.status.forEach((element: MessageInterface): void => {
|
|
363
|
+
outputContainer.replaceChildren(InfoBox.create(element.severity, element.title, element.message));
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
(error: AjaxResponse): void => {
|
|
368
|
+
this.handleAjaxError(error);
|
|
369
|
+
}
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
public logout(): void {
|
|
374
|
+
(new AjaxRequest(this.getUrl('logout')))
|
|
375
|
+
.get({ cache: 'no-cache' })
|
|
376
|
+
.then(
|
|
377
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
378
|
+
const data = await response.resolve();
|
|
379
|
+
if (data.success === true) {
|
|
380
|
+
this.showEnableInstallTool();
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
(error: AjaxResponse): void => {
|
|
384
|
+
this.handleAjaxError(error);
|
|
385
|
+
}
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
public loadCards(): void {
|
|
390
|
+
(new AjaxRequest(this.getUrl('cards')))
|
|
391
|
+
.get({ cache: 'no-cache' })
|
|
392
|
+
.then(
|
|
393
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
394
|
+
const data = await response.resolve();
|
|
395
|
+
if (data.success === true && data.html !== 'undefined' && data.html.length > 0) {
|
|
396
|
+
this.setContent(data.html);
|
|
397
|
+
} else {
|
|
398
|
+
this.setContent(InfoBox.create(Severity.error, 'Something went wrong'));
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
(error: AjaxResponse): void => {
|
|
402
|
+
this.handleAjaxError(error);
|
|
403
|
+
}
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
public registerScaffoldEvents(): void {
|
|
408
|
+
if(!localStorage.getItem('typo3-install-modulesCollapsed')) {
|
|
409
|
+
localStorage.setItem('typo3-install-modulesCollapsed', 'false');
|
|
410
|
+
}
|
|
411
|
+
this.toggleMenu(localStorage.getItem('typo3-install-modulesCollapsed') === 'true');
|
|
412
|
+
document.querySelector(this.scaffoldMenuToggleSelector).addEventListener('click', (event: MouseEvent) => {
|
|
413
|
+
event.preventDefault();
|
|
414
|
+
this.toggleMenu();
|
|
415
|
+
});
|
|
416
|
+
document.querySelector(this.scaffoldContentOverlaySelector).addEventListener('click', (event: MouseEvent) => {
|
|
417
|
+
event.preventDefault();
|
|
418
|
+
this.toggleMenu(true);
|
|
419
|
+
});
|
|
420
|
+
document.querySelectorAll('[data-installroute-controller]').forEach((element: Element) => {
|
|
421
|
+
element.addEventListener('click', (): void => {
|
|
422
|
+
if (window.innerWidth < 768) {
|
|
423
|
+
localStorage.setItem('typo3-install-modulesCollapsed', 'true');
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
public toggleMenu(collapse?: boolean): void {
|
|
430
|
+
const scaffold = document.querySelector(this.scaffoldSelector);
|
|
431
|
+
const expandedClass = 'scaffold-modulemenu-expanded';
|
|
432
|
+
if (typeof collapse === 'undefined') {
|
|
433
|
+
collapse = scaffold.classList.contains(expandedClass);
|
|
434
|
+
}
|
|
435
|
+
scaffold.classList.toggle(expandedClass, !collapse);
|
|
436
|
+
localStorage.setItem('typo3-install-modulesCollapsed', collapse ? 'true' : 'false');
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
public updateLoadingInfo(info: string): void {
|
|
440
|
+
const infoElement = this.rootContainer.querySelector('#t3js-ui-block-detail');
|
|
441
|
+
if (infoElement !== undefined && infoElement instanceof HTMLElement) {
|
|
442
|
+
infoElement.innerText = info;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
private preAccessCheck(): void {
|
|
447
|
+
this.updateLoadingInfo('Execute pre access check');
|
|
448
|
+
(new AjaxRequest(this.getUrl('preAccessCheck', 'layout')))
|
|
449
|
+
.get({ cache: 'no-cache' })
|
|
450
|
+
.then(
|
|
451
|
+
async (response: AjaxResponse): Promise<void> => {
|
|
452
|
+
const data = await response.resolve();
|
|
453
|
+
if (data.installToolLocked) {
|
|
454
|
+
this.checkEnableInstallToolFile();
|
|
455
|
+
} else if (!data.isAuthorized) {
|
|
456
|
+
this.showLogin();
|
|
457
|
+
} else {
|
|
458
|
+
this.executeSilentConfigurationUpdate();
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
(error: AjaxResponse): void => {
|
|
462
|
+
this.handleAjaxError(error);
|
|
463
|
+
}
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export default new Router();
|
|
@@ -0,0 +1,45 @@
|
|
|
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 { default as Modal } from '@typo3/backend/modal';
|
|
15
|
+
import { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
16
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
17
|
+
|
|
18
|
+
class LinkvalidatorModal {
|
|
19
|
+
|
|
20
|
+
private readonly selector: string = '.t3js-linkvalidator-modal';
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
this.initialize();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public initialize(): void {
|
|
27
|
+
new RegularEvent('click', function (this: HTMLElement, e: Event): void {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
|
|
30
|
+
const modalContent = new DocumentFragment();
|
|
31
|
+
modalContent.append((document.getElementById(`linkvalidatorModal-${this.dataset.modalIdentifier}`) as HTMLTemplateElement).content.cloneNode(true));
|
|
32
|
+
|
|
33
|
+
const configuration = {
|
|
34
|
+
type: Modal.types.default,
|
|
35
|
+
title: this.dataset.modalTitle,
|
|
36
|
+
size: Modal.sizes.large,
|
|
37
|
+
severity: SeverityEnum.notice,
|
|
38
|
+
content: modalContent,
|
|
39
|
+
};
|
|
40
|
+
Modal.advanced(configuration);
|
|
41
|
+
}).delegateTo(document, this.selector);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default new LinkvalidatorModal();
|
|
@@ -0,0 +1,101 @@
|
|
|
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 Notification from '@typo3/backend/notification';
|
|
16
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
17
|
+
import SortableTable from '@typo3/backend/sortable-table';
|
|
18
|
+
|
|
19
|
+
enum Selectors {
|
|
20
|
+
// Check
|
|
21
|
+
linktypesSelectorCheck = '.t3js-linkvalidator-settings input[type="checkbox"].options-by-type-check',
|
|
22
|
+
actionButtonSelectorCheck = '.t3js-linkvalidator-action-button-check',
|
|
23
|
+
|
|
24
|
+
// Report
|
|
25
|
+
toggleAllLinktypesSelectorReport = '.t3js-linkvalidator-settings input[type="checkbox"].options-by-type-toggle-all-report',
|
|
26
|
+
linktypesSelectorReport = '.t3js-linkvalidator-settings input[type="checkbox"].options-by-type-report',
|
|
27
|
+
actionButtonSelectorReport = '.t3js-linkvalidator-action-button-report'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
enum Identifier {
|
|
31
|
+
toggleAllLinktypesIdReport = 'options-by-type-toggle-all-report',
|
|
32
|
+
brokenLinksTableIdReport = 'typo3-broken-links-table'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Module: @typo3/linkvalidator/linkvalidator
|
|
37
|
+
*/
|
|
38
|
+
class Linkvalidator {
|
|
39
|
+
constructor() {
|
|
40
|
+
DocumentService.ready().then((): void => {
|
|
41
|
+
const linkList = document.getElementById(Identifier.brokenLinksTableIdReport);
|
|
42
|
+
if (linkList !== null) {
|
|
43
|
+
if (linkList instanceof HTMLTableElement) {
|
|
44
|
+
new SortableTable(linkList);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
this.initializeEvents();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private static allCheckBoxesAreChecked(checkBoxes: NodeListOf<HTMLInputElement>): boolean {
|
|
53
|
+
const checkboxArray = Array.from(checkBoxes);
|
|
54
|
+
return checkBoxes.length === checkboxArray.filter((checkBox: HTMLInputElement) => checkBox.checked).length;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private toggleActionButtonReport(): void {
|
|
58
|
+
document.querySelector(Selectors.actionButtonSelectorReport)?.toggleAttribute(
|
|
59
|
+
'disabled',
|
|
60
|
+
!document.querySelectorAll('input[type="checkbox"]:checked').length
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Enables the "Toggle all" checkbox on document load if all child checkboxes are checked
|
|
66
|
+
*/
|
|
67
|
+
private toggleTriggerCheckBoxReport(): void {
|
|
68
|
+
const checkBoxes: NodeListOf<HTMLInputElement> = document.querySelectorAll(Selectors.linktypesSelectorReport);
|
|
69
|
+
(document.getElementById(Identifier.toggleAllLinktypesIdReport) as HTMLInputElement).checked = Linkvalidator.allCheckBoxesAreChecked(checkBoxes);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private initializeEvents(): void {
|
|
73
|
+
// toggleAll (checkboxes): on change
|
|
74
|
+
new RegularEvent('change', (e: Event, currentTarget: HTMLInputElement): void => {
|
|
75
|
+
const checkBoxes: NodeListOf<HTMLInputElement> = document.querySelectorAll(Selectors.linktypesSelectorReport);
|
|
76
|
+
const checkIt = !Linkvalidator.allCheckBoxesAreChecked(checkBoxes);
|
|
77
|
+
|
|
78
|
+
checkBoxes.forEach((checkBox: HTMLInputElement): void => {
|
|
79
|
+
checkBox.checked = checkIt;
|
|
80
|
+
});
|
|
81
|
+
currentTarget.checked = checkIt;
|
|
82
|
+
this.toggleActionButtonReport();
|
|
83
|
+
}).delegateTo(document, Selectors.toggleAllLinktypesSelectorReport);
|
|
84
|
+
|
|
85
|
+
// toggle (checkbox): on change
|
|
86
|
+
new RegularEvent('change', (): void => {
|
|
87
|
+
this.toggleTriggerCheckBoxReport();
|
|
88
|
+
this.toggleActionButtonReport();
|
|
89
|
+
}).delegateTo(document, Selectors.linktypesSelectorReport);
|
|
90
|
+
|
|
91
|
+
new RegularEvent('click', (e: PointerEvent, actionButton: HTMLInputElement): void => {
|
|
92
|
+
Notification.success(actionButton.dataset.notificationMessage || 'Event triggered', '', 2);
|
|
93
|
+
}).delegateTo(document, Selectors.actionButtonSelectorCheck);
|
|
94
|
+
|
|
95
|
+
new RegularEvent('click', (e: PointerEvent, actionButton: HTMLInputElement): void => {
|
|
96
|
+
Notification.success(actionButton.dataset.notificationMessage || 'Event triggered', '', 2);
|
|
97
|
+
}).delegateTo(document, Selectors.actionButtonSelectorReport);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export default new Linkvalidator();
|