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,66 @@
|
|
|
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 { AbstractSortableSelectItems } from '@typo3/backend/form-engine/element/abstract-sortable-select-items';
|
|
16
|
+
import { selector } from '@typo3/core/literals';
|
|
17
|
+
|
|
18
|
+
class FolderSortableSelectItems extends AbstractSortableSelectItems {
|
|
19
|
+
public registerEventHandler(element: HTMLSelectElement): void {
|
|
20
|
+
this.registerSortableEventHandler(element);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Module: @typo3/backend/form-engine/element/folder-element
|
|
26
|
+
*
|
|
27
|
+
* Functionality for the folder element
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* <typo3-formengine-element-folder recordFieldId="some-id">
|
|
31
|
+
* ...
|
|
32
|
+
* </typo3-formengine-element-folder>
|
|
33
|
+
*
|
|
34
|
+
* This is based on W3C custom elements ("web components") specification, see
|
|
35
|
+
* https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
|
|
36
|
+
*/
|
|
37
|
+
class FolderElement extends HTMLElement {
|
|
38
|
+
private recordField: HTMLSelectElement = null;
|
|
39
|
+
|
|
40
|
+
public async connectedCallback(): Promise<void> {
|
|
41
|
+
if (this.recordField !== null) {
|
|
42
|
+
// Element is already initialized, which means the component has been rendered before. Nothing to do here.
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const recordFieldId = this.getAttribute('recordFieldId');
|
|
47
|
+
if (recordFieldId === null) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
await DocumentService.ready();
|
|
52
|
+
this.recordField = this.querySelector<HTMLSelectElement>(selector`#${recordFieldId}`);
|
|
53
|
+
if (!this.recordField) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
this.registerEventHandler();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private registerEventHandler(): void {
|
|
61
|
+
const folderSortableSelectItems = new FolderSortableSelectItems();
|
|
62
|
+
folderSortableSelectItems.registerEventHandler(this.recordField);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
window.customElements.define('typo3-formengine-element-folder', FolderElement);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { AbstractSortableSelectItems } from './abstract-sortable-select-items';
|
|
15
|
+
import DocumentService from '@typo3/core/document-service';
|
|
16
|
+
import FormEngineSuggest from '../../form-engine-suggest';
|
|
17
|
+
|
|
18
|
+
class GroupElement extends AbstractSortableSelectItems {
|
|
19
|
+
private element: HTMLSelectElement = null;
|
|
20
|
+
|
|
21
|
+
constructor(elementId: string) {
|
|
22
|
+
super();
|
|
23
|
+
|
|
24
|
+
DocumentService.ready().then((): void => {
|
|
25
|
+
this.element = <HTMLSelectElement>document.getElementById(elementId);
|
|
26
|
+
if (this.element === null) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.registerEventHandler();
|
|
30
|
+
this.registerSuggest();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private registerEventHandler(): void {
|
|
35
|
+
this.registerSortableEventHandler(this.element);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private registerSuggest(): void {
|
|
39
|
+
let suggestField;
|
|
40
|
+
if ((suggestField = <HTMLInputElement>this.element.closest('.t3js-formengine-field-item').querySelector('.t3-form-suggest')) !== null) {
|
|
41
|
+
// tslint:disable-next-line:no-unused-expression
|
|
42
|
+
new FormEngineSuggest(suggestField);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default GroupElement;
|
|
@@ -0,0 +1,52 @@
|
|
|
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 { Resizable } from './modifier/resizable';
|
|
16
|
+
import { Tabbable } from './modifier/tabbable';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Module: @typo3/backend/form-engine/element/json-element
|
|
20
|
+
*
|
|
21
|
+
* Functionality for the json element
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* <typo3-formengine-element-json recordFieldId="some-id">
|
|
25
|
+
* ...
|
|
26
|
+
* </typo3-formengine-element-json>
|
|
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
|
+
class JsonElement extends HTMLElement {
|
|
32
|
+
private element: HTMLTextAreaElement = null;
|
|
33
|
+
|
|
34
|
+
public async connectedCallback(): Promise<void> {
|
|
35
|
+
if (this.element !== null) {
|
|
36
|
+
// Element is already initialized, which means the component has been rendered before. Nothing to do here.
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await DocumentService.ready();
|
|
41
|
+
this.element = document.getElementById((this.getAttribute('recordFieldId') || '' as string)) as HTMLTextAreaElement;
|
|
42
|
+
|
|
43
|
+
if (!this.element) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
Resizable.enable(this.element);
|
|
48
|
+
Tabbable.enable(this.element);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
window.customElements.define('typo3-formengine-element-json', JsonElement);
|
|
@@ -0,0 +1,121 @@
|
|
|
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 { selector } from '@typo3/core/literals';
|
|
15
|
+
|
|
16
|
+
enum Selectors {
|
|
17
|
+
toggleSelector = '.t3js-form-field-link-explanation-toggle',
|
|
18
|
+
inputFieldSelector = '.t3js-form-field-link-input',
|
|
19
|
+
explanationSelector = '.t3js-form-field-link-explanation',
|
|
20
|
+
iconSelector = '.t3js-form-field-link-icon',
|
|
21
|
+
containerSelector = '.t3js-form-field-link',
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Module: @typo3/backend/form-engine/element/link-element
|
|
26
|
+
*
|
|
27
|
+
* Functionality for the link element
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* <typo3-formengine-element-link recordFieldId="some-id">
|
|
31
|
+
* ...
|
|
32
|
+
* </typo3-formengine-element-link>
|
|
33
|
+
*
|
|
34
|
+
* This is based on W3C custom elements ("web components") specification, see
|
|
35
|
+
* https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
|
|
36
|
+
*/
|
|
37
|
+
class LinkElement extends HTMLElement {
|
|
38
|
+
constructor() {
|
|
39
|
+
super();
|
|
40
|
+
|
|
41
|
+
this.addEventListener('click', (e: Event) => this.handleClick(e));
|
|
42
|
+
this.addEventListener('change', (e: Event) => this.handleChange(e));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private get element(): HTMLSelectElement {
|
|
46
|
+
const recordFieldId = this.getAttribute('recordFieldId');
|
|
47
|
+
if (recordFieldId === null) {
|
|
48
|
+
throw new Error('Missing recordFieldId attribute on <typo3-formengine-element-link>');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const element = this.querySelector<HTMLSelectElement>(selector`#${recordFieldId}`);
|
|
52
|
+
if (element === null) {
|
|
53
|
+
throw new Error(`recordFieldId #${recordFieldId} not found in <typo3-formengine-element-link>`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return element;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private get container(): HTMLElement {
|
|
60
|
+
return this.element.closest<HTMLElement>(Selectors.containerSelector);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private get toggleSelector(): HTMLButtonElement {
|
|
64
|
+
return this.container.querySelector<HTMLButtonElement>(Selectors.toggleSelector);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private get explanationField(): HTMLInputElement {
|
|
68
|
+
return this.container.querySelector<HTMLInputElement>(Selectors.explanationSelector);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private get icon(): HTMLSpanElement {
|
|
72
|
+
return this.container.querySelector<HTMLSpanElement>(Selectors.iconSelector);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private handleClick(e: Event): void {
|
|
76
|
+
const initiator = e.target as Element;
|
|
77
|
+
const isToggleButton = initiator.closest(Selectors.toggleSelector) !== null;
|
|
78
|
+
if (isToggleButton) {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
const explanationHidden = this.explanationField.hasAttribute('hidden');
|
|
81
|
+
if (explanationHidden) {
|
|
82
|
+
this.showExplanation();
|
|
83
|
+
} else {
|
|
84
|
+
this.hideExplanation();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private handleChange(e: Event): void {
|
|
90
|
+
const initiator = e.target as Element;
|
|
91
|
+
const isInputField = initiator.closest(Selectors.inputFieldSelector) !== null;
|
|
92
|
+
if (isInputField) {
|
|
93
|
+
const explanationVisible = !this.explanationField.hasAttribute('hidden');
|
|
94
|
+
if (explanationVisible) {
|
|
95
|
+
this.hideExplanation();
|
|
96
|
+
}
|
|
97
|
+
this.disableToggle();
|
|
98
|
+
this.clearIcon();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private showExplanation(): void {
|
|
103
|
+
this.explanationField.removeAttribute('hidden');
|
|
104
|
+
this.element.setAttribute('hidden', '');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private hideExplanation(): void {
|
|
108
|
+
this.explanationField.setAttribute('hidden', '');
|
|
109
|
+
this.element.removeAttribute('hidden');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private disableToggle(): void {
|
|
113
|
+
this.toggleSelector.setAttribute('disabled', '');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private clearIcon(): void {
|
|
117
|
+
this.icon.replaceChildren();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
window.customElements.define('typo3-formengine-element-link', LinkElement);
|
|
@@ -0,0 +1,169 @@
|
|
|
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 DocumentService from '@typo3/core/document-service';
|
|
16
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
17
|
+
import Notification from '@typo3/backend/notification';
|
|
18
|
+
import Modal from '@typo3/backend/modal';
|
|
19
|
+
import { SeverityEnum } from '@typo3/backend/enum/severity';
|
|
20
|
+
import { selector } from '@typo3/core/literals';
|
|
21
|
+
import { sudoModeInterceptor } from '@typo3/backend/security/sudo-mode-interceptor';
|
|
22
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
23
|
+
|
|
24
|
+
interface FieldOptions {
|
|
25
|
+
userId: number,
|
|
26
|
+
tableName: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface Response {
|
|
30
|
+
success: boolean;
|
|
31
|
+
status: Array<Status>;
|
|
32
|
+
remaining: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface Status {
|
|
36
|
+
title: string;
|
|
37
|
+
message: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
enum Selectors {
|
|
41
|
+
deactivteProviderButton = '.t3js-deactivate-provider-button',
|
|
42
|
+
deactivteMfaButton = '.t3js-deactivate-mfa-button',
|
|
43
|
+
providerslist = '.t3js-mfa-active-providers-list',
|
|
44
|
+
mfaStatusLabel = '.t3js-mfa-status-label',
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
class MfaInfoElement {
|
|
48
|
+
private readonly options: FieldOptions = null;
|
|
49
|
+
private fullElement: HTMLElement = null;
|
|
50
|
+
private deactivteProviderButtons: NodeListOf<HTMLButtonElement> = null;
|
|
51
|
+
private deactivteMfaButton: HTMLButtonElement = null;
|
|
52
|
+
private providersList: HTMLUListElement = null;
|
|
53
|
+
private mfaStatusLabel: HTMLSpanElement = null;
|
|
54
|
+
private request: AjaxRequest = null;
|
|
55
|
+
|
|
56
|
+
constructor(selector: string, options: FieldOptions) {
|
|
57
|
+
this.options = options;
|
|
58
|
+
DocumentService.ready().then((document: Document): void => {
|
|
59
|
+
this.fullElement = document.querySelector(selector);
|
|
60
|
+
this.deactivteProviderButtons = this.fullElement.querySelectorAll(Selectors.deactivteProviderButton);
|
|
61
|
+
this.deactivteMfaButton = this.fullElement.querySelector(Selectors.deactivteMfaButton);
|
|
62
|
+
this.providersList = this.fullElement.querySelector(Selectors.providerslist);
|
|
63
|
+
this.mfaStatusLabel = this.fullElement.parentElement.querySelector(Selectors.mfaStatusLabel);
|
|
64
|
+
this.registerEvents();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private registerEvents(): void {
|
|
69
|
+
new RegularEvent('click', (e: Event): void => {
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
this.prepareDeactivateRequest(this.deactivteMfaButton);
|
|
72
|
+
}).bindTo(this.deactivteMfaButton);
|
|
73
|
+
|
|
74
|
+
this.deactivteProviderButtons.forEach((buttonElement: HTMLButtonElement): void => {
|
|
75
|
+
new RegularEvent('click', (e: Event): void => {
|
|
76
|
+
e.preventDefault();
|
|
77
|
+
this.prepareDeactivateRequest(buttonElement);
|
|
78
|
+
}).bindTo(buttonElement);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private prepareDeactivateRequest(button: HTMLButtonElement): void {
|
|
83
|
+
const modal = Modal.show(
|
|
84
|
+
button.dataset.confirmationTitle || button.getAttribute('title') || 'Deactivate provider(s)',
|
|
85
|
+
button.dataset.confirmationContent || 'Are you sure you want to continue? This action cannot be undone and will be applied immediately!',
|
|
86
|
+
SeverityEnum.warning,
|
|
87
|
+
[
|
|
88
|
+
{
|
|
89
|
+
text: button.dataset.confirmationCancelText || 'Cancel',
|
|
90
|
+
active: true,
|
|
91
|
+
btnClass: 'btn-default',
|
|
92
|
+
name: 'cancel'
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
text: button.dataset.confirmationDeactivateText || 'Deactivate',
|
|
96
|
+
btnClass: 'btn-warning',
|
|
97
|
+
name: 'deactivate',
|
|
98
|
+
trigger: (): void => {
|
|
99
|
+
this.sendDeactivateRequest(button.dataset.provider);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
modal.addEventListener('button.clicked', (): void => {
|
|
106
|
+
modal.hideModal();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private sendDeactivateRequest(provider?: string): void {
|
|
111
|
+
if (this.request instanceof AjaxRequest) {
|
|
112
|
+
this.request.abort();
|
|
113
|
+
}
|
|
114
|
+
this.request = (new AjaxRequest(TYPO3.settings.ajaxUrls.mfa)).addMiddleware(sudoModeInterceptor);
|
|
115
|
+
this.request.post({
|
|
116
|
+
action: 'deactivate',
|
|
117
|
+
provider: provider,
|
|
118
|
+
userId: this.options.userId,
|
|
119
|
+
tableName: this.options.tableName
|
|
120
|
+
}).then(async (response: AjaxResponse): Promise<void> => {
|
|
121
|
+
const data: Response = await response.resolve();
|
|
122
|
+
if (data.status.length > 0) {
|
|
123
|
+
data.status.forEach((status: Status): void => {
|
|
124
|
+
if (data.success) {
|
|
125
|
+
Notification.success(status.title, status.message);
|
|
126
|
+
} else {
|
|
127
|
+
Notification.error(status.title, status.message);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
if (!data.success) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (provider === undefined || data.remaining === 0) {
|
|
135
|
+
this.deactivateMfa();
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (this.providersList === null) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const providerEntry: HTMLLIElement = this.providersList.querySelector(selector`li#provider-${provider}`);
|
|
142
|
+
if (providerEntry === null) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
providerEntry.remove();
|
|
146
|
+
const providerEntries: NodeListOf<HTMLLIElement> = this.providersList.querySelectorAll('li');
|
|
147
|
+
if (providerEntries.length === 0){
|
|
148
|
+
this.deactivateMfa();
|
|
149
|
+
}
|
|
150
|
+
}).finally((): void => {
|
|
151
|
+
this.request = null;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private deactivateMfa(): void {
|
|
156
|
+
this.deactivteMfaButton.classList.add('disabled');
|
|
157
|
+
this.deactivteMfaButton.setAttribute('disabled', 'disabled');
|
|
158
|
+
if (this.providersList !== null) {
|
|
159
|
+
this.providersList.remove();
|
|
160
|
+
}
|
|
161
|
+
if (this.mfaStatusLabel !== null) {
|
|
162
|
+
this.mfaStatusLabel.innerText = this.mfaStatusLabel.dataset.alternativeLabel;
|
|
163
|
+
this.mfaStatusLabel.classList.remove('badge-success');
|
|
164
|
+
this.mfaStatusLabel.classList.add('badge-danger');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export default MfaInfoElement;
|
|
@@ -0,0 +1,27 @@
|
|
|
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 autosize from 'autosize';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Convert textarea so they grow when it is typed in.
|
|
18
|
+
*/
|
|
19
|
+
export class Resizable {
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {HTMLTextAreaElement} textarea
|
|
23
|
+
*/
|
|
24
|
+
public static enable(textarea: HTMLTextAreaElement): void {
|
|
25
|
+
autosize(textarea);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Convert textarea to enable tab
|
|
16
|
+
*/
|
|
17
|
+
export class Tabbable {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {HTMLTextAreaElement} textarea
|
|
21
|
+
*/
|
|
22
|
+
public static enable(textarea: HTMLTextAreaElement): void {
|
|
23
|
+
if (textarea.classList.contains('t3js-enable-tab')) {
|
|
24
|
+
import('taboverride').then(({ default: taboverride }): void => {
|
|
25
|
+
taboverride.set(textarea);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { customElement, property } from 'lit/decorators';
|
|
15
|
+
import { LitElement, type TemplateResult, html } from 'lit';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/form-engine/element/online-media-form-element
|
|
19
|
+
*/
|
|
20
|
+
@customElement('typo3-backend-formengine-online-media-form')
|
|
21
|
+
export class OnlineMediaFormElement extends LitElement {
|
|
22
|
+
@property({ type: String }) placeholder: string;
|
|
23
|
+
@property({ type: String, attribute: 'help-text' }) allowedExtensionsHelpText: string;
|
|
24
|
+
@property({ type: String, attribute: 'extensions' }) allowedExtensions: string;
|
|
25
|
+
|
|
26
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
27
|
+
// @todo Switch to Shadow DOM once Bootstrap CSS style can be applied correctly
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected override render(): TemplateResult {
|
|
32
|
+
return html`
|
|
33
|
+
<form @submit="${ this.dispatchSubmitEvent }">
|
|
34
|
+
<div class="form-control-wrap">
|
|
35
|
+
<input type="text" class="form-control" name="online-media-url" placeholder="${this.placeholder}" required>
|
|
36
|
+
<div class="form-text">
|
|
37
|
+
${this.allowedExtensionsHelpText}<br>
|
|
38
|
+
<ul class="badge-list">
|
|
39
|
+
${this.allowedExtensions.split(',').map((ext: string) => html`
|
|
40
|
+
<li><span class="badge badge-success">${ext.trim().toUpperCase()}</span></li>
|
|
41
|
+
`)}
|
|
42
|
+
</ul>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</form>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private dispatchSubmitEvent(e: SubmitEvent): void {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
|
|
52
|
+
const formData = new FormData(e.target as HTMLFormElement);
|
|
53
|
+
const submittedData = Object.fromEntries(formData);
|
|
54
|
+
|
|
55
|
+
this.dispatchEvent(new CustomEvent('typo3:formengine:online-media-added', {
|
|
56
|
+
detail: submittedData
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
declare global {
|
|
62
|
+
interface HTMLElementTagNameMap {
|
|
63
|
+
'typo3-backend-formengine-online-media-form': OnlineMediaFormElement;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
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 { selector } from '@typo3/core/literals';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module: @typo3/backend/form-engine/element/password-element
|
|
19
|
+
*
|
|
20
|
+
* Functionality for the password element
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* <typo3-formengine-element-password recordFieldId="some-id" passwordPolicy="some-policy">
|
|
24
|
+
* ...
|
|
25
|
+
* </typo3-formengine-element-password>
|
|
26
|
+
*
|
|
27
|
+
* This is based on W3C custom elements ("web components") specification, see
|
|
28
|
+
* https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
|
|
29
|
+
*/
|
|
30
|
+
class PasswordElement extends HTMLElement {
|
|
31
|
+
private element: HTMLInputElement = null;
|
|
32
|
+
private passwordPolicyInfo: HTMLElement|null = null;
|
|
33
|
+
private passwordPolicySet: boolean = false;
|
|
34
|
+
|
|
35
|
+
public async connectedCallback(): Promise<void> {
|
|
36
|
+
if (this.element !== null) {
|
|
37
|
+
// Element is already initialized, which means the component has been rendered before. Nothing to do here.
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const recordFieldId = this.getAttribute('recordFieldId');
|
|
42
|
+
if (recordFieldId === null) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
await DocumentService.ready();
|
|
47
|
+
this.element = this.querySelector<HTMLInputElement>(selector`#${recordFieldId}`);
|
|
48
|
+
if (!this.element) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
this.passwordPolicyInfo = this.querySelector<HTMLElement>(selector`#password-policy-info-${this.element.id}`);
|
|
53
|
+
this.passwordPolicySet = (this.getAttribute('passwordPolicy') || '') !== '';
|
|
54
|
+
|
|
55
|
+
this.registerEventHandler();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private registerEventHandler(): void {
|
|
59
|
+
if (this.passwordPolicySet && this.passwordPolicyInfo !== null) {
|
|
60
|
+
this.element.addEventListener('focusin', (): void => {
|
|
61
|
+
this.passwordPolicyInfo.classList.remove('hidden');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
this.element.addEventListener('focusout', (): void => {
|
|
65
|
+
this.passwordPolicyInfo.classList.add('hidden');
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
window.customElements.define('typo3-formengine-element-password', PasswordElement);
|