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,466 @@
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 SortableTable from '@typo3/backend/sortable-table';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+ import Modal from '@typo3/backend/modal';
17
+ import Icons from '@typo3/backend/icons';
18
+ import { MessageUtility } from '@typo3/backend/utility/message-utility';
19
+ import type { ActionEventDetails } from '@typo3/backend/multi-record-selection-action';
20
+ import PersistentStorage from '@typo3/backend/storage/persistent';
21
+ import DateTimePicker from '@typo3/backend/date-time-picker';
22
+ import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selection';
23
+ import Severity from '@typo3/backend/severity';
24
+ import DocumentService from '@typo3/core/document-service';
25
+ import SubmitInterceptor from '@typo3/backend/form/submit-interceptor';
26
+ import Hotkeys, { ModifierKeys } from '@typo3/backend/hotkeys';
27
+
28
+ interface TableNumberMapping {
29
+ [s: string]: number;
30
+ }
31
+
32
+ /**
33
+ * Module: @typo3/scheduler/scheduler
34
+ * @exports @typo3/scheduler/scheduler
35
+ */
36
+ class Scheduler {
37
+ constructor() {
38
+ DocumentService.ready().then((): void => {
39
+ this.initializeSubmitInterceptor();
40
+ this.initializeEvents();
41
+ this.registerHotKeys();
42
+ this.initializeDefaultStates();
43
+ this.initializeCloseConfirm();
44
+ });
45
+ }
46
+
47
+ private static updateClearableInputs(): void {
48
+ const clearables = document.querySelectorAll('.t3js-clearable') as NodeListOf<HTMLInputElement>;
49
+ if (clearables.length > 0) {
50
+ import('@typo3/backend/input/clearable').then(function() {
51
+ clearables.forEach(clearableField => clearableField.clearable());
52
+ });
53
+ }
54
+ }
55
+
56
+ private static updateDateTimePickers(): void {
57
+ (document.querySelectorAll('#tx_scheduler_form .t3js-datetimepicker') as NodeListOf<HTMLInputElement>).forEach(
58
+ (dateTimePickerElement: HTMLInputElement) => DateTimePicker.initialize(dateTimePickerElement)
59
+ );
60
+ }
61
+
62
+ private static updateElementBrowserTriggers(): void {
63
+ const triggers = document.querySelectorAll('.t3js-element-browser');
64
+
65
+ triggers.forEach((el: HTMLAnchorElement): void => {
66
+ const triggerField = <HTMLInputElement>document.getElementById(el.dataset.triggerFor);
67
+ el.dataset.params = triggerField.name + '|||pages';
68
+ });
69
+ }
70
+
71
+ private static resolveDefaultNumberOfDays(): TableNumberMapping|null {
72
+ const element = document.getElementById('task_tableGarbageCollection_numberOfDays');
73
+ if (element === null || typeof element.dataset.defaultNumberOfDays === 'undefined') {
74
+ return null;
75
+ }
76
+ return JSON.parse(element.dataset.defaultNumberOfDays) as TableNumberMapping;
77
+ }
78
+
79
+ /**
80
+ * Store task group collapse state in UC
81
+ */
82
+ private static storeCollapseState(table: string, isCollapsed: boolean): void {
83
+ let storedModuleData = {};
84
+
85
+ if (PersistentStorage.isset('moduleData.scheduler_manage')) {
86
+ storedModuleData = PersistentStorage.get('moduleData.scheduler_manage');
87
+ }
88
+
89
+ const collapseConfig: Record<string, number> = {};
90
+ collapseConfig[table] = isCollapsed ? 1 : 0;
91
+
92
+ storedModuleData = { ...storedModuleData, ...collapseConfig };
93
+ PersistentStorage.set('moduleData.scheduler_manage', storedModuleData);
94
+ }
95
+
96
+ /**
97
+ * This method reacts on changes to the task class
98
+ * It switches on or off the relevant extra fields
99
+ */
100
+ private toggleTaskSettingFields(taskSelector: HTMLSelectElement): void {
101
+ let taskClass: string = taskSelector.value;
102
+ taskClass = taskClass.toLowerCase().replace(/\\/g, '-');
103
+
104
+ // Show only relevant extra fields
105
+ for (const extraFieldContainer of document.querySelectorAll('.extraFields') as NodeListOf<HTMLElement>) {
106
+ const extraFieldsAreVisible = extraFieldContainer.classList.contains('extra_fields_' + taskClass);
107
+ extraFieldContainer.querySelectorAll('input, textarea, select').forEach((extraField: HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement): void => {
108
+ extraField.disabled = !extraFieldsAreVisible;
109
+ });
110
+
111
+ extraFieldContainer.hidden = !extraFieldsAreVisible;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * This method reacts on field changes of all table field for table garbage collection task
117
+ */
118
+ private actOnChangeSchedulerTableGarbageCollectionAllTables(checkbox: HTMLInputElement): void {
119
+ const numberOfDaysField = document.querySelector('#task_tableGarbageCollection_numberOfDays') as HTMLInputElement;
120
+ const taskTableGarbageCollectionTableField = document.querySelector('#task_tableGarbageCollection_table') as HTMLSelectElement;
121
+
122
+ if (checkbox.checked) {
123
+ taskTableGarbageCollectionTableField.disabled = true;
124
+ numberOfDaysField.disabled = true;
125
+ } else {
126
+ // Get number of days for selected table
127
+ let numberOfDays = parseInt(numberOfDaysField.value, 10);
128
+ if (numberOfDays < 1) {
129
+ const selectedTable = taskTableGarbageCollectionTableField.value;
130
+ const defaultNumberOfDays = Scheduler.resolveDefaultNumberOfDays();
131
+ if (defaultNumberOfDays !== null) {
132
+ numberOfDays = defaultNumberOfDays[selectedTable];
133
+ }
134
+ }
135
+
136
+ taskTableGarbageCollectionTableField.disabled = false;
137
+ if (numberOfDays > 0) {
138
+ numberOfDaysField.disabled = false;
139
+ }
140
+ }
141
+ }
142
+
143
+ /**
144
+ * This method set the 'number of days' field to the default expire period
145
+ * of the selected table
146
+ */
147
+ private actOnChangeSchedulerTableGarbageCollectionTable(tableSelector: HTMLSelectElement): void {
148
+ const numberOfDaysField = document.querySelector('#task_tableGarbageCollection_numberOfDays') as HTMLInputElement;
149
+ const defaultNumberOfDays = Scheduler.resolveDefaultNumberOfDays();
150
+ if (defaultNumberOfDays !== null && defaultNumberOfDays[tableSelector.value] > 0) {
151
+ numberOfDaysField.disabled = false;
152
+ numberOfDaysField.value = defaultNumberOfDays[tableSelector.value].toString(10);
153
+ } else {
154
+ numberOfDaysField.disabled = true;
155
+ numberOfDaysField.value = '0';
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Toggle the relevant form fields by task type
161
+ */
162
+ private toggleFieldsByTaskType(taskType: string|number): void {
163
+ // Single task option = 1, Recurring task option = 2
164
+ taskType = parseInt(taskType + '', 10);
165
+ const taskIsRecurring = taskType === 2;
166
+ (document.querySelector('#task_end_col') as HTMLElement).hidden = !taskIsRecurring;
167
+ (document.querySelector('#task_frequency_row') as HTMLElement).hidden = !taskIsRecurring;
168
+ (document.querySelector('#task_multiple_row') as HTMLElement).hidden = !taskIsRecurring;
169
+ }
170
+
171
+ private initializeSubmitInterceptor(): void {
172
+ const schedulerForm: HTMLFormElement = document.querySelector('form[name=tx_scheduler_form]');
173
+ if (!schedulerForm) {
174
+ return;
175
+ }
176
+
177
+ new SubmitInterceptor(schedulerForm);
178
+ }
179
+
180
+ /**
181
+ * Registers listeners
182
+ */
183
+ private initializeEvents(): void {
184
+ const taskClassElement = document.querySelector('#task_class');
185
+ if (taskClassElement) {
186
+ new RegularEvent('change', (evt: Event): void => {
187
+ this.toggleTaskSettingFields(evt.target as HTMLSelectElement);
188
+ }).bindTo(taskClassElement);
189
+ }
190
+
191
+ const taskTypeElement = document.querySelector('#task_type');
192
+ if (taskTypeElement) {
193
+ new RegularEvent('change', (evt: Event): void => {
194
+ this.toggleFieldsByTaskType((evt.target as HTMLSelectElement).value);
195
+ }).bindTo(taskTypeElement);
196
+ }
197
+
198
+ const taskTableGarbageCollectionAllTablesElement = document.querySelector('#task_tableGarbageCollection_allTables');
199
+ if (taskTableGarbageCollectionAllTablesElement) {
200
+ new RegularEvent('change', (evt: Event): void => {
201
+ this.actOnChangeSchedulerTableGarbageCollectionAllTables(evt.target as HTMLInputElement);
202
+ }).bindTo(taskTableGarbageCollectionAllTablesElement);
203
+ }
204
+
205
+ const taskTableGarbageCollectionTableElement = document.querySelector('#task_tableGarbageCollection_table');
206
+ if (taskTableGarbageCollectionTableElement) {
207
+ new RegularEvent('change', (evt: Event): void => {
208
+ this.actOnChangeSchedulerTableGarbageCollectionTable(evt.target as HTMLSelectElement);
209
+ }).bindTo(taskTableGarbageCollectionTableElement);
210
+ }
211
+
212
+ const updateTaskFrequencyElement = document.querySelector('[data-update-task-frequency]');
213
+ if (updateTaskFrequencyElement) {
214
+ new RegularEvent('change', (evt: Event): void => {
215
+ const target = evt.target as HTMLSelectElement;
216
+ const taskFrequencyField = document.querySelector('#task_frequency') as HTMLInputElement;
217
+
218
+ taskFrequencyField.value = target.value;
219
+ target.value = '';
220
+ target.blur();
221
+ }).bindTo(updateTaskFrequencyElement);
222
+ }
223
+
224
+ document.querySelectorAll('[data-scheduler-table]').forEach((table: HTMLTableElement) => {
225
+ new SortableTable(table);
226
+ });
227
+
228
+ new RegularEvent('click', (e: Event, target: HTMLAnchorElement): void => {
229
+ e.preventDefault();
230
+
231
+ const url = new URL(target.href, window.origin);
232
+ url.searchParams.set('mode', target.dataset.mode);
233
+ url.searchParams.set('bparams', target.dataset.params);
234
+
235
+ Modal.advanced({
236
+ type: Modal.types.iframe,
237
+ content: url.toString(),
238
+ size: Modal.sizes.large
239
+ });
240
+ }).delegateTo(document, '.t3js-element-browser');
241
+
242
+ new RegularEvent('show.bs.collapse', this.toggleCollapseIcon.bind(this)).bindTo(document);
243
+ new RegularEvent('hide.bs.collapse', this.toggleCollapseIcon.bind(this)).bindTo(document);
244
+ new RegularEvent('multiRecordSelection:action:go', this.executeTasks.bind(this)).bindTo(document);
245
+ new RegularEvent('multiRecordSelection:action:go_cron', this.executeTasks.bind(this)).bindTo(document);
246
+
247
+ window.addEventListener('message', this.listenOnElementBrowser.bind(this));
248
+
249
+ new RegularEvent('click', (e: Event, target: HTMLElement): void => {
250
+ e.preventDefault();
251
+
252
+ this.saveDocument(target);
253
+ }).delegateTo(document, 'button[form]');
254
+ }
255
+
256
+ private saveDocument(submitter?: HTMLElement): void {
257
+ const schedulerForm = this.getTaskEditForm();
258
+ if (!schedulerForm) {
259
+ return;
260
+ }
261
+
262
+ const hidden = document.createElement('input');
263
+ hidden.type = 'hidden';
264
+ hidden.value = 'save';
265
+ hidden.name = 'CMD';
266
+
267
+ schedulerForm.append(hidden);
268
+ schedulerForm.requestSubmit(submitter);
269
+ }
270
+
271
+ private saveAndCloseDocument(submitter?: HTMLElement): void {
272
+ const schedulerForm = this.getTaskEditForm();
273
+ if (!schedulerForm) {
274
+ return;
275
+ }
276
+
277
+ const hidden = document.createElement('input');
278
+ hidden.type = 'hidden';
279
+ hidden.value = 'saveclose';
280
+ hidden.name = 'CMD';
281
+
282
+ schedulerForm.append(hidden);
283
+ schedulerForm.requestSubmit(submitter);
284
+ }
285
+
286
+ private registerHotKeys(): void {
287
+ const form = this.getTaskEditForm();
288
+ if (form === null) {
289
+ return;
290
+ }
291
+
292
+ let submitterElement = null;
293
+ if (form.CMD instanceof HTMLElement) {
294
+ submitterElement = form.CMD;
295
+ } else if (form.CMD instanceof NodeList) {
296
+ submitterElement = form.CMD.item(0) as HTMLButtonElement;
297
+ }
298
+
299
+ Hotkeys.setScope('scheduler/edit-task');
300
+ Hotkeys.register([Hotkeys.normalizedCtrlModifierKey, 's'], (e: KeyboardEvent): void => {
301
+ e.preventDefault();
302
+
303
+ this.saveDocument(submitterElement);
304
+ }, {
305
+ scope: 'scheduler/edit-task',
306
+ allowOnEditables: true,
307
+ bindElement: submitterElement,
308
+ });
309
+ Hotkeys.register([Hotkeys.normalizedCtrlModifierKey, ModifierKeys.SHIFT, 's'], (e: KeyboardEvent): void => {
310
+ e.preventDefault();
311
+
312
+ this.saveAndCloseDocument(submitterElement);
313
+ }, {
314
+ scope: 'scheduler/edit-task',
315
+ allowOnEditables: true,
316
+ });
317
+ }
318
+
319
+ /**
320
+ * Initialize default states
321
+ */
322
+ private initializeDefaultStates(): void {
323
+ const taskType = document.querySelector('#task_type') as HTMLSelectElement;
324
+ if (taskType !== null) {
325
+ this.toggleFieldsByTaskType(taskType.value);
326
+ }
327
+ const taskClass = document.querySelector('#task_class') as HTMLSelectElement;
328
+ if (taskClass !== null) {
329
+ this.toggleTaskSettingFields(taskClass);
330
+ Scheduler.updateClearableInputs();
331
+ Scheduler.updateDateTimePickers();
332
+ Scheduler.updateElementBrowserTriggers();
333
+ }
334
+ }
335
+
336
+ private listenOnElementBrowser(e: MessageEvent): void {
337
+ if (!MessageUtility.verifyOrigin(e.origin)) {
338
+ throw 'Denied message sent by ' + e.origin;
339
+ }
340
+
341
+ if (e.data.actionName === 'typo3:elementBrowser:elementAdded') {
342
+ if (typeof e.data.fieldName === 'undefined') {
343
+ throw 'fieldName not defined in message';
344
+ }
345
+
346
+ if (typeof e.data.value === 'undefined') {
347
+ throw 'value not defined in message';
348
+ }
349
+
350
+ const field = <HTMLInputElement>document.querySelector('input[name="' + e.data.fieldName + '"]');
351
+ field.value = e.data.value.split('_').pop();
352
+ }
353
+ }
354
+
355
+ private toggleCollapseIcon(e: Event): void {
356
+ const isCollapsed: boolean = e.type === 'hide.bs.collapse';
357
+ const collapseIcon: HTMLElement = document.querySelector('.t3js-toggle-table[data-bs-target="#' + (e.target as HTMLElement).id + '"] .t3js-icon');
358
+ if (collapseIcon !== null) {
359
+ Icons
360
+ .getIcon((isCollapsed ? 'actions-view-list-expand' : 'actions-view-list-collapse'), Icons.sizes.small)
361
+ .then((icon: string): void => {
362
+ collapseIcon.replaceWith(document.createRange().createContextualFragment(icon));
363
+ });
364
+ }
365
+ Scheduler.storeCollapseState((e.target as HTMLElement).dataset.table, isCollapsed);
366
+ }
367
+
368
+ private executeTasks(event: CustomEvent): void {
369
+ const form: HTMLFormElement = document.querySelector('[data-multi-record-selection-form="' + event.detail.identifier + '"]');
370
+ if (form === null) {
371
+ return;
372
+ }
373
+ const taskIds: Array<string> = [];
374
+ ((event.detail as ActionEventDetails).checkboxes as NodeListOf<HTMLInputElement>).forEach((checkbox: HTMLInputElement) => {
375
+ const checkboxContainer: HTMLElement = checkbox.closest(MultiRecordSelectionSelectors.elementSelector);
376
+ if (checkboxContainer !== null && checkboxContainer.dataset.taskId) {
377
+ taskIds.push(checkboxContainer.dataset.taskId);
378
+ }
379
+ });
380
+ if (taskIds.length) {
381
+ if (event.type === 'multiRecordSelection:action:go_cron') {
382
+ // Schedule selected tasks for next cron run
383
+ const goCron: HTMLInputElement = document.createElement('input');
384
+ goCron.setAttribute('type', 'hidden');
385
+ goCron.setAttribute('name', 'scheduleCron');
386
+ goCron.setAttribute('value', taskIds.join(','));
387
+ form.append(goCron);
388
+ } else {
389
+ // Execute selected tasks directly
390
+ const executeTasks: HTMLInputElement = document.createElement('input');
391
+ executeTasks.setAttribute('type', 'hidden');
392
+ executeTasks.setAttribute('name', 'execute');
393
+ executeTasks.setAttribute('value', taskIds.join(','));
394
+ form.append(executeTasks);
395
+ }
396
+
397
+ form.submit();
398
+ }
399
+ }
400
+
401
+ private initializeCloseConfirm() {
402
+ const schedulerForm = this.getTaskEditForm();
403
+ if(!schedulerForm) {
404
+ return;
405
+ }
406
+
407
+ const formData = new FormData(schedulerForm);
408
+
409
+ new RegularEvent('click', (e: Event): void => {
410
+ const newFormData = new FormData(schedulerForm);
411
+ const formDataObj = Object.fromEntries(formData.entries());
412
+ const newFormDataObj = Object.fromEntries(newFormData.entries());
413
+ const formChanged = JSON.stringify(formDataObj) !== JSON.stringify(newFormDataObj);
414
+
415
+ if (formChanged || schedulerForm.querySelector('input[value="add"]')) {
416
+ e.preventDefault();
417
+ const closeUrl = (e.currentTarget as HTMLLinkElement).href;
418
+ Modal.confirm(
419
+ TYPO3.lang['label.confirm.close_without_save.title'] || 'Do you want to close without saving?',
420
+ TYPO3.lang['label.confirm.close_without_save.content'] || 'You currently have unsaved changes. Are you sure you want to discard these changes?',
421
+ Severity.warning,
422
+ [
423
+ {
424
+ text: TYPO3.lang['buttons.confirm.close_without_save.no'] || 'No, I will continue editing',
425
+ btnClass: 'btn-default',
426
+ name: 'no',
427
+ trigger: () => Modal.dismiss(),
428
+ },
429
+ {
430
+ text: TYPO3.lang['buttons.confirm.close_without_save.yes'] || 'Yes, discard my changes',
431
+ btnClass: 'btn-default',
432
+ name: 'yes',
433
+ trigger: () => {
434
+ Modal.dismiss();
435
+ window.location.href = closeUrl;
436
+ }
437
+ },
438
+ {
439
+ text: TYPO3.lang['buttons.confirm.save_and_close'] || 'Save and close',
440
+ btnClass: 'btn-primary',
441
+ name: 'save',
442
+ active: true,
443
+ trigger: () => {
444
+ Modal.dismiss();
445
+
446
+ const hidden = document.createElement('input');
447
+ hidden.type = 'hidden';
448
+ hidden.value = 'saveclose';
449
+ hidden.name = 'CMD';
450
+
451
+ schedulerForm.append(hidden);
452
+ schedulerForm.submit();
453
+ },
454
+ }
455
+ ]
456
+ );
457
+ }
458
+ }).bindTo(document.querySelector('.t3js-scheduler-close'));
459
+ }
460
+
461
+ private getTaskEditForm(): HTMLFormElement|null {
462
+ return document.querySelector('form[name=tx_scheduler_form]');
463
+ }
464
+ }
465
+
466
+ export default new Scheduler();
@@ -0,0 +1,122 @@
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 { ModalResponseEvent } from '@typo3/backend/modal-interface';
15
+ import { MessageUtility } from '@typo3/backend/utility/message-utility';
16
+ import Client from '@typo3/backend/storage/client';
17
+ import RegularEvent from '@typo3/core/event/regular-event';
18
+ import Modal from '@typo3/backend/modal';
19
+
20
+ /**
21
+ * Module: @typo3/setup/setup-module
22
+ * @exports @typo3/setup/setup-module
23
+ */
24
+ class SetupModule {
25
+ private avatarWindowRef: Window;
26
+
27
+ constructor() {
28
+ new RegularEvent('setup:confirmation:response', SetupModule.handleConfirmationResponse)
29
+ .delegateTo(document, '[data-event-name="setup:confirmation:response"]');
30
+ new RegularEvent('click', (e: Event, element: HTMLElement): void => {
31
+ const clickEvent = new CustomEvent(
32
+ element.dataset.eventName, {
33
+ bubbles: true,
34
+ detail: { payload: element.dataset.eventPayload }
35
+ });
36
+ element.dispatchEvent(clickEvent);
37
+ }).delegateTo(document, '[data-event="click"][data-event-name]');
38
+ document.querySelectorAll('[data-setup-avatar-field]')
39
+ .forEach((fieldElement: HTMLElement): void => {
40
+ const fieldName = fieldElement.dataset.setupAvatarField;
41
+ const clearElement = document.getElementById('clear_button_' + fieldName);
42
+ const addElement = document.getElementById('add_button_' + fieldName);
43
+
44
+ addElement.addEventListener('click', (): void => this.avatarOpenFileBrowser(addElement.dataset.setupAvatarUrl));
45
+ clearElement?.addEventListener('click', (): void => this.avatarClearExistingImage(fieldName));
46
+ });
47
+ if (document.querySelector('[data-setup-avatar-field]') !== null) {
48
+ this.initializeMessageListener();
49
+ }
50
+ }
51
+
52
+ private static handleConfirmationResponse(evt: ModalResponseEvent): void {
53
+ if (evt.detail.result && evt.detail.payload === 'resetConfiguration') {
54
+ Client.unsetByPrefix('');
55
+
56
+ const input: HTMLInputElement = document.querySelector('#setValuesToDefault');
57
+ input.value = '1';
58
+ input.form.submit();
59
+ }
60
+ }
61
+
62
+ private static hideElement(element: HTMLElement): void {
63
+ element.style.display = 'none';
64
+ }
65
+
66
+ private initializeMessageListener(): void {
67
+ window.addEventListener('message', (evt: MessageEvent): void => {
68
+ if (!MessageUtility.verifyOrigin(evt.origin)) {
69
+ throw new Error('Denied message sent by ' + evt.origin);
70
+ }
71
+ if (evt.data.actionName === 'typo3:foreignRelation:insert') {
72
+ if (typeof evt.data.objectGroup === 'undefined') {
73
+ throw new Error('No object group defined for message');
74
+ }
75
+ const avatarMatches = evt.data.objectGroup.match(/avatar-(.+)$/);
76
+ if (avatarMatches === null) {
77
+ // Received message isn't provisioned for current InlineControlContainer instance
78
+ return;
79
+ }
80
+ this.avatarSetFileUid(avatarMatches[1], evt.data.uid);
81
+ }
82
+ });
83
+ }
84
+
85
+ private avatarOpenFileBrowser(uri: string) {
86
+ Modal.advanced({
87
+ type: Modal.types.iframe,
88
+ content: uri,
89
+ size: Modal.sizes.large
90
+ });
91
+ }
92
+
93
+ private avatarClearExistingImage(fieldName: string) {
94
+ const fieldElement = document.getElementById('field_' + fieldName) as HTMLInputElement;
95
+ const imageElement = document.getElementById('image_' + fieldName);
96
+ const clearElement = document.getElementById('clear_button_' + fieldName);
97
+
98
+ if (clearElement) {
99
+ SetupModule.hideElement(clearElement);
100
+ }
101
+ if (imageElement) {
102
+ SetupModule.hideElement(imageElement);
103
+ }
104
+ fieldElement.value = 'delete';
105
+ }
106
+
107
+ private avatarSetFileUid(fieldName: string, fileUid: string) {
108
+ this.avatarClearExistingImage(fieldName);
109
+ const fieldElement = document.getElementById('field_' + fieldName) as HTMLInputElement;
110
+ const addElement = document.getElementById('add_button_' + fieldName);
111
+
112
+ fieldElement.value = fileUid;
113
+ addElement.classList.remove('btn-default');
114
+ addElement.classList.add('btn-info');
115
+ if (this.avatarWindowRef instanceof Window && !this.avatarWindowRef.closed) {
116
+ this.avatarWindowRef.close();
117
+ this.avatarWindowRef = null;
118
+ }
119
+ }
120
+ }
121
+
122
+ export default new SetupModule();
@@ -0,0 +1,5 @@
1
+ document.querySelectorAll('.example input[type="checkbox"]').forEach((element: HTMLInputElement) => {
2
+ if (element.id.includes('indeterminate')) {
3
+ element.indeterminate = true;
4
+ }
5
+ });
@@ -0,0 +1,101 @@
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 { customElement, property } from 'lit/decorators';
15
+ import { html, LitElement, type TemplateResult } from 'lit';
16
+ import { lll } from '@typo3/core/lit-helper';
17
+ import '@typo3/backend/element/icon-element';
18
+
19
+ type ThemeIdentifier = string;
20
+ type Theme = {
21
+ icon: string,
22
+ label: string
23
+ };
24
+
25
+ const selectorConverter = {
26
+ fromAttribute(selector: string) {
27
+ return document.querySelector(selector);
28
+ }
29
+ };
30
+
31
+ /**
32
+ * Module: @typo3/styleguide/element/theme-switcher-element
33
+ *
34
+ * @example
35
+ * <typo3-styleguide-theme-switcher></typo3-styleguide-theme-switcher>
36
+ */
37
+ @customElement('typo3-styleguide-theme-switcher')
38
+ export class ThemeSwitcherElement extends LitElement {
39
+ @property() private activeTheme: ThemeIdentifier = 'light';
40
+ @property({ converter: selectorConverter }) private readonly example: HTMLElement;
41
+
42
+ private readonly themes: Record<ThemeIdentifier, Theme> = {
43
+ auto: {
44
+ icon: 'actions-circle-half',
45
+ label: 'colorScheme.auto',
46
+ },
47
+ light: {
48
+ icon: 'actions-brightness-high',
49
+ label: 'colorScheme.light',
50
+ },
51
+ dark: {
52
+ icon: 'actions-moon',
53
+ label: 'colorScheme.dark',
54
+ }
55
+ };
56
+
57
+ protected override createRenderRoot(): HTMLElement | ShadowRoot {
58
+ return this;
59
+ }
60
+
61
+ protected override render(): TemplateResult {
62
+ const dropdownActiveIcon = html`<span class="text-primary"><typo3-backend-icon identifier="actions-dot" size="small"></typo3-backend-icon></span>`;
63
+ const dropdownInactiveIcon = html`<typo3-backend-icon identifier="miscellaneous-placeholder" size="small"></typo3-backend-icon>`;
64
+ const themeOptions = [];
65
+ for (const [identifier, theme] of Object.entries(this.themes)) {
66
+ themeOptions.push(html`
67
+ <li>
68
+ <a class="dropdown-item dropdown-item-spaced" href="#" data-theme="${identifier}" @click="${this.setTheme}">
69
+ ${identifier === this.activeTheme ? dropdownActiveIcon : dropdownInactiveIcon}
70
+ ${lll(theme.label)}
71
+ </a>
72
+ </li>
73
+ `);
74
+ }
75
+
76
+ return html`
77
+ <div class="colorscheme-switch">
78
+ ${lll('colorScheme.selector.label')}
79
+ <div class="dropdown">
80
+ <button class="btn btn-link dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
81
+ <typo3-backend-icon identifier="${this.themes[this.activeTheme].icon}" size="small"></typo3-backend-icon> ${lll(this.themes[this.activeTheme].label)}
82
+ </button>
83
+ <ul class="dropdown-menu">
84
+ ${themeOptions}
85
+ </ul>
86
+ </div>
87
+ </div>
88
+ `;
89
+ }
90
+
91
+ private setTheme(event: PointerEvent): void {
92
+ this.activeTheme = (event.target as HTMLAnchorElement).dataset.theme;
93
+ this.example.dataset.colorScheme = this.activeTheme;
94
+ }
95
+ }
96
+
97
+ declare global {
98
+ interface HTMLElementTagNameMap {
99
+ 'typo3-styleguide-theme-switcher': ThemeSwitcherElement;
100
+ }
101
+ }