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,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import FormEngine from '@typo3/backend/form-engine';
|
|
16
|
+
import Modal from '../../modal';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* This module is used for the field control "Link popup"
|
|
20
|
+
*/
|
|
21
|
+
class LinkPopup {
|
|
22
|
+
private controlElement: HTMLElement = null;
|
|
23
|
+
|
|
24
|
+
constructor(controlElementId: string) {
|
|
25
|
+
DocumentService.ready().then((): void => {
|
|
26
|
+
this.controlElement = <HTMLElement>document.querySelector(controlElementId);
|
|
27
|
+
if (this.controlElement === null) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.controlElement.addEventListener('click', this.handleControlClick);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param {Event} e
|
|
36
|
+
*/
|
|
37
|
+
private readonly handleControlClick = (e: Event): void => {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
|
|
40
|
+
const itemName = this.controlElement.dataset.itemName;
|
|
41
|
+
const url = this.controlElement.getAttribute('href')
|
|
42
|
+
+ '&P[currentValue]=' + encodeURIComponent(document.forms.namedItem('editform')[itemName].value)
|
|
43
|
+
+ '&P[currentSelectedValues]=' + encodeURIComponent(FormEngine.getFieldElement(itemName).val());
|
|
44
|
+
|
|
45
|
+
Modal.advanced({
|
|
46
|
+
type: Modal.types.iframe,
|
|
47
|
+
content: url,
|
|
48
|
+
size: Modal.sizes.large,
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export default LinkPopup;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import FormEngine from '@typo3/backend/form-engine';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* This module is used for the field control "List module" used for "group" fields
|
|
19
|
+
*/
|
|
20
|
+
class ListModule {
|
|
21
|
+
private controlElement: HTMLElement = null;
|
|
22
|
+
|
|
23
|
+
constructor(controlElementId: string) {
|
|
24
|
+
DocumentService.ready().then((): void => {
|
|
25
|
+
this.controlElement = <HTMLElement>document.querySelector(controlElementId);
|
|
26
|
+
this.controlElement.addEventListener('click', this.registerClickHandler);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param {Event} e
|
|
32
|
+
*/
|
|
33
|
+
private readonly registerClickHandler = (e: Event): void => {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
|
|
36
|
+
FormEngine.preventFollowLinkIfNotSaved(this.controlElement.getAttribute('href'));
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default ListModule;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import FormEngineValidation from '@typo3/backend/form-engine-validation';
|
|
16
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
17
|
+
import Notification from '@typo3/backend/notification';
|
|
18
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
19
|
+
|
|
20
|
+
interface PasswordRules {
|
|
21
|
+
length: number;
|
|
22
|
+
random: string;
|
|
23
|
+
digitCharacters: boolean;
|
|
24
|
+
lowerCaseCharacters: boolean;
|
|
25
|
+
upperCaseCharacters: boolean;
|
|
26
|
+
specialCharacters: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Handles the "Generate Password" field control
|
|
31
|
+
*/
|
|
32
|
+
class PasswordGenerator {
|
|
33
|
+
private controlElement: HTMLAnchorElement = null;
|
|
34
|
+
private humanReadableField: HTMLInputElement = null;
|
|
35
|
+
private hiddenField: HTMLInputElement = null;
|
|
36
|
+
private passwordRules: PasswordRules = null;
|
|
37
|
+
|
|
38
|
+
constructor(controlElementId: string) {
|
|
39
|
+
DocumentService.ready().then((): void => {
|
|
40
|
+
this.controlElement = <HTMLAnchorElement>document.getElementById(controlElementId);
|
|
41
|
+
this.humanReadableField = <HTMLInputElement>document.querySelector(
|
|
42
|
+
'input[data-formengine-input-name="' + this.controlElement.dataset.itemName + '"]',
|
|
43
|
+
);
|
|
44
|
+
this.hiddenField = <HTMLInputElement>document.querySelector(
|
|
45
|
+
'input[name="' + this.controlElement.dataset.itemName + '"]',
|
|
46
|
+
);
|
|
47
|
+
this.passwordRules = JSON.parse(this.controlElement.dataset.passwordRules || '{}');
|
|
48
|
+
|
|
49
|
+
// Set human-readable field to disable and readonly in case edit is disallowed in the field control settings
|
|
50
|
+
if (!this.controlElement.dataset.allowEdit) {
|
|
51
|
+
this.humanReadableField.disabled = true;
|
|
52
|
+
this.humanReadableField.readOnly = true;
|
|
53
|
+
// Also remove clearable possibility
|
|
54
|
+
if (this.humanReadableField.isClearable || this.humanReadableField.classList.contains('t3js-clearable')) {
|
|
55
|
+
this.humanReadableField.classList.remove('t3js-clearable');
|
|
56
|
+
const clearableContainer = <HTMLDivElement>this.humanReadableField.closest('div.form-control-clearable-wrapper');
|
|
57
|
+
if (clearableContainer) {
|
|
58
|
+
clearableContainer.classList.remove('form-control-clearable');
|
|
59
|
+
const closeButton = <HTMLButtonElement>clearableContainer.querySelector('button.close');
|
|
60
|
+
if (closeButton) {
|
|
61
|
+
clearableContainer.removeChild(closeButton);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
this.controlElement.addEventListener('click', this.generatePassword.bind(this));
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private generatePassword(e: Event): void {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
|
|
74
|
+
// Generate new password
|
|
75
|
+
(new AjaxRequest(TYPO3.settings.ajaxUrls.password_generate)).post({
|
|
76
|
+
passwordRules: this.passwordRules,
|
|
77
|
+
})
|
|
78
|
+
.then(async (response: AjaxResponse): Promise<void> => {
|
|
79
|
+
const resolvedBody = await response.resolve();
|
|
80
|
+
if (resolvedBody.success === true) {
|
|
81
|
+
// Set type=text to display the generated password (allow to copy) and update the field value
|
|
82
|
+
this.humanReadableField.type = 'text';
|
|
83
|
+
this.humanReadableField.value = resolvedBody.password;
|
|
84
|
+
// Manually dispatch "change" to enable FormEngine handling (instead of manually calling "updateInputField()").
|
|
85
|
+
// This way custom modules are also triggered when listening on this event.
|
|
86
|
+
this.humanReadableField.dispatchEvent(new Event('change'));
|
|
87
|
+
// Due to formatting and processing done by FormEngine, we need to set the value again (allow to copy)
|
|
88
|
+
this.humanReadableField.value = this.hiddenField.value;
|
|
89
|
+
// Finally validate and mark the field as changed
|
|
90
|
+
FormEngineValidation.validateField(this.humanReadableField);
|
|
91
|
+
FormEngineValidation.markFieldAsChanged(this.humanReadableField);
|
|
92
|
+
} else {
|
|
93
|
+
Notification.warning(resolvedBody.message || 'No password was generated');
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
.catch(() => {
|
|
97
|
+
Notification.error('Password could not be generated');
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export default PasswordGenerator;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* This module is used for the field control "Reset selection" used for selectSingleBox
|
|
18
|
+
*/
|
|
19
|
+
class ResetSelection {
|
|
20
|
+
private controlElement: HTMLElement = null;
|
|
21
|
+
|
|
22
|
+
constructor(controlElementId: string) {
|
|
23
|
+
DocumentService.ready().then((): void => {
|
|
24
|
+
this.controlElement = <HTMLElement>document.querySelector(controlElementId);
|
|
25
|
+
if (this.controlElement !== null) {
|
|
26
|
+
this.controlElement.addEventListener('click', this.registerClickHandler);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {Event} e
|
|
33
|
+
*/
|
|
34
|
+
private readonly registerClickHandler = (e: Event): void => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
|
|
37
|
+
const itemName: string = this.controlElement.dataset.itemName;
|
|
38
|
+
const selectedIndices: Array<number> = JSON.parse(this.controlElement.dataset.selectedIndices);
|
|
39
|
+
const field = (<HTMLSelectElement>document.forms.namedItem('editform').querySelector('[name="' + itemName + '[]"]'));
|
|
40
|
+
|
|
41
|
+
field.selectedIndex = -1;
|
|
42
|
+
for (const i of selectedIndices) {
|
|
43
|
+
field.options[i].selected = true;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export default ResetSelection;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
16
|
+
|
|
17
|
+
enum States {
|
|
18
|
+
CUSTOM = 'custom',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class LocalizationStateSelector {
|
|
22
|
+
constructor(fieldName: string) {
|
|
23
|
+
DocumentService.ready().then((): void => {
|
|
24
|
+
this.registerEventHandler(fieldName);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string} fieldName
|
|
30
|
+
*/
|
|
31
|
+
private registerEventHandler(fieldName: string): void {
|
|
32
|
+
new RegularEvent('change', (e: Event): void => {
|
|
33
|
+
const target = e.target as HTMLInputElement;
|
|
34
|
+
const input: HTMLInputElement = target.closest('.t3js-formengine-field-item')?.querySelector('[data-formengine-input-name]');
|
|
35
|
+
if (!input) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const lastState = input.dataset.lastL10nState || false;
|
|
40
|
+
const currentState = target.value;
|
|
41
|
+
|
|
42
|
+
if (lastState && currentState === lastState) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (currentState === States.CUSTOM) {
|
|
47
|
+
if (lastState) {
|
|
48
|
+
target.dataset.originalLanguageValue = input.value;
|
|
49
|
+
}
|
|
50
|
+
input.disabled = false;
|
|
51
|
+
} else {
|
|
52
|
+
if (lastState === States.CUSTOM) {
|
|
53
|
+
(target.closest('.t3js-l10n-state-container')
|
|
54
|
+
.querySelector('.t3js-l10n-state-custom') as HTMLElement)
|
|
55
|
+
.dataset.originalLanguageValue = input.value;
|
|
56
|
+
}
|
|
57
|
+
input.disabled = true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
input.value = target.dataset.originalLanguageValue;
|
|
61
|
+
input.dispatchEvent(new Event('change'));
|
|
62
|
+
input.dataset.lastL10nState = target.value;
|
|
63
|
+
}).delegateTo(document, '.t3js-l10n-state-container input[type="radio"][name="' + fieldName + '"]');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export default LocalizationStateSelector;
|
|
@@ -0,0 +1,123 @@
|
|
|
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
|
+
enum InsertModes {
|
|
15
|
+
append = 'append',
|
|
16
|
+
replace = 'replace',
|
|
17
|
+
prepend = 'prepend'
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Module @typo3/backend/form-engine/field-wizard/value-picker
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* <typo3-formengine-valuepicker mode="prepend" linked-field="css-selector">
|
|
25
|
+
* <select>
|
|
26
|
+
* </typo3-formengine-valuepicker>
|
|
27
|
+
*
|
|
28
|
+
* This is based on W3C custom elements ("web components") specification, see
|
|
29
|
+
* https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
|
|
30
|
+
*/
|
|
31
|
+
export class ValuePicker extends HTMLElement {
|
|
32
|
+
private valuePicker: HTMLSelectElement|null = null;
|
|
33
|
+
private linkedField: HTMLInputElement|HTMLTextAreaElement|null = null;
|
|
34
|
+
private initialValueSet: boolean = false;
|
|
35
|
+
|
|
36
|
+
public constructor() {
|
|
37
|
+
super();
|
|
38
|
+
const slot = document.createElement('slot');
|
|
39
|
+
slot.addEventListener('slotchange', () => this.initializeValuePicker(slot));
|
|
40
|
+
this.attachShadow({ mode: 'open' }).append(slot);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public connectedCallback(): void {
|
|
44
|
+
this.linkedField = document.querySelector(this.getAttribute('linked-field')) as HTMLInputElement|HTMLTextAreaElement|null;
|
|
45
|
+
this.linkedField?.addEventListener('change', this.linkedFieldOnChange);
|
|
46
|
+
this.initializeValuePicker(this.shadowRoot.querySelector('slot'));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public disconnectedCallback(): void {
|
|
50
|
+
this.linkedField?.removeEventListener('change', this.linkedFieldOnChange);
|
|
51
|
+
this.linkedField = null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private initializeValuePicker(slot: HTMLSlotElement): void {
|
|
55
|
+
const picker = (slot.assignedElements()[0] ?? null) as HTMLSelectElement|null;
|
|
56
|
+
if (picker !== null && picker.tagName.toLowerCase() !== 'select') {
|
|
57
|
+
throw new Error(`ValuePicker could not be initialized. Expected <select> child name, but found: ${picker}`);
|
|
58
|
+
}
|
|
59
|
+
if (picker !== this.valuePicker) {
|
|
60
|
+
this.valuePicker?.removeEventListener('change', this.onChange);
|
|
61
|
+
this.valuePicker = picker;
|
|
62
|
+
this.valuePicker?.addEventListener('change', this.onChange);
|
|
63
|
+
this.initialValueSet = false;
|
|
64
|
+
}
|
|
65
|
+
this.setInitialPickerValue();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private setInitialPickerValue() {
|
|
69
|
+
if (this.linkedField === null || this.valuePicker === null || this.initialValueSet) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (this.getInsertMode() === InsertModes.replace) {
|
|
73
|
+
const formEngineInputField = (document.getElementsByName(this.linkedField.dataset.formengineInputName)[0] ?? null) as HTMLInputElement|HTMLTextAreaElement;
|
|
74
|
+
if (formEngineInputField !== null) {
|
|
75
|
+
this.selectValue(formEngineInputField.value);
|
|
76
|
+
this.initialValueSet = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private readonly onChange = () => {
|
|
82
|
+
this.setValue();
|
|
83
|
+
this.valuePicker.blur();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
private readonly linkedFieldOnChange = () => {
|
|
87
|
+
if (this.valuePicker === null) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (this.getInsertMode() === InsertModes.replace) {
|
|
91
|
+
this.selectValue(this.linkedField.value);
|
|
92
|
+
} else {
|
|
93
|
+
this.valuePicker.selectedIndex = 0;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
private selectValue (value: string): void {
|
|
98
|
+
this.valuePicker.selectedIndex = Array.from(this.valuePicker.options).findIndex((option): boolean => option.value === value);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private getInsertMode (): InsertModes {
|
|
102
|
+
return this.getAttribute('mode') as InsertModes ?? InsertModes.replace;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private setValue (): void {
|
|
106
|
+
const selectedValue = this.valuePicker.options[this.valuePicker.selectedIndex].value;
|
|
107
|
+
|
|
108
|
+
switch (this.getInsertMode()) {
|
|
109
|
+
case InsertModes.append:
|
|
110
|
+
this.linkedField.value += selectedValue;
|
|
111
|
+
break;
|
|
112
|
+
case InsertModes.prepend:
|
|
113
|
+
this.linkedField.value = selectedValue + this.linkedField.value;
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
this.linkedField.value = selectedValue;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
this.linkedField.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
window.customElements.define('typo3-formengine-valuepicker', ValuePicker);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import DocumentService from '@typo3/core/document-service';
|
|
15
|
+
import ThrottleEvent from '@typo3/core/event/throttle-event';
|
|
16
|
+
|
|
17
|
+
enum Format {
|
|
18
|
+
integer = 'integer',
|
|
19
|
+
decimal = 'decimal'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Module @typo3/backend/form-engine/field-wizard/value-slider
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* <typo3-formengine-valueslider linked-field="css-selector" format="integer" precision="2">
|
|
27
|
+
* <input>
|
|
28
|
+
* </typo3-formengine-valueslider>
|
|
29
|
+
*
|
|
30
|
+
* This is based on W3C custom elements ("web components") specification, see
|
|
31
|
+
* https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
|
|
32
|
+
*/
|
|
33
|
+
export class ValueSlider extends HTMLElement {
|
|
34
|
+
private valueSlider: HTMLInputElement = null;
|
|
35
|
+
|
|
36
|
+
public async connectedCallback(): Promise<void> {
|
|
37
|
+
if (this.valueSlider !== null) {
|
|
38
|
+
// Element is already initialized, which means the component has been rendered before. Nothing to do here.
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
await DocumentService.ready();
|
|
43
|
+
this.valueSlider = this.querySelector('input') as HTMLInputElement;
|
|
44
|
+
if (this.valueSlider !== null) {
|
|
45
|
+
new ThrottleEvent('input', this.handleRangeChange, 25).bindTo(this.valueSlider);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private readonly handleRangeChange = (e: Event): void => {
|
|
50
|
+
const target = e.target as HTMLInputElement;
|
|
51
|
+
this.updateValue(target);
|
|
52
|
+
this.updateTooltipValue(target);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Update value of slider element
|
|
57
|
+
*
|
|
58
|
+
* @param {HTMLInputElement} element
|
|
59
|
+
*/
|
|
60
|
+
private updateValue(element: HTMLInputElement): void {
|
|
61
|
+
const foreignField = document.querySelector(this.getAttribute('linked-field')) as HTMLInputElement;
|
|
62
|
+
foreignField.value = element.value;
|
|
63
|
+
foreignField.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @param {HTMLInputElement} element
|
|
68
|
+
*/
|
|
69
|
+
private updateTooltipValue(element: HTMLInputElement): void {
|
|
70
|
+
let renderedValue;
|
|
71
|
+
const value = element.value;
|
|
72
|
+
|
|
73
|
+
switch (this.getAttribute('format')) {
|
|
74
|
+
case Format.decimal:
|
|
75
|
+
renderedValue = parseFloat(value).toFixed(Number(this.getAttribute('precision')) || 2);
|
|
76
|
+
break;
|
|
77
|
+
case Format.integer:
|
|
78
|
+
default:
|
|
79
|
+
renderedValue = parseInt(value, 10);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
element.title = renderedValue.toString();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
window.customElements.define('typo3-formengine-valueslider', ValueSlider);
|
|
@@ -0,0 +1,124 @@
|
|
|
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 AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
15
|
+
import { JavaScriptItemProcessor } from '@typo3/core/java-script-item-processor';
|
|
16
|
+
import Notification from '../../notification';
|
|
17
|
+
import Utility from '../../utility';
|
|
18
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
19
|
+
|
|
20
|
+
export interface Context {
|
|
21
|
+
config: object;
|
|
22
|
+
hmac: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface Message {
|
|
26
|
+
title: string;
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AjaxDispatcherResponse {
|
|
31
|
+
hasErrors: boolean;
|
|
32
|
+
messages: Message[];
|
|
33
|
+
stylesheetFiles: string[];
|
|
34
|
+
inlineData: object;
|
|
35
|
+
scriptItems?: any[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class AjaxDispatcher {
|
|
39
|
+
private readonly objectGroup: string = null;
|
|
40
|
+
|
|
41
|
+
constructor(objectGroup: string) {
|
|
42
|
+
this.objectGroup = objectGroup;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public newRequest(endpoint: string): AjaxRequest {
|
|
46
|
+
return new AjaxRequest(endpoint);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @param {String} routeName
|
|
51
|
+
*/
|
|
52
|
+
public getEndpoint(routeName: string): string {
|
|
53
|
+
if (typeof TYPO3.settings.ajaxUrls[routeName] !== 'undefined') {
|
|
54
|
+
return TYPO3.settings.ajaxUrls[routeName];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
throw 'Undefined endpoint for route "' + routeName + '"';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public send(request: AjaxRequest, params: Array<string>): Promise<AjaxDispatcherResponse> {
|
|
61
|
+
const sentRequest = request.post(this.createRequestBody(params)).then(async (response: AjaxResponse): Promise<AjaxDispatcherResponse> => {
|
|
62
|
+
return this.processResponse(await response.resolve());
|
|
63
|
+
});
|
|
64
|
+
sentRequest.catch((reason: Error): void => {
|
|
65
|
+
Notification.error('Error ' + reason.message);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
return sentRequest;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private createRequestBody(input: Array<string>): Record<string, string> {
|
|
72
|
+
const body: Record<string, string> = {};
|
|
73
|
+
for (let i = 0; i < input.length; i++) {
|
|
74
|
+
body['ajax[' + i + ']'] = input[i];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
body['ajax[context]'] = JSON.stringify(this.getContext());
|
|
78
|
+
|
|
79
|
+
return body;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private getContext(): Context {
|
|
83
|
+
let context: Context;
|
|
84
|
+
|
|
85
|
+
if (typeof TYPO3.settings.FormEngineInline.config[this.objectGroup] !== 'undefined'
|
|
86
|
+
&& typeof TYPO3.settings.FormEngineInline.config[this.objectGroup].context !== 'undefined'
|
|
87
|
+
) {
|
|
88
|
+
context = TYPO3.settings.FormEngineInline.config[this.objectGroup].context;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return context;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private processResponse(json: AjaxDispatcherResponse): AjaxDispatcherResponse {
|
|
95
|
+
if (json.hasErrors) {
|
|
96
|
+
for (const message of json.messages) {
|
|
97
|
+
Notification.error(message.title, message.message);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (json.stylesheetFiles) {
|
|
102
|
+
document.querySelector('head').append(
|
|
103
|
+
...json.stylesheetFiles.filter(file => file).map(file => {
|
|
104
|
+
const element = document.createElement('link');
|
|
105
|
+
element.rel = 'stylesheet';
|
|
106
|
+
element.type = 'text/css';
|
|
107
|
+
element.href = file;
|
|
108
|
+
return element;
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (typeof json.inlineData === 'object') {
|
|
114
|
+
TYPO3.settings.FormEngineInline = Utility.mergeDeep(TYPO3.settings.FormEngineInline, json.inlineData) as typeof TYPO3.settings.FormEngineInline;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (json.scriptItems instanceof Array && json.scriptItems.length > 0) {
|
|
118
|
+
const processor = new JavaScriptItemProcessor();
|
|
119
|
+
processor.processItems(json.scriptItems);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return json;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { AjaxDispatcherResponse } from '@typo3/backend/form-engine/inline-relation/ajax-dispatcher';
|
|
15
|
+
|
|
16
|
+
export interface InlineResponseInterface extends AjaxDispatcherResponse{
|
|
17
|
+
data: string;
|
|
18
|
+
inlineData: InlineData;
|
|
19
|
+
stylesheetFiles: Array<string>;
|
|
20
|
+
compilerInput?: CompilerInput,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface InlineData {
|
|
24
|
+
config: { [key: string]: object };
|
|
25
|
+
map: { [key: string]: Array<string> };
|
|
26
|
+
nested: { [key: string]: Array<Array<string>> };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface CompilerInput {
|
|
30
|
+
uid: string;
|
|
31
|
+
childChildUid: string;
|
|
32
|
+
parentConfig: { [key: string]: any };
|
|
33
|
+
delete?: Array<string>;
|
|
34
|
+
localize?: Array<LocalizeItem>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface LocalizeItem {
|
|
38
|
+
uid: string;
|
|
39
|
+
selectedValue: string;
|
|
40
|
+
remove?: number;
|
|
41
|
+
}
|