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,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { PseudoButtonLitElement } from '@typo3/backend/element/pseudo-button';
|
|
16
|
+
import Notification from '@typo3/backend/notification';
|
|
17
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
18
|
+
|
|
19
|
+
export function copyToClipboard(text: string): void {
|
|
20
|
+
if (!text.length) {
|
|
21
|
+
console.warn('No text for copy to clipboard given.');
|
|
22
|
+
Notification.error(lll('copyToClipboard.error'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (navigator.clipboard) {
|
|
26
|
+
navigator.clipboard.writeText(text).then((): void => {
|
|
27
|
+
Notification.success(lll('copyToClipboard.success'), '', 1);
|
|
28
|
+
}).catch((): void => {
|
|
29
|
+
Notification.error(lll('copyToClipboard.error'));
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
const textarea = document.createElement('textarea');
|
|
33
|
+
textarea.value = text;
|
|
34
|
+
document.body.appendChild(textarea);
|
|
35
|
+
textarea.focus();
|
|
36
|
+
textarea.select();
|
|
37
|
+
try {
|
|
38
|
+
if (document.execCommand('copy')) {
|
|
39
|
+
Notification.success(lll('copyToClipboard.success'), '', 1);
|
|
40
|
+
} else {
|
|
41
|
+
Notification.error(lll('copyToClipboard.error'));
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
Notification.error(lll('copyToClipboard.error'));
|
|
45
|
+
}
|
|
46
|
+
document.body.removeChild(textarea);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Module: @typo3/backend/copy-to-clipboard
|
|
52
|
+
*
|
|
53
|
+
* This module can be used to copy a given text to
|
|
54
|
+
* the operating systems' clipboard.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* <typo3-copy-to-clipboard text="some text">
|
|
58
|
+
* Copy to clipboard
|
|
59
|
+
* </typo3-copy-to-clipboard>
|
|
60
|
+
*/
|
|
61
|
+
@customElement('typo3-copy-to-clipboard')
|
|
62
|
+
export class CopyToClipboard extends PseudoButtonLitElement {
|
|
63
|
+
@property({ type: String }) text: string;
|
|
64
|
+
|
|
65
|
+
protected override buttonActivated(): void {
|
|
66
|
+
if (typeof this.text !== 'string') {
|
|
67
|
+
console.warn('No text for copy to clipboard given.');
|
|
68
|
+
Notification.error(lll('copyToClipboard.error'));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
copyToClipboard(this.text);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
declare global {
|
|
76
|
+
interface HTMLElementTagNameMap {
|
|
77
|
+
'typo3-copy-to-clipboard': CopyToClipboard;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
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 flatpickr from 'flatpickr';
|
|
15
|
+
import ShortcutButtonsPlugin from 'shortcut-buttons-flatpickr';
|
|
16
|
+
import { DateTime } from 'luxon';
|
|
17
|
+
import ThrottleEvent from '@typo3/core/event/throttle-event';
|
|
18
|
+
import type { PostValidationEvent } from '@typo3/backend/form-engine-validation';
|
|
19
|
+
import '@typo3/backend/input/clearable';
|
|
20
|
+
|
|
21
|
+
const ISO8601_UTC = 'ISO8601_UTC';
|
|
22
|
+
|
|
23
|
+
interface FlatpickrInputElement extends HTMLInputElement {
|
|
24
|
+
_flatpickr: flatpickr.Instance;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Module: @typo3/backend/date-time-picker
|
|
29
|
+
* contains all logic for the date time picker used in FormEngine, EXT:belog and EXT:scheduler
|
|
30
|
+
*/
|
|
31
|
+
class DateTimePicker {
|
|
32
|
+
private readonly format: string = (typeof opener?.top?.TYPO3 !== 'undefined' ? opener.top : top).TYPO3.settings.DateTimePicker.DateFormat;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* initialize date fields to add a datepicker to each field
|
|
36
|
+
* note: this function can be called multiple times (e.g. after AJAX requests) because it only
|
|
37
|
+
* applies to fields which haven't been used yet.
|
|
38
|
+
*/
|
|
39
|
+
public initialize(element: HTMLInputElement): void {
|
|
40
|
+
if (!(element instanceof HTMLInputElement) || typeof element.dataset.datepickerInitialized !== 'undefined') {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let userLocale = document.documentElement.lang;
|
|
45
|
+
if (!userLocale || userLocale === 'en') {
|
|
46
|
+
// flatpickr's English localization is "default"
|
|
47
|
+
userLocale = 'default';
|
|
48
|
+
} else if (userLocale === 'ch') {
|
|
49
|
+
// Fix our made up locale "ch"
|
|
50
|
+
userLocale = 'zh';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
element.dataset.datepickerInitialized = '1';
|
|
54
|
+
import('flatpickr/dist/l10n').then((): void => {
|
|
55
|
+
this.initializeField(element, userLocale as flatpickr.Options.LocaleKey);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Initialize a single field
|
|
61
|
+
*/
|
|
62
|
+
private initializeField(inputElement: HTMLInputElement, locale: flatpickr.Options.LocaleKey): void {
|
|
63
|
+
const scrollEvent = this.getScrollEvent();
|
|
64
|
+
const options = this.getDateOptions(inputElement);
|
|
65
|
+
options.locale = locale;
|
|
66
|
+
options.onOpen = [
|
|
67
|
+
(): void => {
|
|
68
|
+
scrollEvent.bindTo(document.querySelector('.t3js-module-body'));
|
|
69
|
+
}
|
|
70
|
+
];
|
|
71
|
+
options.onClose = (): void => {
|
|
72
|
+
scrollEvent.release();
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// initialize the date time picker on this element
|
|
76
|
+
const dateTimePicker = flatpickr(inputElement, options);
|
|
77
|
+
if (dateTimePicker.altInput instanceof HTMLInputElement) {
|
|
78
|
+
// Explicitly handle clearing input (invoked by clearable control) if altInput is available
|
|
79
|
+
dateTimePicker.input.addEventListener('typo3:internal:clear', (): void => {
|
|
80
|
+
// @todo The `typo3:internal:clear` event is a hack and must fall again
|
|
81
|
+
dateTimePicker.clear();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
dateTimePicker._input.addEventListener('change', (e: Event): void => {
|
|
86
|
+
// Update selected date in picker after manually entering a value
|
|
87
|
+
const value = (e.target as HTMLInputElement).value;
|
|
88
|
+
const parsedDate: Date = dateTimePicker.parseDate(value, dateTimePicker.config.altFormat);
|
|
89
|
+
|
|
90
|
+
dateTimePicker.setDate(parsedDate, true);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
dateTimePicker._input.addEventListener('keyup', (e: KeyboardEvent): void => {
|
|
94
|
+
if (e.key === 'Escape') {
|
|
95
|
+
dateTimePicker.close();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Due to some whack CSS the scrollPosition of the document stays 0 which renders a stuck date time picker.
|
|
102
|
+
* Because of this the position is recalculated on scrolling `.t3js-module-body`.
|
|
103
|
+
*
|
|
104
|
+
* @return {ThrottleEvent}
|
|
105
|
+
*/
|
|
106
|
+
private getScrollEvent(): ThrottleEvent {
|
|
107
|
+
return new ThrottleEvent('scroll', (): void => {
|
|
108
|
+
const activeFlatpickrElement = document.querySelector('.flatpickr-input.active') as FlatpickrInputElement;
|
|
109
|
+
if (activeFlatpickrElement === null) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const bounds = activeFlatpickrElement.getBoundingClientRect();
|
|
114
|
+
const additionalOffset = 2;
|
|
115
|
+
const calendarHeight = activeFlatpickrElement._flatpickr.calendarContainer.offsetHeight;
|
|
116
|
+
const distanceFromBottom = window.innerHeight - bounds.bottom;
|
|
117
|
+
const showOnTop = distanceFromBottom < calendarHeight && bounds.top > calendarHeight;
|
|
118
|
+
|
|
119
|
+
let newPosition;
|
|
120
|
+
let arrowClass;
|
|
121
|
+
if (showOnTop) {
|
|
122
|
+
newPosition = bounds.y - calendarHeight - additionalOffset;
|
|
123
|
+
arrowClass = 'arrowBottom';
|
|
124
|
+
} else {
|
|
125
|
+
newPosition = bounds.y + bounds.height + additionalOffset;
|
|
126
|
+
arrowClass = 'arrowTop';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
activeFlatpickrElement._flatpickr.calendarContainer.style.top = newPosition + 'px';
|
|
130
|
+
activeFlatpickrElement._flatpickr.calendarContainer.classList.remove('arrowBottom', 'arrowTop');
|
|
131
|
+
activeFlatpickrElement._flatpickr.calendarContainer.classList.add(arrowClass);
|
|
132
|
+
}, 15);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Initialize a single field
|
|
137
|
+
*
|
|
138
|
+
* @param {HTMLInputElement} inputElement
|
|
139
|
+
*/
|
|
140
|
+
private getDateOptions(inputElement: HTMLInputElement): flatpickr.Options.Options {
|
|
141
|
+
|
|
142
|
+
const format = this.format;
|
|
143
|
+
const type = inputElement.dataset.dateType;
|
|
144
|
+
const now = new Date();
|
|
145
|
+
const options: flatpickr.Options.Options = {
|
|
146
|
+
altFormat: '',
|
|
147
|
+
allowInput: true,
|
|
148
|
+
altInput: true,
|
|
149
|
+
ariaDateFormat: 'DDDD',
|
|
150
|
+
// We configure a dummy dateFormat token and use luxon parsing/formatting
|
|
151
|
+
// internally, as flatpickr cannot be configured to ignore timezones
|
|
152
|
+
// (in order to behave similar to <input type=datetime-local>)
|
|
153
|
+
dateFormat: ISO8601_UTC,
|
|
154
|
+
defaultHour: now.getHours(),
|
|
155
|
+
defaultMinute: now.getMinutes(),
|
|
156
|
+
enableSeconds: false,
|
|
157
|
+
enableTime: false,
|
|
158
|
+
formatDate: (date: Date, format: string) => {
|
|
159
|
+
const dt = DateTime.fromJSDate(date);
|
|
160
|
+
if (format === ISO8601_UTC) {
|
|
161
|
+
// JS dates are always encoded in localtime (flatpickr can only operate in localtime) and are now "intepreted" as UTC:
|
|
162
|
+
// We discard the intermediate local-time offset; that means the hours and minutes from localtime are rendered as-is
|
|
163
|
+
return dt.toUTC().plus(dt.offset * 60 * 1000).toISO({ suppressMilliseconds: true });
|
|
164
|
+
}
|
|
165
|
+
return dt.toFormat(format);
|
|
166
|
+
},
|
|
167
|
+
parseDate: (currentDateString: string, format: string): Date => {
|
|
168
|
+
if (format === ISO8601_UTC) {
|
|
169
|
+
const isoDt = DateTime.fromISO(currentDateString, { zone: 'utc' });
|
|
170
|
+
if (!isoDt.isValid) {
|
|
171
|
+
throw new Error('Invalid ISO8601 date: ' + currentDateString);
|
|
172
|
+
}
|
|
173
|
+
const localDate = isoDt.toLocal();
|
|
174
|
+
// This is the reverse operation of the formatting in `formatDate`:
|
|
175
|
+
// We substract the localtime offset to generate a local-time JS Date instance,
|
|
176
|
+
// that will contain the same local-time hour/time values as the UTC input.
|
|
177
|
+
return localDate.minus(localDate.offset * 60 * 1000).toJSDate();
|
|
178
|
+
}
|
|
179
|
+
return DateTime.fromFormat(currentDateString, format).toJSDate();
|
|
180
|
+
},
|
|
181
|
+
onReady: (dates: Date[], currentDateString: string, self: flatpickr.Instance): void => {
|
|
182
|
+
if (self.altInput !== undefined) {
|
|
183
|
+
// Transfer the id of the original input to the altInput
|
|
184
|
+
// This is a hack for the picker button - one would use `{wrap: true}` in flatpickr, but this apparently
|
|
185
|
+
// collides with using altInput – sigh.
|
|
186
|
+
self.altInput.id = self.input.id;
|
|
187
|
+
self.input.removeAttribute('id');
|
|
188
|
+
self.altInput.clearable();
|
|
189
|
+
if (self.input.dataset.formengineInputName !== undefined) {
|
|
190
|
+
self.altInput.dataset.formengineDatepickerRealInputName = self.input.dataset.formengineInputName;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Register a custom event handler for `t3-formengine-postfieldvalidation` to be able to toggle the `has-error` class on the mirrored field
|
|
194
|
+
self.altInput.form.addEventListener('t3-formengine-postfieldvalidation', (e: CustomEvent<PostValidationEvent>): void => {
|
|
195
|
+
if (e.detail.field === self.input) {
|
|
196
|
+
self.altInput.classList.toggle('has-error', !e.detail.isValid);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
onChange: (dates: Date[], currentDateString: string, self: flatpickr.Instance): void => {
|
|
202
|
+
self.input.dispatchEvent(new Event('formengine.dp.change'));
|
|
203
|
+
},
|
|
204
|
+
maxDate: '',
|
|
205
|
+
minDate: '',
|
|
206
|
+
minuteIncrement: 1,
|
|
207
|
+
noCalendar: false,
|
|
208
|
+
showMonths: 1,
|
|
209
|
+
// Disable month dropdown in `time`, `timesec` or `year` fields to fix:
|
|
210
|
+
// `TypeError: Cannot set properties of undefined (setting 'tabIndex')` in flatpickr
|
|
211
|
+
// Rproducible when entering an arbitrary time (e.g. "13:30")
|
|
212
|
+
// and pressing the TAB key in a time field.
|
|
213
|
+
monthSelectorType: type.startsWith('date') ? 'dropdown' : 'static',
|
|
214
|
+
weekNumbers: true,
|
|
215
|
+
time_24hr: !Intl.DateTimeFormat(navigator.language, { hour: 'numeric' }).resolvedOptions().hour12,
|
|
216
|
+
plugins: [
|
|
217
|
+
ShortcutButtonsPlugin({
|
|
218
|
+
theme: 'typo3',
|
|
219
|
+
button: [
|
|
220
|
+
{
|
|
221
|
+
label: top.TYPO3.lang['labels.datepicker.today'] || 'Today'
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
onClick: (index: number, fp: flatpickr.Instance) => {
|
|
225
|
+
fp.setDate(new Date(), true);
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// set options based on type
|
|
232
|
+
switch (type) {
|
|
233
|
+
case 'datetime':
|
|
234
|
+
options.altFormat = format[1];
|
|
235
|
+
options.enableTime = true;
|
|
236
|
+
break;
|
|
237
|
+
case 'date':
|
|
238
|
+
options.altFormat = format[0];
|
|
239
|
+
break;
|
|
240
|
+
case 'time':
|
|
241
|
+
options.altFormat = 'HH:mm';
|
|
242
|
+
options.enableTime = true;
|
|
243
|
+
options.noCalendar = true;
|
|
244
|
+
break;
|
|
245
|
+
case 'timesec':
|
|
246
|
+
options.altFormat = 'HH:mm:ss';
|
|
247
|
+
options.enableSeconds = true;
|
|
248
|
+
options.enableTime = true;
|
|
249
|
+
options.noCalendar = true;
|
|
250
|
+
break;
|
|
251
|
+
case 'year':
|
|
252
|
+
options.altFormat = 'yyyy';
|
|
253
|
+
break;
|
|
254
|
+
default:
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (inputElement.dataset.dateMinDate !== undefined) {
|
|
258
|
+
options.minDate = options.parseDate(inputElement.dataset.dateMinDate, ISO8601_UTC);
|
|
259
|
+
options.minDate.setSeconds(0);
|
|
260
|
+
}
|
|
261
|
+
if (inputElement.dataset.dateMaxDate !== undefined) {
|
|
262
|
+
options.maxDate = options.parseDate(inputElement.dataset.dateMaxDate, ISO8601_UTC);
|
|
263
|
+
options.maxDate.setSeconds(59);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return options;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export default new DateTimePicker();
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import Icons from './icons';
|
|
16
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
17
|
+
import { selector } from '@typo3/core/literals';
|
|
18
|
+
|
|
19
|
+
export type PreSubmitCallback = (e: Event) => boolean;
|
|
20
|
+
|
|
21
|
+
type SubmitTriggerHTMLElement = HTMLAnchorElement|HTMLButtonElement;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Module: @typo3/backend/document-save-actions
|
|
25
|
+
* @deprecated: use @typo3/backend/form/submit-interceptor instead
|
|
26
|
+
*/
|
|
27
|
+
class DocumentSaveActions {
|
|
28
|
+
private static instance: DocumentSaveActions = null;
|
|
29
|
+
private preventDoubleClick: boolean = false;
|
|
30
|
+
private readonly preSubmitCallbacks: PreSubmitCallback[] = [];
|
|
31
|
+
|
|
32
|
+
private constructor() {
|
|
33
|
+
console.warn('The module `@typo3/backend/document-save-actions.js` has been deprecated and will be removed in TYPO3 v14. Please consider migrating to `@typo3/backend/form/submit-interceptor.js` instead.');
|
|
34
|
+
DocumentService.ready().then((): void => {
|
|
35
|
+
this.initializeSaveHandling();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public static getInstance(): DocumentSaveActions {
|
|
40
|
+
if (DocumentSaveActions.instance === null) {
|
|
41
|
+
DocumentSaveActions.instance = new DocumentSaveActions();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return DocumentSaveActions.instance;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public static registerEvents(): void {
|
|
48
|
+
DocumentSaveActions.getInstance();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Adds a callback being executed before submit
|
|
53
|
+
*/
|
|
54
|
+
public addPreSubmitCallback(callback: PreSubmitCallback): void {
|
|
55
|
+
if (typeof callback !== 'function') {
|
|
56
|
+
throw 'callback must be a function.';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.preSubmitCallbacks.push(callback);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Initializes the save handling
|
|
64
|
+
*/
|
|
65
|
+
private initializeSaveHandling(): void {
|
|
66
|
+
const docHeader = document.querySelector('.t3js-module-docheader');
|
|
67
|
+
if (docHeader === null) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const elements = [
|
|
72
|
+
'button[form]',
|
|
73
|
+
'button[name^="_save"]',
|
|
74
|
+
'a[data-name^="_save"]',
|
|
75
|
+
'button[name="CMD"][value^="save"]',
|
|
76
|
+
'a[data-name="CMD"][data-value^="save"]',
|
|
77
|
+
].join(',');
|
|
78
|
+
|
|
79
|
+
new RegularEvent('click', (e: Event, target: SubmitTriggerHTMLElement): void => {
|
|
80
|
+
if (this.preventDoubleClick) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const form = this.getAttachedForm(target);
|
|
85
|
+
if (form === null) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Run any preSubmit callbacks
|
|
90
|
+
for (const callback of this.preSubmitCallbacks) {
|
|
91
|
+
const callbackResult = callback(e);
|
|
92
|
+
if (!callbackResult) {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.preventDoubleClick = true;
|
|
99
|
+
|
|
100
|
+
// All callbacks were executed, add dummy field for POST action to make clear we're submitting something...
|
|
101
|
+
this.attachSaveFieldToForm(form, target);
|
|
102
|
+
|
|
103
|
+
form.addEventListener('submit', (): void => {
|
|
104
|
+
const splitButton = target.closest('.t3js-splitbutton');
|
|
105
|
+
let affectedButton: SubmitTriggerHTMLElement;
|
|
106
|
+
if (splitButton !== null) {
|
|
107
|
+
affectedButton = splitButton.firstElementChild as HTMLButtonElement;
|
|
108
|
+
splitButton.querySelectorAll('button').forEach((button: HTMLButtonElement): void => { button.disabled = true; });
|
|
109
|
+
} else {
|
|
110
|
+
affectedButton = target;
|
|
111
|
+
if (affectedButton instanceof HTMLAnchorElement) {
|
|
112
|
+
affectedButton.classList.add('disabled');
|
|
113
|
+
} else {
|
|
114
|
+
affectedButton.disabled = true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
Icons.getIcon('spinner-circle', Icons.sizes.small).then((markup: string): void => {
|
|
119
|
+
affectedButton.replaceChild(document.createRange().createContextualFragment(markup), target.querySelector('.t3js-icon'));
|
|
120
|
+
}).catch(() => {
|
|
121
|
+
// Catch error in case the promise was not resolved
|
|
122
|
+
// e.g. loading a new page
|
|
123
|
+
});
|
|
124
|
+
}, { once: true });
|
|
125
|
+
}).delegateTo(docHeader, elements);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private getAttachedForm(trigger: SubmitTriggerHTMLElement): HTMLFormElement|null {
|
|
129
|
+
let form;
|
|
130
|
+
if (trigger instanceof HTMLAnchorElement) {
|
|
131
|
+
form = document.querySelector(selector`#${trigger.dataset.form}`) as HTMLFormElement|null;
|
|
132
|
+
} else {
|
|
133
|
+
form = trigger.form;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!form) {
|
|
137
|
+
form = trigger.closest('form');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return form;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private attachSaveFieldToForm(form: HTMLFormElement, trigger: SubmitTriggerHTMLElement): void {
|
|
144
|
+
const inputId = form.name + '_save_field';
|
|
145
|
+
let saveValueInput = document.getElementById(inputId) as HTMLInputElement|null;
|
|
146
|
+
if (saveValueInput === null) {
|
|
147
|
+
saveValueInput = document.createElement('input');
|
|
148
|
+
saveValueInput.id = inputId;
|
|
149
|
+
saveValueInput.type = 'hidden';
|
|
150
|
+
|
|
151
|
+
form.append(saveValueInput);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
saveValueInput.name = trigger instanceof HTMLAnchorElement ? trigger.dataset.name : trigger.name;
|
|
155
|
+
saveValueInput.value = trigger instanceof HTMLAnchorElement ? trigger.dataset.value : trigger.value;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export default DocumentSaveActions;
|