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,41 @@
|
|
|
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 { AbstractAction } from './abstract-action';
|
|
15
|
+
import Icons from '../icons';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Action used when an operation execution time is unknown.
|
|
19
|
+
*/
|
|
20
|
+
class DeferredAction extends AbstractAction {
|
|
21
|
+
protected override callback: () => Promise<void>;
|
|
22
|
+
|
|
23
|
+
public async execute(el: HTMLAnchorElement|HTMLButtonElement): Promise<void> {
|
|
24
|
+
el.dataset.actionLabel = el.innerText;
|
|
25
|
+
el.classList.add('disabled');
|
|
26
|
+
|
|
27
|
+
Icons.getIcon('spinner-circle', Icons.sizes.small).then((spinner: string): void => {
|
|
28
|
+
el.innerHTML = spinner;
|
|
29
|
+
});
|
|
30
|
+
return await this.executeCallback(el);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private async executeCallback(el: HTMLElement): Promise<void> {
|
|
34
|
+
return await Promise.resolve(this.callback()).finally(() => {
|
|
35
|
+
el.innerText = el.dataset.actionLabel;
|
|
36
|
+
el.classList.remove('disabled');
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default DeferredAction;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General 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 { AbstractAction } from './abstract-action';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Action used when an operation is executed immediately.
|
|
18
|
+
*/
|
|
19
|
+
class ImmediateAction extends AbstractAction {
|
|
20
|
+
protected override callback: () => void;
|
|
21
|
+
|
|
22
|
+
public execute(): Promise<void> {
|
|
23
|
+
return this.executeCallback();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private async executeCallback(): Promise<void> {
|
|
27
|
+
return Promise.resolve(this.callback());
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default ImmediateAction;
|
|
@@ -0,0 +1,104 @@
|
|
|
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 InfoWindow from '@typo3/backend/info-window';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
import shortcutMenu from '@typo3/backend/toolbar/shortcut-menu';
|
|
17
|
+
import windowManager from '@typo3/backend/window-manager';
|
|
18
|
+
import moduleMenuApp from '@typo3/backend/module-menu';
|
|
19
|
+
import documentService from '@typo3/core/document-service';
|
|
20
|
+
import Utility from '@typo3/backend/utility';
|
|
21
|
+
|
|
22
|
+
declare type ActionDispatchArgument = unknown;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Module: @typo3/backend/action-dispatcher
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* <a class="btn btn-default" href="#"
|
|
29
|
+
* data-dispatch-action="TYPO3.InfoWindow.showItem"
|
|
30
|
+
* data-dispatch-args-list="tt_content,123"
|
|
31
|
+
* ...
|
|
32
|
+
* data-dispatch-args="[$quot;tt_content",123]"
|
|
33
|
+
* ...
|
|
34
|
+
* data-dispatch-disabled>
|
|
35
|
+
*/
|
|
36
|
+
class ActionDispatcher {
|
|
37
|
+
private delegates: {[key: string]: (...args: ActionDispatchArgument[]) => void} = {};
|
|
38
|
+
|
|
39
|
+
public constructor() {
|
|
40
|
+
this.createDelegates();
|
|
41
|
+
documentService.ready().then((): void => this.registerEvents());
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private static resolveArguments(element: HTMLElement): null | string[] {
|
|
45
|
+
if (element.dataset.dispatchArgs) {
|
|
46
|
+
// `"` is the only literal of a PHP `json_encode` that needs to be substituted
|
|
47
|
+
// all other payload values are expected to be serialized to unicode literals
|
|
48
|
+
const json = element.dataset.dispatchArgs.replace(/"/g, '"');
|
|
49
|
+
const args = JSON.parse(json);
|
|
50
|
+
return args instanceof Array ? Utility.trimItems(args) : null;
|
|
51
|
+
} else if (element.dataset.dispatchArgsList) {
|
|
52
|
+
const args = element.dataset.dispatchArgsList.split(',');
|
|
53
|
+
return Utility.trimItems(args);
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
private createDelegates(): void {
|
|
61
|
+
this.delegates = {
|
|
62
|
+
'TYPO3.InfoWindow.showItem': InfoWindow.showItem.bind(null),
|
|
63
|
+
'TYPO3.ShortcutMenu.createShortcut': shortcutMenu.createShortcut.bind(shortcutMenu),
|
|
64
|
+
'TYPO3.WindowManager.localOpen': windowManager.localOpen.bind(windowManager),
|
|
65
|
+
'TYPO3.ModuleMenu.showModule': moduleMenuApp.App.showModule.bind(moduleMenuApp.App),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private registerEvents(): void {
|
|
70
|
+
new RegularEvent('click', this.handleClickEvent.bind(this))
|
|
71
|
+
.delegateTo(document, '[data-dispatch-action]');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private handleClickEvent(evt: Event, target: HTMLElement): void {
|
|
75
|
+
evt.preventDefault();
|
|
76
|
+
this.delegateTo(evt, target);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private delegateTo(evt: Event, target: HTMLElement): void {
|
|
80
|
+
const disabled = target.hasAttribute('data-dispatch-disabled');
|
|
81
|
+
if (disabled) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const action = target.dataset.dispatchAction;
|
|
85
|
+
let args: ActionDispatchArgument[] = ActionDispatcher.resolveArguments(target);
|
|
86
|
+
if (args instanceof Array) {
|
|
87
|
+
args = args.map((arg: string): ActionDispatchArgument => {
|
|
88
|
+
switch (arg) {
|
|
89
|
+
case '{$target}':
|
|
90
|
+
return target;
|
|
91
|
+
case '{$event}':
|
|
92
|
+
return evt;
|
|
93
|
+
default:
|
|
94
|
+
return arg;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (this.delegates[action]) {
|
|
99
|
+
this.delegates[action].apply(null, args || []);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export default new ActionDispatcher();
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
export default interface MessageInterface {
|
|
15
|
+
title: string;
|
|
16
|
+
message: string;
|
|
17
|
+
severity: number;
|
|
18
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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 type MessageInterface from './message-interface';
|
|
15
|
+
|
|
16
|
+
export default interface ResponseInterface {
|
|
17
|
+
redirect: string;
|
|
18
|
+
messages: Array<MessageInterface>;
|
|
19
|
+
hasErrors: boolean;
|
|
20
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
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 { BroadcastMessage } from '@typo3/backend/broadcast-message';
|
|
15
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
16
|
+
import DocumentService from '@typo3/core/document-service';
|
|
17
|
+
import BroadcastService from '@typo3/backend/broadcast-service';
|
|
18
|
+
import Icons from './icons';
|
|
19
|
+
import Notification from './notification';
|
|
20
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
21
|
+
import { sudoModeInterceptor } from '@typo3/backend/security/sudo-mode-interceptor';
|
|
22
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
23
|
+
import type ResponseInterface from './ajax-data-handler/response-interface';
|
|
24
|
+
|
|
25
|
+
enum Identifiers {
|
|
26
|
+
hide = 'button[data-datahandler-action="visibility"]',
|
|
27
|
+
icon = '.t3js-icon',
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface AfterProcessEventDict {
|
|
31
|
+
component: string;
|
|
32
|
+
action: string;
|
|
33
|
+
table: string;
|
|
34
|
+
uid: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Module: @typo3/backend/ajax-data-handler
|
|
39
|
+
* Javascript functions to work with AJAX and interacting with Datahandler
|
|
40
|
+
* through \TYPO3\CMS\Backend\Controller\SimpleDataHandlerController->processAjaxRequest (record_process route)
|
|
41
|
+
*/
|
|
42
|
+
class AjaxDataHandler {
|
|
43
|
+
constructor() {
|
|
44
|
+
DocumentService.ready().then((): void => {
|
|
45
|
+
this.initialize();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Refresh the page tree
|
|
51
|
+
*/
|
|
52
|
+
private static refreshPageTree(): void {
|
|
53
|
+
top.document.dispatchEvent(new CustomEvent('typo3:pagetree:refresh'));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* AJAX call to record_process route (SimpleDataHandlerController->processAjaxRequest)
|
|
58
|
+
* returns a jQuery Promise to work with
|
|
59
|
+
*
|
|
60
|
+
* @param {string | object} params
|
|
61
|
+
* @returns {Promise<ResponseInterface>}
|
|
62
|
+
*/
|
|
63
|
+
private static call(params: string | object): Promise<ResponseInterface> {
|
|
64
|
+
return (new AjaxRequest(TYPO3.settings.ajaxUrls.record_process))
|
|
65
|
+
.addMiddleware(sudoModeInterceptor)
|
|
66
|
+
.withQueryArguments(params)
|
|
67
|
+
.get()
|
|
68
|
+
.then(async (response: AjaxResponse): Promise<ResponseInterface> => {
|
|
69
|
+
return await response.resolve();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Generic function to call from the outside the script and validate directly showing errors
|
|
75
|
+
*
|
|
76
|
+
* @param {string | object} parameters
|
|
77
|
+
* @param {AfterProcessEventDict} eventDict Dictionary used as event detail. This is private API yet.
|
|
78
|
+
* @returns {Promise<ResponseInterface>}
|
|
79
|
+
*/
|
|
80
|
+
public process(parameters: string | object, eventDict?: AfterProcessEventDict): Promise<ResponseInterface> {
|
|
81
|
+
const promise = AjaxDataHandler.call(parameters);
|
|
82
|
+
return promise.then((result: ResponseInterface): ResponseInterface => {
|
|
83
|
+
if (result.hasErrors) {
|
|
84
|
+
this.handleErrors(result);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (eventDict) {
|
|
88
|
+
const payload = { ...eventDict, hasErrors: result.hasErrors };
|
|
89
|
+
const message = new BroadcastMessage(
|
|
90
|
+
'datahandler',
|
|
91
|
+
'process',
|
|
92
|
+
payload
|
|
93
|
+
);
|
|
94
|
+
BroadcastService.post(message);
|
|
95
|
+
|
|
96
|
+
const event = new CustomEvent('typo3:datahandler:process',{
|
|
97
|
+
detail: {
|
|
98
|
+
payload: payload
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
document.dispatchEvent(event);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return result;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// @todo: Many extensions rely on this behavior but it's misplaced in AjaxDataHandler. Move into recordlist.ts and deprecate in v11.
|
|
109
|
+
private initialize(): void {
|
|
110
|
+
// HIDE/UNHIDE: click events for all action icons to hide/unhide
|
|
111
|
+
new RegularEvent('click', (e: Event, element: HTMLButtonElement): void => {
|
|
112
|
+
e.preventDefault();
|
|
113
|
+
this.handleVisibilityToggle(element);
|
|
114
|
+
}).delegateTo(document, Identifiers.hide);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private handleVisibilityToggle(element: HTMLButtonElement): void
|
|
118
|
+
{
|
|
119
|
+
const rowElement = element.closest('tr[data-uid]');
|
|
120
|
+
|
|
121
|
+
// Show spinner
|
|
122
|
+
const iconElement = element.querySelector(Identifiers.icon);
|
|
123
|
+
this._showSpinnerIcon(iconElement);
|
|
124
|
+
|
|
125
|
+
const isVisible = element.dataset.datahandlerStatus === 'visible';
|
|
126
|
+
// Get Settings from element
|
|
127
|
+
const settings = {
|
|
128
|
+
table: element.dataset.datahandlerTable,
|
|
129
|
+
uid: element.dataset.datahandlerUid,
|
|
130
|
+
field: element.dataset.datahandlerField,
|
|
131
|
+
visible: isVisible,
|
|
132
|
+
overlayIcon: isVisible
|
|
133
|
+
? element.dataset.datahandlerRecordHiddenOverlayIcon ?? 'overlay-hidden'
|
|
134
|
+
: element.dataset.datahandlerRecordVisibleOverlayIcon ?? null
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const params = {
|
|
138
|
+
data: {
|
|
139
|
+
[settings.table]: {
|
|
140
|
+
[settings.uid]: {
|
|
141
|
+
[settings.field]: settings.visible
|
|
142
|
+
? element.dataset.datahandlerHiddenValue
|
|
143
|
+
: element.dataset.datahandlerVisibleValue
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Submit Data
|
|
150
|
+
this.process(params).then((result: ResponseInterface): void => {
|
|
151
|
+
if (!result.hasErrors) {
|
|
152
|
+
// Inverse current state
|
|
153
|
+
settings.visible = !(settings.visible);
|
|
154
|
+
element.setAttribute('data-datahandler-status', settings.visible ? 'visible' : 'hidden');
|
|
155
|
+
|
|
156
|
+
const elementLabel = settings.visible
|
|
157
|
+
? element.dataset.datahandlerVisibleLabel
|
|
158
|
+
: element.dataset.datahandlerHiddenLabel;
|
|
159
|
+
element.setAttribute('title', elementLabel);
|
|
160
|
+
|
|
161
|
+
const elementIconIdentifier = settings.visible
|
|
162
|
+
? element.dataset.datahandlerVisibleIcon
|
|
163
|
+
: element.dataset.datahandlerHiddenIcon;
|
|
164
|
+
const iconElement = element.querySelector(Identifiers.icon);
|
|
165
|
+
Icons.getIcon(elementIconIdentifier, Icons.sizes.small).then((icon: string): void => {
|
|
166
|
+
iconElement.replaceWith(document.createRange().createContextualFragment(icon));
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Set overlay for the record icon
|
|
170
|
+
const recordIcon = rowElement.querySelector('.col-icon ' + Identifiers.icon);
|
|
171
|
+
recordIcon.querySelector('.icon-overlay')?.remove();
|
|
172
|
+
Icons.getIcon('miscellaneous-placeholder', Icons.sizes.small, settings.overlayIcon).then((icon: string): void => {
|
|
173
|
+
const iconFragment = document.createRange().createContextualFragment(icon);
|
|
174
|
+
recordIcon.append(iconFragment.querySelector('.icon-overlay'));
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Animate row
|
|
178
|
+
const animationEvent = new RegularEvent('animationend', (): void => {
|
|
179
|
+
rowElement.classList.remove('record-pulse');
|
|
180
|
+
animationEvent.release();
|
|
181
|
+
});
|
|
182
|
+
animationEvent.bindTo(rowElement);
|
|
183
|
+
rowElement.classList.add('record-pulse');
|
|
184
|
+
|
|
185
|
+
// Refresh Pagetree
|
|
186
|
+
if (settings.table === 'pages') {
|
|
187
|
+
AjaxDataHandler.refreshPageTree();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Handle the errors from result object
|
|
195
|
+
*
|
|
196
|
+
* @param {Object} result
|
|
197
|
+
*/
|
|
198
|
+
private handleErrors(result: ResponseInterface): void {
|
|
199
|
+
for (const message of result.messages) {
|
|
200
|
+
Notification.error(message.title, message.message);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Replace the given icon with a spinner icon
|
|
206
|
+
*/
|
|
207
|
+
private _showSpinnerIcon(iconElement: Element): void {
|
|
208
|
+
Icons.getIcon('spinner-circle', Icons.sizes.small).then((icon: string): void => {
|
|
209
|
+
iconElement.replaceWith(document.createRange().createContextualFragment(icon));
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export default new AjaxDataHandler();
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
export class BackendException {
|
|
15
|
+
public readonly message: string;
|
|
16
|
+
public readonly code: number;
|
|
17
|
+
|
|
18
|
+
constructor(message: string = '', code: number = 0) {
|
|
19
|
+
this.message = message;
|
|
20
|
+
this.code = code;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
export type BroadcastEvent<Payload extends object> = CustomEvent<{ payload: Payload }>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @module @typo3/backend/broadcast-message
|
|
18
|
+
*/
|
|
19
|
+
export class BroadcastMessage<Payload = unknown> {
|
|
20
|
+
readonly componentName: string;
|
|
21
|
+
readonly eventName: string;
|
|
22
|
+
readonly payload: Payload;
|
|
23
|
+
|
|
24
|
+
constructor(componentName: string, eventName: string, payload: Payload) {
|
|
25
|
+
if (!componentName || !eventName) {
|
|
26
|
+
throw new Error('Properties componentName and eventName have to be defined');
|
|
27
|
+
}
|
|
28
|
+
this.componentName = componentName;
|
|
29
|
+
this.eventName = eventName;
|
|
30
|
+
this.payload = payload || ({} as Payload);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static fromData(data: any): BroadcastMessage {
|
|
34
|
+
const payload = Object.assign({}, data);
|
|
35
|
+
delete payload.componentName;
|
|
36
|
+
delete payload.eventName;
|
|
37
|
+
return new BroadcastMessage(
|
|
38
|
+
data.componentName,
|
|
39
|
+
data.eventName,
|
|
40
|
+
payload,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public createCustomEvent(scope: string = 'typo3'): CustomEvent {
|
|
45
|
+
return new CustomEvent(
|
|
46
|
+
[scope, this.componentName, this.eventName].join(':'),
|
|
47
|
+
{ detail: this.payload },
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
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 { BroadcastMessage } from '@typo3/backend/broadcast-message';
|
|
15
|
+
import { MessageUtility } from '@typo3/backend/utility/message-utility';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @module @typo3/backend/broadcast-service
|
|
19
|
+
*/
|
|
20
|
+
class BroadcastService {
|
|
21
|
+
private readonly channel: BroadcastChannel;
|
|
22
|
+
|
|
23
|
+
public constructor() {
|
|
24
|
+
this.channel = new BroadcastChannel('typo3');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public get isListening(): boolean {
|
|
28
|
+
return typeof this.channel.onmessage === 'function';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private static onMessage(evt: MessageEvent): void {
|
|
32
|
+
if (!MessageUtility.verifyOrigin(evt.origin)) {
|
|
33
|
+
throw 'Denied message sent by ' + evt.origin;
|
|
34
|
+
}
|
|
35
|
+
const message = BroadcastMessage.fromData(evt.data);
|
|
36
|
+
document.dispatchEvent(message.createCustomEvent('typo3'));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public listen(): void {
|
|
40
|
+
if (this.isListening) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// once `this` becomes necessary, use `.bind(this)`
|
|
44
|
+
this.channel.onmessage = BroadcastService.onMessage;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public post(message: BroadcastMessage): void {
|
|
48
|
+
this.channel.postMessage(message);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default new BroadcastService();
|
|
@@ -0,0 +1,38 @@
|
|
|
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 ElementBrowser from './element-browser';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/browse-database
|
|
19
|
+
* Database record selection
|
|
20
|
+
* @exports @typo3/backend/browse-database
|
|
21
|
+
*/
|
|
22
|
+
class BrowseDatabase {
|
|
23
|
+
constructor() {
|
|
24
|
+
new RegularEvent('click', (evt: MouseEvent, targetEl: HTMLElement): void => {
|
|
25
|
+
evt.preventDefault();
|
|
26
|
+
const data = targetEl.closest('span').dataset;
|
|
27
|
+
ElementBrowser.insertElement(
|
|
28
|
+
data.table,
|
|
29
|
+
data.uid,
|
|
30
|
+
data.title,
|
|
31
|
+
'',
|
|
32
|
+
parseInt(targetEl.dataset.close || '0', 10) === 1,
|
|
33
|
+
);
|
|
34
|
+
}).delegateTo(document, '[data-close]');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default new BrowseDatabase();
|
|
@@ -0,0 +1,88 @@
|
|
|
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 type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
15
|
+
import Notification from '@typo3/backend/notification';
|
|
16
|
+
import Icons from '@typo3/backend/icons';
|
|
17
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
18
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
19
|
+
|
|
20
|
+
enum Identifiers {
|
|
21
|
+
clearCache = '.t3js-clear-page-cache',
|
|
22
|
+
icon = '.t3js-icon',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Module: @typo3/backend/clear-cache
|
|
27
|
+
*/
|
|
28
|
+
class ClearCache {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.registerClickHandler();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private static setDisabled(element: HTMLButtonElement, isDisabled: boolean): void {
|
|
34
|
+
element.disabled = isDisabled;
|
|
35
|
+
element.classList.toggle('disabled', isDisabled);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Send an AJAX request to clear a page's cache
|
|
40
|
+
*
|
|
41
|
+
* @param {number} pageId
|
|
42
|
+
* @return Promise<AjaxResponse>
|
|
43
|
+
*/
|
|
44
|
+
private static sendClearCacheRequest(pageId: number): Promise<AjaxResponse> {
|
|
45
|
+
const request = new AjaxRequest(TYPO3.settings.ajaxUrls.web_list_clearpagecache).withQueryArguments({ id: pageId }).get({ cache: 'no-cache' });
|
|
46
|
+
request.then(async (response: AjaxResponse): Promise<void> => {
|
|
47
|
+
const data = await response.resolve();
|
|
48
|
+
if (data.success === true) {
|
|
49
|
+
Notification.success(data.title, data.message, 1);
|
|
50
|
+
} else {
|
|
51
|
+
Notification.error(data.title, data.message, 1);
|
|
52
|
+
}
|
|
53
|
+
}, (): void => {
|
|
54
|
+
Notification.error(
|
|
55
|
+
'Clearing page caches went wrong on the server side.',
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return request;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private registerClickHandler(): void {
|
|
63
|
+
const trigger = document.querySelector(`${Identifiers.clearCache}:not([disabled])`);
|
|
64
|
+
if (trigger !== null) {
|
|
65
|
+
new RegularEvent('click', (e: Event): void => {
|
|
66
|
+
e.preventDefault();
|
|
67
|
+
|
|
68
|
+
// The action trigger behaves like a button
|
|
69
|
+
const me = e.currentTarget as HTMLButtonElement;
|
|
70
|
+
const id = parseInt(me.dataset.id, 10);
|
|
71
|
+
ClearCache.setDisabled(me, true);
|
|
72
|
+
|
|
73
|
+
Icons.getIcon('spinner-circle', Icons.sizes.small, null, 'disabled').then((icon: string): void => {
|
|
74
|
+
me.querySelector(Identifiers.icon).outerHTML = icon;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
ClearCache.sendClearCacheRequest(id).finally((): void => {
|
|
78
|
+
Icons.getIcon('actions-system-cache-clear', Icons.sizes.small).then((icon: string): void => {
|
|
79
|
+
me.querySelector(Identifiers.icon).outerHTML = icon;
|
|
80
|
+
});
|
|
81
|
+
ClearCache.setDisabled(me, false);
|
|
82
|
+
});
|
|
83
|
+
}).bindTo(trigger);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export default new ClearCache();
|