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,183 @@
|
|
|
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 Client from '@typo3/backend/storage/client';
|
|
15
|
+
import '@typo3/backend/input/clearable';
|
|
16
|
+
import DocumentService from '@typo3/core/document-service';
|
|
17
|
+
import DebounceEvent from '@typo3/core/event/debounce-event';
|
|
18
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
19
|
+
import Mark from 'mark.js';
|
|
20
|
+
import DomHelper from '@typo3/backend/utility/dom-helper';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Utility class to perform client side search on ul/li trees. This is used in various
|
|
24
|
+
* backend modules that show trees, especially the "Active PageTsConfig" and "Active TypoScript".
|
|
25
|
+
*
|
|
26
|
+
* This is an add-on to collapse-state-persister.ts: When a search is performed, this search
|
|
27
|
+
* result collapse/expand state is not persisted in local storage, so the state without search
|
|
28
|
+
* "comes back" when a search word is reset.
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
class CollapseStateSearch {
|
|
33
|
+
private readonly searchValueSelector: string = '.t3js-collapse-search-term';
|
|
34
|
+
private searchField: HTMLInputElement;
|
|
35
|
+
private searchForm: HTMLFormElement;
|
|
36
|
+
private searchSessionKey: string;
|
|
37
|
+
private searchValue: string = '';
|
|
38
|
+
private treeContainers: NodeListOf<HTMLElement>;
|
|
39
|
+
private numberOfSearchMatchesContainer: NodeListOf<HTMLElement>;
|
|
40
|
+
private markInstances: Array<any> = [];
|
|
41
|
+
|
|
42
|
+
constructor() {
|
|
43
|
+
DocumentService.ready().then(() => {
|
|
44
|
+
this.treeContainers = document.querySelectorAll('.t3js-collapse-states-search-tree');
|
|
45
|
+
if (this.treeContainers.length === 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.numberOfSearchMatchesContainer = document.querySelectorAll('.t3js-collapse-states-search-numberOfSearchMatches');
|
|
49
|
+
this.searchField = document.querySelector(this.searchValueSelector);
|
|
50
|
+
this.searchForm = this.searchField.closest('form');
|
|
51
|
+
this.searchSessionKey = this.searchField.dataset.persistCollapseSearchKey;
|
|
52
|
+
this.searchValue = Client.get(this.searchSessionKey) ?? '';
|
|
53
|
+
|
|
54
|
+
this.registerEvents();
|
|
55
|
+
|
|
56
|
+
for (let i = 0; i < this.treeContainers.length; i++) {
|
|
57
|
+
this.markInstances[i] = new Mark(this.treeContainers[i]);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (this.searchValue !== '') {
|
|
61
|
+
this.searchField.value = this.searchValue;
|
|
62
|
+
// Trigger "keyup" event to update clearable status
|
|
63
|
+
this.searchField.dispatchEvent(new Event('keyup'));
|
|
64
|
+
this.searchForm.requestSubmit();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private registerEvents(): void {
|
|
70
|
+
this.searchField.clearable({
|
|
71
|
+
onClear: (input: HTMLInputElement): void => {
|
|
72
|
+
input.closest('form').requestSubmit();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
new DebounceEvent('input', (): void => {
|
|
77
|
+
this.searchForm.requestSubmit();
|
|
78
|
+
}).bindTo(this.searchField);
|
|
79
|
+
|
|
80
|
+
new RegularEvent('submit', (e: SubmitEvent): void => {
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
for (let i = 0; i < this.treeContainers.length; i++) {
|
|
83
|
+
this.filterTree(this.searchField.value, this.treeContainers[i], this.numberOfSearchMatchesContainer[i], this.markInstances[i]);
|
|
84
|
+
}
|
|
85
|
+
}).bindTo(this.searchForm);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private filterTree(term: string, treeContainer: HTMLElement, numberOfSearchMatchesContainer: HTMLElement, markInstance: any): void {
|
|
89
|
+
// Normalize search term
|
|
90
|
+
term = term.toLowerCase();
|
|
91
|
+
|
|
92
|
+
markInstance.unmark();
|
|
93
|
+
Client.set(this.searchSessionKey, term);
|
|
94
|
+
if (term.length < 3) {
|
|
95
|
+
numberOfSearchMatchesContainer.classList.add('hidden');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const matchingCollapsibleIds = new Set();
|
|
100
|
+
const matchingNodes = [
|
|
101
|
+
...this.findNodesByIdentifier(term, treeContainer),
|
|
102
|
+
...this.findNodesByValue(term, treeContainer),
|
|
103
|
+
...this.findNodesByComment(term, treeContainer),
|
|
104
|
+
...this.findNodesByConstantSubstitution(term, treeContainer)
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
numberOfSearchMatchesContainer.innerText = String(TYPO3.lang['collapse-state-search.numberOfSearchMatches']).replace('%s', String(matchingNodes.length));
|
|
108
|
+
numberOfSearchMatchesContainer.classList.remove('hidden');
|
|
109
|
+
|
|
110
|
+
matchingNodes.forEach((match: Element|null): void => {
|
|
111
|
+
if (match === null) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const collapsibleIdentifier = (match.parentElement.querySelector('[data-bs-toggle="collapse"]') as HTMLElement|null)?.dataset.bsTarget;
|
|
116
|
+
if (collapsibleIdentifier !== undefined) {
|
|
117
|
+
matchingCollapsibleIds.add(collapsibleIdentifier.substring(1));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const parentElements = DomHelper.parents(match, '.collapse');
|
|
121
|
+
for (const parentEl of parentElements) {
|
|
122
|
+
matchingCollapsibleIds.add(parentEl.id);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
const allNodes = Array.from(treeContainer.querySelectorAll('.collapse')) as HTMLElement[];
|
|
127
|
+
for (const node of allNodes) {
|
|
128
|
+
const isExpanded: boolean = node.classList.contains('show');
|
|
129
|
+
const id: string = node.id;
|
|
130
|
+
if (matchingCollapsibleIds.has(id)) {
|
|
131
|
+
// We're not using BootstrapCollapse.getOrCreateInstance() since this is too slow when
|
|
132
|
+
// dealing with many elements like with System > Configuration with TCA tree.
|
|
133
|
+
if (!isExpanded) {
|
|
134
|
+
const toggle: HTMLElement = document.querySelector('[data-bs-target="#' + id + '"]');
|
|
135
|
+
toggle.classList.remove('collapsed');
|
|
136
|
+
toggle.setAttribute('aria-expanded', 'true');
|
|
137
|
+
node.classList.add('show');
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
if (isExpanded) {
|
|
141
|
+
const toggle: HTMLElement = document.querySelector('[data-bs-target="#' + id + '"]');
|
|
142
|
+
toggle.classList.add('collapsed');
|
|
143
|
+
toggle.setAttribute('aria-expanded', 'false');
|
|
144
|
+
node.classList.remove('show');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
markInstance.mark(term, {
|
|
150
|
+
element: 'span',
|
|
151
|
+
className: 'text-highlight'
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private findNodesByIdentifier(term: string, treeContainer: HTMLElement): Element[] {
|
|
156
|
+
return Array.from(treeContainer.querySelectorAll('.treelist-label')).filter((el: Element): boolean => {
|
|
157
|
+
return el.textContent.toLowerCase().includes(term);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private findNodesByValue(term: string, treeContainer: HTMLElement): Element[] {
|
|
162
|
+
const matchingValueNodes = Array.from(treeContainer.querySelectorAll('.treelist-value')).filter((el: Element): boolean => {
|
|
163
|
+
return el.textContent.toLowerCase().includes(term);
|
|
164
|
+
});
|
|
165
|
+
return matchingValueNodes.map((node: Element): Element => {
|
|
166
|
+
return node.previousElementSibling;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private findNodesByComment(term: string, treeContainer: HTMLElement): Element[] {
|
|
171
|
+
return Array.from(treeContainer.querySelectorAll('.treelist-comment')).filter((el: Element): boolean => {
|
|
172
|
+
return el.textContent.toLowerCase().includes(term);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
private findNodesByConstantSubstitution(term: string, treeContainer: HTMLElement): Element[] {
|
|
177
|
+
return Array.from(treeContainer.querySelectorAll('.treelist-constant-substitution')).filter((el: Element): boolean => {
|
|
178
|
+
return el.textContent.toLowerCase().includes(term);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export default new CollapseStateSearch();
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Module: @typo3/backend/utility/dom-helper
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export default class DomHelper {
|
|
20
|
+
/**
|
|
21
|
+
* Get all parent elements matching the passed `selector`
|
|
22
|
+
*/
|
|
23
|
+
public static parents(el: Element, selector: string): Element[] {
|
|
24
|
+
const parents = [];
|
|
25
|
+
let closest;
|
|
26
|
+
while ((closest = el.parentElement.closest(selector)) !== null) {
|
|
27
|
+
el = closest;
|
|
28
|
+
parents.push(closest);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return parents;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get the next scrollable parent element
|
|
36
|
+
*/
|
|
37
|
+
public static scrollableParent(element: Element) {
|
|
38
|
+
let parent = element.parentElement;
|
|
39
|
+
|
|
40
|
+
while (parent) {
|
|
41
|
+
const style = window.getComputedStyle(parent);
|
|
42
|
+
const overflowY = style.overflowY;
|
|
43
|
+
|
|
44
|
+
if (overflowY === 'auto' || overflowY === 'scroll') {
|
|
45
|
+
return parent;
|
|
46
|
+
}
|
|
47
|
+
parent = parent.parentElement;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return document.documentElement;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get all next siblings the passed `target` element inside `el`
|
|
55
|
+
*/
|
|
56
|
+
public static nextAll(target: Element): Element[] {
|
|
57
|
+
const nextSiblings = [];
|
|
58
|
+
let node = target.nextElementSibling;
|
|
59
|
+
while (node !== null) {
|
|
60
|
+
nextSiblings.push(node);
|
|
61
|
+
node = node.nextElementSibling;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return nextSiblings;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* This is a wrapper for scrollIntoViewIfNeeded() that falls back to scrollIntoView() if the former
|
|
69
|
+
* is not available.
|
|
70
|
+
*
|
|
71
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded
|
|
72
|
+
*/
|
|
73
|
+
public static scrollIntoViewIfNeeded(target: Element, smooth: boolean = false): void {
|
|
74
|
+
if (!smooth && 'scrollIntoViewIfNeeded' in target && typeof target.scrollIntoViewIfNeeded === 'function') {
|
|
75
|
+
target.scrollIntoViewIfNeeded(true);
|
|
76
|
+
} else {
|
|
77
|
+
const rect = target.getBoundingClientRect();
|
|
78
|
+
const isInViewport = rect.top >= 0
|
|
79
|
+
&& rect.left >= 0
|
|
80
|
+
&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)
|
|
81
|
+
&& rect.right <= (window.innerWidth || document.documentElement.clientWidth);
|
|
82
|
+
if (!isInViewport) {
|
|
83
|
+
if (smooth) {
|
|
84
|
+
target.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
|
|
85
|
+
} else {
|
|
86
|
+
target.scrollIntoView();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { DragTooltipMetadata } from '@typo3/backend/drag-tooltip';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/backend/utility/drag-drop-utility
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export default class DragDropUtility {
|
|
22
|
+
public static isCopyModifierFromEvent(event: DragEvent): boolean {
|
|
23
|
+
if (event.dataTransfer.dropEffect === 'copy') {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (event.dataTransfer.dropEffect === 'move') {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return navigator.userAgent.includes('Mac')
|
|
32
|
+
? (event.dataTransfer.effectAllowed === 'copy' || event.altKey)
|
|
33
|
+
: event.ctrlKey;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public static updateEventAndTooltipToReflectCopyMoveIntention(event: DragEvent): void {
|
|
37
|
+
const isCopy = DragDropUtility.isCopyModifierFromEvent(event);
|
|
38
|
+
event.dataTransfer.dropEffect = isCopy ? 'copy' : 'move';
|
|
39
|
+
top.document.dispatchEvent(
|
|
40
|
+
new CustomEvent<DragTooltipMetadata>('typo3:drag-tooltip:metadata-update', {
|
|
41
|
+
detail: {
|
|
42
|
+
statusIconIdentifier: isCopy ? 'actions-duplicate' : 'actions-move'
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 Message {
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
actionName: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class MessageUtility {
|
|
20
|
+
/**
|
|
21
|
+
* Generates an URL for usage in postMessage
|
|
22
|
+
*
|
|
23
|
+
* @return {string}
|
|
24
|
+
*/
|
|
25
|
+
public static getOrigin(): string {
|
|
26
|
+
return window.origin;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param {string} receivedOrigin
|
|
31
|
+
*/
|
|
32
|
+
public static verifyOrigin(receivedOrigin: string): boolean {
|
|
33
|
+
const currentDomain = MessageUtility.getOrigin();
|
|
34
|
+
|
|
35
|
+
return currentDomain === receivedOrigin;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {*} message
|
|
40
|
+
* @param {Window} windowObject
|
|
41
|
+
*/
|
|
42
|
+
public static send(message: Message, windowObject: Window = window): void {
|
|
43
|
+
windowObject.postMessage(message, MessageUtility.getOrigin());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -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
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export function topLevelModuleImport(specifier: string): Promise<any> {
|
|
18
|
+
const event: CustomEvent<{ specifier: string; importPromise?: Promise<any>; }> = new CustomEvent('typo3:import-javascript-module', {
|
|
19
|
+
detail: {
|
|
20
|
+
specifier,
|
|
21
|
+
importPromise: null
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
top.document.dispatchEvent(event);
|
|
26
|
+
|
|
27
|
+
if (event.detail.importPromise) {
|
|
28
|
+
return event.detail.importPromise;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return Promise.reject(new Error('Top level did not respond with a promise.'));
|
|
32
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
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/utility
|
|
16
|
+
*/
|
|
17
|
+
class Utility {
|
|
18
|
+
/**
|
|
19
|
+
* Splits a string by a given delimiter and trims the values
|
|
20
|
+
*
|
|
21
|
+
* @param {string} delimiter
|
|
22
|
+
* @param {string} string
|
|
23
|
+
* @return Array<string>
|
|
24
|
+
*/
|
|
25
|
+
public static trimExplode(delimiter: string, string: string): Array<string> {
|
|
26
|
+
return string.split(delimiter).map((item: string) => item.trim()).filter((item: string) => item !== '');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Trims string items.
|
|
31
|
+
*
|
|
32
|
+
* @param {string[]|any[]} items
|
|
33
|
+
*/
|
|
34
|
+
public static trimItems(items: any[]): any[] {
|
|
35
|
+
return items.map((item: any) => {
|
|
36
|
+
if (item instanceof String) {
|
|
37
|
+
return item.trim();
|
|
38
|
+
}
|
|
39
|
+
return item;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Splits a string by a given delimiter and converts the values to integer
|
|
45
|
+
*
|
|
46
|
+
* @param {string} delimiter
|
|
47
|
+
* @param {string} string
|
|
48
|
+
* @param {boolean} excludeZeroValues
|
|
49
|
+
* @return Array<number>
|
|
50
|
+
*/
|
|
51
|
+
public static intExplode(delimiter: string, string: string, excludeZeroValues: boolean = false): Array<number> {
|
|
52
|
+
return string
|
|
53
|
+
.split(delimiter)
|
|
54
|
+
.map((item: string) => parseInt(item, 10))
|
|
55
|
+
.filter((item: number) => !isNaN(item) || excludeZeroValues && item === 0);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Checks if a given number is really a number
|
|
60
|
+
*
|
|
61
|
+
* Taken from:
|
|
62
|
+
* http://dl.dropbox.com/u/35146/js/tests/isNumber.html
|
|
63
|
+
*
|
|
64
|
+
* @param {number} value
|
|
65
|
+
* @returns {boolean}
|
|
66
|
+
*/
|
|
67
|
+
public static isNumber(value: number): boolean {
|
|
68
|
+
return !isNaN(parseFloat(value.toString())) && isFinite(value);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Updates a parameter inside of given url
|
|
73
|
+
*
|
|
74
|
+
* @param {string} url
|
|
75
|
+
* @param {string} key
|
|
76
|
+
* @param {string} value
|
|
77
|
+
* @returns {string}
|
|
78
|
+
* @deprecated will be removed in TYPO3 v14
|
|
79
|
+
*/
|
|
80
|
+
public static updateQueryStringParameter(url: string, key: string, value: string): string {
|
|
81
|
+
console.warn('Utility.updateQueryStringParameter() has been marked as deprecated and will be removed in TYPO3 v14.');
|
|
82
|
+
|
|
83
|
+
const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
|
|
84
|
+
const separator = url.includes('?') ? '&' : '?';
|
|
85
|
+
|
|
86
|
+
if (url.match(re)) {
|
|
87
|
+
return url.replace(re, '$1' + key + '=' + value + '$2');
|
|
88
|
+
}
|
|
89
|
+
return url + separator + key + '=' + value;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public static convertFormToObject(form: HTMLFormElement): { [key: string]: any } {
|
|
93
|
+
const obj: { [key: string]: any } = {};
|
|
94
|
+
form.querySelectorAll('input, select, textarea').forEach((element: HTMLInputElement|HTMLSelectElement|HTMLTextAreaElement): void => {
|
|
95
|
+
const name = element.name;
|
|
96
|
+
const value = element.value;
|
|
97
|
+
|
|
98
|
+
if (name) {
|
|
99
|
+
if (element.tagName.toLowerCase() === 'input' && element.type == 'checkbox') {
|
|
100
|
+
const checkbox = element as HTMLInputElement;
|
|
101
|
+
if (obj[name] === undefined) {
|
|
102
|
+
obj[name] = [];
|
|
103
|
+
}
|
|
104
|
+
if (checkbox.checked){
|
|
105
|
+
obj[name].push(value);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}else{
|
|
109
|
+
obj[name] = value;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
return obj;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Performs a deep merge of `source` into `target`.
|
|
119
|
+
* Mutates `target` only but not its objects and arrays.
|
|
120
|
+
*
|
|
121
|
+
* @author inspired by [jhildenbiddle](https://stackoverflow.com/a/48218209/4828813).
|
|
122
|
+
*/
|
|
123
|
+
public static mergeDeep(...objects: object[]) {
|
|
124
|
+
type IndexedObject = { [key: string]: any };
|
|
125
|
+
const isObject = (obj: any) => {
|
|
126
|
+
return obj && typeof obj === 'object';
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
return objects.reduce((prev: IndexedObject, obj: IndexedObject): IndexedObject => {
|
|
130
|
+
Object.keys(obj).forEach((key: string): void => {
|
|
131
|
+
const pVal = prev[key];
|
|
132
|
+
const oVal = obj[key];
|
|
133
|
+
|
|
134
|
+
if (Array.isArray(pVal) && Array.isArray(oVal)) {
|
|
135
|
+
prev[key] = pVal.concat(...oVal);
|
|
136
|
+
}
|
|
137
|
+
else if (isObject(pVal) && isObject(oVal)) {
|
|
138
|
+
prev[key] = Utility.mergeDeep(pVal, oVal);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
prev[key] = oVal;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
return prev;
|
|
146
|
+
}, {});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Checks if the origin, pathnames and query string are equal (ignoring different fragments),
|
|
151
|
+
* and therefore point to the same server side resource.
|
|
152
|
+
*
|
|
153
|
+
* @param {string|null} url1
|
|
154
|
+
* @param {string|null} url2
|
|
155
|
+
*
|
|
156
|
+
* @returns {boolean}
|
|
157
|
+
*/
|
|
158
|
+
public static urlsPointToSameServerSideResource(url1: null|string, url2: null|string): boolean {
|
|
159
|
+
if (!url1 || !url2) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const currentWindowUrlOrigin = window.location.origin;
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
const uriObject1 = new URL(url1, Utility.isValidUrl(url1) ? undefined : currentWindowUrlOrigin);
|
|
167
|
+
const uriObject2 = new URL(url2, Utility.isValidUrl(url2) ? undefined : currentWindowUrlOrigin);
|
|
168
|
+
const resource1 = uriObject1.origin + uriObject1.pathname + uriObject1.search;
|
|
169
|
+
const resource2 = uriObject2.origin + uriObject2.pathname + uriObject2.search;
|
|
170
|
+
|
|
171
|
+
return resource1 === resource2;
|
|
172
|
+
} catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Checks, if the given URL is valid.
|
|
180
|
+
*
|
|
181
|
+
* @param {null|string} url
|
|
182
|
+
* @private
|
|
183
|
+
*/
|
|
184
|
+
private static isValidUrl(url: null|string): boolean {
|
|
185
|
+
try {
|
|
186
|
+
new URL(url);
|
|
187
|
+
return true;
|
|
188
|
+
} catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export default Utility;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import ConsumerScope from '../event/consumer-scope';
|
|
15
|
+
|
|
16
|
+
export abstract class AbstractContainer {
|
|
17
|
+
protected readonly consumerScope: any = ConsumerScope;
|
|
18
|
+
|
|
19
|
+
constructor(consumerScope: any) {
|
|
20
|
+
this.consumerScope = consumerScope;
|
|
21
|
+
}
|
|
22
|
+
}
|