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,465 @@
|
|
|
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, query } from 'lit/decorators';
|
|
16
|
+
import '@typo3/backend/element/icon-element';
|
|
17
|
+
import { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
18
|
+
import '@typo3/backend/tree/tree-toolbar';
|
|
19
|
+
import { TreeNodePositionEnum, type TreeNodeInterface } from '@typo3/backend/tree/tree-node';
|
|
20
|
+
import { FileStorageTree } from '@typo3/backend/tree/file-storage-tree';
|
|
21
|
+
import { TreeModuleState } from '@typo3/backend/tree/tree-module-state';
|
|
22
|
+
import ContextMenu from '@typo3/backend/context-menu';
|
|
23
|
+
import Notification from '@typo3/backend/notification';
|
|
24
|
+
import { ModuleStateStorage } from '@typo3/backend/storage/module-state-storage';
|
|
25
|
+
import { ModuleUtility } from '@typo3/backend/module';
|
|
26
|
+
import { FileListDragDropEvent, type FileListDragDropDetail } from '@typo3/filelist/file-list-dragdrop';
|
|
27
|
+
import { Resource, type ResourceInterface } from '@typo3/backend/resource/resource';
|
|
28
|
+
import { DataTransferTypes } from '@typo3/backend/enum/data-transfer-types';
|
|
29
|
+
import type { TreeToolbar } from '@typo3/backend/tree/tree-toolbar';
|
|
30
|
+
import type { DataTransferStringItem } from '@typo3/backend/tree/tree';
|
|
31
|
+
|
|
32
|
+
export const navigationComponentName: string = 'typo3-backend-navigation-component-filestoragetree';
|
|
33
|
+
|
|
34
|
+
interface DragDropTargetPosition {
|
|
35
|
+
target: TreeNodeInterface,
|
|
36
|
+
position: TreeNodePositionEnum
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* FileStorageTree which allows for drag+drop, and in-place editing, as well as
|
|
41
|
+
* tree highlighting from the outside
|
|
42
|
+
*/
|
|
43
|
+
@customElement('typo3-backend-navigation-component-filestorage-tree')
|
|
44
|
+
export class EditableFileStorageTree extends FileStorageTree {
|
|
45
|
+
protected override allowNodeDrag: boolean = true;
|
|
46
|
+
|
|
47
|
+
protected override handleNodeMove(
|
|
48
|
+
node: TreeNodeInterface,
|
|
49
|
+
target: TreeNodeInterface,
|
|
50
|
+
position: TreeNodePositionEnum
|
|
51
|
+
): void {
|
|
52
|
+
if (!this.isDropAllowed(target, node)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const options = this.getDropCommandDetails(target, node, position);
|
|
56
|
+
if (options === null) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const fileOperationCollection = FileOperationCollection.fromNodePositionOptions(options);
|
|
60
|
+
const operationConflicts = fileOperationCollection.getConflictingOperationsForTreeNode(options.target);
|
|
61
|
+
if (operationConflicts.length > 0) {
|
|
62
|
+
operationConflicts.forEach((operation: FileOperation) => {
|
|
63
|
+
Notification.showMessage(
|
|
64
|
+
TYPO3.lang['drop.conflict'],
|
|
65
|
+
TYPO3.lang['mess.drop.conflict']
|
|
66
|
+
.replace('%s', operation.resource.name)
|
|
67
|
+
.replace('%s', decodeURIComponent(options.target.identifier)),
|
|
68
|
+
SeverityEnum.error
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.initiateDropAction(fileOperationCollection);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
protected override createDataTransferItemsFromNode(node: TreeNodeInterface): DataTransferStringItem[] {
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
type: DataTransferTypes.treenode,
|
|
80
|
+
data: this.getNodeTreeIdentifier(node),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
type: DataTransferTypes.falResources,
|
|
84
|
+
data: JSON.stringify([
|
|
85
|
+
FileResource.fromTreeNode(node),
|
|
86
|
+
]),
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
protected override handleNodeDragOver(event: DragEvent): boolean {
|
|
92
|
+
// @todo incorporate isDropAllowed
|
|
93
|
+
if (super.handleNodeDragOver(event)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// @TODO Unity with parent
|
|
98
|
+
if (event.dataTransfer.types.includes(DataTransferTypes.falResources)) {
|
|
99
|
+
|
|
100
|
+
// Find the current hovered node
|
|
101
|
+
// Exit when no node was hovered
|
|
102
|
+
const targetNode = this.getNodeFromDragEvent(event);
|
|
103
|
+
if (targetNode === null) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
this.cleanDrag();
|
|
108
|
+
|
|
109
|
+
// Add hover styling to the current hovered node
|
|
110
|
+
// element, during the drag the default mouse over
|
|
111
|
+
// is disabled by the browser
|
|
112
|
+
const hoverElement = this.getElementFromNode(targetNode);
|
|
113
|
+
hoverElement.classList.add('node-hover');
|
|
114
|
+
|
|
115
|
+
// Open node with children while holding the
|
|
116
|
+
// node/element over this node for 1 second
|
|
117
|
+
if (targetNode.hasChildren && !targetNode.__expanded) {
|
|
118
|
+
if (this.openNodeTimeout.targetNode != targetNode) {
|
|
119
|
+
this.openNodeTimeout.targetNode = targetNode;
|
|
120
|
+
clearTimeout(this.openNodeTimeout.timeout);
|
|
121
|
+
this.openNodeTimeout.timeout = setTimeout(() => {
|
|
122
|
+
this.showChildren(this.openNodeTimeout.targetNode);
|
|
123
|
+
this.openNodeTimeout.targetNode = null;
|
|
124
|
+
this.openNodeTimeout.timeout = null;
|
|
125
|
+
}, 1000);
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
clearTimeout(this.openNodeTimeout.timeout);
|
|
129
|
+
this.openNodeTimeout.targetNode = null;
|
|
130
|
+
this.openNodeTimeout.timeout = null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// allow drop
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
protected override getTooltipDescription(node: TreeNodeInterface): string {
|
|
142
|
+
return decodeURIComponent(node.identifier);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
protected override handleNodeDrop(event: DragEvent): boolean {
|
|
146
|
+
if (super.handleNodeDrop(event)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
if (event.dataTransfer.types.includes(DataTransferTypes.falResources)) {
|
|
150
|
+
const node = this.getNodeFromDragEvent(event);
|
|
151
|
+
if (node === null) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (node) {
|
|
156
|
+
const targetResource = FileResource.fromTreeNode(node);
|
|
157
|
+
const fileOperationCollection = FileOperationCollection.fromDataTransfer(event.dataTransfer, targetResource);
|
|
158
|
+
const operationConflicts = fileOperationCollection.getConflictingOperationsForTreeNode(node);
|
|
159
|
+
if (operationConflicts.length > 0) {
|
|
160
|
+
operationConflicts.forEach((operation: FileOperation) => {
|
|
161
|
+
Notification.showMessage(
|
|
162
|
+
TYPO3.lang['drop.conflict'],
|
|
163
|
+
TYPO3.lang['mess.drop.conflict']
|
|
164
|
+
.replace('%s', operation.resource.name)
|
|
165
|
+
.replace('%s', decodeURIComponent(node.identifier)),
|
|
166
|
+
SeverityEnum.error
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
// allow drop
|
|
172
|
+
event.preventDefault();
|
|
173
|
+
this.initiateDropAction(fileOperationCollection);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Prepares all the details, which node is dropped on which other, if it is inside or before
|
|
182
|
+
* the target node (= droppedNode).
|
|
183
|
+
*/
|
|
184
|
+
private getDropCommandDetails(droppedNode: TreeNodeInterface, draggingNode: TreeNodeInterface, position: TreeNodePositionEnum): null | NodePositionOptions {
|
|
185
|
+
const nodes = this.nodes;
|
|
186
|
+
const identifier = draggingNode.identifier;
|
|
187
|
+
let target = droppedNode/* || draggingNode*/;
|
|
188
|
+
|
|
189
|
+
if (identifier === target.identifier) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (position === TreeNodePositionEnum.BEFORE) {
|
|
194
|
+
const index = nodes.indexOf(droppedNode);
|
|
195
|
+
const positionAndTarget = this.setNodePositionAndTarget(index);
|
|
196
|
+
if (positionAndTarget === null) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
position = positionAndTarget.position;
|
|
200
|
+
target = positionAndTarget.target;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return {
|
|
204
|
+
node: draggingNode,
|
|
205
|
+
identifier: identifier, // dragged node id
|
|
206
|
+
target: target, // hovered node
|
|
207
|
+
position: position // before, in, after
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Returns position and target node where it should be added
|
|
213
|
+
*/
|
|
214
|
+
private setNodePositionAndTarget(index: number): null | DragDropTargetPosition {
|
|
215
|
+
const nodes = this.nodes;
|
|
216
|
+
const nodeOver = nodes[index];
|
|
217
|
+
const nodeOverDepth = nodeOver.depth;
|
|
218
|
+
if (index > 0) {
|
|
219
|
+
index--;
|
|
220
|
+
}
|
|
221
|
+
const nodeBefore = nodes[index];
|
|
222
|
+
const nodeBeforeDepth = nodeBefore.depth;
|
|
223
|
+
const target = this.nodes[index];
|
|
224
|
+
|
|
225
|
+
if (nodeBeforeDepth === nodeOverDepth) {
|
|
226
|
+
return { position: TreeNodePositionEnum.AFTER, target };
|
|
227
|
+
} else if (nodeBeforeDepth < nodeOverDepth) {
|
|
228
|
+
return { position: TreeNodePositionEnum.INSIDE, target };
|
|
229
|
+
} else {
|
|
230
|
+
for (let i = index; i >= 0; i--) {
|
|
231
|
+
if (nodes[i].depth === nodeOverDepth) {
|
|
232
|
+
return { position: TreeNodePositionEnum.AFTER, target: this.nodes[i] };
|
|
233
|
+
} else if (nodes[i].depth < nodeOverDepth) {
|
|
234
|
+
return { position: TreeNodePositionEnum.AFTER, target: nodes[i] };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private isDropAllowed(target: TreeNodeInterface, draggingNode: TreeNodeInterface): boolean {
|
|
242
|
+
if (target === draggingNode) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
// @todo: why needed?
|
|
246
|
+
if (!this.isOverRoot) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
private initiateDropAction(fileOperationCollection: FileOperationCollection): void {
|
|
253
|
+
const detail: FileListDragDropDetail = {
|
|
254
|
+
action: 'transfer',
|
|
255
|
+
resources: fileOperationCollection.getResources(),
|
|
256
|
+
target: fileOperationCollection.target,
|
|
257
|
+
};
|
|
258
|
+
top.document.dispatchEvent(new CustomEvent(FileListDragDropEvent.transfer, { detail: detail }));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Responsible for setting up the viewport for the Navigation Component for the File Tree
|
|
264
|
+
*/
|
|
265
|
+
@customElement('typo3-backend-navigation-component-filestoragetree')
|
|
266
|
+
export class FileStorageTreeNavigationComponent extends TreeModuleState(LitElement) {
|
|
267
|
+
@query('.tree-wrapper') tree: EditableFileStorageTree;
|
|
268
|
+
@query('typo3-backend-tree-toolbar') toolbar: TreeToolbar;
|
|
269
|
+
|
|
270
|
+
protected override moduleStateType: string = 'media';
|
|
271
|
+
|
|
272
|
+
public override connectedCallback(): void {
|
|
273
|
+
super.connectedCallback();
|
|
274
|
+
document.addEventListener('typo3:filestoragetree:refresh', this.refresh);
|
|
275
|
+
document.addEventListener('typo3:filestoragetree:selectFirstNode', this.selectFirstNode);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
public override disconnectedCallback(): void {
|
|
279
|
+
document.removeEventListener('typo3:filestoragetree:refresh', this.refresh);
|
|
280
|
+
document.removeEventListener('typo3:filestoragetree:selectFirstNode', this.selectFirstNode);
|
|
281
|
+
super.disconnectedCallback();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// disable shadow dom for now
|
|
285
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
protected override render(): TemplateResult {
|
|
290
|
+
const treeSetup = {
|
|
291
|
+
dataUrl: top.TYPO3.settings.ajaxUrls.filestorage_tree_data,
|
|
292
|
+
rootlineUrl: top.TYPO3.settings.ajaxUrls.filestorage_tree_rootline,
|
|
293
|
+
filterUrl: top.TYPO3.settings.ajaxUrls.filestorage_tree_filter,
|
|
294
|
+
showIcons: true
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
return html`
|
|
298
|
+
<div id="typo3-filestoragetree" class="tree">
|
|
299
|
+
<typo3-backend-tree-toolbar .tree="${this.tree}" id="filestoragetree-toolbar"></typo3-backend-tree-toolbar>
|
|
300
|
+
<div class="navigation-tree-container">
|
|
301
|
+
<typo3-backend-navigation-component-filestorage-tree
|
|
302
|
+
id="typo3-filestoragetree-tree"
|
|
303
|
+
class="tree-wrapper"
|
|
304
|
+
.setup=${treeSetup}
|
|
305
|
+
@typo3:tree:node-selected=${this.loadContent}
|
|
306
|
+
@typo3:tree:node-context=${this.showContextMenu}
|
|
307
|
+
@typo3:tree:nodes-prepared=${this.selectActiveNodeInLoadedNodes}
|
|
308
|
+
@tree:initialized=${this.fetchActiveNodeIfMissing}
|
|
309
|
+
></typo3-backend-navigation-component-filestorage-tree>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
`;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
protected override firstUpdated(): void {
|
|
316
|
+
this.toolbar.tree = this.tree;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
protected override transformModuleStateIdentifierToNodeIdentifier(moduleStateIdentifier: string): string {
|
|
320
|
+
return encodeURIComponent(moduleStateIdentifier);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
protected override transformNodeIdentifierToModuleStateIdentifier(nodeIdentifier: string): string {
|
|
324
|
+
return decodeURIComponent(nodeIdentifier);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
private readonly refresh = (): void => {
|
|
328
|
+
this.tree.refreshOrFilterTree();
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
private readonly selectFirstNode = (): void => {
|
|
332
|
+
const node = this.tree.nodes[0];
|
|
333
|
+
if (node) {
|
|
334
|
+
this.tree.selectNode(node, true);
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
private readonly loadContent = (evt: CustomEvent): void => {
|
|
339
|
+
const node = evt.detail.node as TreeNodeInterface;
|
|
340
|
+
if (!node?.checked) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// remember the selected folder in the global state
|
|
345
|
+
ModuleStateStorage.updateWithTreeIdentifier('media', decodeURIComponent(node.identifier), decodeURIComponent(node.__treeIdentifier));
|
|
346
|
+
|
|
347
|
+
if (evt.detail.propagate === false) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Load the currently selected module with the updated URL
|
|
352
|
+
const moduleMenu = top.TYPO3.ModuleMenu.App;
|
|
353
|
+
let contentUrl = ModuleUtility.getFromName(moduleMenu.getCurrentModule()).link;
|
|
354
|
+
contentUrl += contentUrl.includes('?') ? '&' : '?';
|
|
355
|
+
top.TYPO3.Backend.ContentContainer.setUrl(contentUrl + 'id=' + node.identifier);
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
private readonly showContextMenu = (evt: CustomEvent): void => {
|
|
359
|
+
const node = evt.detail.node as TreeNodeInterface;
|
|
360
|
+
if (!node) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
ContextMenu.show(
|
|
364
|
+
node.recordType,
|
|
365
|
+
decodeURIComponent(node.identifier),
|
|
366
|
+
'tree',
|
|
367
|
+
'',
|
|
368
|
+
'',
|
|
369
|
+
this.tree.getElementFromNode(node),
|
|
370
|
+
evt.detail.originalEvent as PointerEvent
|
|
371
|
+
);
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
interface NodePositionOptions {
|
|
376
|
+
node: TreeNodeInterface,
|
|
377
|
+
target: TreeNodeInterface,
|
|
378
|
+
identifier: string,
|
|
379
|
+
position: TreeNodePositionEnum
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Internal helper class for drag&drop handling
|
|
385
|
+
*/
|
|
386
|
+
class FileOperation {
|
|
387
|
+
public constructor(
|
|
388
|
+
public readonly resource: ResourceInterface,
|
|
389
|
+
public readonly position: TreeNodePositionEnum = TreeNodePositionEnum.INSIDE
|
|
390
|
+
) {
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
public hasConflictWithTreeNode(node: TreeNodeInterface): boolean {
|
|
394
|
+
return this.resource.type === 'folder' && (
|
|
395
|
+
node.identifier === this.resource.identifier
|
|
396
|
+
|| node.__parents[0] == this.resource.identifier
|
|
397
|
+
|| node.__parents.includes(this.resource.identifier)
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
class FileResource extends Resource {
|
|
403
|
+
public static fromTreeNode(node: TreeNodeInterface): ResourceInterface {
|
|
404
|
+
return new FileResource(
|
|
405
|
+
decodeURIComponent(node.resourceType),
|
|
406
|
+
decodeURIComponent(node.identifier),
|
|
407
|
+
decodeURIComponent(node.name)
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
class FileOperationCollection {
|
|
413
|
+
protected constructor(
|
|
414
|
+
public readonly operations: FileOperation[],
|
|
415
|
+
public readonly target: ResourceInterface,
|
|
416
|
+
) {
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
public static fromDataTransfer(dataTransfer: DataTransfer, target: ResourceInterface): FileOperationCollection {
|
|
420
|
+
return FileOperationCollection.fromArray(JSON.parse(dataTransfer.getData(DataTransferTypes.falResources)), target);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
public static fromArray(items: ResourceInterface[], target: ResourceInterface): FileOperationCollection {
|
|
424
|
+
const operations: FileOperation[] = [];
|
|
425
|
+
|
|
426
|
+
for (const item of items) {
|
|
427
|
+
operations.push(new FileOperation(item, TreeNodePositionEnum.INSIDE));
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return new FileOperationCollection(operations, target);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
public static fromNodePositionOptions(options: NodePositionOptions): FileOperationCollection {
|
|
434
|
+
const resource = FileResource.fromTreeNode(options.node);
|
|
435
|
+
const targetResource = FileResource.fromTreeNode(options.target);
|
|
436
|
+
const operations: FileOperation[] = [
|
|
437
|
+
new FileOperation(
|
|
438
|
+
resource,
|
|
439
|
+
options.position
|
|
440
|
+
)
|
|
441
|
+
];
|
|
442
|
+
|
|
443
|
+
return new FileOperationCollection(operations, targetResource);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
public getConflictingOperationsForTreeNode(node: TreeNodeInterface): FileOperation[] {
|
|
447
|
+
return this.operations.filter((operation: FileOperation) => operation.hasConflictWithTreeNode(node));
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
public getResources(): ResourceInterface[] {
|
|
451
|
+
const resources: ResourceInterface[] = [];
|
|
452
|
+
this.operations.forEach((operation: FileOperation) => {
|
|
453
|
+
resources.push(operation.resource);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
return resources;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
declare global {
|
|
461
|
+
interface HTMLElementTagNameMap {
|
|
462
|
+
'typo3-backend-navigation-component-filestorage-tree': EditableFileStorageTree;
|
|
463
|
+
'typo3-backend-navigation-component-filestoragetree': FileStorageTreeNavigationComponent;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 type { TreeNodeInterface } from '@typo3/backend/tree/tree-node';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A tree for folders / storages
|
|
19
|
+
*/
|
|
20
|
+
export class FileStorageTree extends Tree
|
|
21
|
+
{
|
|
22
|
+
public constructor() {
|
|
23
|
+
super();
|
|
24
|
+
this.settings.defaultProperties = {
|
|
25
|
+
hasChildren: false,
|
|
26
|
+
nameSourceField: 'title',
|
|
27
|
+
type: 'sys_file',
|
|
28
|
+
prefix: '',
|
|
29
|
+
suffix: '',
|
|
30
|
+
locked: false,
|
|
31
|
+
loaded: false,
|
|
32
|
+
overlayIcon: '',
|
|
33
|
+
selectable: true,
|
|
34
|
+
expanded: false,
|
|
35
|
+
checked: false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
protected override getNodeTitle(node: TreeNodeInterface): string {
|
|
40
|
+
return decodeURIComponent(node.name);
|
|
41
|
+
}
|
|
42
|
+
}
|