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,224 @@
|
|
|
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 '@typo3/backend/element/spinner-element';
|
|
15
|
+
import LiveSearchConfigurator from '@typo3/backend/live-search/live-search-configurator';
|
|
16
|
+
import { css, html, LitElement, type TemplateResult } from 'lit';
|
|
17
|
+
import { customElement, property } from 'lit/decorators';
|
|
18
|
+
import { until } from 'lit/directives/until';
|
|
19
|
+
import '../../provider/default-result-item';
|
|
20
|
+
import { type Item, type ResultItemActionInterface, type ResultItemInterface } from './item';
|
|
21
|
+
import type { InvokeActionEventData, RequestActionsEventData } from '@typo3/backend/live-search/element/result/result-container';
|
|
22
|
+
|
|
23
|
+
type GroupedResultItems = { [key: string ]: ResultItemInterface[] };
|
|
24
|
+
|
|
25
|
+
export const componentName = 'typo3-backend-live-search-result-item-container';
|
|
26
|
+
|
|
27
|
+
@customElement('typo3-backend-live-search-result-item-container')
|
|
28
|
+
export class ItemContainer extends LitElement {
|
|
29
|
+
@property({ type: Object, attribute: false }) results: ResultItemInterface[]|null = null;
|
|
30
|
+
|
|
31
|
+
public override connectedCallback(): void {
|
|
32
|
+
super.connectedCallback();
|
|
33
|
+
this.addEventListener('scroll', this.onScroll);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public override disconnectedCallback(): void {
|
|
37
|
+
this.removeEventListener('scroll', this.onScroll);
|
|
38
|
+
super.disconnectedCallback();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
42
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
protected override render(): TemplateResult {
|
|
47
|
+
const groupedResults: GroupedResultItems = {};
|
|
48
|
+
const filteredResults = this.results.filter((result: ResultItemInterface): boolean => result !== null);
|
|
49
|
+
if (filteredResults.length !== this.results.length) {
|
|
50
|
+
console.warn(
|
|
51
|
+
'The result set contained "null" values, indicating something went wrong while building the search results. Affected values were removed to no break the user interface.'
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
filteredResults.forEach((result: ResultItemInterface): void => {
|
|
55
|
+
if (!(result.typeLabel in groupedResults)) {
|
|
56
|
+
groupedResults[result.typeLabel] = [result];
|
|
57
|
+
} else {
|
|
58
|
+
groupedResults[result.typeLabel].push(result);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return html`<typo3-backend-live-search-result-list>
|
|
63
|
+
${this.renderGroupedResults(groupedResults)}
|
|
64
|
+
</typo3-backend-live-search-result-list>`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private renderGroupedResults(groupedResults: GroupedResultItems): TemplateResult {
|
|
68
|
+
const items = [];
|
|
69
|
+
for (const [type, results] of Object.entries(groupedResults)) {
|
|
70
|
+
const countElements = results.length;
|
|
71
|
+
items.push(html`<h6 class="livesearch-result-item-group-label">${type} (${countElements})</h6>`);
|
|
72
|
+
items.push(...results.map((result: ResultItemInterface) => html`${until(
|
|
73
|
+
this.renderResultItem(result),
|
|
74
|
+
html`<typo3-backend-spinner></typo3-backend-spinner>`
|
|
75
|
+
)}`));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return html`${items}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private async renderResultItem(resultItem: ResultItemInterface): Promise<TemplateResult> {
|
|
82
|
+
const renderers = LiveSearchConfigurator.getRenderers();
|
|
83
|
+
let innerResultItemComponent;
|
|
84
|
+
|
|
85
|
+
if (renderers[resultItem.provider] !== undefined) {
|
|
86
|
+
await import(renderers[resultItem.provider].module);
|
|
87
|
+
innerResultItemComponent = renderers[resultItem.provider].callback(resultItem);
|
|
88
|
+
} else {
|
|
89
|
+
innerResultItemComponent = html`<typo3-backend-live-search-result-item-default
|
|
90
|
+
title="${resultItem.typeLabel}: ${resultItem.itemTitle}"
|
|
91
|
+
.icon="${resultItem.icon}"
|
|
92
|
+
.itemTitle="${resultItem.itemTitle}"
|
|
93
|
+
.typeLabel="${resultItem.typeLabel}"
|
|
94
|
+
.extraData="${resultItem.extraData}">
|
|
95
|
+
</typo3-backend-live-search-result-item-default>`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return html`<typo3-backend-live-search-result-item
|
|
99
|
+
.resultItem="${resultItem}"
|
|
100
|
+
@click="${() => this.invokeAction(resultItem, resultItem.actions[0])}"
|
|
101
|
+
@focus="${() => this.requestActions(resultItem)}">
|
|
102
|
+
${innerResultItemComponent}
|
|
103
|
+
</typo3-backend-live-search-result-item>`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private requestActions(resultItem: ResultItemInterface) {
|
|
107
|
+
this.parentElement.dispatchEvent(new CustomEvent<RequestActionsEventData>('livesearch:request-actions', {
|
|
108
|
+
detail: {
|
|
109
|
+
resultItem: resultItem
|
|
110
|
+
}
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private invokeAction(resultItem: ResultItemInterface, action: ResultItemActionInterface): void {
|
|
115
|
+
this.parentElement.dispatchEvent(new CustomEvent<InvokeActionEventData>('livesearch:invoke-action', {
|
|
116
|
+
detail: {
|
|
117
|
+
resultItem: resultItem,
|
|
118
|
+
action: action
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private onScroll(e: Event): void {
|
|
124
|
+
this.querySelectorAll('.livesearch-result-item-group-label').forEach((groupLabel: HTMLElement): void => {
|
|
125
|
+
groupLabel.classList.toggle('sticky', groupLabel.offsetTop <= (e.target as HTMLElement).scrollTop);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@customElement('typo3-backend-live-search-result-list')
|
|
131
|
+
export class ResultList extends LitElement {
|
|
132
|
+
static override styles = css`
|
|
133
|
+
:host {
|
|
134
|
+
display: block;
|
|
135
|
+
}
|
|
136
|
+
`;
|
|
137
|
+
|
|
138
|
+
private parentContainer: HTMLElement;
|
|
139
|
+
private resultItemDetailContainer: HTMLElement;
|
|
140
|
+
|
|
141
|
+
public override connectedCallback(): void {
|
|
142
|
+
this.parentContainer = this.closest('typo3-backend-live-search-result-container');
|
|
143
|
+
this.resultItemDetailContainer = this.parentContainer.querySelector('typo3-backend-live-search-result-item-detail-container');
|
|
144
|
+
|
|
145
|
+
super.connectedCallback();
|
|
146
|
+
this.addEventListener('keydown', this.handleKeyDown);
|
|
147
|
+
this.addEventListener('keyup', this.handleKeyUp);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public override disconnectedCallback(): void {
|
|
151
|
+
this.removeEventListener('keydown', this.handleKeyDown);
|
|
152
|
+
this.removeEventListener('keyup', this.handleKeyUp);
|
|
153
|
+
super.disconnectedCallback();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
protected override render(): TemplateResult {
|
|
157
|
+
return html`<slot></slot>`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private handleKeyDown(e: KeyboardEvent): void {
|
|
161
|
+
if (!['ArrowDown', 'ArrowUp', 'ArrowRight'].includes(e.key)) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const expectedTagName = 'typo3-backend-live-search-result-item';
|
|
166
|
+
if (document.activeElement.tagName.toLowerCase() !== expectedTagName) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
e.preventDefault();
|
|
171
|
+
|
|
172
|
+
let focusableCandidate;
|
|
173
|
+
if (e.key === 'ArrowDown') {
|
|
174
|
+
let nextSibling = document.activeElement.nextElementSibling;
|
|
175
|
+
while (nextSibling !== null && nextSibling.tagName.toLowerCase() !== expectedTagName) {
|
|
176
|
+
nextSibling = nextSibling.nextElementSibling;
|
|
177
|
+
}
|
|
178
|
+
focusableCandidate = nextSibling;
|
|
179
|
+
} else if (e.key === 'ArrowUp') {
|
|
180
|
+
let prevSibling = document.activeElement.previousElementSibling;
|
|
181
|
+
while (prevSibling !== null && prevSibling.tagName.toLowerCase() !== expectedTagName) {
|
|
182
|
+
prevSibling = prevSibling.previousElementSibling;
|
|
183
|
+
}
|
|
184
|
+
focusableCandidate = prevSibling;
|
|
185
|
+
if (focusableCandidate === null) {
|
|
186
|
+
// No possible candidate found, fall back to search input
|
|
187
|
+
focusableCandidate = (document.querySelector('typo3-backend-live-search').querySelector('input[type="search"]'));
|
|
188
|
+
}
|
|
189
|
+
} else if (e.key === 'ArrowRight') {
|
|
190
|
+
focusableCandidate = this.resultItemDetailContainer.querySelector('typo3-backend-live-search-result-item-action');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (focusableCandidate !== null) {
|
|
194
|
+
(focusableCandidate as HTMLElement).focus();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private handleKeyUp(e: KeyboardEvent): void {
|
|
199
|
+
if (!['Enter', ' '].includes(e.key)) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
e.preventDefault();
|
|
204
|
+
|
|
205
|
+
const resultItem = (e.target as Item).resultItem;
|
|
206
|
+
this.invokeAction(resultItem);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private invokeAction(item: ResultItemInterface): void {
|
|
210
|
+
this.parentContainer.dispatchEvent(new CustomEvent<InvokeActionEventData>('livesearch:invoke-action', {
|
|
211
|
+
detail: {
|
|
212
|
+
resultItem: item,
|
|
213
|
+
action: item.actions[0]
|
|
214
|
+
}
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
declare global {
|
|
220
|
+
interface HTMLElementTagNameMap {
|
|
221
|
+
'typo3-backend-live-search-result-item-container': ItemContainer;
|
|
222
|
+
'typo3-backend-live-search-result-list': ResultList;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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 { html, LitElement, type TemplateResult } from 'lit';
|
|
16
|
+
import '@typo3/backend/element/icon-element';
|
|
17
|
+
|
|
18
|
+
export interface ResultItemInterface {
|
|
19
|
+
provider: string;
|
|
20
|
+
actions: ResultItemActionInterface[];
|
|
21
|
+
icon: Record<string, string>;
|
|
22
|
+
itemTitle: string;
|
|
23
|
+
typeLabel: string;
|
|
24
|
+
extraData: { [key: string]: any }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ResultItemActionInterface {
|
|
28
|
+
identifier: string;
|
|
29
|
+
icon: Record<string, string>;
|
|
30
|
+
label: string;
|
|
31
|
+
url: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@customElement('typo3-backend-live-search-result-item')
|
|
35
|
+
export class Item extends LitElement {
|
|
36
|
+
@property({ type: Object, attribute: false }) resultItem: ResultItemInterface;
|
|
37
|
+
|
|
38
|
+
public override connectedCallback(): void {
|
|
39
|
+
super.connectedCallback();
|
|
40
|
+
|
|
41
|
+
if (!this.hasAttribute('tabindex')) {
|
|
42
|
+
this.setAttribute('tabindex', '0');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.addEventListener('focus', this.onFocus);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public override disconnectedCallback(): void {
|
|
49
|
+
this.removeEventListener('focus', this.onFocus);
|
|
50
|
+
|
|
51
|
+
super.disconnectedCallback();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
55
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected override render(): TemplateResult {
|
|
60
|
+
return html`<div class="livesearch-expand-action" @click="${(e: Event): void => { e.stopPropagation(); this.focus(); }}"><typo3-backend-icon identifier="actions-chevron-end" size="small"></typo3-backend-icon></div>`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private onFocus(e: Event) {
|
|
64
|
+
const target = e.target as HTMLElement;
|
|
65
|
+
target.parentElement.querySelector('.active')?.classList.remove('active');
|
|
66
|
+
target.classList.add('active');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
declare global {
|
|
71
|
+
interface HTMLElementTagNameMap {
|
|
72
|
+
'typo3-backend-live-search-result-item': Item;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -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 LiveSearchConfigurator from '@typo3/backend/live-search/live-search-configurator';
|
|
15
|
+
import Viewport from '@typo3/backend/viewport';
|
|
16
|
+
import { customElement, property, query } from 'lit/decorators';
|
|
17
|
+
import { html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
18
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
19
|
+
import { type ItemContainer } from './item/item-container';
|
|
20
|
+
import { type ResultDetailContainer } from './result-detail-container';
|
|
21
|
+
import type { ResultItemActionInterface, ResultItemInterface } from './item/item';
|
|
22
|
+
import type { ChooseItemEventData } from '@typo3/backend/toolbar/live-search';
|
|
23
|
+
|
|
24
|
+
export interface InvokeActionEventData {
|
|
25
|
+
resultItem: ResultItemInterface,
|
|
26
|
+
action: ResultItemActionInterface|null
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface RequestActionsEventData {
|
|
30
|
+
resultItem: ResultItemInterface,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const componentName = 'typo3-backend-live-search-result-container';
|
|
34
|
+
|
|
35
|
+
@customElement('typo3-backend-live-search-result-container')
|
|
36
|
+
export class ResultContainer extends LitElement {
|
|
37
|
+
@property({ type: Object }) results: ResultItemInterface[] | null = null;
|
|
38
|
+
@property({ type: Boolean, attribute: false }) loading: boolean = false;
|
|
39
|
+
|
|
40
|
+
@query('typo3-backend-live-search-result-item-container') itemContainer: ItemContainer;
|
|
41
|
+
@query('typo3-backend-live-search-result-item-detail-container') resultDetailContainer: ResultDetailContainer;
|
|
42
|
+
|
|
43
|
+
public override connectedCallback(): void {
|
|
44
|
+
super.connectedCallback();
|
|
45
|
+
|
|
46
|
+
this.addEventListener('livesearch:request-actions', this.onActionsRequested);
|
|
47
|
+
this.addEventListener('livesearch:invoke-action', this.onActionInvoked);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public override disconnectedCallback(): void {
|
|
51
|
+
this.removeEventListener('livesearch:request-actions', this.onActionsRequested);
|
|
52
|
+
this.removeEventListener('livesearch:invoke-action', this.onActionInvoked);
|
|
53
|
+
|
|
54
|
+
super.disconnectedCallback();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
58
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
protected override render(): TemplateResult | symbol {
|
|
63
|
+
if (this.loading) {
|
|
64
|
+
return html`<div class="d-flex flex-fill align-items-center justify-content-center"><typo3-backend-spinner size="large"></typo3-backend-spinner></div>`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (this.results === null) {
|
|
68
|
+
return nothing;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (this.results.length === 0) {
|
|
72
|
+
return html`<div class="alert alert-info">${lll('liveSearch_listEmptyText')}</div>`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return html`
|
|
76
|
+
<typo3-backend-live-search-result-item-container .results="${this.results}"></typo3-backend-live-search-result-item-container>
|
|
77
|
+
<typo3-backend-live-search-result-item-detail-container></typo3-backend-live-search-result-item-detail-container>
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private onActionsRequested(e: CustomEvent<RequestActionsEventData>): void {
|
|
82
|
+
this.resultDetailContainer.resultItem = e.detail.resultItem;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private onActionInvoked(e: CustomEvent<InvokeActionEventData>): void {
|
|
86
|
+
const invokeHandlers = LiveSearchConfigurator.getInvokeHandlers();
|
|
87
|
+
const resultItem = e.detail.resultItem;
|
|
88
|
+
const action = e.detail.action;
|
|
89
|
+
|
|
90
|
+
if (action === undefined) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (typeof invokeHandlers[resultItem.provider + '_' + action.identifier] === 'function') {
|
|
95
|
+
invokeHandlers[resultItem.provider + '_' + action.identifier](resultItem, action);
|
|
96
|
+
} else {
|
|
97
|
+
// Default handler to open the URL
|
|
98
|
+
Viewport.ContentContainer.setUrl(action.url);
|
|
99
|
+
}
|
|
100
|
+
this.dispatchEvent(new CustomEvent<ChooseItemEventData>('live-search:item-chosen', {
|
|
101
|
+
detail: { resultItem }
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
declare global {
|
|
107
|
+
interface HTMLElementTagNameMap {
|
|
108
|
+
'typo3-backend-live-search-result-container': ResultContainer;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
16
|
+
import './item/action/action-container';
|
|
17
|
+
import type { ResultItemInterface } from './item/item';
|
|
18
|
+
|
|
19
|
+
export const componentName = 'typo3-backend-live-search-result-item-detail-container';
|
|
20
|
+
|
|
21
|
+
@customElement('typo3-backend-live-search-result-item-detail-container')
|
|
22
|
+
export class ResultDetailContainer extends LitElement {
|
|
23
|
+
@property({ type: Object, attribute: false }) resultItem: ResultItemInterface|null = null;
|
|
24
|
+
|
|
25
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
26
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected override render(): TemplateResult | symbol {
|
|
31
|
+
if (this.resultItem === null) {
|
|
32
|
+
return nothing;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return html`
|
|
36
|
+
<div class="livesearch-detail-preamble">
|
|
37
|
+
<typo3-backend-icon identifier="${this.resultItem.icon.identifier}" overlay="${this.resultItem.icon.overlay}" size="large"></typo3-backend-icon>
|
|
38
|
+
<h3>${this.resultItem.itemTitle}</h3>
|
|
39
|
+
<p class="livesearch-detail-preamble-type">${this.resultItem.typeLabel}</p>
|
|
40
|
+
</div>
|
|
41
|
+
<typo3-backend-live-search-result-item-action-container .resultItem="${this.resultItem}"></typo3-backend-live-search-result-item-action-container>
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
declare global {
|
|
47
|
+
interface HTMLElementTagNameMap {
|
|
48
|
+
'typo3-backend-live-search-result-item-detail-container': ResultDetailContainer;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
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 { html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
16
|
+
import '@typo3/backend/element/icon-element';
|
|
17
|
+
import type { SelectPageEventData } from '@typo3/backend/toolbar/live-search';
|
|
18
|
+
|
|
19
|
+
export type Pagination = {
|
|
20
|
+
itemsPerPage: number,
|
|
21
|
+
currentPage: number,
|
|
22
|
+
firstPage: number,
|
|
23
|
+
lastPage: number,
|
|
24
|
+
allPageNumbers: number[],
|
|
25
|
+
previousPageNumber: number|null,
|
|
26
|
+
nextPageNumber: number|null,
|
|
27
|
+
hasMorePages: boolean,
|
|
28
|
+
hasLessPages: boolean,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
@customElement('typo3-backend-live-search-result-pagination')
|
|
32
|
+
export class ResultPagination extends LitElement {
|
|
33
|
+
@property({ type: Object }) pagination: Pagination|null = null;
|
|
34
|
+
|
|
35
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
36
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected override render(): TemplateResult | symbol {
|
|
41
|
+
if (this.pagination === null || this.pagination.allPageNumbers.length <= 1) {
|
|
42
|
+
return nothing;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return html`<nav>
|
|
46
|
+
<ul class="pagination">
|
|
47
|
+
<li class="page-item">
|
|
48
|
+
<typo3-backend-live-search-result-page class="page-link ${!this.pagination.previousPageNumber || this.pagination.previousPageNumber < this.pagination.firstPage ? 'disabled' : ''}" page="${this.pagination.previousPageNumber}" perPage="${this.pagination.itemsPerPage}">
|
|
49
|
+
<typo3-backend-icon identifier="actions-view-paging-previous" size="small"></typo3-backend-icon>
|
|
50
|
+
</typo3-backend-live-search-result-page>
|
|
51
|
+
</li>
|
|
52
|
+
${!this.pagination.allPageNumbers.includes(this.pagination.firstPage) ? html`
|
|
53
|
+
<li class="page-item">
|
|
54
|
+
<typo3-backend-live-search-result-page class="page-link" page="${this.pagination.firstPage}" perPage="${this.pagination.itemsPerPage}">
|
|
55
|
+
${this.pagination.firstPage}
|
|
56
|
+
</typo3-backend-live-search-result-page>
|
|
57
|
+
</li>` : nothing}
|
|
58
|
+
${this.pagination.hasLessPages ? html`<li class="page-item disabled"><span class="page-link disabled">…</span></li>` : nothing}
|
|
59
|
+
${this.pagination.allPageNumbers.map((page: number) => html`
|
|
60
|
+
<li class="page-item">
|
|
61
|
+
<typo3-backend-live-search-result-page page="${page}" perPage="${this.pagination.itemsPerPage}" class="page-link ${this.pagination.currentPage === page ? 'active' : ''}">${page}</typo3-backend-live-search-result-page>
|
|
62
|
+
</li>
|
|
63
|
+
`)}
|
|
64
|
+
${this.pagination.hasMorePages ? html`<li class="page-item"><span class="page-link disabled">…</span></li>` : nothing}
|
|
65
|
+
${!this.pagination.allPageNumbers.includes(this.pagination.lastPage) ? html`
|
|
66
|
+
<li class="page-item">
|
|
67
|
+
<typo3-backend-live-search-result-page class="page-link" page="${this.pagination.lastPage}" perPage="${this.pagination.itemsPerPage}">
|
|
68
|
+
${this.pagination.lastPage}
|
|
69
|
+
</typo3-backend-live-search-result-page>
|
|
70
|
+
</li>` : nothing}
|
|
71
|
+
<li class="page-item">
|
|
72
|
+
<typo3-backend-live-search-result-page class="page-link ${!this.pagination.nextPageNumber || this.pagination.nextPageNumber > this.pagination.lastPage ? 'disabled' : ''}" page="${this.pagination.nextPageNumber}" perPage="${this.pagination.itemsPerPage}">
|
|
73
|
+
<typo3-backend-icon identifier="actions-view-paging-next" size="small"></typo3-backend-icon>
|
|
74
|
+
</typo3-backend-live-search-result-page>
|
|
75
|
+
</li>
|
|
76
|
+
</ul>
|
|
77
|
+
</nav>`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@customElement('typo3-backend-live-search-result-page')
|
|
82
|
+
export class ResultPaginationPage extends LitElement {
|
|
83
|
+
@property({ type: Number }) page: number;
|
|
84
|
+
@property({ type: Number }) perPage: number;
|
|
85
|
+
|
|
86
|
+
public override connectedCallback(): void {
|
|
87
|
+
super.connectedCallback();
|
|
88
|
+
|
|
89
|
+
this.addEventListener('click', this.dispatchPaginationEvent);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public override disconnectedCallback(): void {
|
|
93
|
+
this.removeEventListener('click', this.dispatchPaginationEvent);
|
|
94
|
+
|
|
95
|
+
super.disconnectedCallback();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
99
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
protected override render(): symbol {
|
|
104
|
+
return nothing;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private dispatchPaginationEvent(): void {
|
|
108
|
+
const liveSearchContainer = this.closest('typo3-backend-live-search');
|
|
109
|
+
liveSearchContainer.dispatchEvent(new CustomEvent<SelectPageEventData>('livesearch:pagination-selected', {
|
|
110
|
+
detail: {
|
|
111
|
+
offset: (this.page - 1) * this.perPage,
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
declare global {
|
|
118
|
+
interface HTMLElementTagNameMap {
|
|
119
|
+
'typo3-backend-live-search-result-pagination': ResultPagination;
|
|
120
|
+
'typo3-backend-live-search-result-page': ResultPaginationPage;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 { html, LitElement, type TemplateResult } from 'lit';
|
|
16
|
+
import BrowserSession from '@typo3/backend/storage/browser-session';
|
|
17
|
+
import type { InvokeOptionEventData } from '@typo3/backend/toolbar/live-search';
|
|
18
|
+
|
|
19
|
+
@customElement('typo3-backend-live-search-option-item')
|
|
20
|
+
export class SearchOptionItem extends LitElement {
|
|
21
|
+
@property({ type: Boolean }) active: boolean = false;
|
|
22
|
+
@property({ type: String }) optionId: string;
|
|
23
|
+
@property({ type: String }) optionName: string;
|
|
24
|
+
@property({ type: String }) optionLabel: string;
|
|
25
|
+
|
|
26
|
+
private parentContainer: HTMLElement;
|
|
27
|
+
|
|
28
|
+
public override connectedCallback(): void {
|
|
29
|
+
this.parentContainer = this.closest('typo3-backend-live-search');
|
|
30
|
+
|
|
31
|
+
super.connectedCallback();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
35
|
+
// Avoid shadow DOM for Bootstrap CSS to be applied
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
protected override render(): TemplateResult {
|
|
40
|
+
return html`
|
|
41
|
+
<div class="form-check">
|
|
42
|
+
<input type="checkbox" class="form-check-input" name="${this.optionName}[]" value="${this.optionId}" id="${this.optionId}" ?checked=${this.active} @input="${this.handleInput}">
|
|
43
|
+
<label class="form-check-label" for="${this.optionId}">
|
|
44
|
+
${this.optionLabel}
|
|
45
|
+
</label>
|
|
46
|
+
</div>
|
|
47
|
+
`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private getStorageKey(): string {
|
|
51
|
+
return `livesearch-option-${this.optionName}-${this.optionId}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private handleInput() {
|
|
55
|
+
this.active = !this.active;
|
|
56
|
+
this.parentContainer.dispatchEvent(new CustomEvent<InvokeOptionEventData>('typo3:live-search:option-invoked', {
|
|
57
|
+
detail: {
|
|
58
|
+
active: this.active
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
BrowserSession.set(this.getStorageKey(), this.active ? '1' : '0');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare global {
|
|
67
|
+
interface HTMLElementTagNameMap {
|
|
68
|
+
'typo3-backend-live-search-option-item': SearchOptionItem;
|
|
69
|
+
}
|
|
70
|
+
}
|