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,77 @@
|
|
|
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 { default as Modal } from '@typo3/backend/modal';
|
|
16
|
+
import { topLevelModuleImport } from '@typo3/backend/utility/top-level-module-import';
|
|
17
|
+
import { html, type TemplateResult } from 'lit';
|
|
18
|
+
import { until } from 'lit/directives/until';
|
|
19
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
20
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
21
|
+
import type { JavaScriptItemPayload } from '@typo3/core/java-script-item-processor';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @todo: This could be code-de-duplicated with ext:tstemplate template-analyzer.ts,
|
|
25
|
+
* by making "Show t3editor code in a modal" a more general solution.
|
|
26
|
+
* Main trigger is t3js-pagetsconfig-includes-modal vs. t3js-typoscript-analyzer-modal
|
|
27
|
+
*/
|
|
28
|
+
class PageTsConfigIncludes {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.registerEventListeners();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private async registerEventListeners(): Promise<void> {
|
|
34
|
+
await DocumentService.ready();
|
|
35
|
+
|
|
36
|
+
document.querySelectorAll('.t3js-pagetsconfig-includes-modal').forEach((link: HTMLAnchorElement): void => {
|
|
37
|
+
link.addEventListener('click', (e: Event): void => {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
|
|
40
|
+
const type = Modal.types.default;
|
|
41
|
+
const title = link.dataset.modalTitle || link.textContent.trim();
|
|
42
|
+
const url = link.getAttribute('href');
|
|
43
|
+
const size = Modal.sizes.large;
|
|
44
|
+
const content = html`${until(
|
|
45
|
+
this.fetchModalContent(url),
|
|
46
|
+
html`<div class="modal-loading"><typo3-backend-spinner size="large"></typo3-backend-spinner></div>`
|
|
47
|
+
)}`;
|
|
48
|
+
Modal.advanced({ type, title, size, content });
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private async fetchModalContent(url: string): Promise<TemplateResult> {
|
|
54
|
+
// no `await` purpose (webcomponents initialize lazily)
|
|
55
|
+
topLevelModuleImport('@typo3/backend/code-editor/element/code-mirror-element.js');
|
|
56
|
+
|
|
57
|
+
const response: AjaxResponse = await (new AjaxRequest(url)).get();
|
|
58
|
+
const source: string = await response.resolve();
|
|
59
|
+
|
|
60
|
+
const mode: JavaScriptItemPayload = {
|
|
61
|
+
name: '@typo3/backend/code-editor/language/typoscript.js',
|
|
62
|
+
flags: 2 /* FLAG_USE_IMPORTMAP */,
|
|
63
|
+
exportName: 'typoscript',
|
|
64
|
+
items: [
|
|
65
|
+
{ type: 'invoke', args: [] }
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return html`
|
|
70
|
+
<typo3-t3editor-codemirror .mode="${mode}" nolazyload readonly class="flex-grow-1 mh-100">
|
|
71
|
+
<textarea readonly disabled class="form-control">${source}</textarea>
|
|
72
|
+
</typo3-t3editor-codemirror>
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export default new PageTsConfigIncludes();
|
|
@@ -0,0 +1,165 @@
|
|
|
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 { Popover as BootstrapPopover } from 'bootstrap';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/popover
|
|
18
|
+
* API for popover windows powered by Twitter Bootstrap.
|
|
19
|
+
* @exports @typo3/backend/popover
|
|
20
|
+
*/
|
|
21
|
+
class Popover {
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Default selector string.
|
|
25
|
+
*
|
|
26
|
+
* @return {string}
|
|
27
|
+
*/
|
|
28
|
+
private readonly DEFAULT_SELECTOR: string = '[data-bs-toggle="popover"]';
|
|
29
|
+
|
|
30
|
+
constructor() {
|
|
31
|
+
this.initialize();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Initialize
|
|
36
|
+
*/
|
|
37
|
+
public initialize(selector?: string): void {
|
|
38
|
+
selector = selector || this.DEFAULT_SELECTOR;
|
|
39
|
+
document.querySelectorAll(selector).forEach((element: HTMLElement): void => {
|
|
40
|
+
this.applyTitleIfAvailable(element);
|
|
41
|
+
new BootstrapPopover(element);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// noinspection JSMethodCanBeStatic
|
|
46
|
+
/**
|
|
47
|
+
* Popover wrapper function
|
|
48
|
+
*/
|
|
49
|
+
public popover(element: NodeListOf<HTMLElement> | HTMLElement) {
|
|
50
|
+
this.toIterable(element).forEach((element: HTMLElement): void => {
|
|
51
|
+
this.applyTitleIfAvailable(element);
|
|
52
|
+
new BootstrapPopover(element);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// noinspection JSMethodCanBeStatic
|
|
57
|
+
/**
|
|
58
|
+
* Set popover options on $element
|
|
59
|
+
*/
|
|
60
|
+
public setOptions(element: HTMLElement, options?: BootstrapPopover.Options): void {
|
|
61
|
+
options = options || <BootstrapPopover.Options>{};
|
|
62
|
+
const title: string = (options.title as string) || element.dataset.title || element.dataset.bsTitle || '';
|
|
63
|
+
const content: string = (options.content as string) || element.dataset.bsContent || '';
|
|
64
|
+
element.dataset.bsTitle = title;
|
|
65
|
+
element.dataset.bsOriginalTitle = title;
|
|
66
|
+
element.dataset.bsContent = content;
|
|
67
|
+
element.dataset.bsPlacement = 'auto';
|
|
68
|
+
|
|
69
|
+
delete options.title;
|
|
70
|
+
delete options.content;
|
|
71
|
+
|
|
72
|
+
const popover = BootstrapPopover.getInstance(element);
|
|
73
|
+
if (popover === null) {
|
|
74
|
+
console.warn('Failed to get popover instance for element.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
popover.setContent({
|
|
78
|
+
'.popover-header': title,
|
|
79
|
+
'.popover-body': content
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
for (const [optionName, optionValue] of Object.entries(options)) {
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
84
|
+
// @ts-ignore: using internal _config attribute
|
|
85
|
+
popover._config[optionName] = optionValue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// noinspection JSMethodCanBeStatic
|
|
90
|
+
/**
|
|
91
|
+
* Show popover with title and content on $element
|
|
92
|
+
*/
|
|
93
|
+
public show(element: HTMLElement): void {
|
|
94
|
+
const popover = BootstrapPopover.getInstance(element);
|
|
95
|
+
if (popover === null) {
|
|
96
|
+
console.warn('Failed to get popover instance for element.');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
popover.show();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// noinspection JSMethodCanBeStatic
|
|
103
|
+
/**
|
|
104
|
+
* Hide popover on $element
|
|
105
|
+
*/
|
|
106
|
+
public hide(element: HTMLElement): void {
|
|
107
|
+
const popover = BootstrapPopover.getInstance(element);
|
|
108
|
+
if (popover === null) {
|
|
109
|
+
console.warn('Failed to get popover instance for element.');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
popover.hide();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// noinspection JSMethodCanBeStatic
|
|
116
|
+
/**
|
|
117
|
+
* Destroy popover on $element
|
|
118
|
+
*/
|
|
119
|
+
public destroy(element: HTMLElement): void {
|
|
120
|
+
const popover = BootstrapPopover.getInstance(element);
|
|
121
|
+
if (popover === null) {
|
|
122
|
+
console.warn('Failed to get popover instance for element.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
popover.dispose();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// noinspection JSMethodCanBeStatic
|
|
129
|
+
/**
|
|
130
|
+
* Toggle popover on $element
|
|
131
|
+
*/
|
|
132
|
+
public toggle(element: HTMLElement): void {
|
|
133
|
+
const popover = BootstrapPopover.getInstance(element);
|
|
134
|
+
if (popover === null) {
|
|
135
|
+
console.warn('Failed to get popover instance for element.');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
popover.toggle();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private toIterable(element: NodeListOf<HTMLElement> | HTMLElement | unknown): NodeList | HTMLElement[] {
|
|
142
|
+
let elementList;
|
|
143
|
+
if (element instanceof HTMLElement) {
|
|
144
|
+
elementList = [element];
|
|
145
|
+
} else if (element instanceof NodeList) {
|
|
146
|
+
elementList = element;
|
|
147
|
+
} else {
|
|
148
|
+
throw `Cannot consume element of type ${element.constructor.name}, expected NodeListOf<HTMLElement> or HTMLElement`;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return elementList;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* If the element contains an attributes that qualifies as a title, store it as data attribute "bs-title"
|
|
156
|
+
*/
|
|
157
|
+
private applyTitleIfAvailable(element: HTMLElement): void {
|
|
158
|
+
const title = (element.title as string) || element.dataset.title || '';
|
|
159
|
+
if (title) {
|
|
160
|
+
element.dataset.bsTitle = title;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export default new Popover();
|
|
@@ -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 { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { PseudoButtonLitElement } from '@typo3/backend/element/pseudo-button';
|
|
16
|
+
import { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
17
|
+
import Severity from '@typo3/backend/severity';
|
|
18
|
+
import Modal from '@typo3/backend/modal';
|
|
19
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
20
|
+
|
|
21
|
+
enum Selectors {
|
|
22
|
+
formatSelector = '.t3js-record-download-format-selector',
|
|
23
|
+
formatOptions = '.t3js-record-download-format-option'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Module: @typo3/backend/record-download-button
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* <typo3-recordlist-record-download-button url="/url/to/configuration/form" subject="Download records" ok="Download" close="Cancel">
|
|
31
|
+
* <button>Download records/button>
|
|
32
|
+
* </typo3-recordlist-record-download-button>
|
|
33
|
+
*/
|
|
34
|
+
@customElement('typo3-recordlist-record-download-button')
|
|
35
|
+
export class RecordDownloadButton extends PseudoButtonLitElement {
|
|
36
|
+
@property({ type: String }) url: string;
|
|
37
|
+
@property({ type: String }) subject: string;
|
|
38
|
+
@property({ type: String }) ok: string;
|
|
39
|
+
@property({ type: String }) close: string;
|
|
40
|
+
|
|
41
|
+
protected override buttonActivated(): void {
|
|
42
|
+
this.showDownloadConfigurationModal();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private showDownloadConfigurationModal(): void {
|
|
46
|
+
if (!this.url) {
|
|
47
|
+
// Don't render modal in case no url is given
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const modal = Modal.advanced({
|
|
52
|
+
content: this.url,
|
|
53
|
+
title: this.subject || 'Download records',
|
|
54
|
+
severity: SeverityEnum.notice,
|
|
55
|
+
size: Modal.sizes.small,
|
|
56
|
+
type: Modal.types.ajax,
|
|
57
|
+
buttons: [
|
|
58
|
+
{
|
|
59
|
+
text: this.close || lll('button.close') || 'Close',
|
|
60
|
+
active: true,
|
|
61
|
+
btnClass: 'btn-default',
|
|
62
|
+
name: 'cancel',
|
|
63
|
+
trigger: (): void => modal.hideModal(),
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
text: this.ok || lll('button.ok') || 'Download',
|
|
67
|
+
btnClass: 'btn-' + Severity.getCssClass(SeverityEnum.info),
|
|
68
|
+
name: 'download',
|
|
69
|
+
trigger: (): void => {
|
|
70
|
+
const form: HTMLFormElement = modal.querySelector('form');
|
|
71
|
+
form?.submit();
|
|
72
|
+
modal.hideModal();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
ajaxCallback: (): void => {
|
|
77
|
+
const formatSelect: HTMLSelectElement = modal.querySelector(Selectors.formatSelector);
|
|
78
|
+
const formatOptions: NodeListOf<HTMLDivElement> = modal.querySelectorAll(Selectors.formatOptions);
|
|
79
|
+
|
|
80
|
+
if (formatSelect === null || !formatOptions.length) {
|
|
81
|
+
// Return in case elements do not exist in the ajax loaded modal content
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
formatSelect.addEventListener('change', (e: Event): void => {
|
|
86
|
+
const selectetFormat: string = (<HTMLSelectElement>e.target).value;
|
|
87
|
+
formatOptions.forEach((option: HTMLDivElement) => {
|
|
88
|
+
if (option.dataset.formatname !== selectetFormat) {
|
|
89
|
+
option.classList.add('hide');
|
|
90
|
+
} else {
|
|
91
|
+
option.classList.remove('hide');
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
declare global {
|
|
101
|
+
interface HTMLElementTagNameMap {
|
|
102
|
+
'typo3-recordlist-record-download-button': RecordDownloadButton;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -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 LinkBrowser from './link-browser';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/record-link-handler
|
|
19
|
+
* record link interaction
|
|
20
|
+
*/
|
|
21
|
+
class RecordLinkHandler {
|
|
22
|
+
constructor() {
|
|
23
|
+
new RegularEvent('click', (evt: MouseEvent, targetEl: HTMLElement): void => {
|
|
24
|
+
evt.preventDefault();
|
|
25
|
+
const data = targetEl.closest('span').dataset;
|
|
26
|
+
LinkBrowser.finalizeFunction(document.body.dataset.linkbrowserIdentifier + data.uid);
|
|
27
|
+
}).delegateTo(document, '[data-close]');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default new RecordLinkHandler();
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
|
|
17
|
+
enum Selectors {
|
|
18
|
+
searchFieldSelector = '#recordsearchbox-searchterm',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Module: @typo3/backend/record-search
|
|
23
|
+
* Usability improvements for the record search
|
|
24
|
+
* @exports @typo3/backend/record-search
|
|
25
|
+
*/
|
|
26
|
+
class RecordSearch {
|
|
27
|
+
private readonly searchField: HTMLInputElement = document.querySelector(Selectors.searchFieldSelector);
|
|
28
|
+
private readonly activeSearch: boolean = this.searchField ? (this.searchField.value !== '') : false;
|
|
29
|
+
|
|
30
|
+
constructor() {
|
|
31
|
+
DocumentService.ready().then((): void => {
|
|
32
|
+
// Respond to browser related clearable event
|
|
33
|
+
if (this.searchField) {
|
|
34
|
+
new RegularEvent('search', (): void => {
|
|
35
|
+
if (this.searchField.value === '' && this.activeSearch) {
|
|
36
|
+
this.searchField.closest('form').submit();
|
|
37
|
+
}
|
|
38
|
+
}).bindTo(this.searchField);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default new RecordSearch();
|
|
@@ -0,0 +1,230 @@
|
|
|
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 Icons from '@typo3/backend/icons';
|
|
15
|
+
import PersistentStorage from '@typo3/backend/storage/persistent';
|
|
16
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
17
|
+
import DocumentService from '@typo3/core/document-service';
|
|
18
|
+
import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selection';
|
|
19
|
+
import { selector } from '@typo3/core/literals';
|
|
20
|
+
import type { ActionConfiguration, ActionEventDetails } from '@typo3/backend/multi-record-selection-action';
|
|
21
|
+
|
|
22
|
+
interface IconIdentifier {
|
|
23
|
+
collapse: string;
|
|
24
|
+
expand: string;
|
|
25
|
+
}
|
|
26
|
+
interface RecordlistIdentifier {
|
|
27
|
+
entity: string;
|
|
28
|
+
toggle: string;
|
|
29
|
+
localize: string;
|
|
30
|
+
editMultiple: string;
|
|
31
|
+
icons: IconIdentifier;
|
|
32
|
+
}
|
|
33
|
+
interface EditRecordsConfiguration extends ActionConfiguration {
|
|
34
|
+
tableName: string;
|
|
35
|
+
columnsOnly: Array<string>;
|
|
36
|
+
returnUrl: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Module: @typo3/backend/recordlist
|
|
41
|
+
* Usability improvements for the record list
|
|
42
|
+
* @exports @typo3/backend/recordlist
|
|
43
|
+
*/
|
|
44
|
+
class Recordlist {
|
|
45
|
+
identifier: RecordlistIdentifier = {
|
|
46
|
+
entity: '.t3js-entity',
|
|
47
|
+
toggle: '.t3js-toggle-recordlist',
|
|
48
|
+
localize: '.t3js-action-localize',
|
|
49
|
+
editMultiple: '.t3js-record-edit-multiple',
|
|
50
|
+
icons: {
|
|
51
|
+
collapse: 'actions-view-list-collapse',
|
|
52
|
+
expand: 'actions-view-list-expand'
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
constructor() {
|
|
57
|
+
new RegularEvent('click', this.toggleClick).delegateTo(document, this.identifier.toggle);
|
|
58
|
+
new RegularEvent('click', this.onEditMultiple).delegateTo(document, this.identifier.editMultiple);
|
|
59
|
+
new RegularEvent('click', this.disableButton).delegateTo(document, this.identifier.localize);
|
|
60
|
+
DocumentService.ready().then((): void => {
|
|
61
|
+
this.registerPaginationEvents();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// multi record selection events
|
|
65
|
+
new RegularEvent('multiRecordSelection:action:edit', this.onEditMultiple).bindTo(document);
|
|
66
|
+
new RegularEvent('multiRecordSelection:action:copyMarked', (event: CustomEvent): void => {
|
|
67
|
+
Recordlist.submitClipboardFormWithCommand('copyMarked', event.target as HTMLButtonElement);
|
|
68
|
+
}).bindTo(document);
|
|
69
|
+
new RegularEvent('multiRecordSelection:action:removeMarked', (event: CustomEvent): void => {
|
|
70
|
+
Recordlist.submitClipboardFormWithCommand('removeMarked', event.target as HTMLButtonElement);
|
|
71
|
+
}).bindTo(document);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private static submitClipboardFormWithCommand(cmd: string, target: HTMLButtonElement) {
|
|
75
|
+
const clipboardForm = <HTMLFormElement>target.closest('form');
|
|
76
|
+
if (!clipboardForm) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const commandField = <HTMLInputElement>clipboardForm.querySelector('input[name="cmd"]');
|
|
80
|
+
if (!commandField) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
commandField.value = cmd;
|
|
84
|
+
clipboardForm.submit();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private static getReturnUrl(returnUrl: string): string {
|
|
88
|
+
if (returnUrl === '') {
|
|
89
|
+
returnUrl = top.list_frame.document.location.pathname + top.list_frame.document.location.search;
|
|
90
|
+
}
|
|
91
|
+
return encodeURIComponent(returnUrl);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public toggleClick = (e: MouseEvent, targetEl: HTMLElement): void => {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
|
|
97
|
+
const table = targetEl.dataset.table;
|
|
98
|
+
const target = document.querySelector(targetEl.dataset.bsTarget) as HTMLElement;
|
|
99
|
+
const isExpanded = target.dataset.state === 'expanded';
|
|
100
|
+
const collapseIcon = targetEl.querySelector('.t3js-icon');
|
|
101
|
+
const toggleIcon = isExpanded ? this.identifier.icons.expand : this.identifier.icons.collapse;
|
|
102
|
+
|
|
103
|
+
Icons.getIcon(toggleIcon, Icons.sizes.small).then((icon: string): void => {
|
|
104
|
+
collapseIcon.replaceWith(document.createRange().createContextualFragment(icon));
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Store collapse state in UC
|
|
108
|
+
let storedModuleDataList = {};
|
|
109
|
+
|
|
110
|
+
if (PersistentStorage.isset('moduleData.web_list.collapsedTables')) {
|
|
111
|
+
storedModuleDataList = PersistentStorage.get('moduleData.web_list.collapsedTables');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const collapseConfig: Record<string, number> = {};
|
|
115
|
+
collapseConfig[table] = isExpanded ? 1 : 0;
|
|
116
|
+
|
|
117
|
+
storedModuleDataList = Object.assign(storedModuleDataList, collapseConfig);
|
|
118
|
+
PersistentStorage.set('moduleData.web_list.collapsedTables', storedModuleDataList).then((): void => {
|
|
119
|
+
target.dataset.state = isExpanded ? 'collapsed' : 'expanded';
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Handles editing multiple records.
|
|
125
|
+
*/
|
|
126
|
+
public onEditMultiple = (event: Event, target: HTMLElement): void => {
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
let tableName: string = '';
|
|
129
|
+
let returnUrl: string = '';
|
|
130
|
+
let columnsOnly: Array<string> = [];
|
|
131
|
+
const entityIdentifiers: Array<string> = [];
|
|
132
|
+
|
|
133
|
+
if (event.type === 'multiRecordSelection:action:edit') {
|
|
134
|
+
// In case the request is triggerd by the multi record selection event, handling
|
|
135
|
+
// is slightly different since the event data already contain the selected records.
|
|
136
|
+
const eventDetails: ActionEventDetails = (event as CustomEvent).detail as ActionEventDetails;
|
|
137
|
+
const configuration: EditRecordsConfiguration = eventDetails.configuration;
|
|
138
|
+
returnUrl = configuration.returnUrl || '';
|
|
139
|
+
columnsOnly = configuration.columnsOnly || [];
|
|
140
|
+
tableName = configuration.tableName || '';
|
|
141
|
+
if (tableName === '') {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Evaluate all checked records and if valid, add their uid to the list
|
|
145
|
+
eventDetails.checkboxes.forEach((checkbox: HTMLInputElement): void => {
|
|
146
|
+
const checkboxContainer: HTMLElement = checkbox.closest(MultiRecordSelectionSelectors.elementSelector);
|
|
147
|
+
if (checkboxContainer !== null && checkboxContainer.dataset[configuration.idField]) {
|
|
148
|
+
entityIdentifiers.push(checkboxContainer.dataset[configuration.idField]);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
} else {
|
|
152
|
+
// Edit record request was triggered via t3js-* class on target.
|
|
153
|
+
const tableContainer: HTMLElement = target.closest('[data-table]');
|
|
154
|
+
if (tableContainer === null) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
tableName = tableContainer.dataset.table || '';
|
|
158
|
+
if (tableName === '') {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
returnUrl = target.dataset.returnUrl || '';
|
|
162
|
+
columnsOnly = JSON.parse(target.dataset.columnsOnly || '{}');
|
|
163
|
+
// Check if there are selected records, which would limit the records to edit
|
|
164
|
+
const selection: NodeListOf<HTMLElement> = tableContainer.querySelectorAll(
|
|
165
|
+
this.identifier.entity + '[data-uid][data-table="' + tableName + '"] td.col-checkbox input[type="checkbox"]:checked'
|
|
166
|
+
);
|
|
167
|
+
if (selection.length) {
|
|
168
|
+
// If there are selected records, only those are added to the list
|
|
169
|
+
selection.forEach((entity: HTMLInputElement): void => {
|
|
170
|
+
entityIdentifiers.push((entity.closest(this.identifier.entity + selector`[data-uid][data-table="${tableName}"]`) as HTMLElement).dataset.uid);
|
|
171
|
+
});
|
|
172
|
+
} else {
|
|
173
|
+
// Get all records for the current table and add their uid to the list
|
|
174
|
+
const entities: NodeListOf<HTMLElement> = tableContainer.querySelectorAll(this.identifier.entity + selector`[data-uid][data-table="${tableName}"]`);
|
|
175
|
+
if (!entities.length) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
entities.forEach((entity: HTMLElement): void => {
|
|
179
|
+
entityIdentifiers.push(entity.dataset.uid);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (!entityIdentifiers.length) {
|
|
185
|
+
// Return in case no records to edit were found
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
let editUrl: string = top.TYPO3.settings.FormEngine.moduleUrl
|
|
190
|
+
+ '&edit[' + tableName + '][' + entityIdentifiers.join(',') + ']=edit'
|
|
191
|
+
+ '&returnUrl=' + Recordlist.getReturnUrl(returnUrl);
|
|
192
|
+
|
|
193
|
+
if (columnsOnly.length > 0) {
|
|
194
|
+
editUrl += columnsOnly.map((column: string, i: number): string => '&columnsOnly[' + tableName + '][' + i + ']=' + column).join('');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
window.location.href = editUrl;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
private readonly disableButton = (event: Event, target: HTMLElement): void => {
|
|
201
|
+
target.setAttribute('disabled', 'disabled');
|
|
202
|
+
target.classList.add('disabled');
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
private readonly registerPaginationEvents = (): void => {
|
|
206
|
+
document.querySelectorAll('.t3js-recordlist-paging').forEach((trigger: HTMLInputElement) => {
|
|
207
|
+
trigger.addEventListener('keyup', (e: KeyboardEvent) => {
|
|
208
|
+
e.preventDefault();
|
|
209
|
+
let value = Number(trigger.value);
|
|
210
|
+
const min = Number(trigger.min);
|
|
211
|
+
const max = Number(trigger.max);
|
|
212
|
+
if (min && value < min) {
|
|
213
|
+
value = min;
|
|
214
|
+
}
|
|
215
|
+
if (max && value > max) {
|
|
216
|
+
value = max;
|
|
217
|
+
}
|
|
218
|
+
trigger.value = value.toString(10);
|
|
219
|
+
if (e.key === 'Enter' && value !== Number(trigger.dataset.currentpage)) {
|
|
220
|
+
const form = trigger.closest('form[name^="list-table-form-"]') as HTMLFormElement;
|
|
221
|
+
const submitUrl = new URL(form.action, window.origin);
|
|
222
|
+
submitUrl.searchParams.set('pointer', value.toString());
|
|
223
|
+
window.location.href = submitUrl.toString();
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export default new Recordlist();
|
|
@@ -0,0 +1,35 @@
|
|
|
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 interface ResourceInterface {
|
|
15
|
+
type: string;
|
|
16
|
+
identifier: string;
|
|
17
|
+
name: string;
|
|
18
|
+
hasPreview: boolean;
|
|
19
|
+
uid: number | null;
|
|
20
|
+
metaUid: number | null;
|
|
21
|
+
url: string | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class Resource implements ResourceInterface {
|
|
25
|
+
public constructor(
|
|
26
|
+
public readonly type: string,
|
|
27
|
+
public readonly identifier: string,
|
|
28
|
+
public readonly name: string,
|
|
29
|
+
public readonly hasPreview: boolean = false,
|
|
30
|
+
public readonly uid: number | null = null,
|
|
31
|
+
public readonly metaUid: number | null = null,
|
|
32
|
+
public readonly url: string | null = null,
|
|
33
|
+
) {
|
|
34
|
+
}
|
|
35
|
+
}
|