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,539 @@
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 NProgress from 'nprogress';
16
+ import '@typo3/backend/input/clearable';
17
+ import '@typo3/backend/element/alert-element';
18
+ import '@typo3/backend/element/icon-element';
19
+ import '@typo3/backend/element/pagination';
20
+ import DeferredAction from '@typo3/backend/action-button/deferred-action';
21
+ import Modal from '@typo3/backend/modal';
22
+ import Notification from '@typo3/backend/notification';
23
+ import { SeverityEnum } from '@typo3/backend/enum/severity';
24
+ import RegularEvent from '@typo3/core/event/regular-event';
25
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
26
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
27
+
28
+ enum Identifiers {
29
+ searchForm = '#recycler-form',
30
+ searchText = '#recycler-form [name=search-text]',
31
+ searchSubmitBtn = '#recycler-form button[type=submit]',
32
+ depthSelector = '#recycler-form [name=depth]',
33
+ tableSelector = '#recycler-form [name=pages]',
34
+ recyclerTable = '#itemsInRecycler',
35
+ paginator = '#recycler-index nav',
36
+ reloadAction = 'a[data-action=reload]',
37
+ undo = 'button[data-action=undo]',
38
+ delete = 'button[data-action=delete]',
39
+ massUndo = 'button[data-multi-record-selection-action=massundo]',
40
+ massDelete = 'button[data-multi-record-selection-action=massdelete]',
41
+ }
42
+
43
+ type RecordToDelete = string;
44
+
45
+ /**
46
+ * Module: @typo3/recycler/recycler
47
+ * JavaScript module for Recycler
48
+ */
49
+ class Recycler {
50
+ public paging: Record<string, number> = {
51
+ currentPage: 1,
52
+ totalPages: 1,
53
+ totalItems: 0,
54
+ itemsPerPage: parseInt(TYPO3.settings.Recycler.pagingSize, 10),
55
+ };
56
+ public markedRecordsForMassAction: RecordToDelete[] = [];
57
+
58
+ constructor() {
59
+ DocumentService.ready().then((): void => {
60
+ this.initialize();
61
+ });
62
+ }
63
+
64
+ /**
65
+ * Reloads the page tree
66
+ */
67
+ public static refreshPageTree(): void {
68
+ top.document.dispatchEvent(new CustomEvent('typo3:pagetree:refresh'));
69
+ }
70
+
71
+ /**
72
+ * Register events
73
+ */
74
+ private registerEvents(): void {
75
+ new RegularEvent('submit', (event: SubmitEvent) => {
76
+ event.preventDefault();
77
+
78
+ const searchTextField = document.querySelector(Identifiers.searchText) as HTMLInputElement;
79
+ if (searchTextField.value !== '') {
80
+ this.loadDeletedElements();
81
+ }
82
+ }).delegateTo(document, Identifiers.searchForm);
83
+
84
+ // changing the search field
85
+ new RegularEvent('input', (event: Event, target: HTMLInputElement) => {
86
+ const searchSubmitButton = document.querySelector(Identifiers.searchSubmitBtn) as HTMLButtonElement;
87
+
88
+ if (target.value !== '') {
89
+ searchSubmitButton.disabled = false;
90
+ } else {
91
+ searchSubmitButton.disabled = true;
92
+ this.loadDeletedElements();
93
+ }
94
+ }).delegateTo(document, Identifiers.searchText);
95
+
96
+ // changing "depth"
97
+ new RegularEvent('change', () => {
98
+ this.loadAvailableTables().then((): void => {
99
+ this.loadDeletedElements();
100
+ });
101
+ }).delegateTo(document, Identifiers.depthSelector);
102
+
103
+ // changing "table"
104
+ new RegularEvent('change', () => {
105
+ this.paging.currentPage = 1;
106
+ this.loadDeletedElements();
107
+ }).delegateTo(document, Identifiers.tableSelector);
108
+
109
+ // clicking "recover" in single row
110
+ new RegularEvent('click', this.undoRecord.bind(this)).delegateTo(document, Identifiers.undo);
111
+
112
+ // clicking "delete" in single row
113
+ new RegularEvent('click', this.deleteRecord.bind(this)).delegateTo(document, Identifiers.delete);
114
+
115
+ new RegularEvent('click', (event: Event) => {
116
+ event.preventDefault();
117
+ this.loadAvailableTables().then((): void => {
118
+ this.loadDeletedElements();
119
+ });
120
+ }).delegateTo(document, Identifiers.reloadAction);
121
+
122
+ (document.querySelector(Identifiers.searchText) as HTMLInputElement).clearable(
123
+ {
124
+ onClear: () => {
125
+ const searchSubmitButton = document.querySelector(Identifiers.searchSubmitBtn) as HTMLButtonElement;
126
+ searchSubmitButton.disabled = true;
127
+ this.loadDeletedElements();
128
+ },
129
+ },
130
+ );
131
+
132
+ // clicking an action in the paginator
133
+ new RegularEvent('click', (event: Event) => {
134
+ event.preventDefault();
135
+
136
+ const paginator = (event.target as HTMLElement).closest('button') as HTMLButtonElement;
137
+
138
+ if (!paginator) {
139
+ return;
140
+ }
141
+
142
+ if (paginator.dataset.action === 'previous') {
143
+ if (this.paging.currentPage > 1) {
144
+ this.paging.currentPage--;
145
+ }
146
+ } else if (paginator.dataset.action === 'next') {
147
+ if (this.paging.currentPage < this.paging.totalPages) {
148
+ this.paging.currentPage++;
149
+ }
150
+ } else if (paginator.dataset.action === 'page') {
151
+ this.paging.currentPage = parseInt(paginator.querySelector('span').textContent, 10);
152
+ }
153
+
154
+ this.loadDeletedElements();
155
+ }).delegateTo(document, Identifiers.paginator);
156
+
157
+ // checkboxes in the table
158
+ new RegularEvent('multiRecordSelection:checkbox:state:changed', this.handleCheckboxStateChanged.bind(this)).bindTo(document);
159
+ new RegularEvent('multiRecordSelection:action:massundo', this.undoRecord.bind(this)).bindTo(document);
160
+ new RegularEvent('multiRecordSelection:action:massdelete', this.deleteRecord.bind(this)).bindTo(document);
161
+ }
162
+
163
+ /**
164
+ * Initialize the recycler module
165
+ */
166
+ private initialize(): void {
167
+ NProgress.configure({ parent: '.module-loading-indicator', showSpinner: false });
168
+
169
+ this.registerEvents();
170
+
171
+ if (TYPO3.settings.Recycler.depthSelection > 0) {
172
+ (document.querySelector(Identifiers.depthSelector) as HTMLInputElement).value = String(TYPO3.settings.Recycler.depthSelection);
173
+ }
174
+
175
+ this.loadAvailableTables().then((): void => {
176
+ this.loadDeletedElements();
177
+ });
178
+ }
179
+
180
+ /**
181
+ * Handles the clicks on checkboxes in the records table
182
+ */
183
+ private handleCheckboxStateChanged(event: Event): void {
184
+ const checkbox = event.target as HTMLInputElement;
185
+ const tableRow = checkbox.closest('tr') as HTMLTableRowElement;
186
+ const table = tableRow.dataset.table;
187
+ const uid = tableRow.dataset.uid;
188
+ const record = table + ':' + uid;
189
+
190
+ if (checkbox.checked) {
191
+ this.markedRecordsForMassAction.push(record);
192
+ } else {
193
+ const index = this.markedRecordsForMassAction.indexOf(record);
194
+ if (index > -1) {
195
+ this.markedRecordsForMassAction.splice(index, 1);
196
+ }
197
+ }
198
+
199
+ if (this.markedRecordsForMassAction.length > 0) {
200
+ const massUndo = document.querySelector(Identifiers.massUndo) as HTMLButtonElement;
201
+
202
+ massUndo.querySelector('span.text')
203
+ .textContent = this.createMessage(TYPO3.lang['button.undoselected'], [this.markedRecordsForMassAction.length.toString(10)]);
204
+
205
+ if (!TYPO3.settings.Recycler.deleteDisable) {
206
+ const massDelete = document.querySelector(Identifiers.massDelete) as HTMLButtonElement;
207
+ massDelete.querySelector('span.text')
208
+ .textContent = this.createMessage(TYPO3.lang['button.deleteselected'], [this.markedRecordsForMassAction.length.toString(10)]);
209
+ }
210
+ } else {
211
+ this.resetMassActionButtons();
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Resets the mass action state
217
+ */
218
+ private resetMassActionButtons(): void {
219
+ const massUndo = document.querySelector(Identifiers.massUndo) as HTMLButtonElement;
220
+
221
+ this.markedRecordsForMassAction = [];
222
+ massUndo.querySelector('span.text').textContent = TYPO3.lang['button.undo'];
223
+
224
+ if (!TYPO3.settings.Recycler.deleteDisable) {
225
+ const massDelete = document.querySelector(Identifiers.massDelete) as HTMLButtonElement;
226
+ massDelete.querySelector('span.text').textContent = TYPO3.lang['button.delete'];
227
+ }
228
+
229
+ document.dispatchEvent(new CustomEvent('multiRecordSelection:actions:hide'));
230
+ }
231
+
232
+ /**
233
+ * Loads all tables which contain deleted records.
234
+ */
235
+ private async loadAvailableTables(): Promise<AjaxResponse> {
236
+ const tableSelector = document.querySelector(Identifiers.tableSelector) as HTMLSelectElement;
237
+ const depthSelector = document.querySelector(Identifiers.depthSelector) as HTMLSelectElement;
238
+
239
+ NProgress.start();
240
+ tableSelector.value = '';
241
+ this.paging.currentPage = 1;
242
+
243
+ return new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).withQueryArguments({
244
+ action: 'getTables',
245
+ startUid: TYPO3.settings.Recycler.startUid,
246
+ depth: depthSelector.value,
247
+ }).get().then(async (response: AjaxResponse): Promise<AjaxResponse> => {
248
+ const data = await response.resolve();
249
+ const tables: Array<HTMLOptionElement> = [];
250
+
251
+ tableSelector.replaceChildren();
252
+ for (const value of data) {
253
+ const tableName = value[0];
254
+ const deletedRecords = value[1];
255
+ const tableDescription = value[2] ? value[2] : TYPO3.lang.label_allrecordtypes;
256
+ const optionText = tableDescription + ' (' + deletedRecords + ')';
257
+
258
+ const option = document.createElement('option');
259
+ option.value = tableName;
260
+ option.textContent = optionText;
261
+
262
+ tables.push(option);
263
+ }
264
+
265
+ if (tables.length > 0) {
266
+ tableSelector.append(...tables);
267
+ if (TYPO3.settings.Recycler.tableSelection !== '') {
268
+ tableSelector.value = TYPO3.settings.Recycler.tableSelection;
269
+ }
270
+ }
271
+
272
+ return response;
273
+ }).finally(() => NProgress.done());
274
+ }
275
+
276
+ /**
277
+ * Loads the deleted elements, based on the filters
278
+ */
279
+ private async loadDeletedElements(): Promise<AjaxResponse> {
280
+ const depthSelector = document.querySelector(Identifiers.depthSelector) as HTMLSelectElement;
281
+ const tableSelector = document.querySelector(Identifiers.tableSelector) as HTMLSelectElement;
282
+ const searchTextField = document.querySelector(Identifiers.searchText) as HTMLInputElement;
283
+
284
+ NProgress.start();
285
+ this.resetMassActionButtons();
286
+
287
+ return new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).withQueryArguments({
288
+ action: 'getDeletedRecords',
289
+ depth: depthSelector.value,
290
+ startUid: TYPO3.settings.Recycler.startUid,
291
+ table: tableSelector.value,
292
+ filterTxt: searchTextField.value,
293
+ start: (this.paging.currentPage - 1) * this.paging.itemsPerPage,
294
+ limit: this.paging.itemsPerPage,
295
+ }).get().then(async (response: AjaxResponse): Promise<AjaxResponse> => {
296
+ const tableWrapper = document.querySelector(Identifiers.recyclerTable);
297
+ const tableBody = tableWrapper.querySelector('tbody');
298
+ const data = await response.resolve();
299
+
300
+ if (data.totalItems === 0) {
301
+ if (tableWrapper.parentElement.querySelector('#no-recycler-records') === null) {
302
+ const alertElement = document.createElement('typo3-backend-alert');
303
+ alertElement.id = 'no-recycler-records';
304
+ alertElement.severity = SeverityEnum.info;
305
+ alertElement.message = TYPO3.lang['alert.noDeletedRecords'];
306
+ alertElement.showIcon = true;
307
+ tableWrapper.parentElement.insertBefore(alertElement, tableWrapper);
308
+ }
309
+ } else {
310
+ tableWrapper.parentElement.querySelector('#no-recycler-records')?.remove();
311
+ tableBody.innerHTML = data.rows;
312
+ }
313
+ tableWrapper.toggleAttribute('hidden', data.totalItems === 0);
314
+ this.buildPaginator(data.totalItems);
315
+
316
+ return response;
317
+ }).finally(() => NProgress.done());
318
+ }
319
+
320
+ private deleteRecord(event: Event, currentTarget: HTMLElement): void {
321
+ if (TYPO3.settings.Recycler.deleteDisable) {
322
+ return;
323
+ }
324
+
325
+ const target = currentTarget ? currentTarget : event.target as HTMLElement;
326
+ const tableRow = target.closest('tr') as HTMLTableRowElement;
327
+ const isMassDelete = tableRow === null || tableRow.parentElement.tagName !== 'TBODY'; // deleteRecord() was invoked by the mass delete button
328
+ let records: Array<string>;
329
+ let message: string;
330
+
331
+ if (isMassDelete) {
332
+ records = this.markedRecordsForMassAction;
333
+ message = TYPO3.lang['modal.massdelete.text'];
334
+ } else {
335
+ const uid = tableRow.dataset.uid;
336
+ const table = tableRow.dataset.table;
337
+ const recordTitle = tableRow.dataset.recordtitle;
338
+ records = [table + ':' + uid];
339
+ message = table === 'pages' ? TYPO3.lang['modal.deletepage.text'] : TYPO3.lang['modal.deletecontent.text'];
340
+ message = this.createMessage(message, [recordTitle, '[' + records[0] + ']']);
341
+ }
342
+
343
+ Modal.advanced({
344
+ title: TYPO3.lang['modal.delete.header'],
345
+ content: message,
346
+ severity: SeverityEnum.error,
347
+ staticBackdrop: true,
348
+ buttons: [
349
+ {
350
+ text: TYPO3.lang['button.cancel'],
351
+ btnClass: 'btn-default',
352
+ trigger: function(): void {
353
+ Modal.dismiss();
354
+ },
355
+ }, {
356
+ text: TYPO3.lang['button.delete'],
357
+ btnClass: 'btn-danger',
358
+ action: new DeferredAction(() => {
359
+ this.callAjaxAction('delete', records, isMassDelete);
360
+ }),
361
+ },
362
+ ]
363
+ });
364
+ }
365
+
366
+ private undoRecord(event: Event, currentTarget: HTMLElement): void {
367
+ const target = currentTarget ? currentTarget : event.target as HTMLElement;
368
+ const tableRow = target.closest('tr') as HTMLTableRowElement;
369
+ const isMassUndo = tableRow === null || tableRow.parentElement.tagName !== 'TBODY'; // undoRecord() was invoked by the mass delete button
370
+ let records: Array<string>;
371
+ let messageText: string;
372
+ let recoverPages: boolean;
373
+
374
+ if (isMassUndo) {
375
+ records = this.markedRecordsForMassAction;
376
+ messageText = TYPO3.lang['modal.massundo.text'];
377
+ recoverPages = true;
378
+ } else {
379
+ const uid = tableRow.dataset.uid;
380
+ const table = tableRow.dataset.table;
381
+ const recordTitle = tableRow.dataset.recordtitle;
382
+
383
+ records = [table + ':' + uid];
384
+ recoverPages = table === 'pages';
385
+ messageText = recoverPages ? TYPO3.lang['modal.undopage.text'] : TYPO3.lang['modal.undocontent.text'];
386
+ messageText = this.createMessage(messageText, [recordTitle, '[' + records[0] + ']']);
387
+
388
+ if (recoverPages && tableRow.dataset.parentDeleted) {
389
+ messageText += TYPO3.lang['modal.undo.parentpages'];
390
+ }
391
+ }
392
+
393
+ let message: Element = null;
394
+ if (recoverPages) {
395
+ const wrapper = document.createElement('div');
396
+
397
+ const paragraph = document.createElement('p');
398
+ paragraph.textContent = messageText;
399
+
400
+ const checkboxWrapper = document.createElement('div');
401
+ checkboxWrapper.classList.add('form-check');
402
+
403
+ const checkbox = document.createElement('input');
404
+ checkbox.type = 'checkbox';
405
+ checkbox.id = 'undo-recursive';
406
+ checkbox.classList.add('form-check-input');
407
+
408
+ const label = document.createElement('label');
409
+ label.classList.add('form-check-label');
410
+ label.htmlFor = 'undo-recursive';
411
+ label.textContent = TYPO3.lang['modal.undo.recursive'];
412
+
413
+ checkboxWrapper.append(checkbox, label);
414
+ wrapper.append(paragraph, checkboxWrapper);
415
+
416
+ message = wrapper;
417
+ } else {
418
+ const paragraph = document.createElement('p');
419
+ paragraph.textContent = messageText;
420
+ message = paragraph;
421
+ }
422
+
423
+ Modal.advanced({
424
+ title: TYPO3.lang['modal.undo.header'],
425
+ content: message,
426
+ severity: SeverityEnum.ok,
427
+ staticBackdrop: true,
428
+ buttons: [
429
+ {
430
+ text: TYPO3.lang['button.cancel'],
431
+ btnClass: 'btn-default',
432
+ trigger: function(): void {
433
+ Modal.dismiss();
434
+ },
435
+ }, {
436
+ text: TYPO3.lang['button.undo'],
437
+ btnClass: 'btn-success',
438
+ action: new DeferredAction(() => {
439
+ this.callAjaxAction(
440
+ 'undo',
441
+ typeof records === 'object' ? records : [records],
442
+ isMassUndo,
443
+ (message.querySelector('#undo-recursive') as HTMLInputElement)?.checked,
444
+ );
445
+ }),
446
+ },
447
+ ]
448
+ });
449
+ }
450
+
451
+ private async callAjaxAction(action: string, records: RecordToDelete[], isMassAction: boolean, recursive: boolean = false): Promise<AjaxResponse>|null {
452
+ const data: { records: RecordToDelete[], action: string, recursive?: number } = {
453
+ records: records,
454
+ action: '',
455
+ };
456
+ let reloadPageTree: boolean = false;
457
+ if (action === 'undo') {
458
+ data.action = 'undoRecords';
459
+ data.recursive = recursive ? 1 : 0;
460
+ reloadPageTree = true;
461
+ } else if (action === 'delete') {
462
+ data.action = 'deleteRecords';
463
+ } else {
464
+ return null;
465
+ }
466
+
467
+ NProgress.start();
468
+ return new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).post(data).then(async (response: AjaxResponse): Promise<AjaxResponse> => {
469
+ const responseData = await response.resolve();
470
+
471
+ if (responseData.success) {
472
+ Notification.success('', responseData.message);
473
+ } else {
474
+ Notification.error('', responseData.message);
475
+ }
476
+
477
+ // reload recycler data
478
+ this.paging.currentPage = 1;
479
+
480
+ this.loadAvailableTables().then((): void => {
481
+ this.loadDeletedElements();
482
+ if (isMassAction) {
483
+ this.resetMassActionButtons();
484
+ }
485
+
486
+ if (reloadPageTree) {
487
+ Recycler.refreshPageTree();
488
+ }
489
+ });
490
+
491
+ return response;
492
+ });
493
+ }
494
+
495
+ /**
496
+ * Replaces the placeholders with actual values
497
+ */
498
+ private createMessage(message: string, placeholders: string[]): string {
499
+ if (typeof message === 'undefined') {
500
+ return '';
501
+ }
502
+
503
+ return message.replace(
504
+ /\{([0-9]+)\}/g,
505
+ function(_: string, index: number): string {
506
+ return placeholders[index];
507
+ },
508
+ );
509
+ }
510
+
511
+
512
+ /**
513
+ * Build the paginator
514
+ */
515
+ private buildPaginator(totalItems: number): void {
516
+ const paginator = document.querySelector(Identifiers.paginator);
517
+
518
+ if (totalItems === 0) {
519
+ paginator.replaceChildren();
520
+ return;
521
+ }
522
+
523
+ this.paging.totalItems = totalItems;
524
+ this.paging.totalPages = Math.ceil(totalItems / this.paging.itemsPerPage);
525
+
526
+ if (this.paging.totalPages === 1) {
527
+ // early abort if only one page is available
528
+ paginator.replaceChildren();
529
+ return;
530
+ }
531
+
532
+ const pagination = document.createElement('typo3-backend-pagination');
533
+ pagination.paging = this.paging;
534
+
535
+ paginator.replaceChildren(pagination);
536
+ }
537
+ }
538
+
539
+ export default new Recycler();
@@ -0,0 +1,108 @@
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 AjaxRequest from '@typo3/core/ajax/ajax-request';
16
+ import NotificationService from '@typo3/backend/notification';
17
+ import DeferredAction from '@typo3/backend/action-button/deferred-action';
18
+ import type { AbstractAction } from '@typo3/backend/action-button/abstract-action';
19
+
20
+ type Correlation = {
21
+ correlationIdSlugUpdate: string;
22
+ correlationIdRedirectCreation: string;
23
+ };
24
+
25
+ type SlugChangeDetail = {
26
+ correlations: Correlation;
27
+ autoUpdateSlugs: boolean;
28
+ autoCreateRedirects: boolean;
29
+ };
30
+
31
+ /**
32
+ * Module: @typo3/redirects/event-handler
33
+ * @exports @typo3/redirects/event-handler
34
+ */
35
+ class EventHandler {
36
+ public constructor() {
37
+ document.addEventListener(
38
+ 'typo3:redirects:slugChanged',
39
+ (evt: CustomEvent) => this.onSlugChanged(evt.detail),
40
+ );
41
+ }
42
+
43
+ public dispatchCustomEvent(name: string, detail: any = null): void {
44
+ const event = new CustomEvent(name, { detail: detail });
45
+ document.dispatchEvent(event);
46
+ }
47
+
48
+ public onSlugChanged(detail: SlugChangeDetail): void {
49
+ const actions: { label: string; action: AbstractAction }[] = [];
50
+ const correlations = detail.correlations;
51
+
52
+ if (detail.autoUpdateSlugs) {
53
+ actions.push({
54
+ label: TYPO3.lang['notification.redirects.button.revert_update'],
55
+ action: new DeferredAction(async () => {
56
+ await this.revert([
57
+ correlations.correlationIdSlugUpdate,
58
+ correlations.correlationIdRedirectCreation,
59
+ ]);
60
+ }),
61
+ });
62
+ }
63
+ if (detail.autoCreateRedirects) {
64
+ actions.push({
65
+ label: TYPO3.lang['notification.redirects.button.revert_redirect'],
66
+ action: new DeferredAction(async () => {
67
+ await this.revert([
68
+ correlations.correlationIdRedirectCreation,
69
+ ]);
70
+ }),
71
+ });
72
+ }
73
+
74
+ let title = TYPO3.lang['notification.slug_only.title'];
75
+ let message = TYPO3.lang['notification.slug_only.message'];
76
+ if (detail.autoCreateRedirects) {
77
+ title = TYPO3.lang['notification.slug_and_redirects.title'];
78
+ message = TYPO3.lang['notification.slug_and_redirects.message'];
79
+ }
80
+ NotificationService.info(
81
+ title,
82
+ message,
83
+ 0,
84
+ actions,
85
+ );
86
+ }
87
+
88
+ private revert(correlationIds: string[]): Promise<AjaxResponse> {
89
+ const request = new AjaxRequest(TYPO3.settings.ajaxUrls.redirects_revert_correlation).withQueryArguments({
90
+ correlation_ids: correlationIds
91
+ }).get();
92
+
93
+ request.then(async (response: AjaxResponse): Promise<void> => {
94
+ const json = await response.resolve();
95
+ if (json.status === 'ok') {
96
+ NotificationService.success(json.title, json.message);
97
+ }
98
+ if (json.status === 'error') {
99
+ NotificationService.error(json.title, json.message);
100
+ }
101
+ }).catch((): void => {
102
+ NotificationService.error(TYPO3.lang.redirects_error_title, TYPO3.lang.redirects_error_message);
103
+ });
104
+ return request;
105
+ }
106
+ }
107
+
108
+ export default new EventHandler();
@@ -0,0 +1,34 @@
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 FormEngineValidation from '@typo3/backend/form-engine-validation';
15
+
16
+ /**
17
+ * Module: @typo3/redirects/form-engine-evaluation
18
+ * @exports @typo3/redirects/form-engine-evaluation
19
+ */
20
+ export class FormEngineEvaluation {
21
+ static registerCustomEvaluation(name: string): void {
22
+ FormEngineValidation.registerCustomEvaluation(name, FormEngineEvaluation.evaluateSourceHost);
23
+ }
24
+
25
+ public static evaluateSourceHost(value: string): string {
26
+ if (value === '*') {
27
+ return value;
28
+ }
29
+ if (!value.includes('://')) {
30
+ value = 'http://' + value;
31
+ }
32
+ return (new URL(value)).host;
33
+ }
34
+ }