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,366 @@
|
|
|
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 { LitElement, html, type TemplateResult } from 'lit';
|
|
15
|
+
import { customElement, property, state } from 'lit/decorators';
|
|
16
|
+
import { classMap } from 'lit/directives/class-map';
|
|
17
|
+
import { ifDefined } from 'lit/directives/if-defined';
|
|
18
|
+
import type { AbstractAction } from './action-button/abstract-action';
|
|
19
|
+
import { SeverityEnum } from './enum/severity';
|
|
20
|
+
import Severity from './severity';
|
|
21
|
+
import '@typo3/backend/element/icon-element';
|
|
22
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
23
|
+
|
|
24
|
+
interface Action {
|
|
25
|
+
label: string;
|
|
26
|
+
action?: AbstractAction;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Module: @typo3/backend/notification
|
|
31
|
+
* Notification API for the TYPO3 backend
|
|
32
|
+
*/
|
|
33
|
+
class Notification {
|
|
34
|
+
private static readonly duration: number = 5;
|
|
35
|
+
private static readonly showClearAllButtonCount: number = 2;
|
|
36
|
+
private static totalNotifications: number = 0;
|
|
37
|
+
private static messageContainer: HTMLElement = null;
|
|
38
|
+
private static notificationList: HTMLElement = null;
|
|
39
|
+
private static clearAllButton: HTMLElement = null;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Show a notice notification
|
|
43
|
+
*
|
|
44
|
+
* @param {string} title
|
|
45
|
+
* @param {string} message
|
|
46
|
+
* @param {number} duration
|
|
47
|
+
* @param {Action[]} actions
|
|
48
|
+
*/
|
|
49
|
+
public static notice(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
|
|
50
|
+
Notification.showMessage(title, message, SeverityEnum.notice, duration, actions);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Show a info notification
|
|
55
|
+
*
|
|
56
|
+
* @param {string} title
|
|
57
|
+
* @param {string} message
|
|
58
|
+
* @param {number} duration
|
|
59
|
+
* @param {Action[]} actions
|
|
60
|
+
*/
|
|
61
|
+
public static info(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
|
|
62
|
+
Notification.showMessage(title, message, SeverityEnum.info, duration, actions);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Show a success notification
|
|
67
|
+
*
|
|
68
|
+
* @param {string} title
|
|
69
|
+
* @param {string} message
|
|
70
|
+
* @param {number} duration
|
|
71
|
+
* @param {Action[]} actions
|
|
72
|
+
*/
|
|
73
|
+
public static success(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
|
|
74
|
+
Notification.showMessage(title, message, SeverityEnum.ok, duration, actions);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Show a warning notification
|
|
79
|
+
*
|
|
80
|
+
* @param {string} title
|
|
81
|
+
* @param {string} message
|
|
82
|
+
* @param {number} duration
|
|
83
|
+
* @param {Action[]} actions
|
|
84
|
+
*/
|
|
85
|
+
public static warning(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
|
|
86
|
+
Notification.showMessage(title, message, SeverityEnum.warning, duration, actions);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Show a error notification
|
|
91
|
+
*
|
|
92
|
+
* @param {string} title
|
|
93
|
+
* @param {string} message
|
|
94
|
+
* @param {number} duration
|
|
95
|
+
* @param {Action[]} actions
|
|
96
|
+
*/
|
|
97
|
+
public static error(title: string, message?: string, duration: number = 0, actions?: Array<Action>): void {
|
|
98
|
+
Notification.showMessage(title, message, SeverityEnum.error, duration, actions);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @param {string} title
|
|
103
|
+
* @param {string} message
|
|
104
|
+
* @param {SeverityEnum} severity
|
|
105
|
+
* @param {number} duration
|
|
106
|
+
* @param {Action[]} actions
|
|
107
|
+
*/
|
|
108
|
+
public static showMessage(
|
|
109
|
+
title: string,
|
|
110
|
+
message?: string,
|
|
111
|
+
severity: SeverityEnum = SeverityEnum.info,
|
|
112
|
+
duration?: number | string,
|
|
113
|
+
actions: Array<Action> = [],
|
|
114
|
+
): void {
|
|
115
|
+
if (typeof duration === 'undefined') {
|
|
116
|
+
duration = (severity === SeverityEnum.error) ? 0 : this.duration;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (this.messageContainer === null || document.getElementById('alert-container') === null) {
|
|
120
|
+
this.messageContainer = document.createElement('div');
|
|
121
|
+
this.messageContainer.setAttribute('id', 'alert-container');
|
|
122
|
+
this.notificationList = document.createElement('div');
|
|
123
|
+
this.notificationList.setAttribute('class', 'alert-list');
|
|
124
|
+
// Enable focusing for keyboard scrolling (accessibility)
|
|
125
|
+
this.notificationList.setAttribute('tabindex', '0');
|
|
126
|
+
this.messageContainer.appendChild(this.notificationList);
|
|
127
|
+
|
|
128
|
+
this.clearAllButton = <ClearNotificationMessages>document.createElement('typo3-notification-clear-all');
|
|
129
|
+
this.containerItemVisibility();
|
|
130
|
+
this.messageContainer.prepend(this.clearAllButton);
|
|
131
|
+
document.body.appendChild(this.messageContainer);
|
|
132
|
+
|
|
133
|
+
document.addEventListener('typo3-notification-open', () => {
|
|
134
|
+
this.totalNotifications++;
|
|
135
|
+
this.containerItemVisibility();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
document.addEventListener('typo3-notification-clear', () => {
|
|
139
|
+
// Avoid negative value
|
|
140
|
+
if(this.totalNotifications > 0) {
|
|
141
|
+
this.totalNotifications--;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
this.containerItemVisibility();
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const box = <NotificationMessage>document.createElement('typo3-notification-message');
|
|
149
|
+
box.setAttribute('notification-id', 'notification-' + Math.random().toString(36).substring(2, 6));
|
|
150
|
+
box.setAttribute('notification-title', title);
|
|
151
|
+
if (message) {
|
|
152
|
+
box.setAttribute('notification-message', message);
|
|
153
|
+
}
|
|
154
|
+
box.setAttribute('notification-severity', severity.toString());
|
|
155
|
+
box.setAttribute('notification-duration', duration.toString());
|
|
156
|
+
box.actions = actions;
|
|
157
|
+
|
|
158
|
+
// Wait for the animation to finish, before scrolling into view
|
|
159
|
+
setTimeout(() => {
|
|
160
|
+
this.notificationList.querySelector('typo3-notification-message:last-child').scrollIntoView();
|
|
161
|
+
}, Number(duration));
|
|
162
|
+
|
|
163
|
+
this.notificationList.appendChild(box);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
protected static containerItemVisibility() {
|
|
167
|
+
this.clearAllButton.hidden = this.totalNotifications < this.showClearAllButtonCount;
|
|
168
|
+
this.messageContainer.hidden = this.totalNotifications === 0;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
@customElement('typo3-notification-clear-all')
|
|
173
|
+
export class ClearNotificationMessages extends LitElement {
|
|
174
|
+
@property({ type: String, attribute: 'notification-container' }) notificationId: string;
|
|
175
|
+
|
|
176
|
+
public async clearAll() {
|
|
177
|
+
this.dispatchEvent(
|
|
178
|
+
new CustomEvent('typo3-notification-clear-all', { bubbles: true, composed: true })
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
this.hidden = true;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
protected override createRenderRoot(): HTMLElement | DocumentFragment {
|
|
185
|
+
return this;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
protected override render(): TemplateResult {
|
|
189
|
+
return html`<div><button @click=${() => this.clearAll()} class="btn btn-default">
|
|
190
|
+
<typo3-backend-icon identifier="actions-close" size="small"></typo3-backend-icon> ${lll('button.clearAll') || 'Clear all'}
|
|
191
|
+
</button></div>`;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@customElement('typo3-notification-message')
|
|
197
|
+
export class NotificationMessage extends LitElement {
|
|
198
|
+
@property({ type: String, attribute: 'notification-id' }) notificationId: string;
|
|
199
|
+
@property({ type: String, attribute: 'notification-title' }) notificationTitle: string;
|
|
200
|
+
@property({ type: String, attribute: 'notification-message' }) notificationMessage: string;
|
|
201
|
+
@property({ type: Number, attribute: 'notification-severity' }) notificationSeverity: SeverityEnum = SeverityEnum.info;
|
|
202
|
+
@property({ type: Number, attribute: 'notification-duration' }) notificationDuration: number = 0;
|
|
203
|
+
@property({ type: Array, attribute: false }) actions: Array<Action> = [];
|
|
204
|
+
|
|
205
|
+
@state() executingAction: number = -1;
|
|
206
|
+
|
|
207
|
+
public override async firstUpdated(): Promise<void> {
|
|
208
|
+
document.addEventListener('typo3-notification-clear-all', async () => {
|
|
209
|
+
this.clear();
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
const event = new CustomEvent('typo3-notification-open', { bubbles: true, composed: true });
|
|
213
|
+
this.dispatchEvent(event);
|
|
214
|
+
|
|
215
|
+
await new Promise(resolve => window.setTimeout(resolve, 200));
|
|
216
|
+
await this.requestUpdate();
|
|
217
|
+
if (this.notificationDuration > 0) {
|
|
218
|
+
await new Promise(resolve => window.setTimeout(resolve, this.notificationDuration * 1000));
|
|
219
|
+
this.clear();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public async clear(): Promise<void> {
|
|
224
|
+
this.dispatchEvent(
|
|
225
|
+
new CustomEvent('typo3-notification-clear', { bubbles: true, composed: true })
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
this.addEventListener('typo3-notification-clear-finish', (): void => {
|
|
229
|
+
this.parentNode?.removeChild(this);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const dispatchFinishEvent = (): void => {
|
|
233
|
+
this.dispatchEvent(new CustomEvent('typo3-notification-clear-finish'));
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
237
|
+
if (!prefersReducedMotion && 'animate' in this) {
|
|
238
|
+
this.style.overflow = 'hidden';
|
|
239
|
+
this.style.display = 'block';
|
|
240
|
+
this.animate(
|
|
241
|
+
[
|
|
242
|
+
{ height: this.getBoundingClientRect().height + 'px' },
|
|
243
|
+
{ height: 0, opacity: 0, marginTop: 0 },
|
|
244
|
+
], {
|
|
245
|
+
duration: 400,
|
|
246
|
+
easing: 'cubic-bezier(.02, .01, .47, 1)'
|
|
247
|
+
}
|
|
248
|
+
).onfinish = dispatchFinishEvent;
|
|
249
|
+
} else {
|
|
250
|
+
dispatchFinishEvent();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
protected override createRenderRoot(): HTMLElement | DocumentFragment {
|
|
255
|
+
return this;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
protected override render(): TemplateResult {
|
|
259
|
+
const className = Severity.getCssClass(this.notificationSeverity);
|
|
260
|
+
let icon = '';
|
|
261
|
+
switch (this.notificationSeverity) {
|
|
262
|
+
case SeverityEnum.notice:
|
|
263
|
+
icon = 'actions-lightbulb';
|
|
264
|
+
break;
|
|
265
|
+
case SeverityEnum.ok:
|
|
266
|
+
icon = 'actions-check';
|
|
267
|
+
break;
|
|
268
|
+
case SeverityEnum.warning:
|
|
269
|
+
icon = 'actions-exclamation';
|
|
270
|
+
break;
|
|
271
|
+
case SeverityEnum.error:
|
|
272
|
+
icon = 'actions-close';
|
|
273
|
+
break;
|
|
274
|
+
case SeverityEnum.info:
|
|
275
|
+
default:
|
|
276
|
+
icon = 'actions-info';
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const randomSuffix = (Math.random() + 1).toString(36).substring(2);
|
|
280
|
+
|
|
281
|
+
/* eslint-disable @stylistic/indent */
|
|
282
|
+
return html`
|
|
283
|
+
<div
|
|
284
|
+
id="${ifDefined(this.notificationId || undefined)}"
|
|
285
|
+
class="alert alert-${className} alert-dismissible"
|
|
286
|
+
role="alertdialog"
|
|
287
|
+
aria-labelledby="alert-title-${randomSuffix}"
|
|
288
|
+
aria-describedby="alert-message-${randomSuffix}"
|
|
289
|
+
>
|
|
290
|
+
<button type="button" class="close" @click="${async () => this.clear()}">
|
|
291
|
+
<span aria-hidden="true"><typo3-backend-icon identifier="actions-close" size="small"></typo3-backend-icon></span>
|
|
292
|
+
<span class="visually-hidden">Close</span>
|
|
293
|
+
</button>
|
|
294
|
+
<div class="alert-inner">
|
|
295
|
+
<div class="alert-icon">
|
|
296
|
+
<span class="icon-emphasized">
|
|
297
|
+
<typo3-backend-icon identifier="${icon}" size="small"></typo3-backend-icon>
|
|
298
|
+
</span>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="alert-content">
|
|
301
|
+
<div class="alert-title" id="alert-title-${randomSuffix}">${this.notificationTitle}</div>
|
|
302
|
+
<p class="alert-message" id="alert-message-${randomSuffix}">${this.notificationMessage ? this.notificationMessage : ''}</p>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
${this.actions.length === 0 ? '' : html`
|
|
306
|
+
<div class="alert-actions">
|
|
307
|
+
${this.actions.map((action, index) => html`
|
|
308
|
+
<a href="#"
|
|
309
|
+
title="${action.label}"
|
|
310
|
+
@click="${async (event: PointerEvent) => {
|
|
311
|
+
event.preventDefault();
|
|
312
|
+
this.executingAction = index;
|
|
313
|
+
await this.updateComplete;
|
|
314
|
+
if ('action' in action) {
|
|
315
|
+
await action.action.execute(event.currentTarget as HTMLAnchorElement);
|
|
316
|
+
}
|
|
317
|
+
this.clear();
|
|
318
|
+
}}"
|
|
319
|
+
class="${classMap({
|
|
320
|
+
executing: this.executingAction === index,
|
|
321
|
+
disabled: this.executingAction >= 0 && this.executingAction !== index
|
|
322
|
+
})}"
|
|
323
|
+
>${action.label}</a>
|
|
324
|
+
`)}
|
|
325
|
+
</div>
|
|
326
|
+
`}
|
|
327
|
+
</div>
|
|
328
|
+
`;
|
|
329
|
+
/* eslint-enable @stylistic/indent */
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
declare global {
|
|
334
|
+
interface HTMLElementTagNameMap {
|
|
335
|
+
'typo3-notification-message': NotificationMessage;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
let notificationObject: typeof Notification;
|
|
340
|
+
|
|
341
|
+
try {
|
|
342
|
+
// fetch from parent
|
|
343
|
+
if (parent && parent.window.TYPO3 && parent.window.TYPO3.Notification) {
|
|
344
|
+
notificationObject = parent.window.TYPO3.Notification;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// fetch object from outer frame
|
|
348
|
+
if (top && top.TYPO3.Notification) {
|
|
349
|
+
notificationObject = top.TYPO3.Notification;
|
|
350
|
+
}
|
|
351
|
+
} catch {
|
|
352
|
+
// This only happens if the opener, parent or top is some other url (eg a local file)
|
|
353
|
+
// which loaded the current window. Then the browser's cross domain policy jumps in
|
|
354
|
+
// and raises an exception.
|
|
355
|
+
// For this case we are safe and we can create our global object below.
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (!notificationObject) {
|
|
359
|
+
notificationObject = Notification;
|
|
360
|
+
|
|
361
|
+
// attach to global frame
|
|
362
|
+
if (typeof TYPO3 !== 'undefined') {
|
|
363
|
+
TYPO3.Notification = notificationObject;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
export default notificationObject;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export class Offset {
|
|
18
|
+
constructor(
|
|
19
|
+
public left: number,
|
|
20
|
+
public top: number,
|
|
21
|
+
public width: number,
|
|
22
|
+
public height: number
|
|
23
|
+
) {}
|
|
24
|
+
|
|
25
|
+
get right(): number {
|
|
26
|
+
return this.left + this.width;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get bottom(): number {
|
|
30
|
+
return this.top + this.height;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static fromObject({ left, top, width, height }: { left: number, top: number, width: number, height: number }): Offset {
|
|
34
|
+
return new Offset(left, top, width, height);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public clone(): Offset {
|
|
38
|
+
return new Offset(this.left, this.top, this.width, this.height);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
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 { MessageUtility } from '@typo3/backend/utility/message-utility';
|
|
16
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
17
|
+
import NProgress from 'nprogress';
|
|
18
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
19
|
+
import Modal, { type ModalElement, Types } from './modal';
|
|
20
|
+
import Notification from './notification';
|
|
21
|
+
import Severity from './severity';
|
|
22
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
23
|
+
import { topLevelModuleImport } from '@typo3/backend/utility/top-level-module-import';
|
|
24
|
+
|
|
25
|
+
interface Response {
|
|
26
|
+
file?: number;
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Module: @typo3/backend/online-media
|
|
32
|
+
* Javascript for show the online media dialog
|
|
33
|
+
*/
|
|
34
|
+
class OnlineMedia {
|
|
35
|
+
constructor() {
|
|
36
|
+
DocumentService.ready().then(async (): Promise<void> => {
|
|
37
|
+
// Since the web component is used in a modal and therefore in outer frames, we have to import the module in the
|
|
38
|
+
// top level scope. Not doing so causes issues in at least Firefox.
|
|
39
|
+
await topLevelModuleImport('@typo3/backend/form-engine/element/online-media-form-element.js');
|
|
40
|
+
this.registerEvents();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private registerEvents(): void {
|
|
45
|
+
new RegularEvent('click', (e: Event, target: HTMLButtonElement): void => {
|
|
46
|
+
this.triggerModal(target);
|
|
47
|
+
}).delegateTo(document, '.t3js-online-media-add-btn');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private addOnlineMedia(trigger: HTMLButtonElement, modalElement: ModalElement, url: string): void {
|
|
51
|
+
const target = trigger.dataset.targetFolder;
|
|
52
|
+
const allowed = trigger.dataset.onlineMediaAllowed;
|
|
53
|
+
const irreObjectUid = trigger.dataset.fileIrreObject;
|
|
54
|
+
|
|
55
|
+
NProgress.start();
|
|
56
|
+
new AjaxRequest(TYPO3.settings.ajaxUrls.online_media_create).post({
|
|
57
|
+
url: url,
|
|
58
|
+
targetFolder: target,
|
|
59
|
+
allowed: allowed,
|
|
60
|
+
}).then(async (response: AjaxResponse): Promise<void> => {
|
|
61
|
+
const data: Response = await response.resolve();
|
|
62
|
+
if (data.file) {
|
|
63
|
+
const message = {
|
|
64
|
+
actionName: 'typo3:foreignRelation:insert',
|
|
65
|
+
objectGroup: irreObjectUid,
|
|
66
|
+
table: 'sys_file',
|
|
67
|
+
uid: data.file,
|
|
68
|
+
};
|
|
69
|
+
MessageUtility.send(message);
|
|
70
|
+
modalElement.hideModal();
|
|
71
|
+
} else {
|
|
72
|
+
Notification.error(top.TYPO3.lang['online_media.error.new_media.failed'], data.error);
|
|
73
|
+
}
|
|
74
|
+
NProgress.done();
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private triggerModal(trigger: HTMLButtonElement): void {
|
|
79
|
+
const btnSubmit = trigger.dataset.btnSubmit || 'Add';
|
|
80
|
+
const placeholder = trigger.dataset.placeholder || 'Paste media url here...';
|
|
81
|
+
const allowedHelpText = trigger.dataset.onlineMediaAllowedHelpText || 'Allow to embed from sources:';
|
|
82
|
+
|
|
83
|
+
const onlineMediaForm = document.createElement('typo3-backend-formengine-online-media-form');
|
|
84
|
+
onlineMediaForm.placeholder = placeholder;
|
|
85
|
+
onlineMediaForm.setAttribute('help-text', allowedHelpText);
|
|
86
|
+
onlineMediaForm.setAttribute('extensions', trigger.dataset.onlineMediaAllowed);
|
|
87
|
+
|
|
88
|
+
Modal.advanced({
|
|
89
|
+
type: Types.default,
|
|
90
|
+
title: trigger.title,
|
|
91
|
+
content: onlineMediaForm,
|
|
92
|
+
severity: Severity.notice,
|
|
93
|
+
callback: (modalElement: ModalElement): void => {
|
|
94
|
+
modalElement.querySelector('typo3-backend-formengine-online-media-form').addEventListener('typo3:formengine:online-media-added', (e: CustomEvent): void => {
|
|
95
|
+
this.addOnlineMedia(trigger, modalElement, e.detail['online-media-url']);
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
buttons: [{
|
|
99
|
+
text: btnSubmit,
|
|
100
|
+
btnClass: 'btn btn-primary',
|
|
101
|
+
name: 'ok',
|
|
102
|
+
trigger: (): void => {
|
|
103
|
+
onlineMediaForm.querySelector('form').requestSubmit();
|
|
104
|
+
},
|
|
105
|
+
}],
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export default new OnlineMedia();
|
|
@@ -0,0 +1,91 @@
|
|
|
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 RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
import PersistentStorage from './storage/persistent';
|
|
17
|
+
|
|
18
|
+
enum IdentifierEnum {
|
|
19
|
+
hiddenElements = '.t3js-hidden-record',
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Module: @typo3/backend/page-actions
|
|
24
|
+
* JavaScript implementations for page actions
|
|
25
|
+
*/
|
|
26
|
+
class PageActions {
|
|
27
|
+
constructor() {
|
|
28
|
+
DocumentService.ready().then((): void => {
|
|
29
|
+
const pageLayoutToggleShowHidden = document.getElementById('pageLayoutToggleShowHidden') as HTMLButtonElement|null;
|
|
30
|
+
if (pageLayoutToggleShowHidden !== null) {
|
|
31
|
+
new RegularEvent('click', this.toggleContentElementVisibility).bindTo(pageLayoutToggleShowHidden);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Toggles the "Show hidden content elements"
|
|
38
|
+
*/
|
|
39
|
+
private toggleContentElementVisibility(e: Event): void {
|
|
40
|
+
const me = e.target as HTMLButtonElement;
|
|
41
|
+
const hiddenElements = document.querySelectorAll(IdentifierEnum.hiddenElements) as NodeListOf<HTMLElement>;
|
|
42
|
+
const show = me.dataset.dropdowntoggleStatus !== 'active';
|
|
43
|
+
me.disabled = true;
|
|
44
|
+
|
|
45
|
+
for (const hiddenElement of hiddenElements) {
|
|
46
|
+
hiddenElement.style.display = 'flow-root';
|
|
47
|
+
const scrollHeight = hiddenElement.scrollHeight;
|
|
48
|
+
|
|
49
|
+
// Always set `overflow: clip` after storing scrollHeight
|
|
50
|
+
// * For hidden state `height: 0px` is already set.
|
|
51
|
+
// * For visible state setting `overflow: clip` is fine anyway.
|
|
52
|
+
hiddenElement.style.overflow = 'clip';
|
|
53
|
+
|
|
54
|
+
if (!show) {
|
|
55
|
+
// * Invisible elements must not be accessible/focusable by keyboard.
|
|
56
|
+
// * Spacing between content elements is kept uniform by collapsed margins,
|
|
57
|
+
// hidden elements have a height of 0 and the margins of the surrounding elements
|
|
58
|
+
// cannot collapse, causing a visual gap.
|
|
59
|
+
// Therefore do not display the element at all by setting `display: none`.
|
|
60
|
+
hiddenElement.addEventListener('transitionend', (): void => {
|
|
61
|
+
hiddenElement.style.display = 'none';
|
|
62
|
+
hiddenElement.style.overflow = '';
|
|
63
|
+
}, { once: true });
|
|
64
|
+
|
|
65
|
+
// We use requestAnimationFrame() as we have to set the container's height at first before resizing to
|
|
66
|
+
// collapsed-element-height. This results in a smooth animation.
|
|
67
|
+
requestAnimationFrame(function() {
|
|
68
|
+
hiddenElement.style.height = scrollHeight + 'px';
|
|
69
|
+
requestAnimationFrame(function() {
|
|
70
|
+
hiddenElement.style.height = 0 + 'px';
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
hiddenElement.addEventListener('transitionend', (): void => {
|
|
75
|
+
hiddenElement.style.display = '';
|
|
76
|
+
hiddenElement.style.overflow = '';
|
|
77
|
+
hiddenElement.style.height = '';
|
|
78
|
+
}, { once: true });
|
|
79
|
+
|
|
80
|
+
hiddenElement.style.height = scrollHeight + 'px';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
me.dataset.dropdowntoggleStatus = show ? 'active' : 'inactive';
|
|
85
|
+
PersistentStorage.set('moduleData.web_layout.showHidden', show ? '1' : '0').then((): void => {
|
|
86
|
+
me.disabled = false;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default new PageActions();
|
|
@@ -0,0 +1,51 @@
|
|
|
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 LinkBrowser from './link-browser';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/page-link-handler
|
|
19
|
+
* @exports @typo3/backend/page-link-handler
|
|
20
|
+
* Page link interaction
|
|
21
|
+
*/
|
|
22
|
+
class PageLinkHandler {
|
|
23
|
+
constructor() {
|
|
24
|
+
new RegularEvent('click', (evt: MouseEvent, targetEl: HTMLElement): void => {
|
|
25
|
+
evt.preventDefault();
|
|
26
|
+
LinkBrowser.finalizeFunction(targetEl.getAttribute('href'));
|
|
27
|
+
}).delegateTo(document, 'a.t3js-pageLink');
|
|
28
|
+
|
|
29
|
+
// Input field
|
|
30
|
+
new RegularEvent('click', (evt: MouseEvent): void => {
|
|
31
|
+
evt.preventDefault();
|
|
32
|
+
this.linkPageByTextfield();
|
|
33
|
+
}).delegateTo(document, 'input.t3js-pageLink');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private readonly linkPageByTextfield = (): void => {
|
|
37
|
+
const textField = document.getElementById('luid') as HTMLInputElement;
|
|
38
|
+
let value = textField.value;
|
|
39
|
+
if (!value) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// make sure we use proper link syntax if this is an integer only
|
|
43
|
+
const valueAsNumber = parseInt(value, 10);
|
|
44
|
+
if (!isNaN(valueAsNumber)) {
|
|
45
|
+
value = 't3://page?uid=' + valueAsNumber;
|
|
46
|
+
}
|
|
47
|
+
LinkBrowser.finalizeFunction(value);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default new PageLinkHandler();
|