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,165 @@
|
|
|
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
|
+
/**
|
|
16
|
+
* Module: @typo3/backend/layout-module/paste
|
|
17
|
+
* Dynamically adds "Paste" Icons in the Page Layout module (Web => Page)
|
|
18
|
+
* and triggers a modal window. which then calls the AjaxDataHandler
|
|
19
|
+
* to execute the action to paste the current clipboard contents.
|
|
20
|
+
*/
|
|
21
|
+
import DataHandler from '../ajax-data-handler';
|
|
22
|
+
import { default as Modal, type ModalElement, type Button } from '@typo3/backend/modal';
|
|
23
|
+
import Severity from '../severity';
|
|
24
|
+
import '@typo3/backend/element/icon-element';
|
|
25
|
+
import { SeverityEnum } from '../enum/severity';
|
|
26
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
27
|
+
import type ResponseInterface from '../ajax-data-handler/response-interface';
|
|
28
|
+
|
|
29
|
+
type PasteOptions = {
|
|
30
|
+
itemOnClipboardUid: number;
|
|
31
|
+
itemOnClipboardTitle: string;
|
|
32
|
+
copyMode: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
class Paste {
|
|
36
|
+
private readonly itemOnClipboardUid: number = 0;
|
|
37
|
+
private readonly itemOnClipboardTitle: string = '';
|
|
38
|
+
private readonly copyMode: string = '';
|
|
39
|
+
private readonly elementIdentifier: string = '.t3js-page-ce';
|
|
40
|
+
private pasteAfterLinkTemplate: string = '';
|
|
41
|
+
private pasteIntoLinkTemplate: string = '';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* initializes paste icons for all content elements on the page
|
|
45
|
+
*/
|
|
46
|
+
constructor(args: PasteOptions) {
|
|
47
|
+
this.itemOnClipboardUid = args.itemOnClipboardUid;
|
|
48
|
+
this.itemOnClipboardTitle = args.itemOnClipboardTitle;
|
|
49
|
+
this.copyMode = args.copyMode;
|
|
50
|
+
|
|
51
|
+
DocumentService.ready().then((): void => {
|
|
52
|
+
if (document.querySelectorAll('.t3js-page-columns').length > 0) {
|
|
53
|
+
this.generateButtonTemplates();
|
|
54
|
+
this.activatePasteIcons();
|
|
55
|
+
this.initializeEvents();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private static determineColumn(element: HTMLElement): number {
|
|
61
|
+
const columnContainer = element.closest('[data-colpos]') as HTMLElement|null;
|
|
62
|
+
return parseInt(columnContainer?.dataset?.colpos ?? '0', 10);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private initializeEvents(): void
|
|
66
|
+
{
|
|
67
|
+
new RegularEvent('click', (evt: Event, target: HTMLElement): void => {
|
|
68
|
+
evt.preventDefault();
|
|
69
|
+
|
|
70
|
+
this.activatePasteModal(target);
|
|
71
|
+
}).delegateTo(document, '.t3js-paste');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private generateButtonTemplates(): void {
|
|
75
|
+
if (!this.itemOnClipboardUid) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.pasteAfterLinkTemplate = '<button'
|
|
79
|
+
+ ' type="button"'
|
|
80
|
+
+ ' class="t3js-paste t3js-paste' + (this.copyMode ? '-' + this.copyMode : '') + ' t3js-paste-after btn btn-default btn-sm"'
|
|
81
|
+
+ ' title="' + TYPO3.lang?.pasteAfterRecord + '">'
|
|
82
|
+
+ '<typo3-backend-icon identifier="actions-document-paste-into" size="small"></typo3-backend-icon>'
|
|
83
|
+
+ '</button>';
|
|
84
|
+
this.pasteIntoLinkTemplate = '<button'
|
|
85
|
+
+ ' type="button"'
|
|
86
|
+
+ ' class="t3js-paste t3js-paste' + (this.copyMode ? '-' + this.copyMode : '') + ' t3js-paste-into btn btn-default btn-sm"'
|
|
87
|
+
+ ' title="' + TYPO3.lang?.pasteIntoColumn + '">'
|
|
88
|
+
+ '<typo3-backend-icon identifier="actions-document-paste-into" size="small"></typo3-backend-icon>'
|
|
89
|
+
+ '</button>';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* activates the paste into / paste after icons outside the context menus
|
|
94
|
+
*/
|
|
95
|
+
private activatePasteIcons(): void {
|
|
96
|
+
if (this.pasteAfterLinkTemplate && this.pasteIntoLinkTemplate) {
|
|
97
|
+
document.querySelectorAll('.t3js-page-new-ce').forEach((el: HTMLElement): void => {
|
|
98
|
+
const template = el.parentElement.dataset.page ? this.pasteIntoLinkTemplate : this.pasteAfterLinkTemplate;
|
|
99
|
+
el.append(document.createRange().createContextualFragment(template));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* generates the paste into / paste after modal
|
|
106
|
+
*/
|
|
107
|
+
private activatePasteModal(element: HTMLElement): void {
|
|
108
|
+
const title = (TYPO3.lang['paste.modal.title.paste'] || 'Paste record') + ': "' + this.itemOnClipboardTitle + '"';
|
|
109
|
+
const content = TYPO3.lang['paste.modal.paste'] || 'Do you want to paste the record to this position?';
|
|
110
|
+
|
|
111
|
+
let buttons: Array<Button> = [];
|
|
112
|
+
buttons = [
|
|
113
|
+
{
|
|
114
|
+
text: TYPO3.lang['paste.modal.button.cancel'] || 'Cancel',
|
|
115
|
+
active: true,
|
|
116
|
+
btnClass: 'btn-default',
|
|
117
|
+
trigger: (e: Event, modal: ModalElement): void => modal.hideModal(),
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
text: TYPO3.lang['paste.modal.button.paste'] || 'Paste',
|
|
121
|
+
btnClass: 'btn-' + Severity.getCssClass(SeverityEnum.warning),
|
|
122
|
+
trigger: (e: Event, modal: ModalElement): void => {
|
|
123
|
+
modal.hideModal();
|
|
124
|
+
this.execute(element);
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
Modal.show(title, content, SeverityEnum.warning, buttons);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Send an AJAX request via the AjaxDataHandler
|
|
134
|
+
*/
|
|
135
|
+
private execute(element: HTMLElement): void {
|
|
136
|
+
const colPos = Paste.determineColumn(element);
|
|
137
|
+
const closestElement = element.closest(this.elementIdentifier) as HTMLElement;
|
|
138
|
+
const targetFound = closestElement.dataset.uid;
|
|
139
|
+
let targetPid;
|
|
140
|
+
if (typeof targetFound === 'undefined') {
|
|
141
|
+
targetPid = parseInt(closestElement.dataset.page, 10);
|
|
142
|
+
} else {
|
|
143
|
+
targetPid = 0 - parseInt(targetFound, 10);
|
|
144
|
+
}
|
|
145
|
+
const language = parseInt((element.closest('[data-language-uid]') as HTMLElement).dataset.languageUid, 10);
|
|
146
|
+
const parameters = {
|
|
147
|
+
CB: {
|
|
148
|
+
paste: 'tt_content|' + targetPid,
|
|
149
|
+
pad: 'normal',
|
|
150
|
+
update: {
|
|
151
|
+
colPos: colPos,
|
|
152
|
+
sys_language_uid: language,
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
DataHandler.process(parameters).then((result: ResponseInterface): void => {
|
|
158
|
+
if (!result.hasErrors) {
|
|
159
|
+
window.location.reload();
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export default Paste;
|
|
@@ -0,0 +1,89 @@
|
|
|
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 RegularEvent from '@typo3/core/event/regular-event';
|
|
15
|
+
|
|
16
|
+
export interface LinkAttributes {
|
|
17
|
+
[s: string]: any;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface LinkBrowserFieldChangeFunc {
|
|
21
|
+
name: string;
|
|
22
|
+
data: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface LinkBrowserParameters {
|
|
26
|
+
table: string;
|
|
27
|
+
uid: string;
|
|
28
|
+
pid: string;
|
|
29
|
+
field?: string;
|
|
30
|
+
fieldName?: string;
|
|
31
|
+
formName?: string;
|
|
32
|
+
itemName?: string;
|
|
33
|
+
hmac?: string;
|
|
34
|
+
recordType?: string;
|
|
35
|
+
richtextConfigurationName?: string;
|
|
36
|
+
fieldChangeFunc?:LinkBrowserFieldChangeFunc[];
|
|
37
|
+
fieldChangeFuncHash?: string;
|
|
38
|
+
curUrl?: Record<string, string>,
|
|
39
|
+
currentValue?: string;
|
|
40
|
+
currentSelectedValues?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Module: @typo3/backend/link-browser
|
|
45
|
+
* @exports @typo3/backend/link-browser
|
|
46
|
+
*/
|
|
47
|
+
class LinkBrowser {
|
|
48
|
+
public parameters: LinkBrowserParameters;
|
|
49
|
+
private readonly linkAttributeFields: LinkAttributes;
|
|
50
|
+
|
|
51
|
+
constructor() {
|
|
52
|
+
this.parameters = JSON.parse(document.body.dataset.linkbrowserParameters || '{}');
|
|
53
|
+
this.linkAttributeFields = JSON.parse(document.body.dataset.linkbrowserAttributeFields || '{}');
|
|
54
|
+
|
|
55
|
+
new RegularEvent('click', (event: PointerEvent): void => {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
this.finalizeFunction(document.body.dataset.linkbrowserCurrentLink);
|
|
58
|
+
}).delegateTo(document, 'button.t3js-linkCurrent');
|
|
59
|
+
|
|
60
|
+
new RegularEvent('change', this.loadTarget)
|
|
61
|
+
.delegateTo(document, '.t3js-targetPreselect');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public getLinkAttributeValues(): LinkAttributes {
|
|
65
|
+
const linkAttributeValues: LinkAttributes = {};
|
|
66
|
+
for (const fieldName of this.linkAttributeFields.values()) {
|
|
67
|
+
const linkAttribute: HTMLInputElement = document.querySelector('[name="l' + fieldName + '"]');
|
|
68
|
+
if (linkAttribute !== null) {
|
|
69
|
+
linkAttributeValues[fieldName] = linkAttribute.value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return linkAttributeValues;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public loadTarget(this: HTMLSelectElement): void {
|
|
77
|
+
const linkTarget: HTMLInputElement = document.querySelector('.t3js-linkTarget');
|
|
78
|
+
if (linkTarget !== null) {
|
|
79
|
+
linkTarget.value = this.value;
|
|
80
|
+
this.selectedIndex = 0;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public finalizeFunction(link: string): void {
|
|
85
|
+
throw 'The link browser requires the finalizeFunction to be set in order for ' + link + ' to be handled. Seems like you discovered a major bug.';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export default new LinkBrowser();
|
|
@@ -0,0 +1,34 @@
|
|
|
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 { customElement } from 'lit/decorators';
|
|
15
|
+
import { LitElement } from 'lit';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/live-search/element/backend-search
|
|
19
|
+
* Simple wrapper element around search container
|
|
20
|
+
* @exports @typo3/backend/live-search/element/backend-search
|
|
21
|
+
*/
|
|
22
|
+
@customElement('typo3-backend-live-search')
|
|
23
|
+
export class BackendSearch extends LitElement {
|
|
24
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
25
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
declare global {
|
|
31
|
+
interface HTMLElementTagNameMap {
|
|
32
|
+
'typo3-backend-live-search': BackendSearch;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
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 { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
16
|
+
import { markdown } from '@typo3/core/directive/markdown';
|
|
17
|
+
import '@typo3/backend/element/icon-element';
|
|
18
|
+
|
|
19
|
+
@customElement('typo3-backend-live-search-hint')
|
|
20
|
+
export class Hint extends LitElement {
|
|
21
|
+
@property({ type: String }) hint: string;
|
|
22
|
+
|
|
23
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected override render(): TemplateResult | symbol {
|
|
28
|
+
if (this.hint === '') {
|
|
29
|
+
return nothing;
|
|
30
|
+
}
|
|
31
|
+
return html`<typo3-backend-icon identifier="actions-lightbulb-on" size="small"></typo3-backend-icon> ${markdown(this.hint, 'minimal')}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
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 { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
16
|
+
import '@typo3/backend/element/icon-element';
|
|
17
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
18
|
+
|
|
19
|
+
@customElement('typo3-backend-live-search-result-item-default')
|
|
20
|
+
export class DefaultProviderResultItem extends LitElement {
|
|
21
|
+
@property({ type: Object, attribute: false }) icon: Record<string, string>;
|
|
22
|
+
@property({ type: String, attribute: false }) itemTitle: string;
|
|
23
|
+
@property({ type: String, attribute: false }) typeLabel: string;
|
|
24
|
+
@property({ type: Object, attribute: false }) extraData: { [key: string]: any };
|
|
25
|
+
|
|
26
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
27
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected override render(): TemplateResult {
|
|
32
|
+
return html`
|
|
33
|
+
<div class="livesearch-result-item-icon">
|
|
34
|
+
<typo3-backend-icon title="${this.icon.title}" identifier="${this.icon.identifier}" overlay="${this.icon.overlay}" size="small"></typo3-backend-icon>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="livesearch-result-item-summary">
|
|
37
|
+
<div class="livesearch-result-item-title">
|
|
38
|
+
<div class="livesearch-result-item-title-contentlabel">${this.itemTitle}</div>
|
|
39
|
+
${this.extraData.inWorkspace ? html`<div class="livesearch-result-item-title-indicator"><typo3-backend-icon title="${lll('liveSearch.versionizedRecord')}" identifier="actions-dot" size="small" class="text-warning"></typo3-backend-icon></div>` : nothing}
|
|
40
|
+
</div>
|
|
41
|
+
${this.extraData.breadcrumb !== undefined ? html`<small>${this.extraData.breadcrumb}</small>` : nothing}
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare global {
|
|
49
|
+
interface HTMLElementTagNameMap {
|
|
50
|
+
'typo3-backend-live-search-result-item-default': DefaultProviderResultItem;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
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 { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
16
|
+
import '@typo3/backend/element/icon-element';
|
|
17
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
18
|
+
|
|
19
|
+
@customElement('typo3-backend-live-search-result-item-page-provider')
|
|
20
|
+
export default class PageProviderResultItem extends LitElement {
|
|
21
|
+
@property({ type: Object, attribute: false }) icon: Record<string, string>;
|
|
22
|
+
@property({ type: String, attribute: false }) itemTitle: string;
|
|
23
|
+
@property({ type: String, attribute: false }) typeLabel: string;
|
|
24
|
+
@property({ type: Object, attribute: false }) extraData: { [key: string]: any };
|
|
25
|
+
|
|
26
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
27
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected override render(): TemplateResult {
|
|
32
|
+
return html`
|
|
33
|
+
<div class="livesearch-result-item-icon">
|
|
34
|
+
<typo3-backend-icon title="${this.icon.title}" identifier="${this.icon.identifier}" overlay="${this.icon.overlay}" size="small"></typo3-backend-icon>
|
|
35
|
+
<typo3-backend-icon title="${this.extraData.flagIcon.title}" identifier="${this.extraData.flagIcon.identifier}" size="small"></typo3-backend-icon>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="livesearch-result-item-summary">
|
|
38
|
+
<div class="livesearch-result-item-title">
|
|
39
|
+
<div class="livesearch-result-item-title-contentlabel">${this.itemTitle}</div>
|
|
40
|
+
${this.extraData.inWorkspace ? html`<div class="livesearch-result-item-title-indicator"><typo3-backend-icon title="${lll('liveSearch.versionizedRecord')}" identifier="actions-dot" size="small" class="text-warning"></typo3-backend-icon></div>` : nothing}
|
|
41
|
+
</div>
|
|
42
|
+
<small>${this.extraData.breadcrumb}</small>
|
|
43
|
+
</div>
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare global {
|
|
49
|
+
interface HTMLElementTagNameMap {
|
|
50
|
+
'typo3-backend-live-search-result-item-page-provider': PageProviderResultItem;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
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 { customElement, property } from 'lit/decorators';
|
|
16
|
+
import { css, html, LitElement, type TemplateResult } from 'lit';
|
|
17
|
+
import { type Action } from './action';
|
|
18
|
+
import type { ResultItemActionInterface, ResultItemInterface } from '../item';
|
|
19
|
+
import type { InvokeActionEventData } from '@typo3/backend/live-search/element/result/result-container';
|
|
20
|
+
|
|
21
|
+
export const componentName = 'typo3-backend-live-search-result-item-action-container';
|
|
22
|
+
|
|
23
|
+
@customElement('typo3-backend-live-search-result-item-action-container')
|
|
24
|
+
export class ActionContainer extends LitElement {
|
|
25
|
+
@property({ type: Object, attribute: false }) resultItem: ResultItemInterface|null = null;
|
|
26
|
+
|
|
27
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
28
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected override render(): TemplateResult {
|
|
33
|
+
return html`<typo3-backend-live-search-result-action-list>
|
|
34
|
+
${this.resultItem.actions.map((action: ResultItemActionInterface) => this.renderActionItem(this.resultItem, action))}
|
|
35
|
+
</typo3-backend-live-search-result-action-list>`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private renderActionItem(resultItem: ResultItemInterface, action: ResultItemActionInterface): TemplateResult {
|
|
39
|
+
return html`<typo3-backend-live-search-result-item-action
|
|
40
|
+
.resultItem="${resultItem}"
|
|
41
|
+
.resultItemAction="${action}"
|
|
42
|
+
@click="${() => this.invokeAction(this.resultItem, action)}">
|
|
43
|
+
</typo3-backend-live-search-result-item-action>`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private invokeAction(resultItem: ResultItemInterface, action: ResultItemActionInterface): void {
|
|
47
|
+
this.closest('typo3-backend-live-search-result-container').dispatchEvent(new CustomEvent<InvokeActionEventData>('livesearch:invoke-action', {
|
|
48
|
+
detail: {
|
|
49
|
+
resultItem: resultItem,
|
|
50
|
+
action: action
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@customElement('typo3-backend-live-search-result-action-list')
|
|
57
|
+
export class ActionList extends LitElement {
|
|
58
|
+
static override styles = css`
|
|
59
|
+
:host {
|
|
60
|
+
display: block;
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
private parentContainer: HTMLElement;
|
|
65
|
+
private resultItemContainer: HTMLElement;
|
|
66
|
+
|
|
67
|
+
public override async connectedCallback(): Promise<void> {
|
|
68
|
+
await DocumentService.ready();
|
|
69
|
+
this.parentContainer = this.closest('typo3-backend-live-search-result-container');
|
|
70
|
+
this.resultItemContainer = this.parentContainer.querySelector('typo3-backend-live-search-result-item-container');
|
|
71
|
+
|
|
72
|
+
super.connectedCallback();
|
|
73
|
+
this.addEventListener('keydown', this.handleKeyDown);
|
|
74
|
+
this.addEventListener('keyup', this.handleKeyUp);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public override disconnectedCallback(): void {
|
|
78
|
+
this.removeEventListener('keydown', this.handleKeyDown);
|
|
79
|
+
this.removeEventListener('keyup', this.handleKeyUp);
|
|
80
|
+
|
|
81
|
+
super.disconnectedCallback();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
protected override render(): TemplateResult {
|
|
85
|
+
return html`<slot></slot>`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private handleKeyDown(e: KeyboardEvent): void {
|
|
89
|
+
if (!['ArrowDown', 'ArrowUp', 'ArrowLeft'].includes(e.key)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (document.activeElement.tagName.toLowerCase() !== 'typo3-backend-live-search-result-item-action') {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
|
|
98
|
+
let focusableCandidate;
|
|
99
|
+
if (e.key === 'ArrowDown') {
|
|
100
|
+
focusableCandidate = document.activeElement.nextElementSibling;
|
|
101
|
+
} else if (e.key === 'ArrowUp') {
|
|
102
|
+
focusableCandidate = document.activeElement.previousElementSibling;
|
|
103
|
+
} else if (e.key === 'ArrowLeft') {
|
|
104
|
+
focusableCandidate = this.resultItemContainer.querySelector('typo3-backend-live-search-result-item.active');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (focusableCandidate !== null) {
|
|
108
|
+
(focusableCandidate as HTMLElement).focus();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private handleKeyUp(e: KeyboardEvent): void {
|
|
113
|
+
// @todo Enter should (probably) be handled in keydown, like buttons do
|
|
114
|
+
if (!['Enter', ' '].includes(e.key)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
e.preventDefault();
|
|
119
|
+
|
|
120
|
+
const actionElement = e.target as Action;
|
|
121
|
+
this.parentContainer.dispatchEvent(new CustomEvent<InvokeActionEventData>('livesearch:invoke-action', {
|
|
122
|
+
detail: {
|
|
123
|
+
resultItem: actionElement.resultItem,
|
|
124
|
+
action: actionElement.resultItemAction
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
declare global {
|
|
131
|
+
interface HTMLElementTagNameMap {
|
|
132
|
+
'typo3-backend-live-search-result-item-action-container': ActionContainer;
|
|
133
|
+
'typo3-backend-live-search-result-action-list': ActionList;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
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 { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { ifDefined } from 'lit/directives/if-defined';
|
|
16
|
+
import { html, LitElement, type TemplateResult } from 'lit';
|
|
17
|
+
import '@typo3/backend/element/icon-element';
|
|
18
|
+
import type { ResultItemActionInterface, ResultItemInterface } from '../item';
|
|
19
|
+
|
|
20
|
+
@customElement('typo3-backend-live-search-result-item-action')
|
|
21
|
+
export class Action extends LitElement {
|
|
22
|
+
@property({ type: Object, attribute: false }) resultItem: ResultItemInterface;
|
|
23
|
+
@property({ type: Object, attribute: false }) resultItemAction: ResultItemActionInterface;
|
|
24
|
+
|
|
25
|
+
public override connectedCallback(): void {
|
|
26
|
+
super.connectedCallback();
|
|
27
|
+
|
|
28
|
+
if (!this.hasAttribute('tabindex')) {
|
|
29
|
+
this.setAttribute('tabindex', '0');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
34
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected override render(): TemplateResult {
|
|
39
|
+
return html`
|
|
40
|
+
<div>
|
|
41
|
+
<div class="livesearch-result-item-icon">
|
|
42
|
+
<typo3-backend-icon identifier="${ifDefined(this.resultItemAction.icon.identifier || 'actions-arrow-right')}" overlay="${this.resultItemAction.icon.overlay}" size="small"></typo3-backend-icon>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="livesearch-result-item-title">
|
|
45
|
+
${this.resultItemAction.label}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
declare global {
|
|
53
|
+
interface HTMLElementTagNameMap {
|
|
54
|
+
'typo3-backend-live-search-result-item-action': Action;
|
|
55
|
+
}
|
|
56
|
+
}
|