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,125 @@
|
|
|
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, LitElement, nothing, type TemplateResult } from 'lit';
|
|
15
|
+
import { customElement, property, query } from 'lit/decorators';
|
|
16
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
17
|
+
import type { ModuleState } from '../module';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Module: @typo3/backend/module/iframe
|
|
21
|
+
*/
|
|
22
|
+
export const componentName = 'typo3-iframe-module';
|
|
23
|
+
|
|
24
|
+
@customElement('typo3-iframe-module')
|
|
25
|
+
export class IframeModuleElement extends LitElement {
|
|
26
|
+
|
|
27
|
+
@property({ type: String }) endpoint: string = '';
|
|
28
|
+
|
|
29
|
+
@query('iframe', true) iframe: HTMLIFrameElement;
|
|
30
|
+
|
|
31
|
+
public override attributeChangedCallback(name: string, old: string, value: string): void {
|
|
32
|
+
super.attributeChangedCallback(name, old, value);
|
|
33
|
+
|
|
34
|
+
if (name === 'endpoint' && value === old) {
|
|
35
|
+
// Trigger explicit reload if value has been reset to current value,
|
|
36
|
+
// lit doesn't re-set the attribute in this case.
|
|
37
|
+
this.iframe.setAttribute('src', value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public override connectedCallback(): void {
|
|
42
|
+
super.connectedCallback();
|
|
43
|
+
if (this.endpoint) {
|
|
44
|
+
this.dispatch('typo3-iframe-load', { url: this.endpoint, title: null });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
49
|
+
// Disable shadow root as <iframe> needs to be accessible
|
|
50
|
+
// via top.list_frame for legacy-code and backwards compatibility.
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected override render(): TemplateResult | symbol {
|
|
55
|
+
if (!this.endpoint) {
|
|
56
|
+
return nothing;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return html`
|
|
60
|
+
<iframe
|
|
61
|
+
src="${this.endpoint}"
|
|
62
|
+
name="list_frame"
|
|
63
|
+
id="typo3-contentIframe"
|
|
64
|
+
class="scaffold-content-module-iframe t3js-scaffold-content-module-iframe"
|
|
65
|
+
title="${lll('iframe.listFrame')}"
|
|
66
|
+
@load="${this._loaded}"
|
|
67
|
+
></iframe>
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private registerPagehideHandler(iframe: HTMLIFrameElement): void {
|
|
72
|
+
try {
|
|
73
|
+
iframe.contentWindow.addEventListener('pagehide', (e: Event) => this._pagehide(e, iframe), { once: true });
|
|
74
|
+
} catch (e) {
|
|
75
|
+
console.error('Failed to access contentWindow of module iframe – using a foreign origin?');
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private retrieveModuleStateFromIFrame(iframe: HTMLIFrameElement): ModuleState {
|
|
81
|
+
try {
|
|
82
|
+
return {
|
|
83
|
+
url: iframe.contentWindow.location.href,
|
|
84
|
+
title: iframe.contentDocument.title,
|
|
85
|
+
module: iframe.contentDocument.body.querySelector('.module[data-module-name]')?.getAttribute('data-module-name')
|
|
86
|
+
};
|
|
87
|
+
} catch {
|
|
88
|
+
console.error('Failed to access contentWindow of module iframe – using a foreign origin?');
|
|
89
|
+
return { url: this.endpoint, title: null };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private _loaded({ target }: Event) {
|
|
94
|
+
const iframe = <HTMLIFrameElement> target;
|
|
95
|
+
|
|
96
|
+
// The event handler for the "pagehide" event needs to be attached
|
|
97
|
+
// after every iframe load (for the current iframes's contentWindow).
|
|
98
|
+
this.registerPagehideHandler(iframe);
|
|
99
|
+
|
|
100
|
+
const state = this.retrieveModuleStateFromIFrame(iframe);
|
|
101
|
+
this.dispatch('typo3-iframe-loaded', state);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private _pagehide(e: Event, iframe: HTMLIFrameElement) {
|
|
105
|
+
// Asynchronous execution needed because the URL changes immediately after
|
|
106
|
+
// the `pagehide` event is dispatched, but has not been changed right now.
|
|
107
|
+
new Promise((resolve) => window.setTimeout(resolve, 0)).then(() => {
|
|
108
|
+
if (iframe.contentWindow !== null) {
|
|
109
|
+
this.dispatch('typo3-iframe-load', { url: iframe.contentWindow.location.href, title: null });
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private dispatch(type: 'typo3-iframe-load' | 'typo3-iframe-loaded', state: ModuleState) {
|
|
115
|
+
this.dispatchEvent(
|
|
116
|
+
new CustomEvent<ModuleState>(type, { detail: state, bubbles: true, composed: true })
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
declare global {
|
|
122
|
+
interface HTMLElementTagNameMap {
|
|
123
|
+
'typo3-iframe-module': IframeModuleElement;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
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, css, LitElement, type TemplateResult, type HasChanged } from 'lit';
|
|
15
|
+
import { customElement, property, query } from 'lit/decorators';
|
|
16
|
+
import { ModuleUtility, type ModuleState } from '@typo3/backend/module';
|
|
17
|
+
|
|
18
|
+
const IFRAME_COMPONENT = '@typo3/backend/module/iframe';
|
|
19
|
+
|
|
20
|
+
interface DecoratedModuleState {
|
|
21
|
+
slotName: string;
|
|
22
|
+
detail: ModuleState;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Trigger a render cycle, even if property has been reset to
|
|
26
|
+
// the current value (this is to trigger a module refresh).
|
|
27
|
+
const alwaysUpdate: HasChanged = () => true;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Module: @typo3/backend/module/router
|
|
31
|
+
*/
|
|
32
|
+
@customElement('typo3-backend-module-router')
|
|
33
|
+
export class ModuleRouter extends LitElement {
|
|
34
|
+
public static override styles = css`
|
|
35
|
+
:host {
|
|
36
|
+
width: 100%;
|
|
37
|
+
min-height: 100%;
|
|
38
|
+
flex: 1 0 auto;
|
|
39
|
+
display: flex;
|
|
40
|
+
flex-direction: row;
|
|
41
|
+
}
|
|
42
|
+
::slotted(*) {
|
|
43
|
+
min-height: 100%;
|
|
44
|
+
width: 100%;
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
|
|
48
|
+
@property({ type: String, hasChanged: alwaysUpdate }) module: string = '';
|
|
49
|
+
@property({ type: String, hasChanged: alwaysUpdate }) endpoint: string = '';
|
|
50
|
+
@property({ type: String, attribute: 'state-tracker' }) stateTrackerUrl: string;
|
|
51
|
+
@property({ type: String, attribute: 'sitename' }) sitename: string;
|
|
52
|
+
@property({ type: String, attribute: 'entry-point' }) entryPoint: string;
|
|
53
|
+
@property({ type: String, attribute: 'install-tool-path' }) installToolPath: string;
|
|
54
|
+
@query('slot', true) slotElement: HTMLSlotElement;
|
|
55
|
+
|
|
56
|
+
// Not a @property, since changes must not cause a module-reload
|
|
57
|
+
sitenameFirst: boolean = false;
|
|
58
|
+
titleComponents: string[]|null = null;
|
|
59
|
+
|
|
60
|
+
constructor() {
|
|
61
|
+
super();
|
|
62
|
+
|
|
63
|
+
this.addEventListener('typo3-module-load', ({ target, detail }: CustomEvent<ModuleState>) => {
|
|
64
|
+
const slotName = (target as HTMLElement).getAttribute('slot');
|
|
65
|
+
this.pushState({ slotName, detail });
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
this.addEventListener('typo3-module-loaded', ({ detail }: CustomEvent<ModuleState>) => {
|
|
69
|
+
this.updateBrowserState(detail);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
this.addEventListener('typo3-iframe-load', ({ detail }: CustomEvent<ModuleState>) => {
|
|
73
|
+
let state: DecoratedModuleState = {
|
|
74
|
+
slotName: IFRAME_COMPONENT,
|
|
75
|
+
detail: detail
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
if (state.detail.url.includes(this.stateTrackerUrl + '?state=')) {
|
|
79
|
+
const parts = state.detail.url.split('?state=');
|
|
80
|
+
state = <DecoratedModuleState>JSON.parse(decodeURIComponent(parts[1] || '{}'));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
* Event came frame <typo3-iframe-module>, that means it may have been triggered by an
|
|
85
|
+
* a) explicit iframe src attribute change or by
|
|
86
|
+
* b) browser history backwards or forward navigation
|
|
87
|
+
*
|
|
88
|
+
* In case of b), the following code block manually synchronizes the slot attribute
|
|
89
|
+
*/
|
|
90
|
+
if (this.slotElement.getAttribute('name') !== state.slotName) {
|
|
91
|
+
// The "name" attribute of <slot> gets of out sync
|
|
92
|
+
// due to browser history backwards or forward navigation.
|
|
93
|
+
// Synchronize to the state as advertised by the iframe event.
|
|
94
|
+
this.slotElement.setAttribute('name', state.slotName);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Mark active and sync endpoint attribute for modules.
|
|
98
|
+
// Do not reset endpoint for iframe modules as the URL has already been
|
|
99
|
+
// updated and a reset would trigger a reload and another event cycle.
|
|
100
|
+
this.markActive(
|
|
101
|
+
state.slotName,
|
|
102
|
+
this.slotElement.getAttribute('name') === IFRAME_COMPONENT ? null : state.detail.url,
|
|
103
|
+
false
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
this.updateBrowserState(state.detail);
|
|
107
|
+
|
|
108
|
+
// Send load event (e.g. to be handled by ModuleMenu).
|
|
109
|
+
// Dispated via parent element to prevent routers own event handlers to be invoked.
|
|
110
|
+
// @todo: Introduce a separate event (name) to prevent the parentElement workaround?
|
|
111
|
+
this.parentElement.dispatchEvent(new CustomEvent<ModuleState>('typo3-module-load', {
|
|
112
|
+
bubbles: true,
|
|
113
|
+
composed: true,
|
|
114
|
+
detail: state.detail
|
|
115
|
+
}));
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
this.addEventListener('typo3-iframe-loaded', ({ detail }: CustomEvent<ModuleState>) => {
|
|
119
|
+
this.updateBrowserState(detail);
|
|
120
|
+
this.parentElement.dispatchEvent(new CustomEvent<ModuleState>('typo3-module-loaded', {
|
|
121
|
+
bubbles: true,
|
|
122
|
+
composed: true,
|
|
123
|
+
detail
|
|
124
|
+
}));
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public static override get observedAttributes(): string[] {
|
|
129
|
+
return [
|
|
130
|
+
...super.observedAttributes,
|
|
131
|
+
'sitename-first',
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public override connectedCallback(): void {
|
|
136
|
+
super.connectedCallback();
|
|
137
|
+
this.sitenameFirst = this.hasAttribute('sitename-first');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public override attributeChangedCallback(name: string, oldValue: string|null, newValue: string): void {
|
|
141
|
+
super.attributeChangedCallback(name, oldValue, newValue);
|
|
142
|
+
if (name === 'sitename-first') {
|
|
143
|
+
this.sitenameFirst = newValue !== null;
|
|
144
|
+
this.updateBrowserTitle();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
protected override render(): TemplateResult {
|
|
149
|
+
const moduleData = ModuleUtility.getFromName(this.module);
|
|
150
|
+
const jsModule = moduleData.component || IFRAME_COMPONENT;
|
|
151
|
+
|
|
152
|
+
return html`<slot name="${jsModule}"></slot>`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
protected override updated(): void {
|
|
156
|
+
const moduleData = ModuleUtility.getFromName(this.module);
|
|
157
|
+
const jsModule = moduleData.component || IFRAME_COMPONENT;
|
|
158
|
+
|
|
159
|
+
this.markActive(jsModule, this.endpoint);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private async markActive(jsModule: string, endpoint: string | null, forceEndpointReset: boolean = true): Promise<void> {
|
|
163
|
+
const element = await this.getModuleElement(jsModule);
|
|
164
|
+
if (endpoint && (forceEndpointReset || element.getAttribute('endpoint') !== endpoint)) {
|
|
165
|
+
element.setAttribute('endpoint', endpoint);
|
|
166
|
+
}
|
|
167
|
+
if (!element.hasAttribute('active')) {
|
|
168
|
+
element.setAttribute('active', '');
|
|
169
|
+
}
|
|
170
|
+
for (let previous = element.previousElementSibling; previous !== null; previous = previous.previousElementSibling) {
|
|
171
|
+
previous.removeAttribute('active');
|
|
172
|
+
}
|
|
173
|
+
for (let next = element.nextElementSibling; next !== null; next = next.nextElementSibling) {
|
|
174
|
+
next.removeAttribute('active');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private async getModuleElement(moduleName: string): Promise<Element> {
|
|
179
|
+
let element = this.querySelector(`*[slot="${moduleName}"]`);
|
|
180
|
+
if (element !== null) {
|
|
181
|
+
return element;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
const module = await import(moduleName + '.js');
|
|
186
|
+
element = this.querySelector(`*[slot="${moduleName}"]`);
|
|
187
|
+
if (element !== null) {
|
|
188
|
+
// The element has been created parallelly during the asynchronous module load; use that instance
|
|
189
|
+
return element;
|
|
190
|
+
}
|
|
191
|
+
if (!('componentName' in module)) {
|
|
192
|
+
throw new Error(`module ${moduleName} is missing the "componentName" export`);
|
|
193
|
+
}
|
|
194
|
+
element = document.createElement(module.componentName);
|
|
195
|
+
} catch (e) {
|
|
196
|
+
console.error({ msg: `Error importing ${moduleName} as backend module`, err: e });
|
|
197
|
+
throw e;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
element.setAttribute('slot', moduleName);
|
|
201
|
+
this.appendChild(element);
|
|
202
|
+
return element;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
private async pushState(state: DecoratedModuleState): Promise<void> {
|
|
206
|
+
const url = this.stateTrackerUrl + '?state=' + encodeURIComponent(JSON.stringify(state));
|
|
207
|
+
// push dummy route to iframe. to trigger an implicit browser state update
|
|
208
|
+
const component = await this.getModuleElement(IFRAME_COMPONENT);
|
|
209
|
+
component.setAttribute('endpoint', url);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private updateBrowserTitle(): void {
|
|
213
|
+
let { titleComponents } = this;
|
|
214
|
+
|
|
215
|
+
if (titleComponents === null) {
|
|
216
|
+
// updateBrowserState has not been invoked yet, nothing to update for now
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (this.sitenameFirst) {
|
|
221
|
+
titleComponents = titleComponents.toReversed();
|
|
222
|
+
}
|
|
223
|
+
document.title = titleComponents.join(' · ');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private updateBrowserState(state: ModuleState): void {
|
|
227
|
+
const url = new URL(state.url || '', window.location.origin);
|
|
228
|
+
const params = new URLSearchParams(url.search);
|
|
229
|
+
|
|
230
|
+
const title = 'title' in state ? state.title : '';
|
|
231
|
+
// update/reset document.title if state.title is not null
|
|
232
|
+
// (state.title === null indicates "keep current title")
|
|
233
|
+
if (title !== null) {
|
|
234
|
+
const titleComponents = [this.sitename];
|
|
235
|
+
if (title !== '') {
|
|
236
|
+
titleComponents.unshift(title);
|
|
237
|
+
}
|
|
238
|
+
this.titleComponents = titleComponents;
|
|
239
|
+
this.updateBrowserTitle();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!params.has('token')) {
|
|
243
|
+
// InstallTool doesn't use a backend-route with a token,
|
|
244
|
+
// but has backend-routes that act as wrappers.
|
|
245
|
+
// Rewrite the URL for display in the browser URL bar.
|
|
246
|
+
// @todo: rewrite installtool as webcomponent backend
|
|
247
|
+
// module in order to advertise a proper module URL on it's own
|
|
248
|
+
if (params.has('install[controller]')) {
|
|
249
|
+
const controller = params.get('install[controller]');
|
|
250
|
+
params.delete('install[controller]');
|
|
251
|
+
params.delete('install[context]');
|
|
252
|
+
params.delete('install[colorScheme]');
|
|
253
|
+
params.delete('install[theme]');
|
|
254
|
+
url.pathname = url.pathname.replace(this.installToolPath, this.entryPoint + 'module/tools/' + controller);
|
|
255
|
+
} else {
|
|
256
|
+
// non token-urls cannot be mapped by
|
|
257
|
+
// the main backend controller right now
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
params.delete('token');
|
|
263
|
+
url.search = params.toString();
|
|
264
|
+
|
|
265
|
+
const niceUrl = url.toString();
|
|
266
|
+
window.history.replaceState(state, '', niceUrl);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
declare global {
|
|
272
|
+
interface HTMLElementTagNameMap {
|
|
273
|
+
'typo3-backend-module-router': ModuleRouter;
|
|
274
|
+
}
|
|
275
|
+
}
|