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,152 @@
|
|
|
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 { Tree } from '@typo3/backend/tree/tree';
|
|
15
|
+
import { html, type TemplateResult } from 'lit';
|
|
16
|
+
import { DataTransferTypes } from '@typo3/backend/enum/data-transfer-types';
|
|
17
|
+
import Modal from '@typo3/backend/modal';
|
|
18
|
+
import { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
19
|
+
import type { TreeNodeInterface } from '@typo3/backend/tree/tree-node';
|
|
20
|
+
import type { ContentElementDragDropData } from '@typo3/backend/layout-module/drag-drop';
|
|
21
|
+
import DragDropUtility from '@typo3/backend/utility/drag-drop-utility';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A Tree based on for pages, which has a AJAX-based loading of the tree
|
|
25
|
+
* and also handles search + filter via AJAX.
|
|
26
|
+
*/
|
|
27
|
+
export class PageTree extends Tree
|
|
28
|
+
{
|
|
29
|
+
public constructor() {
|
|
30
|
+
super();
|
|
31
|
+
this.settings.defaultProperties = {
|
|
32
|
+
hasChildren: false,
|
|
33
|
+
nameSourceField: 'title',
|
|
34
|
+
prefix: '',
|
|
35
|
+
suffix: '',
|
|
36
|
+
locked: false,
|
|
37
|
+
loaded: false,
|
|
38
|
+
overlayIcon: '',
|
|
39
|
+
selectable: true,
|
|
40
|
+
expanded: false,
|
|
41
|
+
checked: false,
|
|
42
|
+
stopPageTree: false,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public override getDataUrl(parentNode: TreeNodeInterface|null = null): string {
|
|
47
|
+
if (parentNode === null) {
|
|
48
|
+
return this.settings.dataUrl;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return this.settings.dataUrl + '&parent=' + parentNode.identifier + '&mount=' + parentNode.mountPoint + '&depth=' + parentNode.depth;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected override createNodeToggle(node: TreeNodeInterface): TemplateResult {
|
|
55
|
+
return html`${node.stopPageTree && node.depth !== 0
|
|
56
|
+
? html`
|
|
57
|
+
<span class="node-stop" @click="${(event: PointerEvent) => { event.preventDefault(); event.stopImmediatePropagation(); document.dispatchEvent(new CustomEvent('typo3:pagetree:mountPoint', { detail: { pageId: parseInt(node.identifier, 10) } })); }}">
|
|
58
|
+
<typo3-backend-icon identifier="actions-caret-end" size="small"></typo3-backend-icon>
|
|
59
|
+
</span>
|
|
60
|
+
`
|
|
61
|
+
: super.createNodeToggle(node)
|
|
62
|
+
}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
protected override handleNodeDragOver(event: DragEvent): boolean {
|
|
66
|
+
// @todo incorporate isDropAllowed
|
|
67
|
+
if (super.handleNodeDragOver(event)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// @TODO Unity with parent
|
|
72
|
+
if (event.dataTransfer.types.includes(DataTransferTypes.content)) {
|
|
73
|
+
// Find the current hovered node
|
|
74
|
+
// Exit when no node was hovered
|
|
75
|
+
const targetNode = this.getNodeFromDragEvent(event);
|
|
76
|
+
if (targetNode === null) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.cleanDrag();
|
|
81
|
+
|
|
82
|
+
// Add hover styling to the current hovered node
|
|
83
|
+
// element, during the drag the default mouse over
|
|
84
|
+
// is disabled by the browser
|
|
85
|
+
const hoverElement = this.getElementFromNode(targetNode);
|
|
86
|
+
hoverElement.classList.add('node-hover');
|
|
87
|
+
|
|
88
|
+
// Open node with children while holding the
|
|
89
|
+
// node/element over this node for 1 second
|
|
90
|
+
if (targetNode.hasChildren && !targetNode.__expanded) {
|
|
91
|
+
if (this.openNodeTimeout.targetNode != targetNode) {
|
|
92
|
+
this.openNodeTimeout.targetNode = targetNode;
|
|
93
|
+
clearTimeout(this.openNodeTimeout.timeout);
|
|
94
|
+
this.openNodeTimeout.timeout = setTimeout(() => {
|
|
95
|
+
this.showChildren(this.openNodeTimeout.targetNode);
|
|
96
|
+
this.openNodeTimeout.targetNode = null;
|
|
97
|
+
this.openNodeTimeout.timeout = null;
|
|
98
|
+
}, 1000);
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
clearTimeout(this.openNodeTimeout.timeout);
|
|
102
|
+
this.openNodeTimeout.targetNode = null;
|
|
103
|
+
this.openNodeTimeout.timeout = null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Allow drop
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
|
|
109
|
+
// Adjust allowed drop effect
|
|
110
|
+
DragDropUtility.updateEventAndTooltipToReflectCopyMoveIntention(event);
|
|
111
|
+
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
protected override handleNodeDrop(event: DragEvent): boolean {
|
|
119
|
+
if (super.handleNodeDrop(event)) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (event.dataTransfer.types.includes(DataTransferTypes.content)) {
|
|
123
|
+
const node = this.getNodeFromDragEvent(event);
|
|
124
|
+
if (node === null) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const newNodeData = event.dataTransfer.getData(DataTransferTypes.content);
|
|
129
|
+
const parsedData = JSON.parse(newNodeData) as ContentElementDragDropData;
|
|
130
|
+
|
|
131
|
+
// allow drop
|
|
132
|
+
event.preventDefault();
|
|
133
|
+
|
|
134
|
+
const moveElementUrl = new URL(parsedData.moveElementUrl, window.origin);
|
|
135
|
+
moveElementUrl.searchParams.set('expandPage', node.identifier);
|
|
136
|
+
moveElementUrl.searchParams.set('originalPid', node.identifier);
|
|
137
|
+
if (DragDropUtility.isCopyModifierFromEvent(event)) {
|
|
138
|
+
moveElementUrl.searchParams.set('makeCopy', '1');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
Modal.advanced({
|
|
142
|
+
content: moveElementUrl.toString(),
|
|
143
|
+
severity: SeverityEnum.notice,
|
|
144
|
+
size: Modal.sizes.large,
|
|
145
|
+
type: Modal.types.iframe,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
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 AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
15
|
+
import { ModuleStateStorage } from '@typo3/backend/storage/module-state-storage';
|
|
16
|
+
import type { LitElement } from 'lit';
|
|
17
|
+
import type { ModuleStateUpdateEvent } from '@typo3/backend/storage/module-state-storage';
|
|
18
|
+
import type { TreeNodeInterface } from '@typo3/backend/tree/tree-node';
|
|
19
|
+
import type { Tree } from '@typo3/backend/tree/tree';
|
|
20
|
+
import type { Constructor } from '@lit/reactive-element/decorators/base';
|
|
21
|
+
|
|
22
|
+
export const TreeModuleState = <T extends Constructor<LitElement>>(superClass: T) => {
|
|
23
|
+
abstract class TreeModuleStateClass extends superClass {
|
|
24
|
+
protected abstract tree: Tree;
|
|
25
|
+
protected abstract moduleStateType: string;
|
|
26
|
+
|
|
27
|
+
public override connectedCallback(): void {
|
|
28
|
+
super.connectedCallback();
|
|
29
|
+
document.addEventListener('typo3:module-state-storage:update:' + this.moduleStateType, this.moduleStateUpdated);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public override disconnectedCallback(): void {
|
|
33
|
+
super.disconnectedCallback();
|
|
34
|
+
document.removeEventListener('typo3:module-state-storage:update:' + this.moduleStateType, this.moduleStateUpdated);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
protected transformModuleStateIdentifierToNodeIdentifier(moduleStateIdentifier: string): string {
|
|
38
|
+
return moduleStateIdentifier;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected transformNodeIdentifierToModuleStateIdentifier(nodeIdentifier: string): string {
|
|
42
|
+
return nodeIdentifier;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected async selectActiveViaRootline(identifier: string) {
|
|
46
|
+
const url = new URL(this.tree.settings.rootlineUrl, window.location.origin);
|
|
47
|
+
url.searchParams.set('identifier', identifier);
|
|
48
|
+
const response = await new AjaxRequest(url.toString()).get({ cache: 'no-cache' });
|
|
49
|
+
const { rootline }: { rootline: string[] } = await response.resolve();
|
|
50
|
+
rootline.pop();
|
|
51
|
+
const propagate = false;
|
|
52
|
+
await this.selectActiveNodeByParents(identifier, rootline.map(id => this.transformModuleStateIdentifierToNodeIdentifier(id)), propagate);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Event listener called for each loaded node,
|
|
57
|
+
* here used to mark node remembered from/in ModuleState as selected
|
|
58
|
+
*/
|
|
59
|
+
protected readonly selectActiveNodeInLoadedNodes = (evt: CustomEvent<{nodes: TreeNodeInterface[]}>): void => {
|
|
60
|
+
let moduleState = ModuleStateStorage.current(this.moduleStateType);
|
|
61
|
+
if (!moduleState.identifier) {
|
|
62
|
+
// No active node selected yet
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const { nodes } = evt.detail;
|
|
67
|
+
const treeIdentifier = this.transformModuleStateIdentifierToNodeIdentifier(moduleState.treeIdentifier);
|
|
68
|
+
const identifier = this.transformModuleStateIdentifierToNodeIdentifier(moduleState.identifier);
|
|
69
|
+
const nodeToActivate = nodes.find((node) => (
|
|
70
|
+
(moduleState.treeIdentifier !== null && node.__treeIdentifier === treeIdentifier) ||
|
|
71
|
+
(moduleState.treeIdentifier === null && node.identifier === identifier)
|
|
72
|
+
));
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
if (!nodeToActivate) {
|
|
76
|
+
// The active node was not found. That is fine since we only enhance a
|
|
77
|
+
// subset of nodes here (like an ondemand loaded subtree) and we must not
|
|
78
|
+
// initiate new rootline requests.
|
|
79
|
+
// This will be checked by this.fetchActiveNodeIfMissing().
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (moduleState.treeIdentifier === null) {
|
|
84
|
+
moduleState = ModuleStateStorage.updateWithTreeIdentifier(
|
|
85
|
+
this.moduleStateType,
|
|
86
|
+
this.transformNodeIdentifierToModuleStateIdentifier(nodeToActivate.identifier),
|
|
87
|
+
this.transformNodeIdentifierToModuleStateIdentifier(nodeToActivate.__treeIdentifier)
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
nodeToActivate.checked = true;
|
|
91
|
+
// If the parent was loaded with this chunk, expand it (and its parents) immediately
|
|
92
|
+
const parent = nodes.find((node) => node.__treeIdentifier === nodeToActivate.__parents.join('_'));
|
|
93
|
+
if (parent && !parent.__expanded) {
|
|
94
|
+
this.tree.updateComplete.then(() => this.tree.expandNodeParents(nodeToActivate));
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
protected readonly fetchActiveNodeIfMissing = async (): Promise<void> => {
|
|
99
|
+
const moduleState = ModuleStateStorage.current(this.moduleStateType);
|
|
100
|
+
if (!moduleState.identifier) {
|
|
101
|
+
// No active node selected yet
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (this.tree.nodes.find((node: TreeNodeInterface) => node.checked)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
await this.selectActiveViaRootline(moduleState.identifier);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
private readonly moduleStateUpdated = async (e: CustomEvent<ModuleStateUpdateEvent>): Promise<void> => {
|
|
113
|
+
const identifier = e.detail.state.identifier;
|
|
114
|
+
if (!this.tree) {
|
|
115
|
+
/* @todo store all module state updates in a stack to be consumed by a "slow" tree initialization */
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (identifier && identifier === e.detail.oldState.identifier && this.tree.nodes.find((node: TreeNodeInterface) => node.checked)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (!identifier) {
|
|
123
|
+
console.error('invalid identifier', e.detail);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (this.tree.loading) {
|
|
128
|
+
await this.tree.loadComplete;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const nodeIdentifier = this.transformModuleStateIdentifierToNodeIdentifier(identifier);
|
|
132
|
+
const node = this.tree.nodes.find((node) => node.identifier === nodeIdentifier);
|
|
133
|
+
const selectedNode = this.tree.nodes.find((node: TreeNodeInterface) => node.checked);
|
|
134
|
+
if (node && node === selectedNode) {
|
|
135
|
+
// node is already selected, only ensure parents are expanded
|
|
136
|
+
await this.tree.expandNodeParents(node);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const propagate = false;
|
|
141
|
+
if (node) {
|
|
142
|
+
await this.selectActiveNodeByParents(identifier, node.__parents, propagate);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
await this.selectActiveViaRootline(identifier);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
private async selectActiveNodeByParents(identifier: string, parents: string[], propagate: boolean = true) {
|
|
150
|
+
await this.tree.expandParents(parents);
|
|
151
|
+
const nodeIdentifier = this.transformModuleStateIdentifierToNodeIdentifier(identifier);
|
|
152
|
+
const node = this.tree.nodes.find((node) => node.identifier === nodeIdentifier);
|
|
153
|
+
if (node) {
|
|
154
|
+
this.tree.selectNode(node, propagate);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
return TreeModuleStateClass;
|
|
159
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
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 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, type TemplateResult } from 'lit';
|
|
16
|
+
import '@typo3/backend/element/icon-element';
|
|
17
|
+
|
|
18
|
+
@customElement('typo3-backend-tree-node-toggle')
|
|
19
|
+
export default class TreeNodeToggle extends LitElement {
|
|
20
|
+
@property({ type: String, reflect: true, attribute: 'aria-expanded' }) expanded: string = 'false';
|
|
21
|
+
|
|
22
|
+
protected override render(): TemplateResult | symbol {
|
|
23
|
+
return html`<typo3-backend-icon size="small" identifier="${this.expanded === 'true' ? 'actions-chevron-down' : 'actions-chevron-end'}"></typo3-backend-icon>`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare global {
|
|
28
|
+
interface HTMLElementTagNameMap {
|
|
29
|
+
'typo3-backend-tree-node-toggle': TreeNodeToggle;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
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 License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export enum TreeNodeCommandEnum {
|
|
15
|
+
COPY = 'copy',
|
|
16
|
+
EDIT = 'edit',
|
|
17
|
+
MOVE = 'move',
|
|
18
|
+
DELETE = 'delete',
|
|
19
|
+
NEW = 'new'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export enum TreeNodePositionEnum {
|
|
23
|
+
INSIDE = 'inside',
|
|
24
|
+
BEFORE = 'before',
|
|
25
|
+
AFTER = 'after'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
export interface TreeNodeStatusInformation {
|
|
30
|
+
label: string,
|
|
31
|
+
icon: string,
|
|
32
|
+
severity: number,
|
|
33
|
+
overlayIcon: string,
|
|
34
|
+
priority: number
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface TreeNodeLabel {
|
|
38
|
+
label: string,
|
|
39
|
+
color: string,
|
|
40
|
+
priority: number,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Represents a single node in the tree that is rendered.
|
|
45
|
+
*/
|
|
46
|
+
export interface TreeNodeInterface {
|
|
47
|
+
|
|
48
|
+
// TYPO3\CMS\Backend\Dto\Tree\TreeItem
|
|
49
|
+
type: string,
|
|
50
|
+
identifier: string,
|
|
51
|
+
parentIdentifier: string,
|
|
52
|
+
recordType: string,
|
|
53
|
+
name: string,
|
|
54
|
+
note: string,
|
|
55
|
+
prefix: string,
|
|
56
|
+
suffix: string,
|
|
57
|
+
tooltip: string,
|
|
58
|
+
depth: number,
|
|
59
|
+
hasChildren: boolean,
|
|
60
|
+
loaded: boolean,
|
|
61
|
+
editable: boolean,
|
|
62
|
+
deletable: boolean,
|
|
63
|
+
icon: string,
|
|
64
|
+
overlayIcon: string,
|
|
65
|
+
statusInformation: Array<TreeNodeStatusInformation>,
|
|
66
|
+
labels: Array<TreeNodeLabel>,
|
|
67
|
+
|
|
68
|
+
// Calculated Internal
|
|
69
|
+
__treeIdentifier: string,
|
|
70
|
+
__treeParents: Array<string>,
|
|
71
|
+
__treeDragAction: string,
|
|
72
|
+
__parents: Array<string>,
|
|
73
|
+
__processed: boolean,
|
|
74
|
+
__loading: boolean,
|
|
75
|
+
__hidden: boolean,
|
|
76
|
+
__expanded: boolean,
|
|
77
|
+
__indeterminate: boolean,
|
|
78
|
+
__x: number,
|
|
79
|
+
__y: number,
|
|
80
|
+
|
|
81
|
+
// TYPO3\CMS\Backend\Dto\Tree\PageTreeItem
|
|
82
|
+
nameSourceField?: string,
|
|
83
|
+
workspaceId?: number,
|
|
84
|
+
locked?: boolean,
|
|
85
|
+
stopPageTree?: boolean,
|
|
86
|
+
mountPoint?: number,
|
|
87
|
+
doktype?: number;
|
|
88
|
+
|
|
89
|
+
// TYPO3\CMS\Backend\Dto\Tree\FileTreeItem
|
|
90
|
+
pathIdentifier?: string,
|
|
91
|
+
storage?: number,
|
|
92
|
+
resourceType?: string,
|
|
93
|
+
|
|
94
|
+
// TYPO3\CMS\Backend\Dto\Tree\SelectTreeItem
|
|
95
|
+
checked?: boolean,
|
|
96
|
+
selectable?: boolean,
|
|
97
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
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, type TemplateResult } from 'lit';
|
|
15
|
+
import { customElement, property } from 'lit/decorators';
|
|
16
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
17
|
+
import DebounceEvent from '@typo3/core/event/debounce-event';
|
|
18
|
+
import '@typo3/backend/element/icon-element';
|
|
19
|
+
import { Tree } from './tree';
|
|
20
|
+
import type { TreeNodeInterface } from './tree-node';
|
|
21
|
+
|
|
22
|
+
@customElement('typo3-backend-tree-toolbar')
|
|
23
|
+
export class TreeToolbar extends LitElement {
|
|
24
|
+
@property({ type: Tree }) tree: Tree = null;
|
|
25
|
+
protected settings = {
|
|
26
|
+
searchInput: '.search-input',
|
|
27
|
+
filterTimeout: 450
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected override firstUpdated(): void
|
|
35
|
+
{
|
|
36
|
+
const inputEl = this.querySelector(this.settings.searchInput) as HTMLInputElement;
|
|
37
|
+
if (inputEl) {
|
|
38
|
+
new DebounceEvent('input', (evt: InputEvent) => {
|
|
39
|
+
const el = evt.target as HTMLInputElement;
|
|
40
|
+
this.tree.filter(el.value.trim());
|
|
41
|
+
}, this.settings.filterTimeout).bindTo(inputEl);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected override render(): TemplateResult {
|
|
46
|
+
return html`
|
|
47
|
+
<div class="tree-toolbar">
|
|
48
|
+
<div class="tree-toolbar__menu">
|
|
49
|
+
<div class="tree-toolbar__search">
|
|
50
|
+
<label for="toolbarSearch" class="visually-hidden">
|
|
51
|
+
${lll('labels.label.searchString')}
|
|
52
|
+
</label>
|
|
53
|
+
<input type="search" id="toolbarSearch" class="form-control form-control-sm search-input" placeholder="${lll('tree.searchTermInfo')}">
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="tree-toolbar__submenu">
|
|
57
|
+
<button
|
|
58
|
+
type="button"
|
|
59
|
+
class="tree-toolbar__menuitem dropdown-toggle dropdown-toggle-no-chevron float-end"
|
|
60
|
+
data-bs-toggle="dropdown"
|
|
61
|
+
aria-expanded="false"
|
|
62
|
+
aria-label="${lll('labels.openTreeOptionsMenu')}"
|
|
63
|
+
>
|
|
64
|
+
<typo3-backend-icon identifier="actions-menu-alternative" size="small"></typo3-backend-icon>
|
|
65
|
+
</button>
|
|
66
|
+
<ul class="dropdown-menu dropdown-menu-end">
|
|
67
|
+
<li>
|
|
68
|
+
<button class="dropdown-item" @click="${() => this.refreshTree()}">
|
|
69
|
+
<span class="dropdown-item-columns">
|
|
70
|
+
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
|
|
71
|
+
<typo3-backend-icon identifier="actions-refresh" size="small"></typo3-backend-icon>
|
|
72
|
+
</span>
|
|
73
|
+
<span class="dropdown-item-column dropdown-item-column-title">
|
|
74
|
+
${lll('labels.refresh')}
|
|
75
|
+
</span>
|
|
76
|
+
</span>
|
|
77
|
+
</button>
|
|
78
|
+
</li>
|
|
79
|
+
<li>
|
|
80
|
+
<button class="dropdown-item" @click="${(evt: MouseEvent) => this.collapseAll(evt)}">
|
|
81
|
+
<span class="dropdown-item-columns">
|
|
82
|
+
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
|
|
83
|
+
<typo3-backend-icon identifier="apps-pagetree-category-collapse-all" size="small"></typo3-backend-icon>
|
|
84
|
+
</span>
|
|
85
|
+
<span class="dropdown-item-column dropdown-item-column-title">
|
|
86
|
+
${lll('labels.collapse')}
|
|
87
|
+
</span>
|
|
88
|
+
</span>
|
|
89
|
+
</button>
|
|
90
|
+
</li>
|
|
91
|
+
</ul>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected refreshTree(): void {
|
|
98
|
+
this.tree.refreshOrFilterTree();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
protected collapseAll(evt: MouseEvent): void {
|
|
102
|
+
evt.preventDefault();
|
|
103
|
+
// Only collapse nodes that aren't on the root level
|
|
104
|
+
// @TODO Implement into tree
|
|
105
|
+
this.tree.nodes.forEach((node: TreeNodeInterface) => {
|
|
106
|
+
if (node.__parents.length) {
|
|
107
|
+
this.tree.hideChildren(node);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
declare global {
|
|
114
|
+
interface HTMLElementTagNameMap {
|
|
115
|
+
'typo3-backend-tree-toolbar': TreeToolbar;
|
|
116
|
+
}
|
|
117
|
+
}
|