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,427 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { html, LitElement, type TemplateResult } from 'lit';
|
|
15
|
+
import { customElement, property } from 'lit/decorators';
|
|
16
|
+
import { lll } from '@typo3/core/lit-helper';
|
|
17
|
+
import '@typo3/backend/element/icon-element';
|
|
18
|
+
import Modal from '@typo3/backend/modal';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Module: @typo3/backend/form-engine/element/table-wizard-element
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* <typo3-formengine-table-wizard table="[["quot;a"quot;,"quot;b"quot;],["quot;c"quot;,"quot;d"quot;]]">
|
|
25
|
+
* </typo3-formengine-table-wizard>
|
|
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
|
+
@customElement('typo3-formengine-table-wizard')
|
|
31
|
+
export class TableWizardElement extends LitElement {
|
|
32
|
+
@property({ type: String }) type: string = 'textarea';
|
|
33
|
+
@property({ type: String }) selectorData: string = '';
|
|
34
|
+
@property({ type: String }) delimiter: string = '|';
|
|
35
|
+
@property({ type: String }) enclosure: string = '';
|
|
36
|
+
@property({ type: Number, attribute: 'append-rows' }) appendRows: number = 1;
|
|
37
|
+
|
|
38
|
+
private table: string[][] = [];
|
|
39
|
+
|
|
40
|
+
private get firstRow(): string[] {
|
|
41
|
+
return this.table[0] || [];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public override connectedCallback(): void {
|
|
45
|
+
super.connectedCallback();
|
|
46
|
+
|
|
47
|
+
this.selectorData = this.getAttribute('selector');
|
|
48
|
+
this.delimiter = this.getAttribute('delimiter');
|
|
49
|
+
this.enclosure = this.getAttribute('enclosure') || '';
|
|
50
|
+
this.readTableFromTextarea();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected override createRenderRoot(): HTMLElement | ShadowRoot {
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected override render(): TemplateResult {
|
|
58
|
+
return this.renderTemplate();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private provideMinimalTable(): void {
|
|
62
|
+
if (this.table.length === 0 || this.firstRow.length === 0) {
|
|
63
|
+
// create a table with one row and one column
|
|
64
|
+
this.table = [
|
|
65
|
+
['']
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private readTableFromTextarea(): void {
|
|
71
|
+
// Note: We do not wait for `DocumentService.ready()` here, as the <textarea> is placed as a previous sibling before this element in DOM
|
|
72
|
+
const textarea: HTMLTextAreaElement = document.querySelector(this.selectorData);
|
|
73
|
+
const table: string[][] = [];
|
|
74
|
+
|
|
75
|
+
textarea.value.split('\n').forEach((row: string) => {
|
|
76
|
+
if (row !== '') {
|
|
77
|
+
if(this.enclosure) {
|
|
78
|
+
row = row.replace(new RegExp(this.enclosure, 'g'), '');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const cols = row.split(this.delimiter);
|
|
82
|
+
table.push(cols);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
this.table = table;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private writeTableSyntaxToTextarea(): void {
|
|
90
|
+
const textarea: HTMLTextAreaElement = document.querySelector(this.selectorData);
|
|
91
|
+
let text = '';
|
|
92
|
+
this.table.forEach((row) => {
|
|
93
|
+
const count = row.length;
|
|
94
|
+
text += row.reduce((result, word, index) => {
|
|
95
|
+
// Do not add delimiter at the end of each row
|
|
96
|
+
const delimiter = (count - 1) === index ? '' : this.delimiter;
|
|
97
|
+
// Substitute newlines by `<br>`
|
|
98
|
+
word = word.replace(/\r?\n/g, '<br>');
|
|
99
|
+
// Build enclosed representation of column value
|
|
100
|
+
return result + this.enclosure + word + this.enclosure + delimiter;
|
|
101
|
+
}, '') + '\n';
|
|
102
|
+
});
|
|
103
|
+
textarea.value = text;
|
|
104
|
+
textarea.dispatchEvent(new CustomEvent('change', { bubbles: true }));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private modifyTable(evt: Event, rowIndex: number, colIndex: number): void {
|
|
108
|
+
const target = evt.target as HTMLInputElement | HTMLTextAreaElement;
|
|
109
|
+
this.table[rowIndex][colIndex] = target.value;
|
|
110
|
+
this.writeTableSyntaxToTextarea();
|
|
111
|
+
this.requestUpdate();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private toggleType(): void {
|
|
115
|
+
this.type = this.type === 'input' ? 'textarea' : 'input';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private moveColumn(col: number, target: number): void {
|
|
119
|
+
this.table = this.table.map((row: string[]): string[] => {
|
|
120
|
+
const temp = row.splice(col, 1);
|
|
121
|
+
row.splice(target, 0, ...temp);
|
|
122
|
+
return row;
|
|
123
|
+
});
|
|
124
|
+
this.writeTableSyntaxToTextarea();
|
|
125
|
+
this.requestUpdate();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private appendColumn(evt: Event, col: number): void {
|
|
129
|
+
this.table = this.table.map((row: string[]): string[] => {
|
|
130
|
+
row.splice(col + 1, 0, '');
|
|
131
|
+
return row;
|
|
132
|
+
});
|
|
133
|
+
this.writeTableSyntaxToTextarea();
|
|
134
|
+
this.requestUpdate();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private removeColumn(evt: Event, col: number): void {
|
|
138
|
+
this.table = this.table.map((row: string[]): string[] => {
|
|
139
|
+
row.splice(col, 1);
|
|
140
|
+
return row;
|
|
141
|
+
});
|
|
142
|
+
this.writeTableSyntaxToTextarea();
|
|
143
|
+
this.requestUpdate();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private moveRow(evt: Event, row: number, target: number): void {
|
|
147
|
+
const temp = this.table.splice(row, 1);
|
|
148
|
+
this.table.splice(target, 0, ...temp);
|
|
149
|
+
this.writeTableSyntaxToTextarea();
|
|
150
|
+
this.requestUpdate();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private appendRow(evt: Event, row: number): void {
|
|
154
|
+
const columns = this.firstRow.concat().fill('');
|
|
155
|
+
const rows = (new Array(this.appendRows)).fill(columns);
|
|
156
|
+
this.table.splice(row + 1, 0, ...rows);
|
|
157
|
+
this.writeTableSyntaxToTextarea();
|
|
158
|
+
this.requestUpdate();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private removeRow(evt: Event, row: number): void {
|
|
162
|
+
this.table.splice(row, 1);
|
|
163
|
+
this.writeTableSyntaxToTextarea();
|
|
164
|
+
this.requestUpdate();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private renderTemplate(): TemplateResult {
|
|
168
|
+
this.provideMinimalTable();
|
|
169
|
+
const colIndexes = Object.keys(this.firstRow).map((item: string) => parseInt(item, 10));
|
|
170
|
+
const lastColIndex = colIndexes[colIndexes.length - 1];
|
|
171
|
+
const lastRowIndex = this.table.length - 1;
|
|
172
|
+
|
|
173
|
+
return html`
|
|
174
|
+
<div class="table-fit table-fit-inline-block">
|
|
175
|
+
<table class="table table-center">
|
|
176
|
+
<thead>
|
|
177
|
+
<th>${this.renderTypeButton()}</th>
|
|
178
|
+
${colIndexes.map((colIndex: number) => html`
|
|
179
|
+
<th>${this.renderColButtons(colIndex, lastColIndex)}</th>
|
|
180
|
+
`)}
|
|
181
|
+
</thead>
|
|
182
|
+
<tbody>
|
|
183
|
+
${this.table.map((row: string[], rowIndex: number) => html`
|
|
184
|
+
<tr>
|
|
185
|
+
<td>${this.renderRowButtons(rowIndex, lastRowIndex)}</td>
|
|
186
|
+
${row.map((value: string, colIndex: number) => html`
|
|
187
|
+
<td>${this.renderDataElement(value, rowIndex, colIndex)}</td>
|
|
188
|
+
`)}
|
|
189
|
+
</tr>
|
|
190
|
+
`)}
|
|
191
|
+
</tbody>
|
|
192
|
+
</table>
|
|
193
|
+
</div>
|
|
194
|
+
`;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
private renderDataElement(value: string, rowIndex: number, colIndex: number): TemplateResult {
|
|
198
|
+
const modifyTable = (evt: Event) => this.modifyTable(evt, rowIndex, colIndex);
|
|
199
|
+
switch (this.type) {
|
|
200
|
+
case 'input':
|
|
201
|
+
return html`
|
|
202
|
+
<input class="form-control" type="text" data-row="${rowIndex}" data-col="${colIndex}"
|
|
203
|
+
@change="${modifyTable}" .value="${value.replace(/\n/g, '<br>')}">
|
|
204
|
+
`;
|
|
205
|
+
case 'textarea':
|
|
206
|
+
default:
|
|
207
|
+
return html`
|
|
208
|
+
<textarea class="form-control" rows="6" data-row="${rowIndex}" data-col="${colIndex}"
|
|
209
|
+
@change="${modifyTable}" .value="${value.replace(/<br[ ]*\/?>/g, '\n')}"></textarea>
|
|
210
|
+
`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
private renderTypeButton(): TemplateResult {
|
|
215
|
+
return html`
|
|
216
|
+
<span class="btn-group">
|
|
217
|
+
<button class="btn btn-default" type="button" title="${lll('table_smallFields')}"
|
|
218
|
+
@click="${() => this.toggleType()}">
|
|
219
|
+
<typo3-backend-icon identifier="${this.type === 'input' ? 'actions-chevron-expand' : 'actions-chevron-contract'}" size="small"></typo3-backend-icon>
|
|
220
|
+
</button>
|
|
221
|
+
<button class="btn btn-default" type="button" title="${lll('table_setCount')}"
|
|
222
|
+
@click="${(evt: Event) => this.showTableConfigurationModal(evt)}">
|
|
223
|
+
<typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
|
|
224
|
+
</button>
|
|
225
|
+
<button class="btn btn-default" type="button" title="${lll('table_showCode')}"
|
|
226
|
+
@click="${() => this.showTableSyntax()}">
|
|
227
|
+
<typo3-backend-icon identifier="actions-code" size="small"></typo3-backend-icon>
|
|
228
|
+
</button>
|
|
229
|
+
</span>
|
|
230
|
+
`;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private renderColButtons(col: number, last: number): TemplateResult {
|
|
234
|
+
const leftButton = {
|
|
235
|
+
title: col === 0 ? lll('table_end') : lll('table_left'),
|
|
236
|
+
class: col === 0 ? 'bar-right' : 'left',
|
|
237
|
+
target: col === 0 ? last : col - 1,
|
|
238
|
+
};
|
|
239
|
+
const rightButton = {
|
|
240
|
+
title: col === last ? lll('table_start') : lll('table_right'),
|
|
241
|
+
class: col === last ? 'bar-left' : 'right',
|
|
242
|
+
target: col === last ? 0 : col + 1,
|
|
243
|
+
};
|
|
244
|
+
return html`
|
|
245
|
+
<span class="btn-group">
|
|
246
|
+
<button class="btn btn-default" type="button" title="${leftButton.title}"
|
|
247
|
+
@click="${() => this.moveColumn(col, leftButton.target)}">
|
|
248
|
+
<typo3-backend-icon identifier="actions-chevron-${leftButton.class}" size="small"></typo3-backend-icon>
|
|
249
|
+
</button>
|
|
250
|
+
<button class="btn btn-default" type="button" title="${rightButton.title}"
|
|
251
|
+
@click="${() => this.moveColumn(col, rightButton.target)}">
|
|
252
|
+
<typo3-backend-icon identifier="actions-chevron-${rightButton.class}" size="small"></typo3-backend-icon>
|
|
253
|
+
</button>
|
|
254
|
+
<button class="btn btn-default" type="button" title="${lll('table_removeColumn')}"
|
|
255
|
+
@click="${(evt: Event) => this.removeColumn(evt, col)}">
|
|
256
|
+
<typo3-backend-icon identifier="actions-delete" size="small"></typo3-backend-icon>
|
|
257
|
+
</button>
|
|
258
|
+
<button class="btn btn-default" type="button" title="${lll('table_addColumn')}"
|
|
259
|
+
@click="${(evt: Event) => this.appendColumn(evt, col)}">
|
|
260
|
+
<typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
|
|
261
|
+
</button>
|
|
262
|
+
</span>
|
|
263
|
+
`;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private renderRowButtons(row: number, last: number): TemplateResult {
|
|
267
|
+
const topButton = {
|
|
268
|
+
title: row === 0 ? lll('table_bottom') : lll('table_up'),
|
|
269
|
+
class: row === 0 ? 'bar-down' : 'up',
|
|
270
|
+
target: row === 0 ? last : row - 1,
|
|
271
|
+
};
|
|
272
|
+
const bottomButton = {
|
|
273
|
+
title: row === last ? lll('table_top') : lll('table_down'),
|
|
274
|
+
class: row === last ? 'bar-up' : 'down',
|
|
275
|
+
target: row === last ? 0 : row + 1,
|
|
276
|
+
};
|
|
277
|
+
return html`
|
|
278
|
+
<span class="btn-group${this.type === 'input' ? '' : '-vertical'}">
|
|
279
|
+
<button class="btn btn-default" type="button" title="${topButton.title}"
|
|
280
|
+
@click="${(evt: Event) => this.moveRow(evt, row, topButton.target)}">
|
|
281
|
+
<typo3-backend-icon identifier="actions-chevron-${topButton.class}" size="small"></typo3-backend-icon>
|
|
282
|
+
</button>
|
|
283
|
+
<button class="btn btn-default" type="button" title="${bottomButton.title}"
|
|
284
|
+
@click="${(evt: Event) => this.moveRow(evt, row, bottomButton.target)}">
|
|
285
|
+
<typo3-backend-icon identifier="actions-chevron-${bottomButton.class}" size="small"></typo3-backend-icon>
|
|
286
|
+
</button>
|
|
287
|
+
<button class="btn btn-default" type="button" title="${lll('table_removeRow')}"
|
|
288
|
+
@click="${(evt: Event) => this.removeRow(evt, row)}">
|
|
289
|
+
<typo3-backend-icon identifier="actions-delete" size="small"></typo3-backend-icon>
|
|
290
|
+
</button>
|
|
291
|
+
<button class="btn btn-default" type="button" title="${lll('table_addRow')}"
|
|
292
|
+
@click="${(evt: Event) => this.appendRow(evt, row)}">
|
|
293
|
+
<typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
|
|
294
|
+
</button>
|
|
295
|
+
</span>
|
|
296
|
+
`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
private showTableConfigurationModal(evt: Event): void {
|
|
300
|
+
const lastColIndex: number = this.firstRow.length;
|
|
301
|
+
const lastRowIndex: number = this.table.length;
|
|
302
|
+
const initRowValue: number = lastRowIndex || 1;
|
|
303
|
+
const initTableValue: number = lastColIndex || 1;
|
|
304
|
+
|
|
305
|
+
const modal = Modal.advanced({
|
|
306
|
+
content: html`
|
|
307
|
+
<div class="form-group">
|
|
308
|
+
<label for="t3js-expand-rows" class="form-label">${lll('table_rowCount')}</label>
|
|
309
|
+
<input id="t3js-expand-rows" class="form-control" type="number" min="1" required value="${initRowValue}">
|
|
310
|
+
</div>
|
|
311
|
+
<div class="form-group">
|
|
312
|
+
<label for="t3js-expand-cols" class="form-label">${lll('table_colCount')}</label>
|
|
313
|
+
<input id="t3js-expand-cols" class="form-control" type="number" min="1" required value="${initTableValue}">
|
|
314
|
+
</div>
|
|
315
|
+
`,
|
|
316
|
+
title: lll('table_setCountHeadline'),
|
|
317
|
+
size: Modal.sizes.small,
|
|
318
|
+
buttons: [
|
|
319
|
+
{
|
|
320
|
+
text: lll('labels.cancel') || 'Cancel',
|
|
321
|
+
btnClass: 'btn-default',
|
|
322
|
+
name: 'cancel',
|
|
323
|
+
trigger: (): void => modal.hideModal(),
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
text: lll('table_buttonUpdate') || 'Update',
|
|
327
|
+
active: true,
|
|
328
|
+
btnClass: 'btn-primary',
|
|
329
|
+
name: 'apply',
|
|
330
|
+
trigger: (): void => {
|
|
331
|
+
const rows: HTMLInputElement = modal.querySelector('#t3js-expand-rows');
|
|
332
|
+
const cols: HTMLInputElement = modal.querySelector('#t3js-expand-cols');
|
|
333
|
+
|
|
334
|
+
if (rows === null || cols === null) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (rows.checkValidity() && cols.checkValidity()) {
|
|
339
|
+
const modifyRows: number = Number(rows.value) - lastRowIndex;
|
|
340
|
+
const modifyCols: number = Number(cols.value) - lastColIndex;
|
|
341
|
+
this.setColAndRowCount(evt, modifyCols, modifyRows);
|
|
342
|
+
modal.hideModal();
|
|
343
|
+
} else {
|
|
344
|
+
rows.reportValidity();
|
|
345
|
+
cols.reportValidity();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
]
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
private showTableSyntax(): void {
|
|
354
|
+
const textarea: HTMLTextAreaElement = document.querySelector(this.selectorData);
|
|
355
|
+
const modal = Modal.advanced({
|
|
356
|
+
content: html`
|
|
357
|
+
<div class="form-group">
|
|
358
|
+
<label for="table-wizard-textarea-raw" class="form-label">${lll('table_showCodeLabel')}</label>
|
|
359
|
+
<textarea id="table-wizard-textarea-raw" rows="8" class="form-control">${textarea.value}</textarea>
|
|
360
|
+
</div>
|
|
361
|
+
`,
|
|
362
|
+
title: lll('table_showCodeHeadline'),
|
|
363
|
+
size: Modal.sizes.small,
|
|
364
|
+
buttons: [
|
|
365
|
+
{
|
|
366
|
+
text: lll('labels.cancel') || 'Cancel',
|
|
367
|
+
btnClass: 'btn-default',
|
|
368
|
+
name: 'cancel',
|
|
369
|
+
trigger: (): void => modal.hideModal(),
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
text: lll('table_buttonUpdate') || 'Update',
|
|
373
|
+
active: true,
|
|
374
|
+
btnClass: 'btn-primary',
|
|
375
|
+
name: 'apply',
|
|
376
|
+
trigger: (): void => {
|
|
377
|
+
// Apply table changes
|
|
378
|
+
textarea.value = modal.querySelector('textarea').value;
|
|
379
|
+
textarea.dispatchEvent(new CustomEvent('change', { bubbles: true }));
|
|
380
|
+
this.readTableFromTextarea();
|
|
381
|
+
this.requestUpdate();
|
|
382
|
+
|
|
383
|
+
modal.hideModal();
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
]
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Allow user to set a specific row/col count
|
|
392
|
+
*
|
|
393
|
+
* @param evt
|
|
394
|
+
* @param colCount
|
|
395
|
+
* @param rowCount
|
|
396
|
+
* @private
|
|
397
|
+
*/
|
|
398
|
+
private setColAndRowCount(evt: Event, colCount: number, rowCount: number) {
|
|
399
|
+
const lastRowIndex: number = this.table.length;
|
|
400
|
+
|
|
401
|
+
if (rowCount > 0) {
|
|
402
|
+
for (let count = 0; count < rowCount; count++) {
|
|
403
|
+
this.appendRow(evt, lastRowIndex);
|
|
404
|
+
}
|
|
405
|
+
} else {
|
|
406
|
+
for (let count = 0; count < Math.abs(rowCount); count++) {
|
|
407
|
+
this.removeRow(evt, this.table.length - 1);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (colCount > 0) {
|
|
412
|
+
for (let count = 0; count < colCount; count++) {
|
|
413
|
+
this.appendColumn(evt, colCount);
|
|
414
|
+
}
|
|
415
|
+
} else {
|
|
416
|
+
for (let count = 0; count < Math.abs(colCount); count++) {
|
|
417
|
+
this.removeColumn(evt, this.firstRow.length - 1);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
declare global {
|
|
424
|
+
interface HTMLElementTagNameMap {
|
|
425
|
+
'typo3-formengine-table-wizard': TableWizardElement;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
@@ -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/text-element
|
|
20
|
+
*
|
|
21
|
+
* Functionality for the text element
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* <typo3-formengine-element-text recordFieldId="some-id">
|
|
25
|
+
* ...
|
|
26
|
+
* </typo3-formengine-element-text>
|
|
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 TextElement 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-text', TextElement);
|
|
@@ -0,0 +1,31 @@
|
|
|
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 { Resizable } from './modifier/resizable';
|
|
15
|
+
import { Tabbable } from './modifier/tabbable';
|
|
16
|
+
import DocumentService from '@typo3/core/document-service';
|
|
17
|
+
|
|
18
|
+
class TextTableElement {
|
|
19
|
+
private element: HTMLTextAreaElement = null;
|
|
20
|
+
|
|
21
|
+
constructor(elementId: string) {
|
|
22
|
+
DocumentService.ready().then((): void => {
|
|
23
|
+
this.element = <HTMLTextAreaElement>document.getElementById(elementId);
|
|
24
|
+
|
|
25
|
+
Resizable.enable(this.element);
|
|
26
|
+
Tabbable.enable(this.element);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default TextTableElement;
|
|
@@ -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
|
+
* Handles the "Add record" field control that renders a new FormEngine instance
|
|
19
|
+
*/
|
|
20
|
+
class AddRecord {
|
|
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 AddRecord;
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
* Handles the "Edit popup" field control that renders a new FormEngine instance
|
|
18
|
+
*/
|
|
19
|
+
class EditPopup {
|
|
20
|
+
private controlElement: HTMLAnchorElement = null;
|
|
21
|
+
private assignedFormField: HTMLSelectElement = null;
|
|
22
|
+
|
|
23
|
+
constructor(controlElementId: string) {
|
|
24
|
+
DocumentService.ready().then((): void => {
|
|
25
|
+
this.controlElement = <HTMLAnchorElement>document.querySelector(controlElementId);
|
|
26
|
+
this.assignedFormField = <HTMLSelectElement>document.querySelector(
|
|
27
|
+
'select[data-formengine-input-name="' + this.controlElement.dataset.element + '"]',
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
if (this.assignedFormField.options.selectedIndex === -1) {
|
|
31
|
+
this.controlElement.classList.add('disabled');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
this.assignedFormField.addEventListener('change', this.registerChangeHandler);
|
|
35
|
+
this.controlElement.addEventListener('click', this.registerClickHandler);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private readonly registerChangeHandler = (): void => {
|
|
40
|
+
this.controlElement.classList.toggle('disabled', this.assignedFormField.options.selectedIndex === -1);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {Event} e
|
|
45
|
+
*/
|
|
46
|
+
private readonly registerClickHandler = (e: Event): void => {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
|
|
49
|
+
const values: Array<string> = [];
|
|
50
|
+
for (let i = 0; i < this.assignedFormField.selectedOptions.length; ++i) {
|
|
51
|
+
const option = this.assignedFormField.selectedOptions.item(i);
|
|
52
|
+
values.push(option.value);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const url = this.controlElement.getAttribute('href')
|
|
56
|
+
+ '&P[currentValue]=' + encodeURIComponent(this.assignedFormField.value)
|
|
57
|
+
+ '&P[currentSelectedValues]=' + values.join(',')
|
|
58
|
+
;
|
|
59
|
+
const popupWindow = window.open(url, '', this.controlElement.dataset.windowParameters);
|
|
60
|
+
popupWindow.focus();
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default EditPopup;
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
interface ClipboardItem {
|
|
18
|
+
title: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Handles the "Insert clipboard" field control that pastes the clipboard into a "group" field
|
|
24
|
+
*/
|
|
25
|
+
class InsertClipboard {
|
|
26
|
+
private controlElement: HTMLElement = null;
|
|
27
|
+
|
|
28
|
+
constructor(controlElementId: string) {
|
|
29
|
+
DocumentService.ready().then((): void => {
|
|
30
|
+
this.controlElement = <HTMLElement>document.querySelector(controlElementId);
|
|
31
|
+
this.controlElement.addEventListener('click', this.registerClickHandler);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {Event} e
|
|
37
|
+
*/
|
|
38
|
+
private readonly registerClickHandler = (e: Event): void => {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
|
|
41
|
+
const assignedElement: string = this.controlElement.dataset.element;
|
|
42
|
+
const clipboardItems: Array<ClipboardItem> = JSON.parse(this.controlElement.dataset.clipboardItems);
|
|
43
|
+
|
|
44
|
+
for (const item of clipboardItems) {
|
|
45
|
+
FormEngine.setSelectOptionFromExternalSource(assignedElement, item.value, item.title, item.title);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export default InsertClipboard;
|