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.
Files changed (415) hide show
  1. package/.github/workflows/sync-and-publish.yml +265 -0
  2. package/.last-synced-tag +1 -0
  3. package/LICENSE.txt +339 -0
  4. package/README-TYPO3.md +166 -0
  5. package/README.md +28 -0
  6. package/adminpanel/admin-panel.ts +375 -0
  7. package/adminpanel/modules/cache.ts +27 -0
  8. package/adminpanel/modules/preview.ts +75 -0
  9. package/backend/action-button/abstract-action.ts +22 -0
  10. package/backend/action-button/deferred-action.ts +41 -0
  11. package/backend/action-button/immediate-action.ts +31 -0
  12. package/backend/action-dispatcher.ts +104 -0
  13. package/backend/ajax-data-handler/message-interface.ts +18 -0
  14. package/backend/ajax-data-handler/response-interface.ts +20 -0
  15. package/backend/ajax-data-handler.ts +214 -0
  16. package/backend/backend-exception.ts +22 -0
  17. package/backend/broadcast-message.ts +50 -0
  18. package/backend/broadcast-service.ts +52 -0
  19. package/backend/browse-database.ts +38 -0
  20. package/backend/clear-cache.ts +88 -0
  21. package/backend/clipboard-panel.ts +240 -0
  22. package/backend/close-current-window.ts +2 -0
  23. package/backend/code-editor/autocomplete/completion-result.ts +105 -0
  24. package/backend/code-editor/autocomplete/ts-code-completion.ts +142 -0
  25. package/backend/code-editor/autocomplete/ts-parser.ts +485 -0
  26. package/backend/code-editor/autocomplete/ts-ref.ts +164 -0
  27. package/backend/code-editor/element/code-mirror-element.ts +282 -0
  28. package/backend/code-editor/language/typoscript.ts +181 -0
  29. package/backend/code-editor/stream-parser/typoscript.ts +1600 -0
  30. package/backend/color-picker.ts +158 -0
  31. package/backend/color-scheme-switch.ts +179 -0
  32. package/backend/column-selector-button.ts +302 -0
  33. package/backend/context-help.ts +68 -0
  34. package/backend/context-menu-actions.ts +322 -0
  35. package/backend/context-menu.ts +751 -0
  36. package/backend/copy-to-clipboard.ts +79 -0
  37. package/backend/date-time-picker.ts +270 -0
  38. package/backend/document-save-actions.ts +159 -0
  39. package/backend/drag-tooltip.ts +285 -0
  40. package/backend/drag-uploader.ts +914 -0
  41. package/backend/element/alert-element.ts +116 -0
  42. package/backend/element/dispatch-modal-button.ts +50 -0
  43. package/backend/element/draggable-resizable-element.ts +249 -0
  44. package/backend/element/editable-page-title.ts +306 -0
  45. package/backend/element/icon-element.ts +84 -0
  46. package/backend/element/immediate-action-element.ts +89 -0
  47. package/backend/element/pagination.ts +59 -0
  48. package/backend/element/progress-bar-element.ts +172 -0
  49. package/backend/element/progress-tracker-element.ts +119 -0
  50. package/backend/element/pseudo-button.ts +58 -0
  51. package/backend/element/spinner-element.ts +51 -0
  52. package/backend/element/thumbnail-element.ts +80 -0
  53. package/backend/element-browser.ts +182 -0
  54. package/backend/enum/data-transfer-types.ts +21 -0
  55. package/backend/enum/icon-types.ts +31 -0
  56. package/backend/enum/key-types.ts +27 -0
  57. package/backend/enum/severity.ts +20 -0
  58. package/backend/enum/viewport/scaffold-identifier.ts +24 -0
  59. package/backend/event/client-request.ts +25 -0
  60. package/backend/event/consumable.ts +18 -0
  61. package/backend/event/consumer-scope.ts +54 -0
  62. package/backend/event/event-dispatcher.ts +26 -0
  63. package/backend/event/interaction-request-assignment.ts +24 -0
  64. package/backend/event/interaction-request-map.ts +75 -0
  65. package/backend/event/interaction-request.ts +48 -0
  66. package/backend/event/trigger-request.ts +56 -0
  67. package/backend/form/submit-interceptor.ts +66 -0
  68. package/backend/form-engine/container/files-control-container.ts +716 -0
  69. package/backend/form-engine/container/flex-form-container-container.ts +166 -0
  70. package/backend/form-engine/container/flex-form-section-container.ts +210 -0
  71. package/backend/form-engine/container/inline-control-container.ts +1230 -0
  72. package/backend/form-engine/container/site-language-container.ts +616 -0
  73. package/backend/form-engine/element/abstract-sortable-select-items.ts +186 -0
  74. package/backend/form-engine/element/category-element.ts +160 -0
  75. package/backend/form-engine/element/color-element.ts +81 -0
  76. package/backend/form-engine/element/datetime-element.ts +66 -0
  77. package/backend/form-engine/element/extra/char-counter.ts +112 -0
  78. package/backend/form-engine/element/extra/select-box-filter.ts +85 -0
  79. package/backend/form-engine/element/folder-element.ts +66 -0
  80. package/backend/form-engine/element/group-element.ts +47 -0
  81. package/backend/form-engine/element/json-element.ts +52 -0
  82. package/backend/form-engine/element/link-element.ts +121 -0
  83. package/backend/form-engine/element/mfa-info-element.ts +169 -0
  84. package/backend/form-engine/element/modifier/resizable.ts +27 -0
  85. package/backend/form-engine/element/modifier/tabbable.ts +29 -0
  86. package/backend/form-engine/element/online-media-form-element.ts +65 -0
  87. package/backend/form-engine/element/password-element.ts +71 -0
  88. package/backend/form-engine/element/select-multiple-side-by-side-element.ts +83 -0
  89. package/backend/form-engine/element/select-single-element.ts +82 -0
  90. package/backend/form-engine/element/select-tree-element.ts +148 -0
  91. package/backend/form-engine/element/select-tree-toolbar.ts +118 -0
  92. package/backend/form-engine/element/select-tree.ts +210 -0
  93. package/backend/form-engine/element/slug-element.ts +243 -0
  94. package/backend/form-engine/element/suggest/result-container.ts +118 -0
  95. package/backend/form-engine/element/suggest/result-item.ts +90 -0
  96. package/backend/form-engine/element/table-permission-element.ts +101 -0
  97. package/backend/form-engine/element/table-wizard-element.ts +427 -0
  98. package/backend/form-engine/element/text-element.ts +52 -0
  99. package/backend/form-engine/element/text-table-element.ts +31 -0
  100. package/backend/form-engine/field-control/add-record.ts +40 -0
  101. package/backend/form-engine/field-control/edit-popup.ts +64 -0
  102. package/backend/form-engine/field-control/insert-clipboard.ts +50 -0
  103. package/backend/form-engine/field-control/link-popup.ts +53 -0
  104. package/backend/form-engine/field-control/list-module.ts +40 -0
  105. package/backend/form-engine/field-control/password-generator.ts +102 -0
  106. package/backend/form-engine/field-control/reset-selection.ts +48 -0
  107. package/backend/form-engine/field-wizard/localization-state-selector.ts +67 -0
  108. package/backend/form-engine/field-wizard/value-picker.ts +123 -0
  109. package/backend/form-engine/field-wizard/value-slider.ts +86 -0
  110. package/backend/form-engine/inline-relation/ajax-dispatcher.ts +124 -0
  111. package/backend/form-engine/inline-relation/inline-response-interface.ts +41 -0
  112. package/backend/form-engine-link-browser-adapter.ts +129 -0
  113. package/backend/form-engine-review.ts +155 -0
  114. package/backend/form-engine-suggest.ts +133 -0
  115. package/backend/form-engine-validation.ts +686 -0
  116. package/backend/form-engine.ts +1391 -0
  117. package/backend/global-event-handler.ts +252 -0
  118. package/backend/grid-editor.ts +1077 -0
  119. package/backend/hashing/md5.ts +252 -0
  120. package/backend/helper.ts +24 -0
  121. package/backend/hotkeys/hotkey-storage.ts +63 -0
  122. package/backend/hotkeys.ts +216 -0
  123. package/backend/icons.ts +236 -0
  124. package/backend/image-manipulation.ts +885 -0
  125. package/backend/info-window.ts +46 -0
  126. package/backend/input/clearable.ts +128 -0
  127. package/backend/input/index.d.ts +8 -0
  128. package/backend/java-script-module-import-event-handler.ts +19 -0
  129. package/backend/key-bindings.ts +42 -0
  130. package/backend/layout-module/drag-drop.ts +359 -0
  131. package/backend/layout-module/paste.ts +165 -0
  132. package/backend/link-browser.ts +89 -0
  133. package/backend/live-search/element/backend-search.ts +34 -0
  134. package/backend/live-search/element/hint.ts +33 -0
  135. package/backend/live-search/element/provider/default-result-item.ts +52 -0
  136. package/backend/live-search/element/provider/page-provider-result-item.ts +52 -0
  137. package/backend/live-search/element/result/item/action/action-container.ts +135 -0
  138. package/backend/live-search/element/result/item/action/action.ts +56 -0
  139. package/backend/live-search/element/result/item/item-container.ts +224 -0
  140. package/backend/live-search/element/result/item/item.ts +74 -0
  141. package/backend/live-search/element/result/result-container.ts +110 -0
  142. package/backend/live-search/element/result/result-detail-container.ts +50 -0
  143. package/backend/live-search/element/result/result-pagination.ts +122 -0
  144. package/backend/live-search/element/search-option-item.ts +70 -0
  145. package/backend/live-search/live-search-configurator.ts +54 -0
  146. package/backend/live-search/live-search-shortcut.ts +29 -0
  147. package/backend/live-search/result-types/backend-module-result-type.ts +8 -0
  148. package/backend/live-search/result-types/default-result-type.ts +21 -0
  149. package/backend/live-search/result-types/page-result-type.ts +23 -0
  150. package/backend/localization.ts +390 -0
  151. package/backend/login-refresh.ts +525 -0
  152. package/backend/login.ts +179 -0
  153. package/backend/mail-link-handler.ts +45 -0
  154. package/backend/modal-interface.ts +19 -0
  155. package/backend/modal.ts +685 -0
  156. package/backend/module/iframe.ts +125 -0
  157. package/backend/module/router.ts +275 -0
  158. package/backend/module-menu.ts +550 -0
  159. package/backend/module.ts +133 -0
  160. package/backend/multi-record-selection-action.ts +44 -0
  161. package/backend/multi-record-selection-delete-action.ts +108 -0
  162. package/backend/multi-record-selection-edit-action.ts +56 -0
  163. package/backend/multi-record-selection.ts +468 -0
  164. package/backend/multi-step-wizard.ts +568 -0
  165. package/backend/new-content-element-wizard-button.ts +51 -0
  166. package/backend/new-multiple-pages.ts +108 -0
  167. package/backend/new-record-wizard.ts +680 -0
  168. package/backend/notification.ts +366 -0
  169. package/backend/offset.ts +40 -0
  170. package/backend/online-media.ts +110 -0
  171. package/backend/page-actions.ts +91 -0
  172. package/backend/page-link-handler.ts +51 -0
  173. package/backend/pagetsconfig/pagetsconfig-includes.ts +77 -0
  174. package/backend/popover.ts +165 -0
  175. package/backend/record-download-button.ts +104 -0
  176. package/backend/record-link-handler.ts +31 -0
  177. package/backend/record-search.ts +44 -0
  178. package/backend/recordlist.ts +230 -0
  179. package/backend/resource/resource.ts +35 -0
  180. package/backend/security/element/csp-reports.ts +406 -0
  181. package/backend/security/element/sudo-mode.ts +249 -0
  182. package/backend/security/sudo-mode-interceptor.ts +19 -0
  183. package/backend/settings/editor/editable-setting.ts +231 -0
  184. package/backend/settings/editor.ts +451 -0
  185. package/backend/settings/enum/settings-mode.enum.ts +24 -0
  186. package/backend/settings/type/base.ts +200 -0
  187. package/backend/settings/type/bool.ts +56 -0
  188. package/backend/settings/type/color.ts +64 -0
  189. package/backend/settings/type/int.ts +85 -0
  190. package/backend/settings/type/number.ts +61 -0
  191. package/backend/settings/type/page.ts +100 -0
  192. package/backend/settings/type/string.ts +77 -0
  193. package/backend/settings/type/stringlist.ts +87 -0
  194. package/backend/severity.ts +88 -0
  195. package/backend/site-inline-actions.ts +32 -0
  196. package/backend/sortable-table.ts +208 -0
  197. package/backend/storage/abstract-client-storage.ts +76 -0
  198. package/backend/storage/browser-session.ts +28 -0
  199. package/backend/storage/client.ts +28 -0
  200. package/backend/storage/module-state-storage.ts +118 -0
  201. package/backend/storage/persistent.ts +204 -0
  202. package/backend/switch-user.ts +82 -0
  203. package/backend/tabs.ts +72 -0
  204. package/backend/telephone-link-handler.ts +40 -0
  205. package/backend/tests/backend/storage/browser-storage-test.ts +87 -0
  206. package/backend/tests/backend/storage/client-test.ts +87 -0
  207. package/backend/tests/backend/utility/dom-helper-test.ts +51 -0
  208. package/backend/tests/backend-exception-test.ts +28 -0
  209. package/backend/tests/element/immediate-action-element-test.ts +81 -0
  210. package/backend/tests/form-engine-validation-test.ts +304 -0
  211. package/backend/tests/grid-editor-test.ts +29 -0
  212. package/backend/tests/hashing/md5Test.ts +28 -0
  213. package/backend/tests/icons-test.ts +23 -0
  214. package/backend/tests/notification-test.ts +161 -0
  215. package/backend/tests/popover-test.ts +83 -0
  216. package/backend/toolbar/clear-cache-menu.ts +88 -0
  217. package/backend/toolbar/live-search.ts +284 -0
  218. package/backend/toolbar/shortcut-menu.ts +254 -0
  219. package/backend/toolbar/system-information-menu.ts +161 -0
  220. package/backend/toolbar.ts +41 -0
  221. package/backend/tree/file-storage-browser.ts +194 -0
  222. package/backend/tree/file-storage-tree-container.ts +465 -0
  223. package/backend/tree/file-storage-tree.ts +42 -0
  224. package/backend/tree/page-browser.ts +272 -0
  225. package/backend/tree/page-tree-element.ts +602 -0
  226. package/backend/tree/page-tree.ts +152 -0
  227. package/backend/tree/tree-module-state.ts +159 -0
  228. package/backend/tree/tree-node-toggle.ts +31 -0
  229. package/backend/tree/tree-node.ts +97 -0
  230. package/backend/tree/tree-toolbar.ts +117 -0
  231. package/backend/tree/tree.ts +1595 -0
  232. package/backend/url-link-handler.ts +36 -0
  233. package/backend/user-pass-login.ts +255 -0
  234. package/backend/user-settings-manager.ts +189 -0
  235. package/backend/utility/collapse-state-persister.ts +205 -0
  236. package/backend/utility/collapse-state-search.ts +183 -0
  237. package/backend/utility/dom-helper.ts +91 -0
  238. package/backend/utility/drag-drop-utility.ts +47 -0
  239. package/backend/utility/message-utility.ts +45 -0
  240. package/backend/utility/top-level-module-import.ts +32 -0
  241. package/backend/utility.ts +194 -0
  242. package/backend/viewport/abstract-container.ts +22 -0
  243. package/backend/viewport/content-container.ts +98 -0
  244. package/backend/viewport/loader.ts +28 -0
  245. package/backend/viewport/navigation-container.ts +119 -0
  246. package/backend/viewport/resizable-navigation.ts +176 -0
  247. package/backend/viewport/toolbar.ts +27 -0
  248. package/backend/viewport/topbar.ts +39 -0
  249. package/backend/viewport.ts +46 -0
  250. package/backend/window-manager.ts +84 -0
  251. package/backend/wizard/move-content-element.ts +107 -0
  252. package/backend/wizard/move-page.ts +74 -0
  253. package/backend/wizard.ts +331 -0
  254. package/belog/backend-log.ts +88 -0
  255. package/beuser/backend-user-listing.ts +40 -0
  256. package/beuser/permissions.ts +291 -0
  257. package/core/ajax/ajax-request-types.ts +15 -0
  258. package/core/ajax/ajax-request.ts +202 -0
  259. package/core/ajax/ajax-response.ts +57 -0
  260. package/core/ajax/input-transformer.ts +92 -0
  261. package/core/ajax/simple-response-interface.ts +5 -0
  262. package/core/authentication/mfa-provider/totp.ts +54 -0
  263. package/core/cache/dedupe-async-task.ts +95 -0
  264. package/core/directive/markdown.ts +82 -0
  265. package/core/directive/nl2br.ts +16 -0
  266. package/core/document-service.ts +35 -0
  267. package/core/event/debounce-event.ts +40 -0
  268. package/core/event/event-interface.ts +24 -0
  269. package/core/event/regular-event.ts +58 -0
  270. package/core/event/request-animation-frame-event.ts +42 -0
  271. package/core/event/throttle-event.ts +54 -0
  272. package/core/java-script-item-handler.ts +29 -0
  273. package/core/java-script-item-processor.ts +171 -0
  274. package/core/lit-helper.ts +126 -0
  275. package/core/literals.ts +17 -0
  276. package/core/referrer-refresh.ts +2 -0
  277. package/core/security-utility.ts +89 -0
  278. package/core/tests/ajax/ajax-request-test.ts +290 -0
  279. package/core/tests/ajax/input-transformer-test.ts +64 -0
  280. package/core/tests/cache/dedupe-async-task-test.ts +152 -0
  281. package/core/tests/event/throttle-event-test.ts +47 -0
  282. package/core/tests/literals-test.ts +24 -0
  283. package/core/tests/security-utility-test.ts +50 -0
  284. package/core/utility/types.ts +9 -0
  285. package/dashboard/chart-initializer.ts +136 -0
  286. package/dashboard/dashboard.ts +1487 -0
  287. package/extensionmanager/distribution-image.ts +55 -0
  288. package/extensionmanager/main.ts +291 -0
  289. package/extensionmanager/repository.ts +195 -0
  290. package/extensionmanager/update.ts +118 -0
  291. package/extensionmanager/upload-form.ts +42 -0
  292. package/filelist/browse-files.ts +148 -0
  293. package/filelist/browse-folders.ts +94 -0
  294. package/filelist/context-menu-actions.ts +335 -0
  295. package/filelist/create-folder.ts +69 -0
  296. package/filelist/file-delete.ts +69 -0
  297. package/filelist/file-list-actions.ts +132 -0
  298. package/filelist/file-list-dragdrop.ts +139 -0
  299. package/filelist/file-list-rename-handler.ts +128 -0
  300. package/filelist/file-list-transfer-handler.ts +138 -0
  301. package/filelist/file-list.ts +396 -0
  302. package/filelist/file-replace.ts +37 -0
  303. package/filelist/linkbrowser-file-handler.ts +94 -0
  304. package/filelist/linkbrowser-folder-handler.ts +74 -0
  305. package/filelist/rename-file.ts +109 -0
  306. package/form/backend/form-editor/component/property-grid-editor.ts +340 -0
  307. package/form/backend/form-editor/core.ts +2104 -0
  308. package/form/backend/form-editor/helper.ts +226 -0
  309. package/form/backend/form-editor/inspector-component.ts +2323 -0
  310. package/form/backend/form-editor/mediator.ts +941 -0
  311. package/form/backend/form-editor/modals-component.ts +433 -0
  312. package/form/backend/form-editor/stage-component.ts +908 -0
  313. package/form/backend/form-editor/tree-component.ts +548 -0
  314. package/form/backend/form-editor/view-model.ts +1343 -0
  315. package/form/backend/form-editor.ts +846 -0
  316. package/form/backend/form-manager/main.ts +39 -0
  317. package/form/backend/form-manager/view-model.ts +789 -0
  318. package/form/backend/form-manager.ts +180 -0
  319. package/form/backend/helper.ts +60 -0
  320. package/form/frontend/date-picker.ts +38 -0
  321. package/frontend/default_frontend.ts +82 -0
  322. package/impexp/context-menu-actions.ts +50 -0
  323. package/impexp/import-export.ts +62 -0
  324. package/indexed-search/pagination.ts +26 -0
  325. package/indexed-search/statistics.ts +50 -0
  326. package/info/translation-status.ts +48 -0
  327. package/install/ajax/ajax-queue.ts +83 -0
  328. package/install/init-install.ts +2 -0
  329. package/install/init-installer.ts +2 -0
  330. package/install/install.ts +25 -0
  331. package/install/installer.ts +458 -0
  332. package/install/message-interface.ts +18 -0
  333. package/install/module/abstract-inline-module.ts +27 -0
  334. package/install/module/abstract-interactable-module.ts +107 -0
  335. package/install/module/environment/environment-check.ts +92 -0
  336. package/install/module/environment/folder-structure.ts +145 -0
  337. package/install/module/environment/image-processing.ts +141 -0
  338. package/install/module/environment/mail-test.ts +127 -0
  339. package/install/module/environment/php-info.ts +50 -0
  340. package/install/module/environment/system-information.ts +50 -0
  341. package/install/module/maintenance/cache.ts +59 -0
  342. package/install/module/maintenance/clear-tables.ts +134 -0
  343. package/install/module/maintenance/clear-typo3temp-files.ts +137 -0
  344. package/install/module/maintenance/create-admin.ts +126 -0
  345. package/install/module/maintenance/database-analyzer.ts +266 -0
  346. package/install/module/maintenance/dump-autoload.ts +58 -0
  347. package/install/module/maintenance/language-packs.ts +338 -0
  348. package/install/module/maintenance/reset-backend-user-uc.ts +58 -0
  349. package/install/module/password-strength.ts +56 -0
  350. package/install/module/settings/change-install-tool-password.ts +101 -0
  351. package/install/module/settings/extension-configuration.ts +224 -0
  352. package/install/module/settings/features.ts +102 -0
  353. package/install/module/settings/local-configuration.ts +316 -0
  354. package/install/module/settings/presets.ts +147 -0
  355. package/install/module/settings/system-maintainer.ts +111 -0
  356. package/install/module/upgrade/core-update.ts +255 -0
  357. package/install/module/upgrade/extension-compat-tester.ts +195 -0
  358. package/install/module/upgrade/extension-scanner.ts +381 -0
  359. package/install/module/upgrade/tca-ext-tables-check.ts +93 -0
  360. package/install/module/upgrade/tca-migrations-check.ts +101 -0
  361. package/install/module/upgrade/upgrade-docs.ts +310 -0
  362. package/install/module/upgrade/upgrade-wizards.ts +612 -0
  363. package/install/renderable/clearable.ts +113 -0
  364. package/install/renderable/flash-message.ts +64 -0
  365. package/install/renderable/info-box.ts +66 -0
  366. package/install/renderable/language-packs.ts +304 -0
  367. package/install/renderable/offset-group.ts +38 -0
  368. package/install/renderable/severity.ts +49 -0
  369. package/install/renderable/wrap-group.ts +36 -0
  370. package/install/router.ts +468 -0
  371. package/linkvalidator/linkvalidator-modal.ts +45 -0
  372. package/linkvalidator/linkvalidator.ts +101 -0
  373. package/lowlevel/query-generator.ts +132 -0
  374. package/lowlevel/reference-index.ts +44 -0
  375. package/opendocs/toolbar/opendocs-menu.ts +117 -0
  376. package/package.json +34 -0
  377. package/recycler/recycler.ts +539 -0
  378. package/redirects/event-handler.ts +108 -0
  379. package/redirects/form-engine-evaluation.ts +34 -0
  380. package/redirects/redirects-module.ts +58 -0
  381. package/rte-ckeditor/ckeditor5.ts +402 -0
  382. package/rte-ckeditor/css-prefixer.ts +94 -0
  383. package/rte-ckeditor/legacy/ckeditor5-bundle.ts +17 -0
  384. package/rte-ckeditor/legacy/ckeditor5-inspector.ts +2 -0
  385. package/rte-ckeditor/plugin/typo3-link.ts +810 -0
  386. package/rte-ckeditor/plugin/whitespace.ts +114 -0
  387. package/rte-ckeditor/rte-link-browser.ts +112 -0
  388. package/rte-ckeditor/tests/css-prefixer-test.ts +314 -0
  389. package/scheduler/scheduler-add-group.ts +119 -0
  390. package/scheduler/scheduler-editable-group-name.ts +307 -0
  391. package/scheduler/scheduler-sortable-groups.ts +59 -0
  392. package/scheduler/scheduler.ts +466 -0
  393. package/setup/setup-module.ts +122 -0
  394. package/styleguide/checkbox-demo.ts +5 -0
  395. package/styleguide/element/theme-switcher-element.ts +101 -0
  396. package/styleguide/filter.ts +22 -0
  397. package/styleguide/find-icons.ts +78 -0
  398. package/styleguide/processing-indicator.ts +78 -0
  399. package/styleguide/render-notifications.ts +64 -0
  400. package/sys-note/element/delete-button.ts +78 -0
  401. package/tstemplate/constant-editor.ts +64 -0
  402. package/tstemplate/information-module.ts +31 -0
  403. package/tstemplate/template-analyzer.ts +77 -0
  404. package/viewpage/main.ts +253 -0
  405. package/workspaces/backend.ts +979 -0
  406. package/workspaces/preview.ts +232 -0
  407. package/workspaces/renderable/comment-view.ts +79 -0
  408. package/workspaces/renderable/diff-view.ts +58 -0
  409. package/workspaces/renderable/history-view.ts +97 -0
  410. package/workspaces/renderable/record-information.ts +118 -0
  411. package/workspaces/renderable/record-table.ts +355 -0
  412. package/workspaces/renderable/send-to-stage-form.ts +108 -0
  413. package/workspaces/toolbar/workspaces-menu.ts +190 -0
  414. package/workspaces/utility/icon-helper.ts +57 -0
  415. 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;