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,87 @@
|
|
|
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 { html, type TemplateResult } from 'lit';
|
|
15
|
+
import { customElement, property } from 'lit/decorators';
|
|
16
|
+
import { BaseElement } from './base';
|
|
17
|
+
import { live } from 'lit/directives/live.js';
|
|
18
|
+
|
|
19
|
+
export const componentName = 'typo3-backend-settings-type-stringlist';
|
|
20
|
+
|
|
21
|
+
@customElement(componentName)
|
|
22
|
+
export class StringlistTypeElement extends BaseElement<string[]> {
|
|
23
|
+
|
|
24
|
+
@property({ type: Array }) override value: string[];
|
|
25
|
+
|
|
26
|
+
protected updateValue(value: string, index: number) {
|
|
27
|
+
const copy = [...this.value];
|
|
28
|
+
copy[index] = value;
|
|
29
|
+
this.value = copy;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected addValue(index: number, value: string = '') {
|
|
33
|
+
this.value = this.value.toSpliced(index + 1, 0, value);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
protected removeValue(index: number) {
|
|
37
|
+
this.value = this.value.toSpliced(index, 1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected renderItem(value: string, index: number): TemplateResult {
|
|
41
|
+
return html`
|
|
42
|
+
<tr>
|
|
43
|
+
<td width="99%">
|
|
44
|
+
<input
|
|
45
|
+
id=${`${this.formid}${index > 0 ? '-' + index : ''}`}
|
|
46
|
+
type="text"
|
|
47
|
+
class="form-control"
|
|
48
|
+
?readonly=${this.readonly}
|
|
49
|
+
.value=${live(value)}
|
|
50
|
+
@change=${(e: InputEvent) => this.updateValue((e.target as HTMLInputElement).value, index)}
|
|
51
|
+
/>
|
|
52
|
+
</td>
|
|
53
|
+
<td>
|
|
54
|
+
<div class="btn-group" role="group">
|
|
55
|
+
<button class="btn btn-default" type="button" ?disabled=${this.readonly} @click=${() => this.addValue(index)}>
|
|
56
|
+
<typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
|
|
57
|
+
</button>
|
|
58
|
+
<button class="btn btn-default" type="button" ?disabled=${this.readonly} @click=${() => this.removeValue(index)}>
|
|
59
|
+
<typo3-backend-icon identifier="actions-delete" size="small"></typo3-backend-icon>
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
62
|
+
</td>
|
|
63
|
+
</tr>
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
protected override render(): TemplateResult {
|
|
68
|
+
const value = this.value || [];
|
|
69
|
+
return html`
|
|
70
|
+
<div class="form-control-wrap">
|
|
71
|
+
<div class="table-fit">
|
|
72
|
+
<table class="table table-hover">
|
|
73
|
+
<tbody>
|
|
74
|
+
${value.map((v, i) => this.renderItem(v, i))}
|
|
75
|
+
</tbody>
|
|
76
|
+
</table>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
declare global {
|
|
84
|
+
interface HTMLElementTagNameMap {
|
|
85
|
+
'typo3-backend-settings-type-stringlist': StringlistTypeElement;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { SeverityEnum } from './enum/severity';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/severity
|
|
18
|
+
* Severity for the TYPO3 backend
|
|
19
|
+
*/
|
|
20
|
+
export default class Severity {
|
|
21
|
+
public static notice: number = SeverityEnum.notice;
|
|
22
|
+
public static info: number = SeverityEnum.info;
|
|
23
|
+
public static ok: number = SeverityEnum.ok;
|
|
24
|
+
public static warning: number = SeverityEnum.warning;
|
|
25
|
+
public static error: number = SeverityEnum.error;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Gets the CSS class for the severity
|
|
29
|
+
*
|
|
30
|
+
* @param {SeverityEnum} severity
|
|
31
|
+
* @returns {string}
|
|
32
|
+
*/
|
|
33
|
+
public static getCssClass(severity: SeverityEnum): string {
|
|
34
|
+
let severityClass: string;
|
|
35
|
+
|
|
36
|
+
switch (severity) {
|
|
37
|
+
case SeverityEnum.notice:
|
|
38
|
+
severityClass = 'notice';
|
|
39
|
+
break;
|
|
40
|
+
case SeverityEnum.ok:
|
|
41
|
+
severityClass = 'success';
|
|
42
|
+
break;
|
|
43
|
+
case SeverityEnum.warning:
|
|
44
|
+
severityClass = 'warning';
|
|
45
|
+
break;
|
|
46
|
+
case SeverityEnum.error:
|
|
47
|
+
severityClass = 'danger';
|
|
48
|
+
break;
|
|
49
|
+
case SeverityEnum.info:
|
|
50
|
+
default:
|
|
51
|
+
severityClass = 'info';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return severityClass;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let severityObject: Severity;
|
|
59
|
+
try {
|
|
60
|
+
// fetch from opening window
|
|
61
|
+
if (window.opener && window.opener.TYPO3 && window.opener.TYPO3.Severity) {
|
|
62
|
+
severityObject = window.opener.TYPO3.Severity;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// fetch from parent
|
|
66
|
+
if (parent && parent.window.TYPO3 && parent.window.TYPO3.Severity) {
|
|
67
|
+
severityObject = parent.window.TYPO3.Severity;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// fetch object from outer frame
|
|
71
|
+
if (top && top.TYPO3 && top.TYPO3.Severity) {
|
|
72
|
+
severityObject = top.TYPO3.Severity;
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
// This only happens if the opener, parent or top is some other url (eg a local file)
|
|
76
|
+
// which loaded the current window. Then the browser's cross domain policy jumps in
|
|
77
|
+
// and raises an exception.
|
|
78
|
+
// For this case we are safe and we can create our global object below.
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!severityObject) {
|
|
82
|
+
severityObject = Severity;
|
|
83
|
+
|
|
84
|
+
// attach to global frame
|
|
85
|
+
if (typeof TYPO3 !== 'undefined') {
|
|
86
|
+
TYPO3.Severity = severityObject;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/site-inline-actions
|
|
18
|
+
* Site configuration backend module FormEngine inline:
|
|
19
|
+
* Override inline 'create' and 'details' route to point to SiteInlineAjaxController
|
|
20
|
+
*/
|
|
21
|
+
class SiteInlineActions {
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
DocumentService.ready().then((): void => {
|
|
25
|
+
TYPO3.settings.ajaxUrls.record_inline_details = TYPO3.settings.ajaxUrls.site_configuration_inline_details;
|
|
26
|
+
TYPO3.settings.ajaxUrls.record_inline_create = TYPO3.settings.ajaxUrls.site_configuration_inline_create;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default new SiteInlineActions();
|
|
@@ -0,0 +1,208 @@
|
|
|
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 Tablesort, { type TablesortOptions } from 'tablesort';
|
|
15
|
+
import 'tablesort.dotsep';
|
|
16
|
+
import 'tablesort.number';
|
|
17
|
+
import { IconElement } from './element/icon-element';
|
|
18
|
+
import { Sizes } from './enum/icon-types';
|
|
19
|
+
|
|
20
|
+
class TablesortWithButtons extends Tablesort {
|
|
21
|
+
public init(el: HTMLTableElement, options: TablesortOptions) {
|
|
22
|
+
let firstRow: HTMLTableRowElement, defaultSort;
|
|
23
|
+
|
|
24
|
+
this.table = el;
|
|
25
|
+
this.thead = false;
|
|
26
|
+
this.options = options;
|
|
27
|
+
|
|
28
|
+
if (el.rows && el.rows.length > 0) {
|
|
29
|
+
if (el.tHead && el.tHead.rows.length > 0) {
|
|
30
|
+
for (let i = 0; i < el.tHead.rows.length; i++) {
|
|
31
|
+
if (el.tHead.rows[i].getAttribute('data-sort-method') === 'thead') {
|
|
32
|
+
firstRow = el.tHead.rows[i];
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (!firstRow) {
|
|
37
|
+
firstRow = el.tHead.rows[el.tHead.rows.length - 1];
|
|
38
|
+
}
|
|
39
|
+
this.thead = true;
|
|
40
|
+
} else {
|
|
41
|
+
firstRow = el.rows[0];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!firstRow) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const onClick = (event: PointerEvent): void => {
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
event.stopImmediatePropagation();
|
|
52
|
+
const direction = (event.currentTarget as HTMLButtonElement).dataset.sortDirection;
|
|
53
|
+
const target = (event.currentTarget as HTMLButtonElement).closest('th, td') as HTMLTableCellElement;
|
|
54
|
+
|
|
55
|
+
// Tablesort produces different results on sorting in the same direction twice
|
|
56
|
+
// when the sorting is not 100% clear and multiple cells have the same value.
|
|
57
|
+
// To avoid confusion we prevent resorting when the direction does not change.
|
|
58
|
+
if (this.current === target && this.current.ariaSort === direction) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Tablesort only supports a toggle for sorting, so we set the current direction to the opposite.
|
|
63
|
+
// After that tablesort uses the correct direction for sorting.
|
|
64
|
+
target.ariaSort = (direction === 'ascending') ? 'descending' : 'ascending';
|
|
65
|
+
|
|
66
|
+
if (this.current && this.current !== target) {
|
|
67
|
+
this.current.removeAttribute('aria-sort');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
this.current = target;
|
|
71
|
+
this.sortTable(target);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Assume first row is the header and attach a click handler to each.
|
|
75
|
+
for (let i = 0; i < firstRow.cells.length; i++) {
|
|
76
|
+
const cell = firstRow.cells[i] as HTMLTableCellElement;
|
|
77
|
+
cell.setAttribute('role', 'columnheader');
|
|
78
|
+
if (cell.getAttribute('data-sort-method') !== 'none') {
|
|
79
|
+
|
|
80
|
+
// Create dropdown toggle
|
|
81
|
+
const toggle = document.createElement('button');
|
|
82
|
+
toggle.classList.add('dropdown-toggle', 'dropdown-toggle-link');
|
|
83
|
+
toggle.dataset.bsToggle = 'dropdown';
|
|
84
|
+
toggle.dataset.sortingToggle = 'true';
|
|
85
|
+
toggle.type = 'button';
|
|
86
|
+
toggle.ariaExpanded = 'false';
|
|
87
|
+
toggle.textContent = cell.textContent;
|
|
88
|
+
const icon = new IconElement();
|
|
89
|
+
icon.identifier = 'empty-empty';
|
|
90
|
+
icon.size = Sizes.small;
|
|
91
|
+
const iconWrapper = document.createElement('div');
|
|
92
|
+
iconWrapper.appendChild(icon);
|
|
93
|
+
toggle.appendChild(iconWrapper);
|
|
94
|
+
cell.replaceChildren(toggle);
|
|
95
|
+
|
|
96
|
+
// Create dropdown menu
|
|
97
|
+
const dropdown = document.createElement('div');
|
|
98
|
+
dropdown.classList.add('dropdown-menu');
|
|
99
|
+
|
|
100
|
+
const buttonSortAscTitle = top.TYPO3.lang['labels.sorting.asc'] || 'Sort ascending';
|
|
101
|
+
const buttonSortAsc = document.createElement('button');
|
|
102
|
+
buttonSortAsc.classList.add('dropdown-item');
|
|
103
|
+
buttonSortAsc.type = 'button';
|
|
104
|
+
buttonSortAsc.title = buttonSortAscTitle;
|
|
105
|
+
buttonSortAsc.ariaLabel = buttonSortAscTitle;
|
|
106
|
+
buttonSortAsc.dataset.sortDirection = 'ascending';
|
|
107
|
+
buttonSortAsc.addEventListener('click', onClick, false);
|
|
108
|
+
const buttonSortAscColumnWrap = document.createElement('span');
|
|
109
|
+
buttonSortAscColumnWrap.classList.add('dropdown-item-columns');
|
|
110
|
+
buttonSortAsc.appendChild(buttonSortAscColumnWrap);
|
|
111
|
+
const buttonSortAscColumnIconWrap = document.createElement('span');
|
|
112
|
+
buttonSortAscColumnIconWrap.classList.add('dropdown-item-column', 'dropdown-item-column-icon', 'text-primary');
|
|
113
|
+
buttonSortAscColumnWrap.appendChild(buttonSortAscColumnIconWrap);
|
|
114
|
+
const buttonSortAscColumnIcon = new IconElement();
|
|
115
|
+
buttonSortAscColumnIcon.identifier = 'empty-empty';
|
|
116
|
+
buttonSortAscColumnIcon.size = Sizes.small;
|
|
117
|
+
buttonSortAscColumnIconWrap.appendChild(buttonSortAscColumnIcon);
|
|
118
|
+
const buttonSortAscColumnTitleWrap = document.createElement('span');
|
|
119
|
+
buttonSortAscColumnTitleWrap.classList.add('dropdown-item-column', 'dropdown-item-column-title');
|
|
120
|
+
buttonSortAscColumnTitleWrap.textContent = buttonSortAscTitle;
|
|
121
|
+
buttonSortAscColumnWrap.appendChild(buttonSortAscColumnTitleWrap);
|
|
122
|
+
dropdown.appendChild(buttonSortAsc);
|
|
123
|
+
|
|
124
|
+
const buttonSortDescTitle = top.TYPO3.lang['labels.sorting.desc'] || 'Sort descending';
|
|
125
|
+
const buttonSortDesc = document.createElement('button');
|
|
126
|
+
buttonSortDesc.classList.add('dropdown-item');
|
|
127
|
+
buttonSortDesc.type = 'button';
|
|
128
|
+
buttonSortDesc.title = buttonSortDescTitle;
|
|
129
|
+
buttonSortDesc.ariaLabel = buttonSortDescTitle;
|
|
130
|
+
buttonSortDesc.dataset.sortDirection = 'descending';
|
|
131
|
+
buttonSortDesc.addEventListener('click', onClick, false);
|
|
132
|
+
const buttonSortDescColumnWrap = document.createElement('span');
|
|
133
|
+
buttonSortDescColumnWrap.classList.add('dropdown-item-columns');
|
|
134
|
+
buttonSortDesc.appendChild(buttonSortDescColumnWrap);
|
|
135
|
+
const buttonSortDescColumnIconWrap = document.createElement('span');
|
|
136
|
+
buttonSortDescColumnIconWrap.classList.add('dropdown-item-column', 'dropdown-item-column-icon', 'text-primary');
|
|
137
|
+
buttonSortDescColumnWrap.appendChild(buttonSortDescColumnIconWrap);
|
|
138
|
+
const buttonSortDescColumnIcon = new IconElement();
|
|
139
|
+
buttonSortDescColumnIcon.identifier = 'empty-empty';
|
|
140
|
+
buttonSortDescColumnIcon.size = Sizes.small;
|
|
141
|
+
buttonSortDescColumnIconWrap.appendChild(buttonSortDescColumnIcon);
|
|
142
|
+
const buttonSortDescColumnTitleWrap = document.createElement('span');
|
|
143
|
+
buttonSortDescColumnTitleWrap.classList.add('dropdown-item-column', 'dropdown-item-column-title');
|
|
144
|
+
buttonSortDescColumnTitleWrap.textContent = buttonSortDescTitle;
|
|
145
|
+
buttonSortDescColumnWrap.appendChild(buttonSortDescColumnTitleWrap);
|
|
146
|
+
dropdown.appendChild(buttonSortDesc);
|
|
147
|
+
|
|
148
|
+
cell.appendChild(dropdown);
|
|
149
|
+
|
|
150
|
+
if (cell.getAttribute('data-sort-default') !== null) {
|
|
151
|
+
defaultSort = cell;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (defaultSort) {
|
|
157
|
+
this.current = defaultSort;
|
|
158
|
+
this.sortTable(defaultSort);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export default class SortableTable {
|
|
164
|
+
constructor(table: HTMLTableElement) {
|
|
165
|
+
table.addEventListener('afterSort', (event: CustomEvent) => {
|
|
166
|
+
const table = (event.target as HTMLTableElement);
|
|
167
|
+
const buttons = table.tHead.querySelectorAll('.dropdown-toggle[data-sorting-toggle]');
|
|
168
|
+
buttons.forEach((button) => {
|
|
169
|
+
const iconWrap = button.querySelector(':scope > div');
|
|
170
|
+
iconWrap.classList.remove('text-primary');
|
|
171
|
+
const icon = button.querySelector('typo3-backend-icon');
|
|
172
|
+
icon.identifier = 'empty-empty';
|
|
173
|
+
icon.classList.remove('text-primary');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const menuIcons = table.tHead.querySelectorAll('.dropdown-toggle[data-sorting-toggle] + .dropdown-menu typo3-backend-icon');
|
|
177
|
+
menuIcons.forEach((menuIcon: IconElement) => {
|
|
178
|
+
menuIcon.identifier = 'empty-empty';
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
const sortingCell = table.tHead.querySelector('th[aria-sort]') as HTMLTableCellElement;
|
|
182
|
+
const sortingButton = sortingCell.querySelector('.dropdown-toggle[data-sorting-toggle]');
|
|
183
|
+
const sortingIconWrap = sortingButton.querySelector(':scope > div');
|
|
184
|
+
sortingIconWrap.classList.add('text-primary');
|
|
185
|
+
const sortingIcon = sortingButton.querySelector('typo3-backend-icon');
|
|
186
|
+
const sortingDropdown = sortingCell.querySelector('.dropdown-menu');
|
|
187
|
+
|
|
188
|
+
if (sortingCell.ariaSort === 'ascending') {
|
|
189
|
+
sortingIcon.identifier = 'actions-sort-amount-up';
|
|
190
|
+
} else {
|
|
191
|
+
sortingIcon.identifier = 'actions-sort-amount-down';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const sortingButtons = sortingDropdown.querySelectorAll('.dropdown-item');
|
|
195
|
+
sortingButtons.forEach((button: HTMLButtonElement) => {
|
|
196
|
+
const sortingButtonDirection = button.dataset.sortDirection;
|
|
197
|
+
const sortingButtonIcon = button.querySelector('typo3-backend-icon');
|
|
198
|
+
if (sortingButtonDirection === sortingCell.ariaSort) {
|
|
199
|
+
sortingButtonIcon.identifier = 'actions-dot';
|
|
200
|
+
} else {
|
|
201
|
+
sortingButtonIcon.identifier = 'empty-empty';
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
new TablesortWithButtons(table);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Module: @typo3/backend/storage/abstract-client-storage
|
|
16
|
+
* @exports @typo3/backend/storage/abstract-client-storage
|
|
17
|
+
*/
|
|
18
|
+
export default abstract class AbstractClientStorage {
|
|
19
|
+
protected keyPrefix: string = 't3-';
|
|
20
|
+
protected storage: Storage = null;
|
|
21
|
+
|
|
22
|
+
public get(key: string): string {
|
|
23
|
+
if (this.storage === null) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return this.storage.getItem(this.keyPrefix + key);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public getByPrefix(prefix: string): Record<string, string> {
|
|
30
|
+
if (this.storage === null) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
const entries = Object.entries(this.storage)
|
|
34
|
+
.filter((item: [string, string]) => item[0].startsWith(this.keyPrefix + prefix))
|
|
35
|
+
.map((item: [string, string]) => {
|
|
36
|
+
return [item[0].substring(this.keyPrefix.length), item[1]];
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return Object.fromEntries(entries);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public set(key: string, value: string): void {
|
|
43
|
+
if (this.storage !== null) {
|
|
44
|
+
this.storage.setItem(this.keyPrefix + key, value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public unset(key: string): void {
|
|
49
|
+
if (this.storage !== null) {
|
|
50
|
+
this.storage.removeItem(this.keyPrefix + key);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public unsetByPrefix(prefix: string): void {
|
|
55
|
+
if (this.storage === null) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
prefix = this.keyPrefix + prefix;
|
|
59
|
+
Object.keys(this.storage)
|
|
60
|
+
.filter((key: string) => key.startsWith(prefix))
|
|
61
|
+
.forEach((key: string) => this.storage.removeItem(key));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public clear(): void {
|
|
65
|
+
if (this.storage !== null) {
|
|
66
|
+
this.storage.clear();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public isset(key: string): boolean {
|
|
71
|
+
if (this.storage === null) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return this.get(key) !== null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
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 AbstractClientStorage from './abstract-client-storage';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/storage/browser-session
|
|
18
|
+
* Wrapper for sessionStorage
|
|
19
|
+
* @exports @typo3/backend/storage/browser-session
|
|
20
|
+
*/
|
|
21
|
+
class BrowserSession extends AbstractClientStorage {
|
|
22
|
+
public constructor() {
|
|
23
|
+
super();
|
|
24
|
+
this.storage = sessionStorage;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default new BrowserSession();
|
|
@@ -0,0 +1,28 @@
|
|
|
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 AbstractClientStorage from './abstract-client-storage';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/storage/client
|
|
18
|
+
* Wrapper for localStorage
|
|
19
|
+
* @exports @typo3/backend/storage/client
|
|
20
|
+
*/
|
|
21
|
+
class Client extends AbstractClientStorage {
|
|
22
|
+
public constructor() {
|
|
23
|
+
super();
|
|
24
|
+
this.storage = localStorage;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default new Client();
|
|
@@ -0,0 +1,118 @@
|
|
|
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
|
+
interface CurrentState {
|
|
15
|
+
identifier: string;
|
|
16
|
+
treeIdentifier: string|null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ModuleStateUpdateEvent {
|
|
20
|
+
state: CurrentState;
|
|
21
|
+
oldState: CurrentState;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Module State previous known as `fsMod` with the previous description:
|
|
26
|
+
*
|
|
27
|
+
* > Used in main modules with a frameset for submodules to keep the ID
|
|
28
|
+
* > between modules Typically that is set by something like this in a
|
|
29
|
+
* > Web>* sub module
|
|
30
|
+
*
|
|
31
|
+
* @exports @typo3/backend/storage/module-state-storage
|
|
32
|
+
*/
|
|
33
|
+
export class ModuleStateStorage {
|
|
34
|
+
private static readonly prefix = 't3-module-state-';
|
|
35
|
+
|
|
36
|
+
public static update(module: string, identifier: string|number): CurrentState
|
|
37
|
+
{
|
|
38
|
+
if (typeof identifier === 'number') {
|
|
39
|
+
identifier = identifier.toString(10);
|
|
40
|
+
} else if (typeof identifier !== 'string') {
|
|
41
|
+
throw new SyntaxError('identifier must be of type string');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const oldState = ModuleStateStorage.current(module);
|
|
45
|
+
const treeIdentifier = identifier === oldState.identifier ? oldState.treeIdentifier : null;
|
|
46
|
+
const state = { identifier, treeIdentifier };
|
|
47
|
+
|
|
48
|
+
ModuleStateStorage.commit(module, 'update', state);
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public static updateWithTreeIdentifier(module: string, identifier: string|number, treeIdentifier: string|number): CurrentState
|
|
53
|
+
{
|
|
54
|
+
if (typeof identifier === 'number') {
|
|
55
|
+
identifier = identifier.toString(10);
|
|
56
|
+
} else if (typeof identifier !== 'string') {
|
|
57
|
+
throw new SyntaxError('identifier must be of type string');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (typeof treeIdentifier === 'number') {
|
|
61
|
+
treeIdentifier = treeIdentifier.toString(10);
|
|
62
|
+
} else if (typeof treeIdentifier !== 'string') {
|
|
63
|
+
throw new SyntaxError('treeIdentifier must be of type string');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const state = { identifier, treeIdentifier };
|
|
67
|
+
ModuleStateStorage.commit(module, 'update-with-tree-identifier', state);
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public static updateWithCurrentMount(module: string, identifier: string|number)
|
|
72
|
+
{
|
|
73
|
+
ModuleStateStorage.update(module, identifier);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public static current(module: string): CurrentState {
|
|
77
|
+
const state = {
|
|
78
|
+
...ModuleStateStorage.getInitialState(),
|
|
79
|
+
...(ModuleStateStorage.fetch(module) ?? {}),
|
|
80
|
+
};
|
|
81
|
+
return state;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public static purge(): void
|
|
85
|
+
{
|
|
86
|
+
Object.keys(sessionStorage)
|
|
87
|
+
.filter((key: string) => key.startsWith(ModuleStateStorage.prefix))
|
|
88
|
+
.forEach((key: string) => sessionStorage.removeItem(key));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private static fetch(module: string): CurrentState|null {
|
|
92
|
+
const data = sessionStorage.getItem(ModuleStateStorage.prefix + module);
|
|
93
|
+
if (data === null) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return JSON.parse(data);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private static async commit(module: string, mode: string, state: CurrentState) {
|
|
100
|
+
const oldState = ModuleStateStorage.current(module);
|
|
101
|
+
sessionStorage.setItem(ModuleStateStorage.prefix + module, JSON.stringify(state));
|
|
102
|
+
|
|
103
|
+
top.document.dispatchEvent(new CustomEvent<ModuleStateUpdateEvent>('typo3:module-state-storage:' + mode + ':' + module, {
|
|
104
|
+
detail: {
|
|
105
|
+
state,
|
|
106
|
+
oldState,
|
|
107
|
+
}
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private static getInitialState(): CurrentState
|
|
112
|
+
{
|
|
113
|
+
return { identifier: '', treeIdentifier: null };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// exposing `ModuleStateStorage`
|
|
118
|
+
window.ModuleStateStorage = ModuleStateStorage;
|