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,114 @@
1
+ import * as Core from '@ckeditor/ckeditor5-core';
2
+ import * as UI from '@ckeditor/ckeditor5-ui';
3
+ import * as Utils from '@ckeditor/ckeditor5-utils';
4
+ import * as Typing from '@ckeditor/ckeditor5-typing';
5
+ import type { InsertTextCommand } from '@ckeditor/ckeditor5-typing';
6
+
7
+ /**
8
+ * CKEditor 5 Whitespace Plugin
9
+ *
10
+ * Add support for non breaking spaces
11
+ * - Make non breaking spaces visible
12
+ * - Shortcut for adding non breaking space:
13
+ * - alt+shift+space on MacOS
14
+ * - ctrl+shift+space on all other Systems
15
+ *
16
+ * Add support for soft hyphen
17
+ * - Make soft hyphens visible
18
+ * - Register button for editor ui: softhyphen
19
+ * - Shortcut for adding non breaking space:
20
+ * - alt+shift+dash on MacOS
21
+ * - ctrl+shift+dash on all other Systems
22
+ */
23
+ export class Whitespace extends Core.Plugin {
24
+ static readonly pluginName = 'Whitespace';
25
+ static readonly requires = [ Typing.Typing ] as const;
26
+
27
+ public init(): void {
28
+ const editor = this.editor;
29
+ const inputCommand: InsertTextCommand = editor.commands.get('insertText');
30
+
31
+ // CKEditor should map Ctrl to Cmd on MacOs, but for
32
+ // some reason the shortcut is blocked and cannot be
33
+ // overwritten.
34
+ //
35
+ // For this reason we are using "Alt" as controlKey on MacOS.
36
+ // All other System use "Ctrl" as controlKey.
37
+ const controlKey = Utils.env.isMac ? 'Alt' : 'Ctrl';
38
+
39
+ editor.ui.componentFactory.add('softhyphen', locale => {
40
+ const button = new UI.ButtonView(locale);
41
+ button.label = 'Soft-Hyphen';
42
+ button.icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" xml:space="preserve"><path d="M4.25 3C3.082 4.683 2 6.917 2 10.026 2 13.083 3.114 15.282 4.25 17H3c-1.008-1.425-2-3.624-2-6.974.016-3.384.992-5.583 2-7.026h1.25zM17 3c1.008 1.443 1.984 3.642 2 7.026 0 3.35-.992 5.549-2 6.974h-1.25c1.136-1.718 2.25-3.917 2.25-6.974 0-3.11-1.082-5.343-2.25-7.026H17zM6 9h8v2H6z"/></svg>';
43
+ button.keystroke = `${controlKey}+Shift+-`;
44
+ button.tooltip = true;
45
+ button.bind('isEnabled').to(inputCommand);
46
+ button.on('execute', () => this.insertSoftHyphen());
47
+ return button;
48
+ });
49
+
50
+ editor.keystrokes.set([controlKey, 'Shift', 189], (data, cancel) => {
51
+ this.insertSoftHyphen();
52
+ cancel();
53
+ });
54
+
55
+ editor.keystrokes.set([controlKey, 'Shift', 'Space'], (data, cancel) => {
56
+ this.insertNonBreakingSpace();
57
+ cancel();
58
+ });
59
+
60
+ editor.conversion.for('editingDowncast').add(downcastDispatcher => {
61
+ downcastDispatcher.on('insert:$text', (evt, data, conversionApi) => {
62
+ if (!conversionApi.consumable.consume(data.item, evt.name)) {
63
+ return;
64
+ }
65
+
66
+ const viewWriter = conversionApi.writer;
67
+ const chunks = data.item.data
68
+ // Using a regex caputure group in order for the
69
+ // split chars to be included in the `chunks` array
70
+ .split(/([\u00AD\u00A0])/)
71
+ .filter((value: string) => value !== '');
72
+ let currentPosition = data.range.start;
73
+
74
+ chunks.forEach((chunk: string) => {
75
+ const text = chunk === '\u00AD' ? '-' : chunk;
76
+ viewWriter.insert(
77
+ conversionApi.mapper.toViewPosition(currentPosition),
78
+ viewWriter.createText(text)
79
+ );
80
+
81
+ if (chunk === '\u00AD' || chunk === '\u00A0') {
82
+ const className = chunk === '\u00AD' ? 'softhyphen' : 'nbsp';
83
+ const id = Math.random().toString(16).slice(2);
84
+ const wrapper = viewWriter.createAttributeElement('span', { class: `ck ck-${className}` }, { id });
85
+ const wrapperRange = viewWriter.createRange(
86
+ conversionApi.mapper.toViewPosition(currentPosition),
87
+ conversionApi.mapper.toViewPosition(currentPosition.getShiftedBy(chunk.length))
88
+ );
89
+ viewWriter.wrap(wrapperRange, wrapper);
90
+ }
91
+
92
+ currentPosition = currentPosition.getShiftedBy(chunk.length);
93
+ });
94
+ }, { priority: 'high' });
95
+ });
96
+ }
97
+
98
+ private insertNonBreakingSpace(): void {
99
+ const editor = this.editor;
100
+
101
+ editor.execute('insertText', { text: '\u00A0' });
102
+ editor.editing.view.focus();
103
+ }
104
+
105
+ private insertSoftHyphen(): void {
106
+ const editor = this.editor;
107
+
108
+ editor.execute('insertText', { text: '\u00AD' });
109
+ editor.editing.view.focus();
110
+ }
111
+ }
112
+
113
+ // Provided for backwards compatibility
114
+ export default Whitespace;
@@ -0,0 +1,112 @@
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 LinkBrowser, { type LinkAttributes } from '@typo3/backend/link-browser';
15
+ import Modal from '@typo3/backend/modal';
16
+ import RegularEvent from '@typo3/core/event/regular-event';
17
+ import { type Typo3LinkDict, LINK_ALLOWED_ATTRIBUTES, addLinkPrefix } from '@typo3/rte-ckeditor/plugin/typo3-link';
18
+ import type * as Core from '@ckeditor/ckeditor5-core';
19
+ import type { ModelPosition } from '@ckeditor/ckeditor5-engine/src/model/position';
20
+
21
+ /**
22
+ * Module: @typo3/rte-ckeditor/rte-link-browser
23
+ * LinkBrowser communication with parent window
24
+ */
25
+ class RteLinkBrowser {
26
+ protected editor: Core.Editor = null;
27
+ protected selectionStartPosition: ModelPosition = null;
28
+ protected selectionEndPosition: ModelPosition = null;
29
+
30
+ public initialize(): void {
31
+ this.editor = Modal.currentModal.userData.editor;
32
+ this.selectionStartPosition = Modal.currentModal.userData.selectionStartPosition;
33
+ this.selectionEndPosition = Modal.currentModal.userData.selectionEndPosition;
34
+
35
+ const removeLinkElement = document.querySelector('.t3js-removeCurrentLink');
36
+ if (removeLinkElement !== null) {
37
+ new RegularEvent('click', (e: Event): void => {
38
+ e.preventDefault();
39
+ this.restoreSelection();
40
+ this.editor.execute('unlink');
41
+ Modal.dismiss();
42
+ }).bindTo(removeLinkElement);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Store the final link
48
+ *
49
+ * @param {String} link The select element or anything else which identifies the link (e.g. "page:<pageUid>" or "file:<uid>")
50
+ */
51
+ public finalizeFunction(link: string): void {
52
+ const attributes = LinkBrowser.getLinkAttributeValues();
53
+ const queryParams = attributes.params ? attributes.params : '';
54
+ delete attributes.params;
55
+
56
+ const linkText = ''; // @todo future feature: e.g. add page title as link-text (if applicable)
57
+ const linkAttrs = this.convertAttributes(attributes, linkText);
58
+
59
+ this.restoreSelection();
60
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
61
+ // @ts-ignore
62
+ this.editor.execute('link', this.sanitizeLink(link, queryParams), linkAttrs);
63
+
64
+ Modal.dismiss();
65
+ }
66
+
67
+ private restoreSelection(): void {
68
+ this.editor.model.change((writer) => {
69
+ const ranges = [writer.createRange(this.selectionStartPosition, this.selectionEndPosition)];
70
+ writer.setSelection(ranges);
71
+ });
72
+ }
73
+
74
+ private convertAttributes(attributes: LinkAttributes, text?: string): Typo3LinkDict {
75
+ const linkAttr: { attrs: { [key: string]: string}, linkText?: string} = { attrs: {} };
76
+ for (const [attribute, value] of Object.entries(attributes)) {
77
+ if (LINK_ALLOWED_ATTRIBUTES.includes(attribute)) {
78
+ linkAttr.attrs[addLinkPrefix(attribute)] = value;
79
+ }
80
+ }
81
+ if (typeof text === 'string' && text !== '') {
82
+ linkAttr.linkText = text;
83
+ }
84
+ return linkAttr as Typo3LinkDict;
85
+ }
86
+
87
+ private sanitizeLink(link: string, queryParams: string): string {
88
+ // @todo taken from previous code - enhance generation
89
+ // Make sure, parameters and anchor are in correct order
90
+ const linkMatch = link.match(/^([a-z0-9]+:\/\/[^:/?#]+(?:\/?[^?#]*)?)(\??[^#]*)(#?.*)$/);
91
+ if (linkMatch && linkMatch.length > 0) {
92
+ link = linkMatch[1] + linkMatch[2];
93
+ const paramsPrefix = linkMatch[2].length > 0 ? '&' : '?';
94
+ if (queryParams.length > 0) {
95
+ if (queryParams.startsWith('&')) {
96
+ queryParams = queryParams.substr(1);
97
+ }
98
+ // If params is set, append it
99
+ if (queryParams.length > 0) {
100
+ link += paramsPrefix + queryParams;
101
+ }
102
+ }
103
+ link += linkMatch[3];
104
+ }
105
+ return link;
106
+ }
107
+ }
108
+
109
+ // @todo check whether this is still required - if, document why/where
110
+ const rteLinkBrowser = new RteLinkBrowser();
111
+ export default rteLinkBrowser;
112
+ LinkBrowser.finalizeFunction = (link: string): void => { rteLinkBrowser.finalizeFunction(link); };
@@ -0,0 +1,314 @@
1
+ import { prefixAndRebaseCss } from '@typo3/rte-ckeditor/css-prefixer.js';
2
+ import { expect } from '@open-wc/testing';
3
+ import type { } from 'mocha';
4
+
5
+ describe('@typo3/rte-ckeditor/css-prefixer-test', () => {
6
+ describe('relative URL in css is relocated', () => {
7
+ it('relocates URLs', () => {
8
+ const result = prefixAndRebaseCss(
9
+ `
10
+ foo {
11
+ background-image: url('../foo.png?v=2')
12
+ }
13
+ `,
14
+ '/assets/css/style.css?v=3',
15
+ ''
16
+ );
17
+
18
+ expect(result).to.equal('foo{background-image:url(/assets/foo.png?v=2)}');
19
+ });
20
+ it('relocates URLs with fragment', () => {
21
+ const result = prefixAndRebaseCss(
22
+ `
23
+ foo {
24
+ background-image: url('../foo.png?v=2#bar')
25
+ }
26
+ `,
27
+ '/assets/css/style.css?v=3',
28
+ ''
29
+ );
30
+
31
+ expect(result).to.equal('foo{background-image:url(/assets/foo.png?v=2#bar)}');
32
+ });
33
+ });
34
+ describe('data URI in css is not relocated', () => {
35
+ it('does not relocate data URIs', () => {
36
+ const result = prefixAndRebaseCss(
37
+ `
38
+ foo {
39
+ background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAUAAAAALAAAAAABAAEAQAICRAEAOw==')
40
+ }
41
+ `,
42
+ '/assets/css/style.css?v=3',
43
+ ''
44
+ );
45
+
46
+ expect(result).to.equal('foo{background-image:url(data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAUAAAAALAAAAAABAAEAQAICRAEAOw==)}');
47
+ });
48
+ });
49
+ describe('css is prefixed', () => {
50
+ interface CssDataSet {
51
+ prefix: string,
52
+ source: string,
53
+ target: string,
54
+ }
55
+ function cssIsPrefixedForScssDataProvider(): Record<string, CssDataSet> {
56
+ return {
57
+ mini: {
58
+ prefix: '#foo',
59
+ source: 'div, bar {}',
60
+ target: '#foo div,#foo bar{}',
61
+ },
62
+ rootSelector: {
63
+ prefix: '#foo',
64
+ source: ':root {}',
65
+ target: '#foo{}',
66
+ },
67
+ htmlSelector: {
68
+ prefix: '#foo',
69
+ source: 'html {}',
70
+ target: '#foo{}',
71
+ },
72
+ bodySelector: {
73
+ prefix: '#foo',
74
+ source: 'body {}',
75
+ target: '#foo{}',
76
+ },
77
+ htmlAndBodySelector: {
78
+ prefix: '#foo',
79
+ source: 'html body foo {}',
80
+ target: '#foo foo{}',
81
+ },
82
+ minified: {
83
+ prefix: '#foo .bar',
84
+ source: 'div{color:#abc;}body{color:#abc;}',
85
+ target: '#foo .bar div{color:#abc}\n#foo .bar{color:#abc}',
86
+ },
87
+ chained: {
88
+ prefix: 'foo',
89
+ source: 'body,html{color:#abc}html,body{color:#abc}',
90
+ target: 'foo,foo{color:#abc}\nfoo,foo{color:#abc}',
91
+ },
92
+ emptyIdSelector: {
93
+ prefix: 'foo',
94
+ source: '#html {}',
95
+ target: 'foo #html{}',
96
+ },
97
+ emptyClassSelector: {
98
+ prefix: 'foo',
99
+ source: '.html {}',
100
+ target: 'foo .html{}',
101
+ },
102
+ customElementsSelector: {
103
+ prefix: 'foo',
104
+ source: 'my---html---div { color: #abc; }',
105
+ target: 'foo my---html---div{color:#abc}',
106
+ },
107
+ strangeCustomSelectors: {
108
+ prefix: 'foo',
109
+ source: 'my___html___div { color: #abc; }',
110
+ target: 'foo my___html___div{color:#abc}',
111
+ },
112
+ hasSelector: {
113
+ prefix: 'foo',
114
+ source: 'ul li:has(> p.text-center) { color: red; }',
115
+ target: 'foo ul li:has(>p.text-center){color:red}',
116
+ },
117
+ hasOnRootSelector: {
118
+ prefix: 'foo',
119
+ source: ':root:has(>header) { color: red; }',
120
+ target: 'foo:has(>header){color:red}',
121
+ },
122
+ hasSelectorWithInvalidNestingSelector: {
123
+ prefix: 'foo',
124
+ source: 'ul li:has(& > p.text-center) { color: red; }',
125
+ target: 'foo ul li:has(&>p.text-center){color:red}',
126
+ },
127
+ whereSelector: {
128
+ prefix: 'foo',
129
+ source: ':where(ol, ul) :where(ol, ul) ol { color: red; }',
130
+ target: 'foo :where(ol,ul) :where(ol,ul) ol{color:red}',
131
+ },
132
+ isSelector: {
133
+ prefix: 'foo',
134
+ source: ':is(ol, ul) :is(ol, ul) ol { color: red; }',
135
+ target: 'foo :is(ol,ul) :is(ol,ul) ol{color:red}',
136
+ },
137
+ containerQuery: {
138
+ prefix: 'foo',
139
+ source: '.card h2 { font-size: 1em; } @container (min-width: 700px) { .card h2 { font-size: 2em; } }',
140
+ target: 'foo .card h2{font-size:1em}\n@container (min-width:700px){foo .card h2{font-size:2em}\n}',
141
+ },
142
+ supportsQuery: {
143
+ prefix: 'foo',
144
+ source: '@supports selector(.a) { .a{ display:block } }',
145
+ target: '@supports selector(foo .a){foo .a{display:block}\n}',
146
+ },
147
+ complete: {
148
+ prefix: 'foo',
149
+ source: getOriginCss(),
150
+ target: getPrefixedCss(),
151
+ },
152
+ };
153
+ }
154
+
155
+ for (const [name, dataSet] of Object.entries(cssIsPrefixedForScssDataProvider())) {
156
+ it('can prefix ' + name, () => {
157
+ const target = prefixAndRebaseCss(dataSet.source, 'foo.css', dataSet.prefix)
158
+ .replace(/}/g, '}\n').trim();
159
+ expect(target).to.equal(dataSet.target);
160
+ });
161
+ }
162
+ });
163
+ });
164
+
165
+
166
+ export function getOriginCss() {
167
+ return`
168
+ body{margin:0}
169
+
170
+ html,
171
+ body{margin:0}
172
+
173
+ body,
174
+ html{margin:0}
175
+
176
+ BODY{margin:0}
177
+
178
+ HTML,
179
+ BODY{margin:0}
180
+
181
+ BODY,
182
+ HTML{margin:0}
183
+
184
+ .someclass{padding:0} body,html{margin:0}
185
+
186
+ body {margin:0}
187
+ body { margin:0; }
188
+ body {margin:0}
189
+
190
+ body{
191
+ padding: 0;
192
+ }
193
+
194
+ body{
195
+ padding: 0;
196
+ }
197
+
198
+ body{
199
+ font-family: var(--bs-body-font-family);
200
+ }
201
+
202
+ body,
203
+ body {
204
+ padding: 0;
205
+ }
206
+
207
+ body > :first-child {
208
+ margin-top: 0;
209
+ }
210
+
211
+ body[dir="ltr"] blockquote {
212
+ padding-left: 20px;
213
+ border-left-width: 5px;
214
+ }
215
+
216
+ body[dir="rtl"] ol,
217
+ body[dir="rtl"] ul,
218
+ body[dir="rtl"] dl {
219
+ padding: 0;
220
+ }
221
+
222
+ .some body[dir="rtl"] ol,
223
+ .some body[dir="rtl"] ul,
224
+ .some body[dir="rtl"] dl {
225
+ padding: 0;
226
+ }
227
+
228
+ /* minified version */
229
+ body{margin:0}html,body{margin:0}body,html{margin:0}.someclass{padding:0} body,html{margin:0}body {margin:0}body {margin:0}body{padding: 0;}body{padding: 0;}
230
+
231
+ /* NO CHANGES HERE */
232
+ body-unofindmemargin {
233
+ padding: 0
234
+ }
235
+
236
+ #body {
237
+ padding: 0;
238
+ }
239
+
240
+ .body {}
241
+
242
+ .body-some {}
243
+ .some-body {}
244
+
245
+ html-unofindmemargin {
246
+ padding: 0
247
+ }
248
+
249
+ #html {
250
+ padding: 0;
251
+ }
252
+
253
+ .html {}
254
+
255
+ .html-some {}
256
+ .some-html {}
257
+
258
+ /* minified version */
259
+ body-unofindmemargin {padding: 0} #body {padding: 0;} .body {} .body-some {} .some-body {} html-unofindmemargin {padding: 0} #html {padding: 0;} .html {} .html-some {} .some-html {}
260
+ `;
261
+ }
262
+
263
+ export function getPrefixedCss() {
264
+ return `
265
+ foo{margin:0}
266
+ foo,foo{margin:0}
267
+ foo,foo{margin:0}
268
+ foo{margin:0}
269
+ foo,foo{margin:0}
270
+ foo,foo{margin:0}
271
+ foo .someclass{padding:0}
272
+ foo,foo{margin:0}
273
+ foo{margin:0}
274
+ foo{margin:0}
275
+ foo{margin:0}
276
+ foo{padding:0}
277
+ foo{padding:0}
278
+ foo{font-family:var(--bs-body-font-family)}
279
+ foo,foo{padding:0}
280
+ foo>:first-child{margin-top:0}
281
+ foo[dir="ltr"] blockquote{padding-left:20px;border-left-width:5px}
282
+ foo[dir="rtl"] ol,foo[dir="rtl"] ul,foo[dir="rtl"] dl{padding:0}
283
+ .some foo[dir="rtl"] ol,.some foo[dir="rtl"] ul,.some foo[dir="rtl"] dl{padding:0}
284
+ foo{margin:0}
285
+ foo,foo{margin:0}
286
+ foo,foo{margin:0}
287
+ foo .someclass{padding:0}
288
+ foo,foo{margin:0}
289
+ foo{margin:0}
290
+ foo{margin:0}
291
+ foo{padding:0}
292
+ foo{padding:0}
293
+ foo body-unofindmemargin{padding:0}
294
+ foo #body{padding:0}
295
+ foo .body{}
296
+ foo .body-some{}
297
+ foo .some-body{}
298
+ foo html-unofindmemargin{padding:0}
299
+ foo #html{padding:0}
300
+ foo .html{}
301
+ foo .html-some{}
302
+ foo .some-html{}
303
+ foo body-unofindmemargin{padding:0}
304
+ foo #body{padding:0}
305
+ foo .body{}
306
+ foo .body-some{}
307
+ foo .some-body{}
308
+ foo html-unofindmemargin{padding:0}
309
+ foo #html{padding:0}
310
+ foo .html{}
311
+ foo .html-some{}
312
+ foo .some-html{}
313
+ `.trim();
314
+ }
@@ -0,0 +1,119 @@
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 Modal from '@typo3/backend/modal';
15
+ import { html, type TemplateResult } from 'lit';
16
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
17
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
18
+ import type ResponseInterface from '@typo3/backend/ajax-data-handler/response-interface';
19
+ import Notification from '@typo3/backend/notification';
20
+ import { lll } from '@typo3/core/lit-helper';
21
+
22
+ /**
23
+ * Module: @typo3/scheduler/scheduler-add-groups
24
+ * @exports @typo3/scheduler/scheduler-add-groups
25
+ */
26
+ class SchedulerAddGroups {
27
+ selector: string = '.t3js-create-group';
28
+
29
+ constructor() {
30
+ this.initialize();
31
+ }
32
+
33
+ public initialize(): void {
34
+ const element = document.querySelector(this.selector) as HTMLElement;
35
+ if(element) {
36
+ element.addEventListener('click', (button: MouseEvent) => {
37
+ button.preventDefault();
38
+ const content: TemplateResult = html`
39
+ <form name="scheduler-create-group" @submit=${this.createGroup}>
40
+ <label class="form-label" for="actionCreateGroup">Group name</label>
41
+ <input class="form-control" id="actionCreateGroup" required="" name="action[createGroup]" autofocus type="text">
42
+ </form>
43
+ `;
44
+
45
+ const modal = Modal.advanced({
46
+ content: content,
47
+ title: lll('scheduler.createGroup') || 'New group',
48
+ size: Modal.sizes.small,
49
+ buttons: [
50
+ {
51
+ trigger: (): void => Modal.dismiss(),
52
+ text: lll('scheduler.modalCancel') || 'Cancel',
53
+ btnClass: 'btn-default',
54
+ name: 'cancel'
55
+ },{
56
+ trigger: (): void => {
57
+ const form: HTMLFormElement = Modal.currentModal.querySelector('form[name="scheduler-create-group"]');
58
+ form.requestSubmit();
59
+ },
60
+ text: lll('scheduler.modalOk') || 'Create group',
61
+ btnClass: 'btn-primary',
62
+ name: 'ok'
63
+ }
64
+ ]
65
+ });
66
+
67
+ modal.addEventListener('typo3-modal-shown', (): void => {
68
+ const input: HTMLInputElement = Modal.currentModal.querySelector('input[name="action[createGroup]"]');
69
+ input.focus();
70
+ });
71
+ });
72
+ }
73
+ }
74
+
75
+ private createGroup(e: Event): Promise<ResponseInterface | void> {
76
+ e.preventDefault();
77
+
78
+ const formData = new FormData(e.target as HTMLFormElement);
79
+ const name = formData.get('action[createGroup]').toString();
80
+ const newUid = 'NEW' + Math.random().toString(36).slice(2, 7);
81
+ const params = '&data[tx_scheduler_task_group][' + newUid + '][pid]=0' +
82
+ '&data[tx_scheduler_task_group][' + newUid + '][groupName]=' + encodeURIComponent(name);
83
+
84
+ return (new AjaxRequest(TYPO3.settings.ajaxUrls.record_process)).post(params, {
85
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' },
86
+ })
87
+ .then(async (response: AjaxResponse): Promise<ResponseInterface> => {
88
+ return await response.resolve();
89
+ }).then((result: ResponseInterface): ResponseInterface => {
90
+ if (result.hasErrors) {
91
+ Notification.error(lll('scheduler.group.error.title'), lll('scheduler.group.error.message') + ' "' + name + '"!');
92
+ }
93
+
94
+ result.messages.forEach((message) => {
95
+ Notification.info(message.title, message.message);
96
+ });
97
+
98
+ return result;
99
+ }).catch(() => {
100
+ Notification.error(lll('scheduler.group.error.title'), lll('scheduler.group.error.message') + ' "' + name + '"!');
101
+ }).finally(() => {
102
+ const select = (document as Document).querySelector('#task_group');
103
+ if(select) {
104
+ // This is an ugly hack to pre-select the created group.
105
+ const form = ((document as Document).forms[0] as HTMLFormElement);
106
+ const selectLatestGroup: HTMLInputElement = form.querySelector('[name="tx_scheduler[select_latest_group]"]');
107
+
108
+ selectLatestGroup.value = '1';
109
+ form.submit();
110
+ } else {
111
+ window.location.reload();
112
+ }
113
+
114
+ Modal.dismiss();
115
+ });
116
+ }
117
+ }
118
+
119
+ export default new SchedulerAddGroups();