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,41 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { AbstractAction } from './abstract-action';
15
+ import Icons from '../icons';
16
+
17
+ /**
18
+ * Action used when an operation execution time is unknown.
19
+ */
20
+ class DeferredAction extends AbstractAction {
21
+ protected override callback: () => Promise<void>;
22
+
23
+ public async execute(el: HTMLAnchorElement|HTMLButtonElement): Promise<void> {
24
+ el.dataset.actionLabel = el.innerText;
25
+ el.classList.add('disabled');
26
+
27
+ Icons.getIcon('spinner-circle', Icons.sizes.small).then((spinner: string): void => {
28
+ el.innerHTML = spinner;
29
+ });
30
+ return await this.executeCallback(el);
31
+ }
32
+
33
+ private async executeCallback(el: HTMLElement): Promise<void> {
34
+ return await Promise.resolve(this.callback()).finally(() => {
35
+ el.innerText = el.dataset.actionLabel;
36
+ el.classList.remove('disabled');
37
+ });
38
+ }
39
+ }
40
+
41
+ export default DeferredAction;
@@ -0,0 +1,31 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { AbstractAction } from './abstract-action';
15
+
16
+ /**
17
+ * Action used when an operation is executed immediately.
18
+ */
19
+ class ImmediateAction extends AbstractAction {
20
+ protected override callback: () => void;
21
+
22
+ public execute(): Promise<void> {
23
+ return this.executeCallback();
24
+ }
25
+
26
+ private async executeCallback(): Promise<void> {
27
+ return Promise.resolve(this.callback());
28
+ }
29
+ }
30
+
31
+ export default ImmediateAction;
@@ -0,0 +1,104 @@
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 InfoWindow from '@typo3/backend/info-window';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+ import shortcutMenu from '@typo3/backend/toolbar/shortcut-menu';
17
+ import windowManager from '@typo3/backend/window-manager';
18
+ import moduleMenuApp from '@typo3/backend/module-menu';
19
+ import documentService from '@typo3/core/document-service';
20
+ import Utility from '@typo3/backend/utility';
21
+
22
+ declare type ActionDispatchArgument = unknown;
23
+
24
+ /**
25
+ * Module: @typo3/backend/action-dispatcher
26
+ *
27
+ * @example
28
+ * <a class="btn btn-default" href="#"
29
+ * data-dispatch-action="TYPO3.InfoWindow.showItem"
30
+ * data-dispatch-args-list="tt_content,123"
31
+ * ...
32
+ * data-dispatch-args="[$quot;tt_content&quot;,123]"
33
+ * ...
34
+ * data-dispatch-disabled>
35
+ */
36
+ class ActionDispatcher {
37
+ private delegates: {[key: string]: (...args: ActionDispatchArgument[]) => void} = {};
38
+
39
+ public constructor() {
40
+ this.createDelegates();
41
+ documentService.ready().then((): void => this.registerEvents());
42
+ }
43
+
44
+ private static resolveArguments(element: HTMLElement): null | string[] {
45
+ if (element.dataset.dispatchArgs) {
46
+ // `&quot;` is the only literal of a PHP `json_encode` that needs to be substituted
47
+ // all other payload values are expected to be serialized to unicode literals
48
+ const json = element.dataset.dispatchArgs.replace(/&quot;/g, '"');
49
+ const args = JSON.parse(json);
50
+ return args instanceof Array ? Utility.trimItems(args) : null;
51
+ } else if (element.dataset.dispatchArgsList) {
52
+ const args = element.dataset.dispatchArgsList.split(',');
53
+ return Utility.trimItems(args);
54
+ }
55
+ return null;
56
+ }
57
+
58
+
59
+
60
+ private createDelegates(): void {
61
+ this.delegates = {
62
+ 'TYPO3.InfoWindow.showItem': InfoWindow.showItem.bind(null),
63
+ 'TYPO3.ShortcutMenu.createShortcut': shortcutMenu.createShortcut.bind(shortcutMenu),
64
+ 'TYPO3.WindowManager.localOpen': windowManager.localOpen.bind(windowManager),
65
+ 'TYPO3.ModuleMenu.showModule': moduleMenuApp.App.showModule.bind(moduleMenuApp.App),
66
+ };
67
+ }
68
+
69
+ private registerEvents(): void {
70
+ new RegularEvent('click', this.handleClickEvent.bind(this))
71
+ .delegateTo(document, '[data-dispatch-action]');
72
+ }
73
+
74
+ private handleClickEvent(evt: Event, target: HTMLElement): void {
75
+ evt.preventDefault();
76
+ this.delegateTo(evt, target);
77
+ }
78
+
79
+ private delegateTo(evt: Event, target: HTMLElement): void {
80
+ const disabled = target.hasAttribute('data-dispatch-disabled');
81
+ if (disabled) {
82
+ return;
83
+ }
84
+ const action = target.dataset.dispatchAction;
85
+ let args: ActionDispatchArgument[] = ActionDispatcher.resolveArguments(target);
86
+ if (args instanceof Array) {
87
+ args = args.map((arg: string): ActionDispatchArgument => {
88
+ switch (arg) {
89
+ case '{$target}':
90
+ return target;
91
+ case '{$event}':
92
+ return evt;
93
+ default:
94
+ return arg;
95
+ }
96
+ });
97
+ }
98
+ if (this.delegates[action]) {
99
+ this.delegates[action].apply(null, args || []);
100
+ }
101
+ }
102
+ }
103
+
104
+ export default new ActionDispatcher();
@@ -0,0 +1,18 @@
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
+ export default interface MessageInterface {
15
+ title: string;
16
+ message: string;
17
+ severity: number;
18
+ }
@@ -0,0 +1,20 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import type MessageInterface from './message-interface';
15
+
16
+ export default interface ResponseInterface {
17
+ redirect: string;
18
+ messages: Array<MessageInterface>;
19
+ hasErrors: boolean;
20
+ }
@@ -0,0 +1,214 @@
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 { BroadcastMessage } from '@typo3/backend/broadcast-message';
15
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
16
+ import DocumentService from '@typo3/core/document-service';
17
+ import BroadcastService from '@typo3/backend/broadcast-service';
18
+ import Icons from './icons';
19
+ import Notification from './notification';
20
+ import RegularEvent from '@typo3/core/event/regular-event';
21
+ import { sudoModeInterceptor } from '@typo3/backend/security/sudo-mode-interceptor';
22
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
23
+ import type ResponseInterface from './ajax-data-handler/response-interface';
24
+
25
+ enum Identifiers {
26
+ hide = 'button[data-datahandler-action="visibility"]',
27
+ icon = '.t3js-icon',
28
+ }
29
+
30
+ interface AfterProcessEventDict {
31
+ component: string;
32
+ action: string;
33
+ table: string;
34
+ uid: number;
35
+ }
36
+
37
+ /**
38
+ * Module: @typo3/backend/ajax-data-handler
39
+ * Javascript functions to work with AJAX and interacting with Datahandler
40
+ * through \TYPO3\CMS\Backend\Controller\SimpleDataHandlerController->processAjaxRequest (record_process route)
41
+ */
42
+ class AjaxDataHandler {
43
+ constructor() {
44
+ DocumentService.ready().then((): void => {
45
+ this.initialize();
46
+ });
47
+ }
48
+
49
+ /**
50
+ * Refresh the page tree
51
+ */
52
+ private static refreshPageTree(): void {
53
+ top.document.dispatchEvent(new CustomEvent('typo3:pagetree:refresh'));
54
+ }
55
+
56
+ /**
57
+ * AJAX call to record_process route (SimpleDataHandlerController->processAjaxRequest)
58
+ * returns a jQuery Promise to work with
59
+ *
60
+ * @param {string | object} params
61
+ * @returns {Promise<ResponseInterface>}
62
+ */
63
+ private static call(params: string | object): Promise<ResponseInterface> {
64
+ return (new AjaxRequest(TYPO3.settings.ajaxUrls.record_process))
65
+ .addMiddleware(sudoModeInterceptor)
66
+ .withQueryArguments(params)
67
+ .get()
68
+ .then(async (response: AjaxResponse): Promise<ResponseInterface> => {
69
+ return await response.resolve();
70
+ });
71
+ }
72
+
73
+ /**
74
+ * Generic function to call from the outside the script and validate directly showing errors
75
+ *
76
+ * @param {string | object} parameters
77
+ * @param {AfterProcessEventDict} eventDict Dictionary used as event detail. This is private API yet.
78
+ * @returns {Promise<ResponseInterface>}
79
+ */
80
+ public process(parameters: string | object, eventDict?: AfterProcessEventDict): Promise<ResponseInterface> {
81
+ const promise = AjaxDataHandler.call(parameters);
82
+ return promise.then((result: ResponseInterface): ResponseInterface => {
83
+ if (result.hasErrors) {
84
+ this.handleErrors(result);
85
+ }
86
+
87
+ if (eventDict) {
88
+ const payload = { ...eventDict, hasErrors: result.hasErrors };
89
+ const message = new BroadcastMessage(
90
+ 'datahandler',
91
+ 'process',
92
+ payload
93
+ );
94
+ BroadcastService.post(message);
95
+
96
+ const event = new CustomEvent('typo3:datahandler:process',{
97
+ detail: {
98
+ payload: payload
99
+ }
100
+ });
101
+ document.dispatchEvent(event);
102
+ }
103
+
104
+ return result;
105
+ });
106
+ }
107
+
108
+ // @todo: Many extensions rely on this behavior but it's misplaced in AjaxDataHandler. Move into recordlist.ts and deprecate in v11.
109
+ private initialize(): void {
110
+ // HIDE/UNHIDE: click events for all action icons to hide/unhide
111
+ new RegularEvent('click', (e: Event, element: HTMLButtonElement): void => {
112
+ e.preventDefault();
113
+ this.handleVisibilityToggle(element);
114
+ }).delegateTo(document, Identifiers.hide);
115
+ }
116
+
117
+ private handleVisibilityToggle(element: HTMLButtonElement): void
118
+ {
119
+ const rowElement = element.closest('tr[data-uid]');
120
+
121
+ // Show spinner
122
+ const iconElement = element.querySelector(Identifiers.icon);
123
+ this._showSpinnerIcon(iconElement);
124
+
125
+ const isVisible = element.dataset.datahandlerStatus === 'visible';
126
+ // Get Settings from element
127
+ const settings = {
128
+ table: element.dataset.datahandlerTable,
129
+ uid: element.dataset.datahandlerUid,
130
+ field: element.dataset.datahandlerField,
131
+ visible: isVisible,
132
+ overlayIcon: isVisible
133
+ ? element.dataset.datahandlerRecordHiddenOverlayIcon ?? 'overlay-hidden'
134
+ : element.dataset.datahandlerRecordVisibleOverlayIcon ?? null
135
+ };
136
+
137
+ const params = {
138
+ data: {
139
+ [settings.table]: {
140
+ [settings.uid]: {
141
+ [settings.field]: settings.visible
142
+ ? element.dataset.datahandlerHiddenValue
143
+ : element.dataset.datahandlerVisibleValue
144
+ }
145
+ }
146
+ }
147
+ };
148
+
149
+ // Submit Data
150
+ this.process(params).then((result: ResponseInterface): void => {
151
+ if (!result.hasErrors) {
152
+ // Inverse current state
153
+ settings.visible = !(settings.visible);
154
+ element.setAttribute('data-datahandler-status', settings.visible ? 'visible' : 'hidden');
155
+
156
+ const elementLabel = settings.visible
157
+ ? element.dataset.datahandlerVisibleLabel
158
+ : element.dataset.datahandlerHiddenLabel;
159
+ element.setAttribute('title', elementLabel);
160
+
161
+ const elementIconIdentifier = settings.visible
162
+ ? element.dataset.datahandlerVisibleIcon
163
+ : element.dataset.datahandlerHiddenIcon;
164
+ const iconElement = element.querySelector(Identifiers.icon);
165
+ Icons.getIcon(elementIconIdentifier, Icons.sizes.small).then((icon: string): void => {
166
+ iconElement.replaceWith(document.createRange().createContextualFragment(icon));
167
+ });
168
+
169
+ // Set overlay for the record icon
170
+ const recordIcon = rowElement.querySelector('.col-icon ' + Identifiers.icon);
171
+ recordIcon.querySelector('.icon-overlay')?.remove();
172
+ Icons.getIcon('miscellaneous-placeholder', Icons.sizes.small, settings.overlayIcon).then((icon: string): void => {
173
+ const iconFragment = document.createRange().createContextualFragment(icon);
174
+ recordIcon.append(iconFragment.querySelector('.icon-overlay'));
175
+ });
176
+
177
+ // Animate row
178
+ const animationEvent = new RegularEvent('animationend', (): void => {
179
+ rowElement.classList.remove('record-pulse');
180
+ animationEvent.release();
181
+ });
182
+ animationEvent.bindTo(rowElement);
183
+ rowElement.classList.add('record-pulse');
184
+
185
+ // Refresh Pagetree
186
+ if (settings.table === 'pages') {
187
+ AjaxDataHandler.refreshPageTree();
188
+ }
189
+ }
190
+ });
191
+ }
192
+
193
+ /**
194
+ * Handle the errors from result object
195
+ *
196
+ * @param {Object} result
197
+ */
198
+ private handleErrors(result: ResponseInterface): void {
199
+ for (const message of result.messages) {
200
+ Notification.error(message.title, message.message);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Replace the given icon with a spinner icon
206
+ */
207
+ private _showSpinnerIcon(iconElement: Element): void {
208
+ Icons.getIcon('spinner-circle', Icons.sizes.small).then((icon: string): void => {
209
+ iconElement.replaceWith(document.createRange().createContextualFragment(icon));
210
+ });
211
+ }
212
+ }
213
+
214
+ export default new AjaxDataHandler();
@@ -0,0 +1,22 @@
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
+ export class BackendException {
15
+ public readonly message: string;
16
+ public readonly code: number;
17
+
18
+ constructor(message: string = '', code: number = 0) {
19
+ this.message = message;
20
+ this.code = code;
21
+ }
22
+ }
@@ -0,0 +1,50 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ export type BroadcastEvent<Payload extends object> = CustomEvent<{ payload: Payload }>;
15
+
16
+ /**
17
+ * @module @typo3/backend/broadcast-message
18
+ */
19
+ export class BroadcastMessage<Payload = unknown> {
20
+ readonly componentName: string;
21
+ readonly eventName: string;
22
+ readonly payload: Payload;
23
+
24
+ constructor(componentName: string, eventName: string, payload: Payload) {
25
+ if (!componentName || !eventName) {
26
+ throw new Error('Properties componentName and eventName have to be defined');
27
+ }
28
+ this.componentName = componentName;
29
+ this.eventName = eventName;
30
+ this.payload = payload || ({} as Payload);
31
+ }
32
+
33
+ public static fromData(data: any): BroadcastMessage {
34
+ const payload = Object.assign({}, data);
35
+ delete payload.componentName;
36
+ delete payload.eventName;
37
+ return new BroadcastMessage(
38
+ data.componentName,
39
+ data.eventName,
40
+ payload,
41
+ );
42
+ }
43
+
44
+ public createCustomEvent(scope: string = 'typo3'): CustomEvent {
45
+ return new CustomEvent(
46
+ [scope, this.componentName, this.eventName].join(':'),
47
+ { detail: this.payload },
48
+ );
49
+ }
50
+ }
@@ -0,0 +1,52 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { BroadcastMessage } from '@typo3/backend/broadcast-message';
15
+ import { MessageUtility } from '@typo3/backend/utility/message-utility';
16
+
17
+ /**
18
+ * @module @typo3/backend/broadcast-service
19
+ */
20
+ class BroadcastService {
21
+ private readonly channel: BroadcastChannel;
22
+
23
+ public constructor() {
24
+ this.channel = new BroadcastChannel('typo3');
25
+ }
26
+
27
+ public get isListening(): boolean {
28
+ return typeof this.channel.onmessage === 'function';
29
+ }
30
+
31
+ private static onMessage(evt: MessageEvent): void {
32
+ if (!MessageUtility.verifyOrigin(evt.origin)) {
33
+ throw 'Denied message sent by ' + evt.origin;
34
+ }
35
+ const message = BroadcastMessage.fromData(evt.data);
36
+ document.dispatchEvent(message.createCustomEvent('typo3'));
37
+ }
38
+
39
+ public listen(): void {
40
+ if (this.isListening) {
41
+ return;
42
+ }
43
+ // once `this` becomes necessary, use `.bind(this)`
44
+ this.channel.onmessage = BroadcastService.onMessage;
45
+ }
46
+
47
+ public post(message: BroadcastMessage): void {
48
+ this.channel.postMessage(message);
49
+ }
50
+ }
51
+
52
+ export default new BroadcastService();
@@ -0,0 +1,38 @@
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 ElementBrowser from './element-browser';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+
17
+ /**
18
+ * Module: @typo3/backend/browse-database
19
+ * Database record selection
20
+ * @exports @typo3/backend/browse-database
21
+ */
22
+ class BrowseDatabase {
23
+ constructor() {
24
+ new RegularEvent('click', (evt: MouseEvent, targetEl: HTMLElement): void => {
25
+ evt.preventDefault();
26
+ const data = targetEl.closest('span').dataset;
27
+ ElementBrowser.insertElement(
28
+ data.table,
29
+ data.uid,
30
+ data.title,
31
+ '',
32
+ parseInt(targetEl.dataset.close || '0', 10) === 1,
33
+ );
34
+ }).delegateTo(document, '[data-close]');
35
+ }
36
+ }
37
+
38
+ export default new BrowseDatabase();
@@ -0,0 +1,88 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
15
+ import Notification from '@typo3/backend/notification';
16
+ import Icons from '@typo3/backend/icons';
17
+ import RegularEvent from '@typo3/core/event/regular-event';
18
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
19
+
20
+ enum Identifiers {
21
+ clearCache = '.t3js-clear-page-cache',
22
+ icon = '.t3js-icon',
23
+ }
24
+
25
+ /**
26
+ * Module: @typo3/backend/clear-cache
27
+ */
28
+ class ClearCache {
29
+ constructor() {
30
+ this.registerClickHandler();
31
+ }
32
+
33
+ private static setDisabled(element: HTMLButtonElement, isDisabled: boolean): void {
34
+ element.disabled = isDisabled;
35
+ element.classList.toggle('disabled', isDisabled);
36
+ }
37
+
38
+ /**
39
+ * Send an AJAX request to clear a page's cache
40
+ *
41
+ * @param {number} pageId
42
+ * @return Promise<AjaxResponse>
43
+ */
44
+ private static sendClearCacheRequest(pageId: number): Promise<AjaxResponse> {
45
+ const request = new AjaxRequest(TYPO3.settings.ajaxUrls.web_list_clearpagecache).withQueryArguments({ id: pageId }).get({ cache: 'no-cache' });
46
+ request.then(async (response: AjaxResponse): Promise<void> => {
47
+ const data = await response.resolve();
48
+ if (data.success === true) {
49
+ Notification.success(data.title, data.message, 1);
50
+ } else {
51
+ Notification.error(data.title, data.message, 1);
52
+ }
53
+ }, (): void => {
54
+ Notification.error(
55
+ 'Clearing page caches went wrong on the server side.',
56
+ );
57
+ });
58
+
59
+ return request;
60
+ }
61
+
62
+ private registerClickHandler(): void {
63
+ const trigger = document.querySelector(`${Identifiers.clearCache}:not([disabled])`);
64
+ if (trigger !== null) {
65
+ new RegularEvent('click', (e: Event): void => {
66
+ e.preventDefault();
67
+
68
+ // The action trigger behaves like a button
69
+ const me = e.currentTarget as HTMLButtonElement;
70
+ const id = parseInt(me.dataset.id, 10);
71
+ ClearCache.setDisabled(me, true);
72
+
73
+ Icons.getIcon('spinner-circle', Icons.sizes.small, null, 'disabled').then((icon: string): void => {
74
+ me.querySelector(Identifiers.icon).outerHTML = icon;
75
+ });
76
+
77
+ ClearCache.sendClearCacheRequest(id).finally((): void => {
78
+ Icons.getIcon('actions-system-cache-clear', Icons.sizes.small).then((icon: string): void => {
79
+ me.querySelector(Identifiers.icon).outerHTML = icon;
80
+ });
81
+ ClearCache.setDisabled(me, false);
82
+ });
83
+ }).bindTo(trigger);
84
+ }
85
+ }
86
+ }
87
+
88
+ export default new ClearCache();