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,55 @@
|
|
|
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 { css, html, LitElement, nothing, type TemplateResult } from 'lit';
|
|
15
|
+
import { customElement, property } from 'lit/decorators';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Module @typo3/extensionmanager/distribution-image
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* <typo3-extensionmanager-distribution-image image="some/image.jpg" fallback="/some/fallback/image.jpg"/>
|
|
22
|
+
*/
|
|
23
|
+
@customElement('typo3-extensionmanager-distribution-image')
|
|
24
|
+
export class DistributionImage extends LitElement {
|
|
25
|
+
static override styles = css`
|
|
26
|
+
img {
|
|
27
|
+
display: block;
|
|
28
|
+
width: 100%;
|
|
29
|
+
height: auto;
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
@property({ type: String }) alt: string;
|
|
34
|
+
@property({ type: String }) image: string;
|
|
35
|
+
@property({ type: String }) welcomeImage: string;
|
|
36
|
+
@property({ type: String }) fallback: string;
|
|
37
|
+
|
|
38
|
+
protected override render(): TemplateResult|symbol {
|
|
39
|
+
if (!this.image && !this.fallback) {
|
|
40
|
+
return nothing;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const imageToUse = this.welcomeImage || this.image || this.fallback;
|
|
44
|
+
return html`<img alt="${this.alt}" src="${imageToUse}" @error="${imageToUse !== this.fallback ? this.onError : nothing}">`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private onError(e: Event): void {
|
|
48
|
+
const imageElement = e.target as HTMLImageElement;
|
|
49
|
+
if (this.image.length && imageElement.getAttribute('src') === this.welcomeImage) {
|
|
50
|
+
imageElement.setAttribute('src', this.image);
|
|
51
|
+
} else if (this.fallback.length) {
|
|
52
|
+
imageElement.setAttribute('src', this.fallback);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
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 BrowserSession from '@typo3/backend/storage/browser-session';
|
|
16
|
+
import NProgress from 'nprogress';
|
|
17
|
+
import { default as Modal, type ModalElement } from '@typo3/backend/modal';
|
|
18
|
+
import Severity from '@typo3/backend/severity';
|
|
19
|
+
import SecurityUtility from '@typo3/core/security-utility';
|
|
20
|
+
import ExtensionManagerRepository from './repository';
|
|
21
|
+
import ExtensionManagerUpdate from './update';
|
|
22
|
+
import ExtensionManagerUploadForm from './upload-form';
|
|
23
|
+
import '@typo3/backend/input/clearable';
|
|
24
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
25
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
26
|
+
import DebounceEvent from '@typo3/core/event/debounce-event';
|
|
27
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
28
|
+
import SortableTable from '@typo3/backend/sortable-table';
|
|
29
|
+
|
|
30
|
+
const securityUtility = new SecurityUtility();
|
|
31
|
+
|
|
32
|
+
enum ExtensionManagerIdentifier {
|
|
33
|
+
extensionlist = 'typo3-extension-list',
|
|
34
|
+
searchField = '#Tx_Extensionmanager_extensionkey',
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface UpdateInformation {
|
|
38
|
+
updateComments: Record<string, string>,
|
|
39
|
+
url: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Module: @typo3/extensionmanager/main
|
|
44
|
+
* main logic holding everything together, consists of multiple parts
|
|
45
|
+
* ExtensionManager => Various functions for displaying the extension list / sorting
|
|
46
|
+
* Repository => Various AJAX functions for TER downloads
|
|
47
|
+
* ExtensionManager.Update => Various AJAX functions to display updates
|
|
48
|
+
* ExtensionManager.uploadForm => helper to show the upload form
|
|
49
|
+
*/
|
|
50
|
+
class ExtensionManager {
|
|
51
|
+
public Update: ExtensionManagerUpdate;
|
|
52
|
+
public UploadForm: ExtensionManagerUploadForm;
|
|
53
|
+
public Repository: ExtensionManagerRepository;
|
|
54
|
+
private readonly searchFilterSessionKey: string = 'tx-extensionmanager-local-filter';
|
|
55
|
+
|
|
56
|
+
constructor() {
|
|
57
|
+
DocumentService.ready().then((): void => {
|
|
58
|
+
this.Update = new ExtensionManagerUpdate();
|
|
59
|
+
this.UploadForm = new ExtensionManagerUploadForm();
|
|
60
|
+
this.Repository = new ExtensionManagerRepository();
|
|
61
|
+
|
|
62
|
+
const extensionList = document.getElementById(ExtensionManagerIdentifier.extensionlist);
|
|
63
|
+
if (extensionList !== null) {
|
|
64
|
+
|
|
65
|
+
if (extensionList instanceof HTMLTableElement) {
|
|
66
|
+
new SortableTable(extensionList);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
new RegularEvent('click', (e: Event, target: HTMLAnchorElement): void => {
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
|
|
72
|
+
Modal.confirm(
|
|
73
|
+
TYPO3.lang['extensionList.removalConfirmation.title'],
|
|
74
|
+
TYPO3.lang['extensionList.removalConfirmation.question'],
|
|
75
|
+
Severity.error,
|
|
76
|
+
[
|
|
77
|
+
{
|
|
78
|
+
text: TYPO3.lang['button.cancel'],
|
|
79
|
+
active: true,
|
|
80
|
+
btnClass: 'btn-default',
|
|
81
|
+
trigger: (): void => {
|
|
82
|
+
Modal.dismiss();
|
|
83
|
+
},
|
|
84
|
+
}, {
|
|
85
|
+
text: TYPO3.lang['button.remove'],
|
|
86
|
+
btnClass: 'btn-danger',
|
|
87
|
+
trigger: (): void => {
|
|
88
|
+
this.removeExtensionFromDisk(target);
|
|
89
|
+
Modal.dismiss();
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
);
|
|
94
|
+
}).delegateTo(extensionList, '.removeExtension');
|
|
95
|
+
|
|
96
|
+
new RegularEvent('click', (e: Event, target: HTMLAnchorElement): void => {
|
|
97
|
+
e.preventDefault();
|
|
98
|
+
|
|
99
|
+
Modal.confirm(
|
|
100
|
+
TYPO3.lang['extensionList.databaseReload.title'],
|
|
101
|
+
TYPO3.lang['extensionList.databaseReload.message'],
|
|
102
|
+
Severity.warning,
|
|
103
|
+
[
|
|
104
|
+
{
|
|
105
|
+
text: TYPO3.lang['button.cancel'],
|
|
106
|
+
active: true,
|
|
107
|
+
btnClass: 'btn-default',
|
|
108
|
+
trigger: (): void => {
|
|
109
|
+
Modal.dismiss();
|
|
110
|
+
},
|
|
111
|
+
}, {
|
|
112
|
+
text: TYPO3.lang['button.reimport'],
|
|
113
|
+
btnClass: 'btn-warning',
|
|
114
|
+
trigger: (): void => {
|
|
115
|
+
NProgress.start();
|
|
116
|
+
new AjaxRequest(target.href).post({}).then((): void => {
|
|
117
|
+
location.reload();
|
|
118
|
+
}).finally((): void => {
|
|
119
|
+
NProgress.done();
|
|
120
|
+
Modal.dismiss();
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
);
|
|
126
|
+
}).delegateTo(extensionList, '.reloadSqlData');
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
new RegularEvent('click', (): void => {
|
|
131
|
+
NProgress.start();
|
|
132
|
+
}).delegateTo(document, '.onClickMaskExtensionManager');
|
|
133
|
+
|
|
134
|
+
new RegularEvent('click', (e: Event, target: HTMLAnchorElement): void => {
|
|
135
|
+
e.preventDefault();
|
|
136
|
+
|
|
137
|
+
NProgress.start();
|
|
138
|
+
new AjaxRequest(target.href).get().then(this.updateExtension);
|
|
139
|
+
}).delegateTo(document, 'a[data-action=update-extension]');
|
|
140
|
+
|
|
141
|
+
new RegularEvent('change', (e: Event, target: HTMLInputElement): void => {
|
|
142
|
+
const actionButton = document.querySelector('.t3js-dependencies');
|
|
143
|
+
|
|
144
|
+
if (target.checked) {
|
|
145
|
+
actionButton.classList.remove('disabled');
|
|
146
|
+
} else {
|
|
147
|
+
actionButton.classList.add('disabled');
|
|
148
|
+
}
|
|
149
|
+
}).delegateTo(document, 'input[name=unlockDependencyIgnoreButton]');
|
|
150
|
+
|
|
151
|
+
new RegularEvent('click', (): void => {
|
|
152
|
+
NProgress.start();
|
|
153
|
+
}).delegateTo(document, '.t3-button-action-installdistribution');
|
|
154
|
+
|
|
155
|
+
let searchField: HTMLInputElement;
|
|
156
|
+
if ((searchField = document.querySelector(ExtensionManagerIdentifier.searchField)) !== null) {
|
|
157
|
+
const activeSearchFilter = BrowserSession.get(this.searchFilterSessionKey);
|
|
158
|
+
if (activeSearchFilter !== null) {
|
|
159
|
+
searchField.value = activeSearchFilter;
|
|
160
|
+
this.filterExtensions(activeSearchFilter);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
new RegularEvent('submit', (e: Event): void => {
|
|
164
|
+
e.preventDefault();
|
|
165
|
+
}).bindTo(searchField.closest('form'));
|
|
166
|
+
|
|
167
|
+
new DebounceEvent('input', (e: KeyboardEvent): void => {
|
|
168
|
+
const target = e.target as HTMLInputElement;
|
|
169
|
+
BrowserSession.set(this.searchFilterSessionKey, target.value);
|
|
170
|
+
this.filterExtensions(target.value);
|
|
171
|
+
}, 100).bindTo(searchField);
|
|
172
|
+
searchField.clearable({
|
|
173
|
+
onClear: (): void => {
|
|
174
|
+
BrowserSession.unset(this.searchFilterSessionKey);
|
|
175
|
+
this.filterExtensions('');
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this.Repository.initDom();
|
|
181
|
+
this.Update.initializeEvents();
|
|
182
|
+
this.UploadForm.initializeEvents();
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private filterExtensions(searchText: string): void {
|
|
187
|
+
const filterableColumns = document.querySelectorAll('[data-filterable]');
|
|
188
|
+
const columnIndices: number[] = [];
|
|
189
|
+
filterableColumns.forEach((element: HTMLTableRowElement): void => {
|
|
190
|
+
const children = Array.from(element.parentElement.children);
|
|
191
|
+
columnIndices.push(children.indexOf(element));
|
|
192
|
+
});
|
|
193
|
+
const rows = document.querySelectorAll('#typo3-extension-list tbody tr');
|
|
194
|
+
rows.forEach((row: HTMLTableRowElement): void => {
|
|
195
|
+
const columns = columnIndices.map((index: number) => row.children.item(index));
|
|
196
|
+
const values: string[] = [];
|
|
197
|
+
columns.forEach((column: HTMLTableCellElement): void => {
|
|
198
|
+
values.push(column.textContent.trim().replace(/\s+/g, ' '));
|
|
199
|
+
});
|
|
200
|
+
row.classList.toggle('hidden', searchText !== '' && !RegExp(searchText, 'i').test(values.join(':')));
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private removeExtensionFromDisk(trigger: HTMLAnchorElement): void {
|
|
205
|
+
NProgress.start();
|
|
206
|
+
new AjaxRequest(trigger.href).post({}).then((): void => {
|
|
207
|
+
location.reload();
|
|
208
|
+
}).finally((): void => {
|
|
209
|
+
NProgress.done();
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private async updateExtension(response: AjaxResponse): Promise<void> {
|
|
214
|
+
let i = 0;
|
|
215
|
+
const data: UpdateInformation = await response.resolve();
|
|
216
|
+
const form = document.createElement('form');
|
|
217
|
+
for (const [version, comment] of Object.entries(data.updateComments)) {
|
|
218
|
+
const versionInput = document.createElement('input');
|
|
219
|
+
versionInput.setAttribute('type', 'radio');
|
|
220
|
+
versionInput.setAttribute('name', 'version');
|
|
221
|
+
versionInput.value = version;
|
|
222
|
+
if (i === 0) {
|
|
223
|
+
versionInput.setAttribute('checked', 'checked');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const versionHeader = document.createElement('h3');
|
|
227
|
+
versionHeader.innerHTML = securityUtility.encodeHtml(version);
|
|
228
|
+
versionHeader.prepend(versionInput);
|
|
229
|
+
|
|
230
|
+
const commentDiv = document.createElement('div');
|
|
231
|
+
commentDiv.innerHTML = comment
|
|
232
|
+
.replace(/(\r\n|\n\r|\r|\n)/g, '\n')
|
|
233
|
+
.split(/\n/).map((line: string): string => {
|
|
234
|
+
return securityUtility.encodeHtml(line);
|
|
235
|
+
})
|
|
236
|
+
.join('<br>');
|
|
237
|
+
|
|
238
|
+
form.append(versionHeader, commentDiv);
|
|
239
|
+
i++;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const updateConfirmationTitle = document.createElement('h1');
|
|
243
|
+
updateConfirmationTitle.textContent = TYPO3.lang['extensionList.updateConfirmation.title'];
|
|
244
|
+
|
|
245
|
+
const updateConfirmationMessage = document.createElement('h2');
|
|
246
|
+
updateConfirmationMessage.textContent = TYPO3.lang['extensionList.updateConfirmation.message'];
|
|
247
|
+
|
|
248
|
+
const container = document.createElement('div');
|
|
249
|
+
container.append(
|
|
250
|
+
updateConfirmationTitle,
|
|
251
|
+
updateConfirmationMessage,
|
|
252
|
+
form,
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
NProgress.done();
|
|
256
|
+
|
|
257
|
+
Modal.confirm(
|
|
258
|
+
TYPO3.lang['extensionList.updateConfirmation.questionVersionComments'],
|
|
259
|
+
container,
|
|
260
|
+
Severity.warning,
|
|
261
|
+
[
|
|
262
|
+
{
|
|
263
|
+
text: TYPO3.lang['button.cancel'],
|
|
264
|
+
active: true,
|
|
265
|
+
btnClass: 'btn-default',
|
|
266
|
+
trigger: (e: Event, modal: ModalElement): void => modal.hideModal(),
|
|
267
|
+
}, {
|
|
268
|
+
text: TYPO3.lang['button.updateExtension'],
|
|
269
|
+
btnClass: 'btn-warning',
|
|
270
|
+
trigger: (e: Event, modal: ModalElement): void => {
|
|
271
|
+
NProgress.start();
|
|
272
|
+
new AjaxRequest(data.url).post({
|
|
273
|
+
version: (modal.querySelector('input[name="version"]:checked') as HTMLInputElement)?.value,
|
|
274
|
+
}).finally((): void => {
|
|
275
|
+
location.reload();
|
|
276
|
+
});
|
|
277
|
+
modal.hideModal();
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const extensionManagerObject = new ExtensionManager();
|
|
286
|
+
|
|
287
|
+
if (typeof TYPO3.ExtensionManager === 'undefined') {
|
|
288
|
+
TYPO3.ExtensionManager = extensionManagerObject;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export default extensionManagerObject;
|
|
@@ -0,0 +1,195 @@
|
|
|
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 NProgress from 'nprogress';
|
|
15
|
+
import Modal from '@typo3/backend/modal';
|
|
16
|
+
import Notification from '@typo3/backend/notification';
|
|
17
|
+
import Severity from '@typo3/backend/severity';
|
|
18
|
+
import SortableTable from '@typo3/backend/sortable-table';
|
|
19
|
+
import '@typo3/backend/input/clearable';
|
|
20
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
21
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
22
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
23
|
+
|
|
24
|
+
interface ResultItems {
|
|
25
|
+
[key: string]: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface ExtensionInstallResult {
|
|
29
|
+
errorCount: number,
|
|
30
|
+
errorMessage: string,
|
|
31
|
+
errorTitle: string,
|
|
32
|
+
extension: string,
|
|
33
|
+
installationTypeLanguageKey: string,
|
|
34
|
+
result: false | {dependencies?: ResultItems, installed?: ResultItems, updated?: ResultItems },
|
|
35
|
+
skipDependencyUri: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
class Repository {
|
|
39
|
+
public initDom(): void {
|
|
40
|
+
NProgress.configure({ parent: '.module-loading-indicator', showSpinner: false });
|
|
41
|
+
|
|
42
|
+
const terVersionTable = document.getElementById('terVersionTable');
|
|
43
|
+
const terSearchTable = document.getElementById('terSearchTable');
|
|
44
|
+
|
|
45
|
+
if (terVersionTable instanceof HTMLTableElement) {
|
|
46
|
+
new SortableTable(terVersionTable);
|
|
47
|
+
}
|
|
48
|
+
if (terSearchTable instanceof HTMLTableElement) {
|
|
49
|
+
new SortableTable(terSearchTable);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
this.bindDownload();
|
|
53
|
+
this.bindSearchFieldResetter();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private bindDownload(): void {
|
|
57
|
+
new RegularEvent('click', (e: Event, target: HTMLInputElement): void => {
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
|
|
60
|
+
const form = target.closest('form');
|
|
61
|
+
const url = form.dataset.href;
|
|
62
|
+
NProgress.start();
|
|
63
|
+
new AjaxRequest(url).get().then(this.getDependencies);
|
|
64
|
+
}).delegateTo(document, '.downloadFromTer form.download button[type=submit]');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private readonly getDependencies = async(response: AjaxResponse): Promise<void> => {
|
|
68
|
+
const data = await response.resolve();
|
|
69
|
+
const messageElement = document.createElement('div');
|
|
70
|
+
messageElement.innerHTML = data.message;
|
|
71
|
+
|
|
72
|
+
NProgress.done();
|
|
73
|
+
if (data.hasDependencies) {
|
|
74
|
+
Modal.confirm(data.title, messageElement, Severity.info, [
|
|
75
|
+
{
|
|
76
|
+
text: TYPO3.lang['button.cancel'],
|
|
77
|
+
active: true,
|
|
78
|
+
btnClass: 'btn-default',
|
|
79
|
+
trigger: (): void => {
|
|
80
|
+
Modal.dismiss();
|
|
81
|
+
},
|
|
82
|
+
}, {
|
|
83
|
+
text: TYPO3.lang['button.resolveDependencies'],
|
|
84
|
+
btnClass: 'btn-primary',
|
|
85
|
+
trigger: (): void => {
|
|
86
|
+
this.getResolveDependenciesAndInstallResult(data.url);
|
|
87
|
+
Modal.dismiss();
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
} else {
|
|
92
|
+
if (data.hasErrors) {
|
|
93
|
+
Notification.error(data.title, data.message, 15);
|
|
94
|
+
} else {
|
|
95
|
+
this.getResolveDependenciesAndInstallResult(data.url);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
private getResolveDependenciesAndInstallResult(url: string): void {
|
|
101
|
+
NProgress.start();
|
|
102
|
+
new AjaxRequest(url).post({}).then(async (response: AjaxResponse): Promise<void> => {
|
|
103
|
+
try {
|
|
104
|
+
// FIXME: As of now, the endpoint doesn't set proper headers, thus we have to parse the response text
|
|
105
|
+
// https://review.typo3.org/c/Packages/TYPO3.CMS/+/63438
|
|
106
|
+
const data: ExtensionInstallResult = await response.raw().json();
|
|
107
|
+
const errorMessageElement = document.createElement('div');
|
|
108
|
+
errorMessageElement.innerHTML = data.errorMessage;
|
|
109
|
+
|
|
110
|
+
if (data.errorCount > 0) {
|
|
111
|
+
const modal = Modal.confirm(data.errorTitle, errorMessageElement, Severity.error, [
|
|
112
|
+
{
|
|
113
|
+
text: TYPO3.lang['button.cancel'],
|
|
114
|
+
active: true,
|
|
115
|
+
btnClass: 'btn-default',
|
|
116
|
+
trigger: (): void => {
|
|
117
|
+
Modal.dismiss();
|
|
118
|
+
},
|
|
119
|
+
}, {
|
|
120
|
+
text: TYPO3.lang['button.resolveDependenciesIgnore'],
|
|
121
|
+
btnClass: 'btn-danger disabled t3js-dependencies',
|
|
122
|
+
trigger: (e: Event): void => {
|
|
123
|
+
if (!(e.currentTarget as HTMLElement).classList.contains('disabled')) {
|
|
124
|
+
this.getResolveDependenciesAndInstallResult(data.skipDependencyUri);
|
|
125
|
+
Modal.dismiss();
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
]);
|
|
130
|
+
modal.addEventListener('typo3-modal-shown', (): void => {
|
|
131
|
+
const actionButton = modal.querySelector('.t3js-dependencies');
|
|
132
|
+
modal.querySelector('input[name="unlockDependencyIgnoreButton"]').addEventListener('change', (e: Event): void => {
|
|
133
|
+
if ((e.currentTarget as HTMLInputElement).checked) {
|
|
134
|
+
actionButton?.classList.remove('disabled');
|
|
135
|
+
} else {
|
|
136
|
+
actionButton?.classList.add('disabled');
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
let successMessage = TYPO3.lang['extensionList.dependenciesResolveDownloadSuccess.message'
|
|
142
|
+
+ data.installationTypeLanguageKey].replace(/\{0\}/g, data.extension);
|
|
143
|
+
|
|
144
|
+
successMessage += '\n' + TYPO3.lang['extensionList.dependenciesResolveDownloadSuccess.header'] + ': ';
|
|
145
|
+
for (const [index, value] of Object.entries(data.result)) {
|
|
146
|
+
successMessage += '\n\n' + TYPO3.lang['extensionList.dependenciesResolveDownloadSuccess.item'] + ' ' + index + ': ';
|
|
147
|
+
for (const extkey of Object.keys(value)) {
|
|
148
|
+
successMessage += '\n* ' + extkey;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
Notification.info(
|
|
152
|
+
TYPO3.lang['extensionList.dependenciesResolveFlashMessage.title' + data.installationTypeLanguageKey]
|
|
153
|
+
.replace(/\{0\}/g, data.extension),
|
|
154
|
+
successMessage,
|
|
155
|
+
15,
|
|
156
|
+
);
|
|
157
|
+
top.TYPO3.ModuleMenu.App.refreshMenu();
|
|
158
|
+
}
|
|
159
|
+
} catch {
|
|
160
|
+
// Catching errors on resolving the response. One case is that an extensions might lead to
|
|
161
|
+
// the PHP request being aborted, which results in an empty response body. Calling .json()
|
|
162
|
+
// on this, results in a SyntaxError. Therefore catch such errors and display a flash message.
|
|
163
|
+
Notification.error(
|
|
164
|
+
TYPO3.lang['extensionList.dependenciesResolveInstallError.title'] || 'Install error',
|
|
165
|
+
TYPO3.lang['extensionList.dependenciesResolveInstallError.message'] || 'Your installation failed while resolving dependencies.'
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}, (): void => {
|
|
169
|
+
Notification.error(
|
|
170
|
+
TYPO3.lang['extensionList.dependenciesResolveInstallError.title'] || 'Install error',
|
|
171
|
+
TYPO3.lang['extensionList.dependenciesResolveInstallError.message'] || 'Your installation failed while resolving dependencies.'
|
|
172
|
+
);
|
|
173
|
+
}).finally((): void => {
|
|
174
|
+
NProgress.done();
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private bindSearchFieldResetter(): void {
|
|
179
|
+
let searchField: HTMLInputElement;
|
|
180
|
+
if ((searchField = document.querySelector('.typo3-extensionmanager-searchTerForm input[type="text"]')) !== null) {
|
|
181
|
+
const searchResultShown = ('' !== searchField.value);
|
|
182
|
+
|
|
183
|
+
// make search field clearable
|
|
184
|
+
searchField.clearable({
|
|
185
|
+
onClear: (input: HTMLInputElement): void => {
|
|
186
|
+
if (searchResultShown) {
|
|
187
|
+
input.closest('form').submit();
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export default Repository;
|
|
@@ -0,0 +1,118 @@
|
|
|
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 NProgress from 'nprogress';
|
|
15
|
+
import Notification from '@typo3/backend/notification';
|
|
16
|
+
import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
|
|
17
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
18
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
19
|
+
|
|
20
|
+
enum ExtensionManagerUpdateIdentifier {
|
|
21
|
+
extensionTable = '#terTable',
|
|
22
|
+
terUpdateAction = '.update-from-ter',
|
|
23
|
+
pagination = '.pagination-wrap',
|
|
24
|
+
splashscreen = '.splash-receivedata',
|
|
25
|
+
terTableWrapper = '#terTableWrapper .table',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class ExtensionManagerUpdate {
|
|
29
|
+
/**
|
|
30
|
+
* Register "update from ter" action
|
|
31
|
+
*/
|
|
32
|
+
public initializeEvents(): void {
|
|
33
|
+
const terUpdateActionForm = document.querySelector(ExtensionManagerUpdateIdentifier.terUpdateAction) as HTMLFormElement|null;
|
|
34
|
+
if (terUpdateActionForm !== null) {
|
|
35
|
+
new RegularEvent('submit', (e: SubmitEvent) => {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
|
|
38
|
+
this.updateFromTer((e.target as HTMLFormElement).action, true);
|
|
39
|
+
}).bindTo(terUpdateActionForm);
|
|
40
|
+
|
|
41
|
+
this.updateFromTer(terUpdateActionForm.action, false);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private updateFromTer(url: string, forceUpdate: boolean): void {
|
|
46
|
+
if (forceUpdate) {
|
|
47
|
+
url = url + '&forceUpdateCheck=1';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Hide triggers for TER update
|
|
51
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.terUpdateAction)?.classList.add('extensionmanager-is-hidden');
|
|
52
|
+
|
|
53
|
+
// Hide extension table
|
|
54
|
+
const extensionTable: HTMLTableElement = document.querySelector(ExtensionManagerUpdateIdentifier.extensionTable);
|
|
55
|
+
if (extensionTable) {
|
|
56
|
+
extensionTable.style.display = 'none';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Show loaders
|
|
60
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.splashscreen)?.classList.add('extensionmanager-is-shown');
|
|
61
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.terTableWrapper)?.classList.add('extensionmanager-is-loading');
|
|
62
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.pagination)?.classList.add('extensionmanager-is-loading');
|
|
63
|
+
|
|
64
|
+
let reload = false;
|
|
65
|
+
|
|
66
|
+
NProgress.start();
|
|
67
|
+
new AjaxRequest(url).post({}).then(async (response: AjaxResponse): Promise<void> => {
|
|
68
|
+
const data = await response.resolve();
|
|
69
|
+
// Something went wrong, show message
|
|
70
|
+
if (data.errorMessage.length) {
|
|
71
|
+
Notification.error(TYPO3.lang['extensionList.updateFromTerFlashMessage.title'], data.errorMessage, 10);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Message with latest updates
|
|
75
|
+
const lastUpdate: HTMLElement = document.querySelector(ExtensionManagerUpdateIdentifier.terUpdateAction + ' .extension-list-last-updated');
|
|
76
|
+
lastUpdate.innerText = data.timeSinceLastUpdate;
|
|
77
|
+
lastUpdate.setAttribute(
|
|
78
|
+
'title',
|
|
79
|
+
TYPO3.lang['extensionList.updateFromTer.lastUpdate.timeOfLastUpdate'] + data.lastUpdateTime,
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
if (data.updated) {
|
|
83
|
+
// Reload page
|
|
84
|
+
reload = true;
|
|
85
|
+
window.location.replace(window.location.href);
|
|
86
|
+
}
|
|
87
|
+
}, async (error: AjaxResponse): Promise<void> => {
|
|
88
|
+
// Create an error message with diagnosis info.
|
|
89
|
+
const errorMessage = error.response.statusText + '(' + error.response.status + '): ' + await error.response.text();
|
|
90
|
+
|
|
91
|
+
Notification.warning(
|
|
92
|
+
TYPO3.lang['extensionList.updateFromTerFlashMessage.title'],
|
|
93
|
+
errorMessage,
|
|
94
|
+
10,
|
|
95
|
+
);
|
|
96
|
+
}).finally((): void => {
|
|
97
|
+
NProgress.done();
|
|
98
|
+
|
|
99
|
+
if (!reload) {
|
|
100
|
+
// Hide loaders
|
|
101
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.splashscreen)?.classList.remove('extensionmanager-is-shown');
|
|
102
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.terTableWrapper)?.classList.remove('extensionmanager-is-loading');
|
|
103
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.pagination)?.classList.remove('extensionmanager-is-loading');
|
|
104
|
+
|
|
105
|
+
// Show triggers for TER-update
|
|
106
|
+
document.querySelector(ExtensionManagerUpdateIdentifier.terUpdateAction)?.classList.remove('extensionmanager-is-hidden');
|
|
107
|
+
|
|
108
|
+
// Show extension table
|
|
109
|
+
const extensionTable: HTMLTableElement = document.querySelector(ExtensionManagerUpdateIdentifier.extensionTable);
|
|
110
|
+
if (extensionTable) {
|
|
111
|
+
extensionTable.style.display = 'block';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default ExtensionManagerUpdate;
|