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,252 @@
|
|
|
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
|
+
/*! Based on http://www.webtoolkit.info/javascript_md5.html */
|
|
15
|
+
|
|
16
|
+
class Md5 {
|
|
17
|
+
public static hash(value: string): string {
|
|
18
|
+
let k;
|
|
19
|
+
let AA;
|
|
20
|
+
let BB;
|
|
21
|
+
let CC;
|
|
22
|
+
let DD;
|
|
23
|
+
let a;
|
|
24
|
+
let b;
|
|
25
|
+
let c;
|
|
26
|
+
let d;
|
|
27
|
+
const S11 = 7;
|
|
28
|
+
const S12 = 12;
|
|
29
|
+
const S13 = 17;
|
|
30
|
+
const S14 = 22;
|
|
31
|
+
const S21 = 5;
|
|
32
|
+
const S22 = 9;
|
|
33
|
+
const S23 = 14;
|
|
34
|
+
const S24 = 20;
|
|
35
|
+
const S31 = 4;
|
|
36
|
+
const S32 = 11;
|
|
37
|
+
const S33 = 16;
|
|
38
|
+
const S34 = 23;
|
|
39
|
+
const S41 = 6;
|
|
40
|
+
const S42 = 10;
|
|
41
|
+
const S43 = 15;
|
|
42
|
+
const S44 = 21;
|
|
43
|
+
|
|
44
|
+
value = Md5.utf8Encode(value);
|
|
45
|
+
const x = Md5.convertToWordArray(value);
|
|
46
|
+
|
|
47
|
+
a = 0x67452301;
|
|
48
|
+
b = 0xEFCDAB89;
|
|
49
|
+
c = 0x98BADCFE;
|
|
50
|
+
d = 0x10325476;
|
|
51
|
+
|
|
52
|
+
for (k = 0; k < x.length; k += 16) {
|
|
53
|
+
AA = a;
|
|
54
|
+
BB = b;
|
|
55
|
+
CC = c;
|
|
56
|
+
DD = d;
|
|
57
|
+
a = Md5.FF(a, b, c, d, x[k], S11, 0xD76AA478);
|
|
58
|
+
d = Md5.FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
|
|
59
|
+
c = Md5.FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
|
|
60
|
+
b = Md5.FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
|
|
61
|
+
a = Md5.FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
|
|
62
|
+
d = Md5.FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
|
|
63
|
+
c = Md5.FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
|
|
64
|
+
b = Md5.FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
|
|
65
|
+
a = Md5.FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
|
|
66
|
+
d = Md5.FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
|
|
67
|
+
c = Md5.FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
|
|
68
|
+
b = Md5.FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
|
|
69
|
+
a = Md5.FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
|
|
70
|
+
d = Md5.FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
|
|
71
|
+
c = Md5.FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
|
|
72
|
+
b = Md5.FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
|
|
73
|
+
a = Md5.GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
|
|
74
|
+
d = Md5.GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
|
|
75
|
+
c = Md5.GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
|
|
76
|
+
b = Md5.GG(b, c, d, a, x[k], S24, 0xE9B6C7AA);
|
|
77
|
+
a = Md5.GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
|
|
78
|
+
d = Md5.GG(d, a, b, c, x[k + 10], S22, 0x2441453);
|
|
79
|
+
c = Md5.GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
|
|
80
|
+
b = Md5.GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
|
|
81
|
+
a = Md5.GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
|
|
82
|
+
d = Md5.GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
|
|
83
|
+
c = Md5.GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
|
|
84
|
+
b = Md5.GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
|
|
85
|
+
a = Md5.GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
|
|
86
|
+
d = Md5.GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
|
|
87
|
+
c = Md5.GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
|
|
88
|
+
b = Md5.GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
|
|
89
|
+
a = Md5.HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
|
|
90
|
+
d = Md5.HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
|
|
91
|
+
c = Md5.HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
|
|
92
|
+
b = Md5.HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
|
|
93
|
+
a = Md5.HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
|
|
94
|
+
d = Md5.HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
|
|
95
|
+
c = Md5.HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
|
|
96
|
+
b = Md5.HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
|
|
97
|
+
a = Md5.HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
|
|
98
|
+
d = Md5.HH(d, a, b, c, x[k], S32, 0xEAA127FA);
|
|
99
|
+
c = Md5.HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
|
|
100
|
+
b = Md5.HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
|
|
101
|
+
a = Md5.HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
|
|
102
|
+
d = Md5.HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
|
|
103
|
+
c = Md5.HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
|
|
104
|
+
b = Md5.HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
|
|
105
|
+
a = Md5.II(a, b, c, d, x[k], S41, 0xF4292244);
|
|
106
|
+
d = Md5.II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
|
|
107
|
+
c = Md5.II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
|
|
108
|
+
b = Md5.II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
|
|
109
|
+
a = Md5.II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
|
|
110
|
+
d = Md5.II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
|
|
111
|
+
c = Md5.II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
|
|
112
|
+
b = Md5.II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
|
|
113
|
+
a = Md5.II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
|
|
114
|
+
d = Md5.II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
|
|
115
|
+
c = Md5.II(c, d, a, b, x[k + 6], S43, 0xA3014314);
|
|
116
|
+
b = Md5.II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
|
|
117
|
+
a = Md5.II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
|
|
118
|
+
d = Md5.II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
|
|
119
|
+
c = Md5.II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
|
|
120
|
+
b = Md5.II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
|
|
121
|
+
a = Md5.addUnsigned(a, AA);
|
|
122
|
+
b = Md5.addUnsigned(b, BB);
|
|
123
|
+
c = Md5.addUnsigned(c, CC);
|
|
124
|
+
d = Md5.addUnsigned(d, DD);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const temp = Md5.wordToHex(a) + Md5.wordToHex(b) + Md5.wordToHex(c) + Md5.wordToHex(d);
|
|
128
|
+
|
|
129
|
+
return temp.toLowerCase();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private static rotateLeft(lValue: number, iShiftBits: number): number {
|
|
133
|
+
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private static addUnsigned(lX: number, lY: number): number {
|
|
137
|
+
const lX8 = (lX & 0x80000000);
|
|
138
|
+
const lY8 = (lY & 0x80000000);
|
|
139
|
+
const lX4 = (lX & 0x40000000);
|
|
140
|
+
const lY4 = (lY & 0x40000000);
|
|
141
|
+
const lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
|
|
142
|
+
if (lX4 & lY4) {
|
|
143
|
+
return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
|
|
144
|
+
}
|
|
145
|
+
if (lX4 | lY4) {
|
|
146
|
+
if (lResult & 0x40000000) {
|
|
147
|
+
return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
|
|
148
|
+
} else {
|
|
149
|
+
return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
return (lResult ^ lX8 ^ lY8);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private static F(x: number, y: number, z: number): number {
|
|
157
|
+
return (x & y) | ((~x) & z);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private static G(x: number, y: number, z: number): number {
|
|
161
|
+
return (x & z) | (y & (~z));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private static H(x: number, y: number, z: number): number {
|
|
165
|
+
return (x ^ y ^ z);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
private static I(x: number, y: number, z: number): number {
|
|
169
|
+
return (y ^ (x | (~z)));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private static FF(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
|
|
173
|
+
a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.F(b, c, d), x), ac));
|
|
174
|
+
return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private static GG(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
|
|
178
|
+
a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.G(b, c, d), x), ac));
|
|
179
|
+
return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private static HH(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
|
|
183
|
+
a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.H(b, c, d), x), ac));
|
|
184
|
+
return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private static II(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
|
|
188
|
+
a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.I(b, c, d), x), ac));
|
|
189
|
+
return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private static convertToWordArray(string: string): Array<number> {
|
|
193
|
+
let lWordCount;
|
|
194
|
+
const lMessageLength = string.length;
|
|
195
|
+
const lNumberOfWords_temp1 = lMessageLength + 8;
|
|
196
|
+
const lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
|
|
197
|
+
const lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
|
|
198
|
+
const lWordArray = Array(lNumberOfWords - 1);
|
|
199
|
+
let lBytePosition = 0;
|
|
200
|
+
let lByteCount = 0;
|
|
201
|
+
while (lByteCount < lMessageLength) {
|
|
202
|
+
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
|
|
203
|
+
lBytePosition = (lByteCount % 4) * 8;
|
|
204
|
+
lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
|
|
205
|
+
lByteCount++;
|
|
206
|
+
}
|
|
207
|
+
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
|
|
208
|
+
lBytePosition = (lByteCount % 4) * 8;
|
|
209
|
+
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
|
|
210
|
+
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
|
|
211
|
+
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
|
|
212
|
+
return lWordArray;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private static wordToHex(lValue: number): string {
|
|
216
|
+
let wordToHexValue = '';
|
|
217
|
+
let wordToHexValue_temp = '';
|
|
218
|
+
let lByte;
|
|
219
|
+
let lCount;
|
|
220
|
+
for (lCount = 0; lCount <= 3; lCount++) {
|
|
221
|
+
lByte = (lValue >>> (lCount * 8)) & 255;
|
|
222
|
+
wordToHexValue_temp = '0' + lByte.toString(16);
|
|
223
|
+
wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length - 2, 2);
|
|
224
|
+
}
|
|
225
|
+
return wordToHexValue;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
private static utf8Encode(string: string): string {
|
|
229
|
+
string = string.replace(/\r\n/g, '\n');
|
|
230
|
+
let utftext = '';
|
|
231
|
+
|
|
232
|
+
for (let n = 0; n < string.length; n++) {
|
|
233
|
+
const c = string.charCodeAt(n);
|
|
234
|
+
|
|
235
|
+
if (c < 128) {
|
|
236
|
+
utftext += String.fromCharCode(c);
|
|
237
|
+
} else if ((c > 127) && (c < 2048)) {
|
|
238
|
+
utftext += String.fromCharCode((c >> 6) | 192);
|
|
239
|
+
utftext += String.fromCharCode((c & 63) | 128);
|
|
240
|
+
} else {
|
|
241
|
+
utftext += String.fromCharCode((c >> 12) | 224);
|
|
242
|
+
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
|
|
243
|
+
utftext += String.fromCharCode((c & 63) | 128);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return utftext;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export default Md5;
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
* @internal Use in TYPO3 core only, API can change at any time!
|
|
15
|
+
*/
|
|
16
|
+
if (document.currentScript) {
|
|
17
|
+
const scriptElement = document.currentScript;
|
|
18
|
+
switch (scriptElement.dataset.action) {
|
|
19
|
+
case 'window.close':
|
|
20
|
+
window.close();
|
|
21
|
+
break;
|
|
22
|
+
default:
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export type HotkeyStruct = {
|
|
15
|
+
modifiers: {
|
|
16
|
+
meta: boolean,
|
|
17
|
+
ctrl: boolean,
|
|
18
|
+
shift: boolean,
|
|
19
|
+
alt: boolean,
|
|
20
|
+
},
|
|
21
|
+
key: string
|
|
22
|
+
};
|
|
23
|
+
export type HotkeyHandler = (e: KeyboardEvent) => void;
|
|
24
|
+
export type Options = {
|
|
25
|
+
scope: string,
|
|
26
|
+
allowOnEditables: boolean,
|
|
27
|
+
allowRepeat: boolean,
|
|
28
|
+
bindElement: Element|undefined
|
|
29
|
+
};
|
|
30
|
+
export type HotkeySetup = {
|
|
31
|
+
struct: HotkeyStruct;
|
|
32
|
+
handler: HotkeyHandler;
|
|
33
|
+
options: Options;
|
|
34
|
+
};
|
|
35
|
+
type HotkeyMap = Map<string, HotkeySetup>;
|
|
36
|
+
export type ScopedHotkeyMap = Map<string, HotkeyMap>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Storage helper for the hotkeys module to keep registered hotkeys anywhere in the backend scaffold available
|
|
40
|
+
*/
|
|
41
|
+
class HotkeyStorage {
|
|
42
|
+
public constructor(
|
|
43
|
+
private readonly scopedHotkeyMap: ScopedHotkeyMap = new Map([
|
|
44
|
+
['all', new Map()]
|
|
45
|
+
]),
|
|
46
|
+
public activeScope: string = 'all'
|
|
47
|
+
) {
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public getScopedHotkeyMap(): ScopedHotkeyMap {
|
|
51
|
+
return this.scopedHotkeyMap;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let hotkeysStorageInstance: HotkeyStorage;
|
|
56
|
+
if (!top.TYPO3.HotkeyStorage) {
|
|
57
|
+
hotkeysStorageInstance = new HotkeyStorage();
|
|
58
|
+
top.TYPO3.HotkeyStorage = hotkeysStorageInstance;
|
|
59
|
+
} else {
|
|
60
|
+
hotkeysStorageInstance = top.TYPO3.HotkeyStorage;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export default hotkeysStorageInstance;
|
|
@@ -0,0 +1,216 @@
|
|
|
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 HotkeyStorage, { type ScopedHotkeyMap, type HotkeyStruct, type Options, type HotkeySetup } from '@typo3/backend/hotkeys/hotkey-storage';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
|
|
17
|
+
export enum ModifierKeys {
|
|
18
|
+
META = 'meta',
|
|
19
|
+
CTRL = 'control',
|
|
20
|
+
SHIFT = 'shift',
|
|
21
|
+
ALT = 'alt',
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type Hotkey = string[];
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Module: @typo3/backend/hotkeys
|
|
28
|
+
*
|
|
29
|
+
* Provides API to register hotkeys (aka shortcuts) in the TYPO3 backend. It is possible to register hotkeys in
|
|
30
|
+
* different scopes, that can also be switched during runtime. Extensions should always specify their scope when
|
|
31
|
+
* registering hotkeys.
|
|
32
|
+
*
|
|
33
|
+
* Due to how the TYPO3 backend currently works, registered hotkeys are limited to the same document the API is used in.
|
|
34
|
+
*/
|
|
35
|
+
class Hotkeys {
|
|
36
|
+
// navigator.platform is deprecated, but https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API is experimental for now
|
|
37
|
+
public readonly normalizedCtrlModifierKey = navigator.platform.toLowerCase().startsWith('mac') ? ModifierKeys.META : ModifierKeys.CTRL;
|
|
38
|
+
private readonly scopedHotkeyMap: ScopedHotkeyMap;
|
|
39
|
+
private readonly defaultOptions: Options = {
|
|
40
|
+
scope: 'all',
|
|
41
|
+
allowOnEditables: false,
|
|
42
|
+
allowRepeat: false,
|
|
43
|
+
bindElement: undefined
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
public constructor() {
|
|
47
|
+
this.scopedHotkeyMap = HotkeyStorage.getScopedHotkeyMap();
|
|
48
|
+
this.setScope('all');
|
|
49
|
+
this.registerEventHandler();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public setScope(scope: string): void {
|
|
53
|
+
HotkeyStorage.activeScope = scope;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public getScope(): string {
|
|
57
|
+
return HotkeyStorage.activeScope;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public register(hotkey: Hotkey, handler: (e: KeyboardEvent) => void, options: Partial<Options> = {}): void {
|
|
61
|
+
if (hotkey.filter((hotkeyPart: string) => !Object.values<string>(ModifierKeys).includes(hotkeyPart)).length === 0) {
|
|
62
|
+
throw new Error('Attempted to register hotkey "' + hotkey.join('+') + '" without a non-modifier key.');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Normalize trigger
|
|
66
|
+
hotkey = hotkey.map((h: string) => h.toLowerCase());
|
|
67
|
+
|
|
68
|
+
const mergedConfiguration: Options = { ...this.defaultOptions, ...options };
|
|
69
|
+
if (!this.scopedHotkeyMap.has(mergedConfiguration.scope)) {
|
|
70
|
+
this.scopedHotkeyMap.set(mergedConfiguration.scope, new Map());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let ariaKeyShortcut = this.composeAriaKeyShortcut(hotkey);
|
|
74
|
+
const hotkeyMap = this.scopedHotkeyMap.get(mergedConfiguration.scope);
|
|
75
|
+
const hotkeyStruct = this.createHotkeyStructFromTrigger(hotkey);
|
|
76
|
+
const encodedHotkeyStruct = JSON.stringify(hotkeyStruct);
|
|
77
|
+
|
|
78
|
+
if (hotkeyMap.has(encodedHotkeyStruct)) {
|
|
79
|
+
const setup = hotkeyMap.get(encodedHotkeyStruct);
|
|
80
|
+
|
|
81
|
+
// Hotkey already exists, remove potentially set `aria-keyshortcuts` for this hotkey
|
|
82
|
+
setup.options.bindElement?.removeAttribute('aria-keyshortcuts');
|
|
83
|
+
// Delete existing hotkey. If the existing hotkey was registered in a different browser scope, the callback is lost
|
|
84
|
+
hotkeyMap.delete(encodedHotkeyStruct);
|
|
85
|
+
}
|
|
86
|
+
hotkeyMap.set(encodedHotkeyStruct, { struct: hotkeyStruct, handler, options: mergedConfiguration });
|
|
87
|
+
|
|
88
|
+
if (mergedConfiguration.bindElement instanceof Element) {
|
|
89
|
+
const existingAriaAttribute = mergedConfiguration.bindElement.getAttribute('aria-keyshortcuts');
|
|
90
|
+
if (existingAriaAttribute !== null && !existingAriaAttribute.includes(ariaKeyShortcut)) {
|
|
91
|
+
// Element already has `aria-keyshortcuts`, append composed shortcut
|
|
92
|
+
ariaKeyShortcut = existingAriaAttribute + ' ' + ariaKeyShortcut;
|
|
93
|
+
}
|
|
94
|
+
mergedConfiguration.bindElement.setAttribute('aria-keyshortcuts', ariaKeyShortcut);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private registerEventHandler(): void {
|
|
99
|
+
new RegularEvent('keydown', (e: KeyboardEvent): void => {
|
|
100
|
+
const hotkeySetup = this.findHotkeySetup(e);
|
|
101
|
+
if (hotkeySetup === null) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (e.repeat && !hotkeySetup.options.allowRepeat) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!hotkeySetup.options.allowOnEditables) {
|
|
110
|
+
const target = e.target as HTMLElement;
|
|
111
|
+
if (target.isContentEditable || (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) && !(e.target as HTMLInputElement|HTMLTextAreaElement).readOnly)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
hotkeySetup.handler(e);
|
|
117
|
+
}).bindTo(document);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private findHotkeySetup(e: KeyboardEvent): HotkeySetup|undefined {
|
|
121
|
+
// We always consider the global "all" scope first to avoid overriding global hotkeys
|
|
122
|
+
const scopes: string[] = [...new Set(['all', HotkeyStorage.activeScope])];
|
|
123
|
+
const hotkeyStruct = this.createHotkeyStructFromEvent(e);
|
|
124
|
+
const encodedHotkeyStruct = JSON.stringify(hotkeyStruct);
|
|
125
|
+
|
|
126
|
+
for (const scope of scopes) {
|
|
127
|
+
const hotkeyMap = this.scopedHotkeyMap.get(scope);
|
|
128
|
+
if (hotkeyMap.has(encodedHotkeyStruct)) {
|
|
129
|
+
return hotkeyMap.get(encodedHotkeyStruct);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private createHotkeyStructFromTrigger(hotkey: Hotkey): HotkeyStruct {
|
|
137
|
+
const nonModifierCodes = hotkey.filter((hotkeyPart: string) => !Object.values<string>(ModifierKeys).includes(hotkeyPart));
|
|
138
|
+
if (nonModifierCodes.length > 1) {
|
|
139
|
+
throw new Error('Cannot register hotkey with more than one non-modifier key, "' + nonModifierCodes.join('+') + '" given.');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
modifiers: {
|
|
144
|
+
meta: hotkey.includes(ModifierKeys.META),
|
|
145
|
+
ctrl: hotkey.includes(ModifierKeys.CTRL),
|
|
146
|
+
shift: hotkey.includes(ModifierKeys.SHIFT),
|
|
147
|
+
alt: hotkey.includes(ModifierKeys.ALT),
|
|
148
|
+
},
|
|
149
|
+
key: nonModifierCodes[0].toLowerCase(),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private createHotkeyStructFromEvent(e: KeyboardEvent): HotkeyStruct {
|
|
154
|
+
return {
|
|
155
|
+
modifiers: {
|
|
156
|
+
meta: e.metaKey,
|
|
157
|
+
ctrl: e.ctrlKey,
|
|
158
|
+
shift: e.shiftKey,
|
|
159
|
+
alt: e.altKey,
|
|
160
|
+
},
|
|
161
|
+
key: e.key?.toLowerCase(),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Composes a string for use with `aria-keyshortcuts`
|
|
167
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-keyshortcuts
|
|
168
|
+
*/
|
|
169
|
+
private composeAriaKeyShortcut(hotkey: Hotkey): string {
|
|
170
|
+
const parts: string[] = [];
|
|
171
|
+
|
|
172
|
+
for (let key of hotkey) {
|
|
173
|
+
if (key === '+') {
|
|
174
|
+
key = 'plus';
|
|
175
|
+
} else {
|
|
176
|
+
key = key.replace(/[\u00A0-\u9999<>&]/g, i => '&#' + i.charCodeAt(0) + ';');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
parts.push(key);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// The standard requires to have modifier keys to be at first
|
|
183
|
+
parts.sort((a: string, b: string): number => {
|
|
184
|
+
const aIsModifierKey = Object.values<string>(ModifierKeys).includes(a);
|
|
185
|
+
const bIsModifierKey = Object.values<string>(ModifierKeys).includes(b);
|
|
186
|
+
|
|
187
|
+
if (aIsModifierKey && !bIsModifierKey) {
|
|
188
|
+
return -1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (!aIsModifierKey && bIsModifierKey) {
|
|
192
|
+
return 1;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (aIsModifierKey && bIsModifierKey) {
|
|
196
|
+
return -1;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return 0;
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
return parts.join('+');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Helper to always get the same instance within a frame
|
|
207
|
+
// @todo: have the module in `top` scope, while being able to register the `keydown` event in each frame
|
|
208
|
+
let hotkeysInstance: Hotkeys;
|
|
209
|
+
if (!TYPO3.Hotkeys) {
|
|
210
|
+
hotkeysInstance = new Hotkeys();
|
|
211
|
+
TYPO3.Hotkeys = hotkeysInstance;
|
|
212
|
+
} else {
|
|
213
|
+
hotkeysInstance = TYPO3.Hotkeys;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export default hotkeysInstance;
|