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,69 @@
|
|
|
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 { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
import DocumentService from '@typo3/core/document-service';
|
|
17
|
+
import Modal from '@typo3/backend/modal';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Module: @typo3/filelist/file-delete
|
|
21
|
+
* @exports @typo3/filelist/file-delete
|
|
22
|
+
*/
|
|
23
|
+
class FileDelete {
|
|
24
|
+
constructor() {
|
|
25
|
+
DocumentService.ready().then((): void => {
|
|
26
|
+
new RegularEvent('click', (e: Event, eventTarget: HTMLElement): void => {
|
|
27
|
+
e.preventDefault();
|
|
28
|
+
let redirectUrl = eventTarget.dataset.redirectUrl;
|
|
29
|
+
redirectUrl = (redirectUrl)
|
|
30
|
+
? encodeURIComponent(redirectUrl)
|
|
31
|
+
: encodeURIComponent(top.list_frame.document.location.pathname + top.list_frame.document.location.search);
|
|
32
|
+
|
|
33
|
+
const identifier = eventTarget.dataset.filelistDeleteIdentifier;
|
|
34
|
+
const deleteType = eventTarget.dataset.filelistDeleteType;
|
|
35
|
+
const deleteUrl = eventTarget.dataset.filelistDeleteUrl + '&data[delete][0][data]=' + encodeURIComponent(identifier);
|
|
36
|
+
const target = deleteUrl + '&data[delete][0][redirect]=' + redirectUrl;
|
|
37
|
+
if (eventTarget.dataset.filelistDeleteCheck) {
|
|
38
|
+
const modal = Modal.confirm(eventTarget.dataset.title, eventTarget.dataset.bsContent, SeverityEnum.warning, [
|
|
39
|
+
{
|
|
40
|
+
text: TYPO3.lang['buttons.confirm.delete_file.no'] || 'Cancel',
|
|
41
|
+
active: true,
|
|
42
|
+
btnClass: 'btn-default',
|
|
43
|
+
name: 'no',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
text: TYPO3.lang['buttons.confirm.' + deleteType + '.yes'] || 'Yes, delete this file or folder',
|
|
47
|
+
btnClass: 'btn-warning',
|
|
48
|
+
name: 'yes',
|
|
49
|
+
},
|
|
50
|
+
]);
|
|
51
|
+
modal.addEventListener('button.clicked', (evt: Event): void => {
|
|
52
|
+
const element = evt.target as HTMLButtonElement;
|
|
53
|
+
const name = element.name;
|
|
54
|
+
if (name === 'no') {
|
|
55
|
+
modal.hideModal();
|
|
56
|
+
} else if (name === 'yes') {
|
|
57
|
+
modal.hideModal();
|
|
58
|
+
top.list_frame.location.href = target;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
} else {
|
|
62
|
+
top.list_frame.location.href = target;
|
|
63
|
+
}
|
|
64
|
+
}).delegateTo(document, '[data-filelist-delete="true"]');
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default new FileDelete();
|
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
import type { ResourceInterface } from '@typo3/backend/resource/resource';
|
|
16
|
+
|
|
17
|
+
export interface FileListActionDetail {
|
|
18
|
+
event: Event;
|
|
19
|
+
action: string;
|
|
20
|
+
resources: [ResourceInterface, ...ResourceInterface[]];
|
|
21
|
+
trigger: HTMLElement | null;
|
|
22
|
+
url: string | null;
|
|
23
|
+
originalAction: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export enum FileListActionEvent {
|
|
27
|
+
primary = 'typo3:filelist:resource:action:primary',
|
|
28
|
+
primaryContextmenu = 'typo3:filelist:resource:action:primaryContextmenu',
|
|
29
|
+
show = 'typo3:filelist:resource:action:show',
|
|
30
|
+
rename = 'typo3:filelist:resource:action:rename',
|
|
31
|
+
select = 'typo3:filelist:resource:action:select',
|
|
32
|
+
download = 'typo3:filelist:resource:action:download',
|
|
33
|
+
updateOnlineMedia = 'typo3:filelist:resource:action:updateOnlineMedia',
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export enum FileListActionSelector {
|
|
37
|
+
elementSelector = '[data-filelist-element]',
|
|
38
|
+
actionSelector = '[data-filelist-action]',
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class FileListActionUtility {
|
|
42
|
+
public static createResourceFromContextDataset(dataset: DOMStringMap): ResourceInterface {
|
|
43
|
+
const resource: ResourceInterface = {
|
|
44
|
+
type: dataset.filecontextType,
|
|
45
|
+
identifier: dataset.filecontextIdentifier,
|
|
46
|
+
name: dataset.filecontextName,
|
|
47
|
+
hasPreview: false,
|
|
48
|
+
uid: dataset.filecontextUid ? parseInt(dataset.filecontextUid, 10) : null,
|
|
49
|
+
metaUid: dataset.filecontextMetaUid ? parseInt(dataset.filecontextMetaUid, 10) : null,
|
|
50
|
+
url: dataset.filecontextUid ? dataset.url : null,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return resource;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public static getResourceForElement(element: HTMLElement): ResourceInterface
|
|
57
|
+
{
|
|
58
|
+
const resource: ResourceInterface = {
|
|
59
|
+
type: element.dataset.filelistType,
|
|
60
|
+
identifier: element.dataset.filelistIdentifier,
|
|
61
|
+
name: element.dataset.filelistName,
|
|
62
|
+
hasPreview: 'filelistPreview' in element.dataset && element.dataset.filelistPreview.trim() === 'true',
|
|
63
|
+
uid: element.dataset.filelistUid ? parseInt(element.dataset.filelistUid, 10) : null,
|
|
64
|
+
metaUid: element.dataset.filelistMetaUid ? parseInt(element.dataset.filelistMetaUid, 10) : null,
|
|
65
|
+
url: element.dataset.filelistUid ? element.dataset.filelistUrl : null,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
return resource;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
class FileListActions {
|
|
73
|
+
constructor() {
|
|
74
|
+
new RegularEvent('contextmenu', (event: Event, target: HTMLElement): void => {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
event.stopImmediatePropagation();
|
|
77
|
+
|
|
78
|
+
const detail: FileListActionDetail = this.getActionDetail(event, target);
|
|
79
|
+
switch (detail.action) {
|
|
80
|
+
case 'primary':
|
|
81
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.primaryContextmenu, { detail: detail }));
|
|
82
|
+
break;
|
|
83
|
+
default:
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}).delegateTo(document, FileListActionSelector.actionSelector);
|
|
87
|
+
|
|
88
|
+
new RegularEvent('click', (event: Event, target: HTMLElement): void => {
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
const detail: FileListActionDetail = this.getActionDetail(event, target);
|
|
91
|
+
switch (detail.action) {
|
|
92
|
+
case 'primary':
|
|
93
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.primary, { detail: detail }));
|
|
94
|
+
break;
|
|
95
|
+
case 'show':
|
|
96
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.show, { detail: detail }));
|
|
97
|
+
break;
|
|
98
|
+
case 'select':
|
|
99
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.select, { detail: detail }));
|
|
100
|
+
break;
|
|
101
|
+
case 'rename':
|
|
102
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.rename, { detail: detail }));
|
|
103
|
+
break;
|
|
104
|
+
case 'download':
|
|
105
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.download, { detail: detail }));
|
|
106
|
+
break;
|
|
107
|
+
case 'updateOnlineMedia':
|
|
108
|
+
document.dispatchEvent(new CustomEvent(FileListActionEvent.updateOnlineMedia, { detail: detail }));
|
|
109
|
+
break;
|
|
110
|
+
default:
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}).delegateTo(document, FileListActionSelector.actionSelector);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private getActionDetail(event: Event, target: HTMLElement): FileListActionDetail {
|
|
117
|
+
const action = target.dataset.filelistAction;
|
|
118
|
+
const element = target.closest(FileListActionSelector.elementSelector) as HTMLElement;
|
|
119
|
+
const resource = FileListActionUtility.getResourceForElement(element);
|
|
120
|
+
const detail: FileListActionDetail = {
|
|
121
|
+
event: event,
|
|
122
|
+
trigger: target,
|
|
123
|
+
action: action,
|
|
124
|
+
resources: [resource],
|
|
125
|
+
url: target.dataset.filelistActionUrl ?? null,
|
|
126
|
+
originalAction: null
|
|
127
|
+
};
|
|
128
|
+
return detail;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export default new FileListActions();
|
|
@@ -0,0 +1,139 @@
|
|
|
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
|
+
import type { ResourceInterface } from '@typo3/backend/resource/resource';
|
|
16
|
+
import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selection';
|
|
17
|
+
import { FileListActionSelector, FileListActionUtility } from '@typo3/filelist/file-list-actions';
|
|
18
|
+
import { DataTransferTypes } from '@typo3/backend/enum/data-transfer-types';
|
|
19
|
+
import type { DragTooltipMetadata, DragDropThumbnail } from '@typo3/backend/drag-tooltip';
|
|
20
|
+
|
|
21
|
+
export interface FileListDragDropDetail {
|
|
22
|
+
action: string;
|
|
23
|
+
resources: ResourceInterface[];
|
|
24
|
+
target: ResourceInterface;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export enum FileListDragDropEvent {
|
|
28
|
+
transfer = 'typo3:filelist:resource:dragdrop:transfer',
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
class FileListDragDrop {
|
|
32
|
+
private readonly previewSize: number = 32;
|
|
33
|
+
|
|
34
|
+
constructor() {
|
|
35
|
+
const selector = FileListActionSelector.elementSelector + '[draggable="true"]';
|
|
36
|
+
|
|
37
|
+
new RegularEvent('dragstart', (event: DragEvent, target: HTMLElement): void => {
|
|
38
|
+
const selectedItems: ResourceInterface[] = [];
|
|
39
|
+
let icon = '';
|
|
40
|
+
let label = '';
|
|
41
|
+
|
|
42
|
+
const checkedItems = document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector + ':checked') as NodeListOf<HTMLInputElement>;
|
|
43
|
+
if (checkedItems.length) {
|
|
44
|
+
checkedItems.forEach((checkbox: HTMLInputElement) => {
|
|
45
|
+
if (checkbox.checked) {
|
|
46
|
+
const element = checkbox.closest(FileListActionSelector.elementSelector) as HTMLInputElement;
|
|
47
|
+
element.dataset.filelistDragdropTransferItem = 'true';
|
|
48
|
+
const resource = FileListActionUtility.getResourceForElement(element);
|
|
49
|
+
selectedItems.push(resource);
|
|
50
|
+
label = element.dataset.filelistName;
|
|
51
|
+
icon = element.dataset.filelistIcon;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
const element = target.closest(FileListActionSelector.elementSelector) as HTMLElement;
|
|
56
|
+
element.dataset.filelistDragdropTransferItem = 'true';
|
|
57
|
+
const resource = FileListActionUtility.getResourceForElement(element);
|
|
58
|
+
selectedItems.push(resource);
|
|
59
|
+
label = element.dataset.filelistName;
|
|
60
|
+
icon = element.dataset.filelistIcon;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
64
|
+
event.dataTransfer.setData(DataTransferTypes.falResources, JSON.stringify(selectedItems));
|
|
65
|
+
|
|
66
|
+
const metadata: DragTooltipMetadata = {
|
|
67
|
+
tooltipIconIdentifier: selectedItems.length > 1 ? 'apps-clipboard-images' : icon,
|
|
68
|
+
tooltipLabel: selectedItems.length > 1 ? this.getPreviewLabel(selectedItems) : label,
|
|
69
|
+
thumbnails: this.getPreviewItems(selectedItems),
|
|
70
|
+
};
|
|
71
|
+
event.dataTransfer.setData(DataTransferTypes.dragTooltip, JSON.stringify(metadata));
|
|
72
|
+
}).delegateTo(document, selector);
|
|
73
|
+
|
|
74
|
+
new RegularEvent('dragover', (event: DragEvent, target: HTMLElement): void => {
|
|
75
|
+
const resource = FileListActionUtility.getResourceForElement(target);
|
|
76
|
+
if (this.isDropAllowedOnResoruce(resource)) {
|
|
77
|
+
event.dataTransfer.dropEffect = 'move';
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
target.classList.add('success');
|
|
80
|
+
}
|
|
81
|
+
}, { capture: true }).delegateTo(document, selector);
|
|
82
|
+
|
|
83
|
+
new RegularEvent('drop', (event: DragEvent, target: HTMLElement): void => {
|
|
84
|
+
const detail: FileListDragDropDetail = {
|
|
85
|
+
action: 'transfer',
|
|
86
|
+
resources: JSON.parse(event.dataTransfer.getData(DataTransferTypes.falResources) ?? '{}'),
|
|
87
|
+
target: FileListActionUtility.getResourceForElement(target),
|
|
88
|
+
};
|
|
89
|
+
top.document.dispatchEvent(new CustomEvent(FileListDragDropEvent.transfer, { detail: detail }));
|
|
90
|
+
}, { capture: true, passive: true }).delegateTo(document, selector);
|
|
91
|
+
|
|
92
|
+
new RegularEvent('dragend', (/*event: DragEvent*/): void => {
|
|
93
|
+
this.reset();
|
|
94
|
+
}, { capture: true, passive: true }).delegateTo(document, selector);
|
|
95
|
+
|
|
96
|
+
new RegularEvent('dragleave', (event: DragEvent, target: HTMLElement): void => {
|
|
97
|
+
target.classList.remove('success');
|
|
98
|
+
}, { capture: true, passive: true }).delegateTo(document, selector);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private getPreviewItems(selectedItems: ResourceInterface[]): DragDropThumbnail[] {
|
|
102
|
+
return selectedItems
|
|
103
|
+
.filter((item: ResourceInterface): boolean => item.hasPreview)
|
|
104
|
+
.map((item: ResourceInterface) => {
|
|
105
|
+
const thumbnailUrl = new URL(top.TYPO3.settings.Resource.thumbnailUrl, window.origin);
|
|
106
|
+
thumbnailUrl.searchParams.set('identifier', item.uid.toString(10));
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
src: thumbnailUrl.toString(),
|
|
110
|
+
width: this.previewSize,
|
|
111
|
+
height: this.previewSize,
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private getPreviewLabel(selectedItems: ResourceInterface[]): string {
|
|
117
|
+
// Counter
|
|
118
|
+
const previewItems = selectedItems.filter((item: ResourceInterface): boolean => item.hasPreview);
|
|
119
|
+
const count = selectedItems.length - previewItems.length;
|
|
120
|
+
if (count > 0) {
|
|
121
|
+
return (previewItems.length > 0 ? '+' : '') + count.toString();
|
|
122
|
+
}
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private reset(): void {
|
|
127
|
+
document.querySelectorAll(FileListActionSelector.elementSelector).forEach((element: HTMLElement) => {
|
|
128
|
+
delete element.dataset.filelistDragdropTransferItem;
|
|
129
|
+
element.classList.remove('success');
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private isDropAllowedOnResoruce(resource: ResourceInterface): boolean {
|
|
134
|
+
const element = document.querySelector(FileListActionSelector.elementSelector + '[data-filelist-identifier="' + resource.identifier + '"]') as HTMLElement;
|
|
135
|
+
return !('filelistDragdropTransferItem' in element.dataset) && resource.type === 'folder';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export default new FileListDragDrop();
|
|
@@ -0,0 +1,128 @@
|
|
|
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
|
+
import { html, type TemplateResult } from 'lit';
|
|
16
|
+
import type { ResourceInterface } from '@typo3/backend/resource/resource';
|
|
17
|
+
import { FileListActionEvent, type FileListActionDetail } from '@typo3/filelist/file-list-actions';
|
|
18
|
+
import { default as Modal, type ModalElement } from '@typo3/backend/modal';
|
|
19
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
20
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
21
|
+
import Notification from '@typo3/backend/notification';
|
|
22
|
+
import Viewport from '@typo3/backend/viewport';
|
|
23
|
+
|
|
24
|
+
interface Message {
|
|
25
|
+
title: string;
|
|
26
|
+
message: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
class FileListRenameHandler {
|
|
30
|
+
constructor() {
|
|
31
|
+
|
|
32
|
+
new RegularEvent(FileListActionEvent.rename, (event: CustomEvent): void => {
|
|
33
|
+
const detail: FileListActionDetail = event.detail;
|
|
34
|
+
const resource = detail.resources[0];
|
|
35
|
+
const modal = Modal.advanced({
|
|
36
|
+
title: TYPO3.lang['file_rename.title'] || 'Rename',
|
|
37
|
+
type: Modal.types.default,
|
|
38
|
+
size: Modal.sizes.small,
|
|
39
|
+
content: this.composeEditForm(resource),
|
|
40
|
+
buttons: [
|
|
41
|
+
{
|
|
42
|
+
text: TYPO3.lang['file_rename.button.cancel'] || 'Cancel',
|
|
43
|
+
btnClass: 'btn-default',
|
|
44
|
+
name: 'cancel',
|
|
45
|
+
trigger: (): void => {
|
|
46
|
+
modal.hideModal();
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
text: TYPO3.lang['file_rename.button.rename'] || 'Rename',
|
|
51
|
+
btnClass: 'btn-primary',
|
|
52
|
+
name: 'rename',
|
|
53
|
+
trigger: (): void => {
|
|
54
|
+
const form: HTMLFormElement = modal.querySelector('form');
|
|
55
|
+
form?.requestSubmit();
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
callback: function (modal: ModalElement) {
|
|
60
|
+
const form = modal.querySelector('form');
|
|
61
|
+
form.addEventListener('submit', (event: SubmitEvent): void => {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
const formData = new FormData(event.target as HTMLFormElement);
|
|
64
|
+
const submittedData = Object.fromEntries(formData);
|
|
65
|
+
const resourceName = submittedData.name.toString();
|
|
66
|
+
if (detail.resources[0].name !== resourceName) {
|
|
67
|
+
|
|
68
|
+
const request = new AjaxRequest(TYPO3.settings.ajaxUrls.resource_rename);
|
|
69
|
+
request.post({
|
|
70
|
+
identifier: detail.resources[0].identifier,
|
|
71
|
+
resourceName: resourceName,
|
|
72
|
+
}).then(async (success: AjaxResponse): Promise<void> => {
|
|
73
|
+
|
|
74
|
+
const data = await success.resolve();
|
|
75
|
+
if (data.status.length > 0) {
|
|
76
|
+
data.status.forEach((message: Message): void => {
|
|
77
|
+
if (data.success) {
|
|
78
|
+
Notification.success(message.title, message.message);
|
|
79
|
+
} else {
|
|
80
|
+
Notification.error(message.title, message.message);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (data.resource?.type === 'folder') {
|
|
86
|
+
const currentUrl = Viewport.ContentContainer.getUrl();
|
|
87
|
+
const params = (new URL(currentUrl, window.location.origin)).searchParams;
|
|
88
|
+
if (params.get('id') === data.origin.identifier) {
|
|
89
|
+
Viewport.ContentContainer.setUrl(currentUrl + '&id=' + data.resource.identifier);
|
|
90
|
+
} else {
|
|
91
|
+
Viewport.ContentContainer.refresh();
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
Viewport.ContentContainer.refresh();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
top.document.dispatchEvent(new CustomEvent('typo3:filestoragetree:refresh'));
|
|
98
|
+
modal.hideModal();
|
|
99
|
+
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
modal.addEventListener('typo3-modal-shown', (): void => {
|
|
105
|
+
form.querySelector('input')?.focus();
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
}).bindTo(document);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private composeEditForm(resource: ResourceInterface): TemplateResult {
|
|
114
|
+
const label = resource?.type === 'folder' ?
|
|
115
|
+
TYPO3.lang['folder_rename.label'] ?? 'New folder name' :
|
|
116
|
+
TYPO3.lang['file_rename.label'] ?? 'New filename';
|
|
117
|
+
return html`
|
|
118
|
+
<form>
|
|
119
|
+
<label class="form-label" for="rename_target">
|
|
120
|
+
${label}
|
|
121
|
+
</label>
|
|
122
|
+
<input id="rename_target" name="name" class="form-control" value="${resource.name}" required>
|
|
123
|
+
</form>
|
|
124
|
+
`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export default new FileListRenameHandler();
|
|
@@ -0,0 +1,138 @@
|
|
|
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 { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
15
|
+
import Modal from '@typo3/backend/modal';
|
|
16
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
17
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
18
|
+
import Notification from '@typo3/backend/notification';
|
|
19
|
+
import Viewport from '@typo3/backend/viewport';
|
|
20
|
+
import { type FileListDragDropDetail, FileListDragDropEvent } from '@typo3/filelist/file-list-dragdrop';
|
|
21
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
22
|
+
import type { ResourceInterface } from '@typo3/backend/resource/resource';
|
|
23
|
+
|
|
24
|
+
interface Message {
|
|
25
|
+
title: string;
|
|
26
|
+
message: string;
|
|
27
|
+
severity: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
enum FileListTransferType {
|
|
31
|
+
move = 'move',
|
|
32
|
+
copy = 'copy',
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface FileListTransferOperation {
|
|
36
|
+
data: string;
|
|
37
|
+
target: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
class FileListTransferHandler {
|
|
41
|
+
constructor() {
|
|
42
|
+
|
|
43
|
+
new RegularEvent(FileListDragDropEvent.transfer, (event: CustomEvent): void => {
|
|
44
|
+
const detail: FileListDragDropDetail = event.detail;
|
|
45
|
+
const target = detail.target;
|
|
46
|
+
const resources = detail.resources;
|
|
47
|
+
|
|
48
|
+
let modalTitle;
|
|
49
|
+
let modalText;
|
|
50
|
+
if (detail.resources.length === 1) {
|
|
51
|
+
const resource = detail.resources[0];
|
|
52
|
+
modalTitle = TYPO3.lang['message.transfer_resource.title'];
|
|
53
|
+
modalText = TYPO3.lang['message.transfer_resource.text']
|
|
54
|
+
.replace('%s', resource.name)
|
|
55
|
+
.replace('%s', target.name);
|
|
56
|
+
} else {
|
|
57
|
+
modalTitle = TYPO3.lang['message.transfer_resources.title'];
|
|
58
|
+
modalText = TYPO3.lang['message.transfer_resources.text']
|
|
59
|
+
.replace('%d', resources.length.toString(10))
|
|
60
|
+
.replace('%s', target.name);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const modal = Modal.confirm(
|
|
64
|
+
modalTitle,
|
|
65
|
+
modalText,
|
|
66
|
+
SeverityEnum.notice,
|
|
67
|
+
[
|
|
68
|
+
{
|
|
69
|
+
text: TYPO3.lang['message.button.cancel'],
|
|
70
|
+
active: true,
|
|
71
|
+
btnClass: 'btn-default',
|
|
72
|
+
name: 'cancel',
|
|
73
|
+
trigger: (): void => {
|
|
74
|
+
modal.hideModal();
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
text: TYPO3.lang['message.button.copy'],
|
|
79
|
+
btnClass: 'btn-primary',
|
|
80
|
+
name: 'copy',
|
|
81
|
+
trigger: (): void => {
|
|
82
|
+
this.transfer(FileListTransferType.copy, resources, target);
|
|
83
|
+
modal.hideModal();
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
text: TYPO3.lang['message.button.move'],
|
|
88
|
+
btnClass: 'btn-primary',
|
|
89
|
+
name: 'move',
|
|
90
|
+
trigger: (): void => {
|
|
91
|
+
this.transfer(FileListTransferType.move, resources, target);
|
|
92
|
+
modal.hideModal();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
);
|
|
97
|
+
}).bindTo(top.document);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private transfer(type: FileListTransferType, resources: ResourceInterface[], target: ResourceInterface): void {
|
|
101
|
+
const payload: FileListTransferOperation[] = [];
|
|
102
|
+
resources.forEach((resource: ResourceInterface) => {
|
|
103
|
+
const operation: FileListTransferOperation = {
|
|
104
|
+
data: resource.identifier,
|
|
105
|
+
target: target.identifier,
|
|
106
|
+
};
|
|
107
|
+
payload.push(operation);
|
|
108
|
+
});
|
|
109
|
+
const params = { data: { [type]: payload } };
|
|
110
|
+
|
|
111
|
+
(new AjaxRequest(top.TYPO3.settings.ajaxUrls.file_process))
|
|
112
|
+
.post(params)
|
|
113
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
114
|
+
const data = await response.resolve();
|
|
115
|
+
this.handleMessages(data.messages ?? []);
|
|
116
|
+
Viewport.ContentContainer.refresh();
|
|
117
|
+
top.document.dispatchEvent(new CustomEvent('typo3:filestoragetree:refresh'));
|
|
118
|
+
})
|
|
119
|
+
.catch(async (response: AjaxResponse): Promise<void> => {
|
|
120
|
+
const data = await response.resolve();
|
|
121
|
+
this.handleMessages(data.messages ?? []);
|
|
122
|
+
Viewport.ContentContainer.refresh();
|
|
123
|
+
top.document.dispatchEvent(new CustomEvent('typo3:filestoragetree:refresh'));
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private handleMessages(messages: Message[]): void {
|
|
128
|
+
messages.forEach((message: Message): void => {
|
|
129
|
+
Notification.showMessage(
|
|
130
|
+
message.title || '',
|
|
131
|
+
message.message || '',
|
|
132
|
+
message.severity
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export default new FileListTransferHandler();
|