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,46 @@
|
|
|
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 './enum/severity';
|
|
15
|
+
import Modal from './modal';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/info-window
|
|
19
|
+
* @exports @typo3/backend/info-window
|
|
20
|
+
*/
|
|
21
|
+
class InfoWindow {
|
|
22
|
+
/**
|
|
23
|
+
* Shows the info modal
|
|
24
|
+
*
|
|
25
|
+
* @param {string} table
|
|
26
|
+
* @param {string | number} uid
|
|
27
|
+
*/
|
|
28
|
+
public static showItem(table: string, uid: string|number): void {
|
|
29
|
+
Modal.advanced({
|
|
30
|
+
type: Modal.types.iframe,
|
|
31
|
+
size: Modal.sizes.large,
|
|
32
|
+
content: top.TYPO3.settings.ShowItem.moduleUrl
|
|
33
|
+
+ '&table=' + encodeURIComponent(table)
|
|
34
|
+
+ '&uid=' + (typeof uid === 'number' ? uid : encodeURIComponent(uid)),
|
|
35
|
+
severity: SeverityEnum.notice,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!top.TYPO3.InfoWindow) {
|
|
41
|
+
top.TYPO3.InfoWindow = InfoWindow;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// expose as global object
|
|
45
|
+
TYPO3.InfoWindow = InfoWindow;
|
|
46
|
+
export default InfoWindow;
|
|
@@ -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
|
+
class Clearable {
|
|
15
|
+
constructor() {
|
|
16
|
+
if (typeof HTMLInputElement.prototype.clearable === 'function') {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
this.registerClearable();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private static createCloseButton(clearButtonTitle: string): HTMLButtonElement {
|
|
24
|
+
// The inlined markup represents the current generated markup from the
|
|
25
|
+
// icon api for the icon actions-close that can be found in the official
|
|
26
|
+
// icon repository and is registered in the backend icon api.
|
|
27
|
+
//
|
|
28
|
+
// It´s not possible to use/open the backend icon api without opening
|
|
29
|
+
// new possible vectors for attackers to sniff system information.
|
|
30
|
+
//
|
|
31
|
+
// When the icon definition of actions-close changes also the inline
|
|
32
|
+
// icon should be updated.
|
|
33
|
+
//
|
|
34
|
+
// https://github.com/typo3/typo3.icons
|
|
35
|
+
const closeIcon = `
|
|
36
|
+
<span class="t3js-icon icon icon-size-small icon-state-default icon-actions-close" data-identifier="actions-close">
|
|
37
|
+
<span class="icon-markup">
|
|
38
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
|
|
39
|
+
<g fill="currentColor">
|
|
40
|
+
<path d="M11.9 5.5 9.4 8l2.5 2.5c.2.2.2.5 0 .7l-.7.7c-.2.2-.5.2-.7 0L8 9.4l-2.5 2.5c-.2.2-.5.2-.7 0l-.7-.7c-.2-.2-.2-.5 0-.7L6.6 8 4.1 5.5c-.2-.2-.2-.5 0-.7l.7-.7c.2-.2.5-.2.7 0L8 6.6l2.5-2.5c.2-.2.5-.2.7 0l.7.7c.2.2.2.5 0 .7z"/>
|
|
41
|
+
</g>
|
|
42
|
+
</svg>
|
|
43
|
+
</span>
|
|
44
|
+
</span>
|
|
45
|
+
`;
|
|
46
|
+
|
|
47
|
+
const closeButton = document.createElement('button');
|
|
48
|
+
closeButton.type = 'button';
|
|
49
|
+
closeButton.tabIndex = -1;
|
|
50
|
+
closeButton.title = clearButtonTitle;
|
|
51
|
+
closeButton.ariaLabel = clearButtonTitle;
|
|
52
|
+
closeButton.innerHTML = closeIcon;
|
|
53
|
+
closeButton.style.visibility = 'hidden';
|
|
54
|
+
closeButton.classList.add('close');
|
|
55
|
+
|
|
56
|
+
return closeButton;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private registerClearable(): void {
|
|
60
|
+
HTMLInputElement.prototype.clearable = function(options: Options = {}): void {
|
|
61
|
+
if (this.isClearable) {
|
|
62
|
+
// input field is already clearable, nothing to do here
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (typeof options !== 'object') {
|
|
67
|
+
throw new Error('Passed options must be an object, ' + typeof options + ' given');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
this.classList.add('form-control-clearable');
|
|
71
|
+
|
|
72
|
+
const isFocused: boolean = document.activeElement === this;
|
|
73
|
+
const wrap = document.createElement('div');
|
|
74
|
+
wrap.classList.add('form-control-clearable-wrapper');
|
|
75
|
+
this.parentNode.insertBefore(wrap, this);
|
|
76
|
+
wrap.appendChild(this);
|
|
77
|
+
|
|
78
|
+
let clearButtonTitle = 'Clear input';
|
|
79
|
+
if (this.dataset.clearableLabel) {
|
|
80
|
+
clearButtonTitle = this.dataset.clearableLabel;
|
|
81
|
+
} else if ('lang' in top.TYPO3 && top.TYPO3.lang['labels.inputfield.clearButton.title']) {
|
|
82
|
+
clearButtonTitle = top.TYPO3.lang['labels.inputfield.clearButton.title'];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const clearButton = Clearable.createCloseButton(clearButtonTitle);
|
|
86
|
+
|
|
87
|
+
const toggleClearButtonVisibility = (): void => {
|
|
88
|
+
clearButton.style.visibility = this.value.length === 0 ? 'hidden' : 'visible';
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
clearButton.addEventListener('click', (e: Event): void => {
|
|
92
|
+
e.preventDefault();
|
|
93
|
+
|
|
94
|
+
this.value = '';
|
|
95
|
+
|
|
96
|
+
if (typeof options.onClear === 'function') {
|
|
97
|
+
options.onClear(this);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
this.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
|
|
101
|
+
// This is a temporary solution thanks to the date picker. Do not rely on it.
|
|
102
|
+
this.dispatchEvent(new CustomEvent('typo3:internal:clear'));
|
|
103
|
+
toggleClearButtonVisibility();
|
|
104
|
+
this.focus();
|
|
105
|
+
});
|
|
106
|
+
wrap.appendChild(clearButton);
|
|
107
|
+
|
|
108
|
+
this.addEventListener('blur', (e: FocusEvent) => {
|
|
109
|
+
// Maintain focus when indicator is clicked
|
|
110
|
+
if (this.parentNode.contains(e.relatedTarget as Node)) {
|
|
111
|
+
this.focus();
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
this.addEventListener('focus', toggleClearButtonVisibility);
|
|
115
|
+
this.addEventListener('keyup', toggleClearButtonVisibility);
|
|
116
|
+
|
|
117
|
+
toggleClearButtonVisibility();
|
|
118
|
+
this.isClearable = true;
|
|
119
|
+
|
|
120
|
+
// Make sure to maintain focus
|
|
121
|
+
if (isFocused) {
|
|
122
|
+
this.focus();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export default new Clearable();
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
document.addEventListener('typo3:import-javascript-module', (e: CustomEvent<{ specifier: string; importPromise?: Promise<any>; }>) => {
|
|
18
|
+
e.detail.importPromise = import(e.detail.specifier);
|
|
19
|
+
});
|
|
@@ -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 RegularEvent from '@typo3/core/event/regular-event';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/key-bindings
|
|
18
|
+
* @exports @typo3/backend/key-bindings
|
|
19
|
+
*/
|
|
20
|
+
class KeyBindings {
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
this.preventEscapePropagationInSearchInputs();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Prevent Bootstrap modals or other global escape handlers from reacting
|
|
28
|
+
* when an Escape keypress is triggered inside a type="search" input.
|
|
29
|
+
* This ensures only the input clears (as expected) without closing modals.
|
|
30
|
+
*
|
|
31
|
+
* @todo Might be removed once we switched to native elements like <dialog> for modals
|
|
32
|
+
*/
|
|
33
|
+
private preventEscapePropagationInSearchInputs(): void {
|
|
34
|
+
new RegularEvent('keydown', (e: KeyboardEvent): void => {
|
|
35
|
+
if (e.key === 'Escape' && e.target instanceof HTMLInputElement && e.target.type === 'search' && e.target.value !== '') {
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
}
|
|
38
|
+
}, true).bindTo(document);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default new KeyBindings();
|
|
@@ -0,0 +1,359 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* Module: @typo3/backend/layout-module/drag-drop
|
|
16
|
+
* this JS code does the drag+drop logic for the Layout module (Web => Page)
|
|
17
|
+
*/
|
|
18
|
+
import DocumentService from '@typo3/core/document-service';
|
|
19
|
+
import DataHandler from '../ajax-data-handler';
|
|
20
|
+
import Icons from '../icons';
|
|
21
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
22
|
+
import { DataTransferTypes } from '@typo3/backend/enum/data-transfer-types';
|
|
23
|
+
import BroadcastService from '@typo3/backend/broadcast-service';
|
|
24
|
+
import { BroadcastMessage } from '@typo3/backend/broadcast-message';
|
|
25
|
+
import type ResponseInterface from '../ajax-data-handler/response-interface';
|
|
26
|
+
import type { DragDropThumbnail, DragTooltipMetadata } from '@typo3/backend/drag-tooltip';
|
|
27
|
+
import DragDropUtility from '@typo3/backend/utility/drag-drop-utility';
|
|
28
|
+
|
|
29
|
+
interface Parameters {
|
|
30
|
+
cmd?: { [key: string]: { [key: string]: any } };
|
|
31
|
+
data?: { [key: string]: { [key: string]: any } };
|
|
32
|
+
CB?: { paste: string, update: { colPos: number | boolean, sys_language_uid: number } };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type ContentElementDragDropData = {
|
|
36
|
+
pid: number;
|
|
37
|
+
uid: number;
|
|
38
|
+
language: number;
|
|
39
|
+
content: string;
|
|
40
|
+
moveElementUrl: string;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
enum Identifiers {
|
|
44
|
+
content = '.t3js-page-ce',
|
|
45
|
+
draggableContentHandle = '.t3js-page-ce-header[draggable="true"]',
|
|
46
|
+
dropZone = '.t3js-page-ce-dropzone-available',
|
|
47
|
+
column = '.t3js-page-column',
|
|
48
|
+
addContent = '.t3js-page-new-ce',
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
enum Classes {
|
|
52
|
+
validDropZoneClass = 'active',
|
|
53
|
+
dropPossibleHoverClass = 't3-page-ce-dropzone-possible',
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
class DragDrop {
|
|
57
|
+
constructor() {
|
|
58
|
+
DocumentService.ready().then((): void => {
|
|
59
|
+
this.initialize();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* initializes Drag+Drop for all content elements on the page
|
|
65
|
+
*/
|
|
66
|
+
public initialize(): void {
|
|
67
|
+
new RegularEvent('mousedown', (e: MouseEvent, target: HTMLElement): void => {
|
|
68
|
+
const closestDenyElement = (e.target as HTMLElement).closest('a,img');
|
|
69
|
+
if (closestDenyElement !== null && target.contains(closestDenyElement)) {
|
|
70
|
+
// Do not enable drag&drop when event is triggered on an anchor element
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}).delegateTo(document, Identifiers.draggableContentHandle);
|
|
74
|
+
|
|
75
|
+
new RegularEvent(
|
|
76
|
+
'dragstart',
|
|
77
|
+
this.onDragStart.bind(this)
|
|
78
|
+
).delegateTo(document, Identifiers.draggableContentHandle);
|
|
79
|
+
|
|
80
|
+
new RegularEvent(
|
|
81
|
+
'dragenter',
|
|
82
|
+
this.onDragEnter.bind(this)
|
|
83
|
+
).delegateTo(document, Identifiers.draggableContentHandle);
|
|
84
|
+
|
|
85
|
+
new RegularEvent(
|
|
86
|
+
'dragend',
|
|
87
|
+
this.onDragEnd.bind(this)
|
|
88
|
+
).delegateTo(document, Identifiers.draggableContentHandle);
|
|
89
|
+
|
|
90
|
+
new RegularEvent('dragenter', (event: DragEvent, target: HTMLElement): void => {
|
|
91
|
+
target.classList.add(Classes.dropPossibleHoverClass);
|
|
92
|
+
DragDropUtility.updateEventAndTooltipToReflectCopyMoveIntention(event);
|
|
93
|
+
}).delegateTo(document, Identifiers.dropZone);
|
|
94
|
+
|
|
95
|
+
new RegularEvent('dragover', (event: DragEvent): void => {
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
DragDropUtility.updateEventAndTooltipToReflectCopyMoveIntention(event);
|
|
98
|
+
}).delegateTo(document, Identifiers.dropZone);
|
|
99
|
+
|
|
100
|
+
new RegularEvent('dragleave', (event: DragEvent, target: HTMLElement): void => {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
target.classList.remove(Classes.dropPossibleHoverClass);
|
|
103
|
+
}).delegateTo(document, Identifiers.dropZone);
|
|
104
|
+
|
|
105
|
+
new RegularEvent('drop', this.onDrop.bind(this), { capture: true, passive: true }).delegateTo(document, Identifiers.dropZone);
|
|
106
|
+
|
|
107
|
+
new RegularEvent('typo3:page-layout-drag-drop:elementChanged', this.onBroadcastElementChanged.bind(this)).bindTo(top.document);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
protected onDragEnter(event: DragEvent): void {
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
DragDropUtility.updateEventAndTooltipToReflectCopyMoveIntention(event);
|
|
113
|
+
this.showDropZones();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
protected onDragStart(event: DragEvent, target: HTMLElement): void {
|
|
117
|
+
const content = target.closest(Identifiers.content) as HTMLElement;
|
|
118
|
+
|
|
119
|
+
event.dataTransfer.setData(DataTransferTypes.content, JSON.stringify({
|
|
120
|
+
pid: this.getCurrentPageId(),
|
|
121
|
+
uid: parseInt(content.dataset.uid, 10),
|
|
122
|
+
language: parseInt(content.dataset.languageUid, 10),
|
|
123
|
+
content: content.outerHTML,
|
|
124
|
+
moveElementUrl: content.dataset.moveElementUrl,
|
|
125
|
+
} as ContentElementDragDropData));
|
|
126
|
+
|
|
127
|
+
const metadata: DragTooltipMetadata = this.getDragTooltipMetadataFromContentElement(content);
|
|
128
|
+
event.dataTransfer.setData(DataTransferTypes.dragTooltip, JSON.stringify(metadata));
|
|
129
|
+
event.dataTransfer.effectAllowed = 'copyMove';
|
|
130
|
+
DragDropUtility.updateEventAndTooltipToReflectCopyMoveIntention(event);
|
|
131
|
+
|
|
132
|
+
(content.querySelector(Identifiers.dropZone) as HTMLElement).hidden = true;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
protected onDragEnd(): void {
|
|
136
|
+
this.hideDropZones();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* this method does the whole logic when a draggable is dropped on to a dropzone
|
|
141
|
+
* sending out the request and afterwards move the HTML element in the right place.
|
|
142
|
+
*
|
|
143
|
+
* @param {DropEvent} event
|
|
144
|
+
*/
|
|
145
|
+
protected onDrop(event: DragEvent, dropContainer: HTMLElement): void {
|
|
146
|
+
let draggedElement: HTMLElement;
|
|
147
|
+
|
|
148
|
+
dropContainer.classList.remove(Classes.dropPossibleHoverClass);
|
|
149
|
+
|
|
150
|
+
if (!event.dataTransfer.types.includes(DataTransferTypes.content)) {
|
|
151
|
+
// Dropped element is not accepted
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const newColumn = this.getColumnPositionForElement(dropContainer);
|
|
156
|
+
const contentElementDragDropData = JSON.parse(event.dataTransfer.getData(DataTransferTypes.content)) as ContentElementDragDropData;
|
|
157
|
+
|
|
158
|
+
draggedElement = document.querySelector(`${Identifiers.content}[data-uid="${contentElementDragDropData.uid}"]`);
|
|
159
|
+
if (!draggedElement) {
|
|
160
|
+
draggedElement = document.createRange().createContextualFragment(contentElementDragDropData.content).firstElementChild as HTMLElement;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (typeof (contentElementDragDropData.uid) === 'number' && contentElementDragDropData.uid > 0) {
|
|
164
|
+
const parameters: Parameters = {};
|
|
165
|
+
// add the information about a possible column position change
|
|
166
|
+
const targetFound = (dropContainer.closest(Identifiers.content) as HTMLElement).dataset.uid;
|
|
167
|
+
// the item was moved to the top of the colPos, so the page ID is used here
|
|
168
|
+
let targetPid: number;
|
|
169
|
+
if (targetFound === undefined) {
|
|
170
|
+
// the actual page is needed. Read it from the container into which the element was dropped.
|
|
171
|
+
targetPid = parseInt((dropContainer.closest('[data-page]') as HTMLElement).dataset.page, 10);
|
|
172
|
+
} else {
|
|
173
|
+
// the negative value of the content element after where it should be moved
|
|
174
|
+
targetPid = 0 - parseInt(targetFound, 10);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// the dragged elements language uid
|
|
178
|
+
let language = contentElementDragDropData.language;
|
|
179
|
+
if (language !== -1) {
|
|
180
|
+
// new elements language must be the same as the column the element is dropped in if element is not -1
|
|
181
|
+
language = parseInt((dropContainer.closest('[data-language-uid]') as HTMLElement).dataset.languageUid, 10);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
let colPos: number | boolean = 0;
|
|
185
|
+
if (targetPid !== 0) {
|
|
186
|
+
colPos = newColumn;
|
|
187
|
+
}
|
|
188
|
+
const isCopyAction = (DragDropUtility.isCopyModifierFromEvent(event) || dropContainer.classList.contains('t3js-paste-copy'));
|
|
189
|
+
const datahandlerCommand = isCopyAction ? 'copy' : 'move';
|
|
190
|
+
parameters.cmd = {
|
|
191
|
+
tt_content: {
|
|
192
|
+
[contentElementDragDropData.uid]: {
|
|
193
|
+
[datahandlerCommand]: {
|
|
194
|
+
action: 'paste',
|
|
195
|
+
target: targetPid,
|
|
196
|
+
update: {
|
|
197
|
+
colPos: colPos,
|
|
198
|
+
sys_language_uid: language,
|
|
199
|
+
},
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
this.ajaxAction(parameters, isCopyAction).then((): void => {
|
|
206
|
+
// insert draggable on the new position
|
|
207
|
+
if (!dropContainer.parentElement.classList.contains(Identifiers.content.substring(1))) {
|
|
208
|
+
dropContainer.closest(Identifiers.dropZone).after(draggedElement);
|
|
209
|
+
} else {
|
|
210
|
+
dropContainer.closest(Identifiers.content).after(draggedElement);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
this.broadcast('elementChanged', {
|
|
214
|
+
pid: contentElementDragDropData.pid,
|
|
215
|
+
uid: contentElementDragDropData.uid,
|
|
216
|
+
targetPid: this.getCurrentPageId(),
|
|
217
|
+
action: isCopyAction ? 'copy' : 'move',
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
const languageDescriber = document.querySelector(`.t3-page-column-lang-name[data-language-uid="${language}"]`) as HTMLElement;
|
|
221
|
+
if (languageDescriber === null) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const newFlagIdentifier = languageDescriber.dataset.flagIdentifier;
|
|
226
|
+
const newLanguageTitle = languageDescriber.dataset.languageTitle;
|
|
227
|
+
|
|
228
|
+
Icons.getIcon(newFlagIdentifier, Icons.sizes.small).then((markup: string): void => {
|
|
229
|
+
const flagIcon = draggedElement.querySelector('.t3js-flag') as HTMLElement;
|
|
230
|
+
flagIcon.title = newLanguageTitle;
|
|
231
|
+
flagIcon.innerHTML = markup;
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
protected onBroadcastElementChanged(event: CustomEvent<{ payload: { pid: number, uid: number, targetPid: number, action: string } }>): void {
|
|
238
|
+
if (event.detail.payload.pid !== this.getCurrentPageId()) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (event.detail.payload.targetPid === event.detail.payload.pid) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (event.detail.payload.action === 'move') {
|
|
247
|
+
document.querySelector(`${Identifiers.content}[data-uid="${event.detail.payload.uid}"]`).remove();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* this method does the actual AJAX request for both, the move and the copy action.
|
|
253
|
+
*
|
|
254
|
+
* @param {Parameters} parameters
|
|
255
|
+
* @param {boolean} isCopyAction
|
|
256
|
+
* @private
|
|
257
|
+
*/
|
|
258
|
+
protected ajaxAction(parameters: Parameters, isCopyAction: boolean): Promise<void> {
|
|
259
|
+
const table: string = Object.keys(parameters.cmd).shift();
|
|
260
|
+
const uid: number = parseInt(Object.keys(parameters.cmd[table]).shift(), 10);
|
|
261
|
+
const eventData = { component: 'dragdrop', action: isCopyAction ? 'copy' : 'move', table, uid };
|
|
262
|
+
const gridContainer = document.querySelector('.t3-grid-container') as HTMLDivElement|null;
|
|
263
|
+
|
|
264
|
+
return DataHandler.process(parameters, eventData).then((result: ResponseInterface): void => {
|
|
265
|
+
if (result.hasErrors) {
|
|
266
|
+
throw result.messages;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (isCopyAction || (gridContainer?.dataset.defaultLanguageBinding === '1')) {
|
|
270
|
+
self.location.reload();
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* returns the next "upper" container colPos parameter inside the code
|
|
277
|
+
* @param element HTMLElement
|
|
278
|
+
* @return int|null the colPos
|
|
279
|
+
*/
|
|
280
|
+
protected getColumnPositionForElement(element: HTMLElement): number | boolean {
|
|
281
|
+
const columnContainer = element.closest('[data-colpos]') as HTMLElement;
|
|
282
|
+
if (columnContainer !== null && columnContainer.dataset.colpos !== undefined) {
|
|
283
|
+
return parseInt(columnContainer.dataset.colpos, 10);
|
|
284
|
+
}
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
protected getDragTooltipMetadataFromContentElement(contentElement: HTMLElement): DragTooltipMetadata {
|
|
289
|
+
let description, iconIdentifier;
|
|
290
|
+
const thumbnails: DragDropThumbnail[] = [];
|
|
291
|
+
const contentElementTitle = contentElement.querySelector('.t3-page-ce-header-title') as HTMLElement;
|
|
292
|
+
const title = contentElementTitle.innerText;
|
|
293
|
+
|
|
294
|
+
const contentElementPreview = contentElement.querySelector('.element-preview') as HTMLElement;
|
|
295
|
+
if (contentElementPreview) {
|
|
296
|
+
description = contentElementPreview.innerText;
|
|
297
|
+
|
|
298
|
+
if (description.length > 80) {
|
|
299
|
+
description = description.substring(0, 80) + '...';
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const contentElementIcon = contentElement.querySelector('.t3js-icon') as HTMLElement;
|
|
304
|
+
if (contentElementIcon) {
|
|
305
|
+
iconIdentifier = contentElementIcon.dataset.identifier;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const contentImagePreviews = contentElement.querySelectorAll('.preview-thumbnails-element-image img');
|
|
309
|
+
if (contentImagePreviews.length > 0) {
|
|
310
|
+
contentImagePreviews.forEach((image: HTMLImageElement): void => {
|
|
311
|
+
thumbnails.push({
|
|
312
|
+
src: image.src,
|
|
313
|
+
height: image.height,
|
|
314
|
+
width: image.width,
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return {
|
|
320
|
+
statusIconIdentifier: 'actions-move',
|
|
321
|
+
tooltipIconIdentifier: iconIdentifier,
|
|
322
|
+
tooltipLabel: title,
|
|
323
|
+
tooltipDescription: description,
|
|
324
|
+
thumbnails: thumbnails,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
protected getCurrentPageId(): number {
|
|
329
|
+
return parseInt((document.querySelector('[data-page]') as HTMLElement).dataset.page, 10);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
protected broadcast(eventName: string, payload?: unknown) {
|
|
333
|
+
BroadcastService.post(new BroadcastMessage('page-layout-drag-drop', eventName, payload || {}));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
protected showDropZones(): void {
|
|
337
|
+
document.querySelectorAll(Identifiers.dropZone).forEach((element: HTMLElement): void => {
|
|
338
|
+
element.hidden = false;
|
|
339
|
+
const addContentButton = element.parentElement.querySelector(Identifiers.addContent) as HTMLElement;
|
|
340
|
+
if (addContentButton !== null) {
|
|
341
|
+
addContentButton.hidden = true;
|
|
342
|
+
element.classList.add(Classes.validDropZoneClass);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
protected hideDropZones(): void {
|
|
348
|
+
document.querySelectorAll(Identifiers.dropZone).forEach((element: HTMLElement): void => {
|
|
349
|
+
element.hidden = true;
|
|
350
|
+
const addContentButton = element.parentElement.querySelector(Identifiers.addContent) as HTMLElement;
|
|
351
|
+
if (addContentButton !== null) {
|
|
352
|
+
addContentButton.hidden = false;
|
|
353
|
+
}
|
|
354
|
+
element.classList.remove(Classes.validDropZoneClass);
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export default new DragDrop();
|