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,87 @@
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 { html, type TemplateResult } from 'lit';
15
+ import { customElement, property } from 'lit/decorators';
16
+ import { BaseElement } from './base';
17
+ import { live } from 'lit/directives/live.js';
18
+
19
+ export const componentName = 'typo3-backend-settings-type-stringlist';
20
+
21
+ @customElement(componentName)
22
+ export class StringlistTypeElement extends BaseElement<string[]> {
23
+
24
+ @property({ type: Array }) override value: string[];
25
+
26
+ protected updateValue(value: string, index: number) {
27
+ const copy = [...this.value];
28
+ copy[index] = value;
29
+ this.value = copy;
30
+ }
31
+
32
+ protected addValue(index: number, value: string = '') {
33
+ this.value = this.value.toSpliced(index + 1, 0, value);
34
+ }
35
+
36
+ protected removeValue(index: number) {
37
+ this.value = this.value.toSpliced(index, 1);
38
+ }
39
+
40
+ protected renderItem(value: string, index: number): TemplateResult {
41
+ return html`
42
+ <tr>
43
+ <td width="99%">
44
+ <input
45
+ id=${`${this.formid}${index > 0 ? '-' + index : ''}`}
46
+ type="text"
47
+ class="form-control"
48
+ ?readonly=${this.readonly}
49
+ .value=${live(value)}
50
+ @change=${(e: InputEvent) => this.updateValue((e.target as HTMLInputElement).value, index)}
51
+ />
52
+ </td>
53
+ <td>
54
+ <div class="btn-group" role="group">
55
+ <button class="btn btn-default" type="button" ?disabled=${this.readonly} @click=${() => this.addValue(index)}>
56
+ <typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
57
+ </button>
58
+ <button class="btn btn-default" type="button" ?disabled=${this.readonly} @click=${() => this.removeValue(index)}>
59
+ <typo3-backend-icon identifier="actions-delete" size="small"></typo3-backend-icon>
60
+ </button>
61
+ </div>
62
+ </td>
63
+ </tr>
64
+ `;
65
+ }
66
+
67
+ protected override render(): TemplateResult {
68
+ const value = this.value || [];
69
+ return html`
70
+ <div class="form-control-wrap">
71
+ <div class="table-fit">
72
+ <table class="table table-hover">
73
+ <tbody>
74
+ ${value.map((v, i) => this.renderItem(v, i))}
75
+ </tbody>
76
+ </table>
77
+ </div>
78
+ </div>
79
+ `;
80
+ }
81
+ }
82
+
83
+ declare global {
84
+ interface HTMLElementTagNameMap {
85
+ 'typo3-backend-settings-type-stringlist': StringlistTypeElement;
86
+ }
87
+ }
@@ -0,0 +1,88 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { SeverityEnum } from './enum/severity';
15
+
16
+ /**
17
+ * Module: @typo3/backend/severity
18
+ * Severity for the TYPO3 backend
19
+ */
20
+ export default class Severity {
21
+ public static notice: number = SeverityEnum.notice;
22
+ public static info: number = SeverityEnum.info;
23
+ public static ok: number = SeverityEnum.ok;
24
+ public static warning: number = SeverityEnum.warning;
25
+ public static error: number = SeverityEnum.error;
26
+
27
+ /**
28
+ * Gets the CSS class for the severity
29
+ *
30
+ * @param {SeverityEnum} severity
31
+ * @returns {string}
32
+ */
33
+ public static getCssClass(severity: SeverityEnum): string {
34
+ let severityClass: string;
35
+
36
+ switch (severity) {
37
+ case SeverityEnum.notice:
38
+ severityClass = 'notice';
39
+ break;
40
+ case SeverityEnum.ok:
41
+ severityClass = 'success';
42
+ break;
43
+ case SeverityEnum.warning:
44
+ severityClass = 'warning';
45
+ break;
46
+ case SeverityEnum.error:
47
+ severityClass = 'danger';
48
+ break;
49
+ case SeverityEnum.info:
50
+ default:
51
+ severityClass = 'info';
52
+ }
53
+
54
+ return severityClass;
55
+ }
56
+ }
57
+
58
+ let severityObject: Severity;
59
+ try {
60
+ // fetch from opening window
61
+ if (window.opener && window.opener.TYPO3 && window.opener.TYPO3.Severity) {
62
+ severityObject = window.opener.TYPO3.Severity;
63
+ }
64
+
65
+ // fetch from parent
66
+ if (parent && parent.window.TYPO3 && parent.window.TYPO3.Severity) {
67
+ severityObject = parent.window.TYPO3.Severity;
68
+ }
69
+
70
+ // fetch object from outer frame
71
+ if (top && top.TYPO3 && top.TYPO3.Severity) {
72
+ severityObject = top.TYPO3.Severity;
73
+ }
74
+ } catch {
75
+ // This only happens if the opener, parent or top is some other url (eg a local file)
76
+ // which loaded the current window. Then the browser's cross domain policy jumps in
77
+ // and raises an exception.
78
+ // For this case we are safe and we can create our global object below.
79
+ }
80
+
81
+ if (!severityObject) {
82
+ severityObject = Severity;
83
+
84
+ // attach to global frame
85
+ if (typeof TYPO3 !== 'undefined') {
86
+ TYPO3.Severity = severityObject;
87
+ }
88
+ }
@@ -0,0 +1,32 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import DocumentService from '@typo3/core/document-service';
15
+
16
+ /**
17
+ * Module: @typo3/backend/site-inline-actions
18
+ * Site configuration backend module FormEngine inline:
19
+ * Override inline 'create' and 'details' route to point to SiteInlineAjaxController
20
+ */
21
+ class SiteInlineActions {
22
+
23
+ constructor() {
24
+ DocumentService.ready().then((): void => {
25
+ TYPO3.settings.ajaxUrls.record_inline_details = TYPO3.settings.ajaxUrls.site_configuration_inline_details;
26
+ TYPO3.settings.ajaxUrls.record_inline_create = TYPO3.settings.ajaxUrls.site_configuration_inline_create;
27
+ });
28
+ }
29
+
30
+ }
31
+
32
+ export default new SiteInlineActions();
@@ -0,0 +1,208 @@
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 Tablesort, { type TablesortOptions } from 'tablesort';
15
+ import 'tablesort.dotsep';
16
+ import 'tablesort.number';
17
+ import { IconElement } from './element/icon-element';
18
+ import { Sizes } from './enum/icon-types';
19
+
20
+ class TablesortWithButtons extends Tablesort {
21
+ public init(el: HTMLTableElement, options: TablesortOptions) {
22
+ let firstRow: HTMLTableRowElement, defaultSort;
23
+
24
+ this.table = el;
25
+ this.thead = false;
26
+ this.options = options;
27
+
28
+ if (el.rows && el.rows.length > 0) {
29
+ if (el.tHead && el.tHead.rows.length > 0) {
30
+ for (let i = 0; i < el.tHead.rows.length; i++) {
31
+ if (el.tHead.rows[i].getAttribute('data-sort-method') === 'thead') {
32
+ firstRow = el.tHead.rows[i];
33
+ break;
34
+ }
35
+ }
36
+ if (!firstRow) {
37
+ firstRow = el.tHead.rows[el.tHead.rows.length - 1];
38
+ }
39
+ this.thead = true;
40
+ } else {
41
+ firstRow = el.rows[0];
42
+ }
43
+ }
44
+
45
+ if (!firstRow) {
46
+ return;
47
+ }
48
+
49
+ const onClick = (event: PointerEvent): void => {
50
+ event.preventDefault();
51
+ event.stopImmediatePropagation();
52
+ const direction = (event.currentTarget as HTMLButtonElement).dataset.sortDirection;
53
+ const target = (event.currentTarget as HTMLButtonElement).closest('th, td') as HTMLTableCellElement;
54
+
55
+ // Tablesort produces different results on sorting in the same direction twice
56
+ // when the sorting is not 100% clear and multiple cells have the same value.
57
+ // To avoid confusion we prevent resorting when the direction does not change.
58
+ if (this.current === target && this.current.ariaSort === direction) {
59
+ return;
60
+ }
61
+
62
+ // Tablesort only supports a toggle for sorting, so we set the current direction to the opposite.
63
+ // After that tablesort uses the correct direction for sorting.
64
+ target.ariaSort = (direction === 'ascending') ? 'descending' : 'ascending';
65
+
66
+ if (this.current && this.current !== target) {
67
+ this.current.removeAttribute('aria-sort');
68
+ }
69
+
70
+ this.current = target;
71
+ this.sortTable(target);
72
+ };
73
+
74
+ // Assume first row is the header and attach a click handler to each.
75
+ for (let i = 0; i < firstRow.cells.length; i++) {
76
+ const cell = firstRow.cells[i] as HTMLTableCellElement;
77
+ cell.setAttribute('role', 'columnheader');
78
+ if (cell.getAttribute('data-sort-method') !== 'none') {
79
+
80
+ // Create dropdown toggle
81
+ const toggle = document.createElement('button');
82
+ toggle.classList.add('dropdown-toggle', 'dropdown-toggle-link');
83
+ toggle.dataset.bsToggle = 'dropdown';
84
+ toggle.dataset.sortingToggle = 'true';
85
+ toggle.type = 'button';
86
+ toggle.ariaExpanded = 'false';
87
+ toggle.textContent = cell.textContent;
88
+ const icon = new IconElement();
89
+ icon.identifier = 'empty-empty';
90
+ icon.size = Sizes.small;
91
+ const iconWrapper = document.createElement('div');
92
+ iconWrapper.appendChild(icon);
93
+ toggle.appendChild(iconWrapper);
94
+ cell.replaceChildren(toggle);
95
+
96
+ // Create dropdown menu
97
+ const dropdown = document.createElement('div');
98
+ dropdown.classList.add('dropdown-menu');
99
+
100
+ const buttonSortAscTitle = top.TYPO3.lang['labels.sorting.asc'] || 'Sort ascending';
101
+ const buttonSortAsc = document.createElement('button');
102
+ buttonSortAsc.classList.add('dropdown-item');
103
+ buttonSortAsc.type = 'button';
104
+ buttonSortAsc.title = buttonSortAscTitle;
105
+ buttonSortAsc.ariaLabel = buttonSortAscTitle;
106
+ buttonSortAsc.dataset.sortDirection = 'ascending';
107
+ buttonSortAsc.addEventListener('click', onClick, false);
108
+ const buttonSortAscColumnWrap = document.createElement('span');
109
+ buttonSortAscColumnWrap.classList.add('dropdown-item-columns');
110
+ buttonSortAsc.appendChild(buttonSortAscColumnWrap);
111
+ const buttonSortAscColumnIconWrap = document.createElement('span');
112
+ buttonSortAscColumnIconWrap.classList.add('dropdown-item-column', 'dropdown-item-column-icon', 'text-primary');
113
+ buttonSortAscColumnWrap.appendChild(buttonSortAscColumnIconWrap);
114
+ const buttonSortAscColumnIcon = new IconElement();
115
+ buttonSortAscColumnIcon.identifier = 'empty-empty';
116
+ buttonSortAscColumnIcon.size = Sizes.small;
117
+ buttonSortAscColumnIconWrap.appendChild(buttonSortAscColumnIcon);
118
+ const buttonSortAscColumnTitleWrap = document.createElement('span');
119
+ buttonSortAscColumnTitleWrap.classList.add('dropdown-item-column', 'dropdown-item-column-title');
120
+ buttonSortAscColumnTitleWrap.textContent = buttonSortAscTitle;
121
+ buttonSortAscColumnWrap.appendChild(buttonSortAscColumnTitleWrap);
122
+ dropdown.appendChild(buttonSortAsc);
123
+
124
+ const buttonSortDescTitle = top.TYPO3.lang['labels.sorting.desc'] || 'Sort descending';
125
+ const buttonSortDesc = document.createElement('button');
126
+ buttonSortDesc.classList.add('dropdown-item');
127
+ buttonSortDesc.type = 'button';
128
+ buttonSortDesc.title = buttonSortDescTitle;
129
+ buttonSortDesc.ariaLabel = buttonSortDescTitle;
130
+ buttonSortDesc.dataset.sortDirection = 'descending';
131
+ buttonSortDesc.addEventListener('click', onClick, false);
132
+ const buttonSortDescColumnWrap = document.createElement('span');
133
+ buttonSortDescColumnWrap.classList.add('dropdown-item-columns');
134
+ buttonSortDesc.appendChild(buttonSortDescColumnWrap);
135
+ const buttonSortDescColumnIconWrap = document.createElement('span');
136
+ buttonSortDescColumnIconWrap.classList.add('dropdown-item-column', 'dropdown-item-column-icon', 'text-primary');
137
+ buttonSortDescColumnWrap.appendChild(buttonSortDescColumnIconWrap);
138
+ const buttonSortDescColumnIcon = new IconElement();
139
+ buttonSortDescColumnIcon.identifier = 'empty-empty';
140
+ buttonSortDescColumnIcon.size = Sizes.small;
141
+ buttonSortDescColumnIconWrap.appendChild(buttonSortDescColumnIcon);
142
+ const buttonSortDescColumnTitleWrap = document.createElement('span');
143
+ buttonSortDescColumnTitleWrap.classList.add('dropdown-item-column', 'dropdown-item-column-title');
144
+ buttonSortDescColumnTitleWrap.textContent = buttonSortDescTitle;
145
+ buttonSortDescColumnWrap.appendChild(buttonSortDescColumnTitleWrap);
146
+ dropdown.appendChild(buttonSortDesc);
147
+
148
+ cell.appendChild(dropdown);
149
+
150
+ if (cell.getAttribute('data-sort-default') !== null) {
151
+ defaultSort = cell;
152
+ }
153
+ }
154
+ }
155
+
156
+ if (defaultSort) {
157
+ this.current = defaultSort;
158
+ this.sortTable(defaultSort);
159
+ }
160
+ }
161
+ }
162
+
163
+ export default class SortableTable {
164
+ constructor(table: HTMLTableElement) {
165
+ table.addEventListener('afterSort', (event: CustomEvent) => {
166
+ const table = (event.target as HTMLTableElement);
167
+ const buttons = table.tHead.querySelectorAll('.dropdown-toggle[data-sorting-toggle]');
168
+ buttons.forEach((button) => {
169
+ const iconWrap = button.querySelector(':scope > div');
170
+ iconWrap.classList.remove('text-primary');
171
+ const icon = button.querySelector('typo3-backend-icon');
172
+ icon.identifier = 'empty-empty';
173
+ icon.classList.remove('text-primary');
174
+ });
175
+
176
+ const menuIcons = table.tHead.querySelectorAll('.dropdown-toggle[data-sorting-toggle] + .dropdown-menu typo3-backend-icon');
177
+ menuIcons.forEach((menuIcon: IconElement) => {
178
+ menuIcon.identifier = 'empty-empty';
179
+ });
180
+
181
+ const sortingCell = table.tHead.querySelector('th[aria-sort]') as HTMLTableCellElement;
182
+ const sortingButton = sortingCell.querySelector('.dropdown-toggle[data-sorting-toggle]');
183
+ const sortingIconWrap = sortingButton.querySelector(':scope > div');
184
+ sortingIconWrap.classList.add('text-primary');
185
+ const sortingIcon = sortingButton.querySelector('typo3-backend-icon');
186
+ const sortingDropdown = sortingCell.querySelector('.dropdown-menu');
187
+
188
+ if (sortingCell.ariaSort === 'ascending') {
189
+ sortingIcon.identifier = 'actions-sort-amount-up';
190
+ } else {
191
+ sortingIcon.identifier = 'actions-sort-amount-down';
192
+ }
193
+
194
+ const sortingButtons = sortingDropdown.querySelectorAll('.dropdown-item');
195
+ sortingButtons.forEach((button: HTMLButtonElement) => {
196
+ const sortingButtonDirection = button.dataset.sortDirection;
197
+ const sortingButtonIcon = button.querySelector('typo3-backend-icon');
198
+ if (sortingButtonDirection === sortingCell.ariaSort) {
199
+ sortingButtonIcon.identifier = 'actions-dot';
200
+ } else {
201
+ sortingButtonIcon.identifier = 'empty-empty';
202
+ }
203
+ });
204
+ });
205
+
206
+ new TablesortWithButtons(table);
207
+ }
208
+ }
@@ -0,0 +1,76 @@
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
+ /**
15
+ * Module: @typo3/backend/storage/abstract-client-storage
16
+ * @exports @typo3/backend/storage/abstract-client-storage
17
+ */
18
+ export default abstract class AbstractClientStorage {
19
+ protected keyPrefix: string = 't3-';
20
+ protected storage: Storage = null;
21
+
22
+ public get(key: string): string {
23
+ if (this.storage === null) {
24
+ return null;
25
+ }
26
+ return this.storage.getItem(this.keyPrefix + key);
27
+ }
28
+
29
+ public getByPrefix(prefix: string): Record<string, string> {
30
+ if (this.storage === null) {
31
+ return {};
32
+ }
33
+ const entries = Object.entries(this.storage)
34
+ .filter((item: [string, string]) => item[0].startsWith(this.keyPrefix + prefix))
35
+ .map((item: [string, string]) => {
36
+ return [item[0].substring(this.keyPrefix.length), item[1]];
37
+ });
38
+
39
+ return Object.fromEntries(entries);
40
+ }
41
+
42
+ public set(key: string, value: string): void {
43
+ if (this.storage !== null) {
44
+ this.storage.setItem(this.keyPrefix + key, value);
45
+ }
46
+ }
47
+
48
+ public unset(key: string): void {
49
+ if (this.storage !== null) {
50
+ this.storage.removeItem(this.keyPrefix + key);
51
+ }
52
+ }
53
+
54
+ public unsetByPrefix(prefix: string): void {
55
+ if (this.storage === null) {
56
+ return;
57
+ }
58
+ prefix = this.keyPrefix + prefix;
59
+ Object.keys(this.storage)
60
+ .filter((key: string) => key.startsWith(prefix))
61
+ .forEach((key: string) => this.storage.removeItem(key));
62
+ }
63
+
64
+ public clear(): void {
65
+ if (this.storage !== null) {
66
+ this.storage.clear();
67
+ }
68
+ }
69
+
70
+ public isset(key: string): boolean {
71
+ if (this.storage === null) {
72
+ return false;
73
+ }
74
+ return this.get(key) !== null;
75
+ }
76
+ }
@@ -0,0 +1,28 @@
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 AbstractClientStorage from './abstract-client-storage';
15
+
16
+ /**
17
+ * Module: @typo3/backend/storage/browser-session
18
+ * Wrapper for sessionStorage
19
+ * @exports @typo3/backend/storage/browser-session
20
+ */
21
+ class BrowserSession extends AbstractClientStorage {
22
+ public constructor() {
23
+ super();
24
+ this.storage = sessionStorage;
25
+ }
26
+ }
27
+
28
+ export default new BrowserSession();
@@ -0,0 +1,28 @@
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 AbstractClientStorage from './abstract-client-storage';
15
+
16
+ /**
17
+ * Module: @typo3/backend/storage/client
18
+ * Wrapper for localStorage
19
+ * @exports @typo3/backend/storage/client
20
+ */
21
+ class Client extends AbstractClientStorage {
22
+ public constructor() {
23
+ super();
24
+ this.storage = localStorage;
25
+ }
26
+ }
27
+
28
+ export default new Client();
@@ -0,0 +1,118 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ interface CurrentState {
15
+ identifier: string;
16
+ treeIdentifier: string|null;
17
+ }
18
+
19
+ export interface ModuleStateUpdateEvent {
20
+ state: CurrentState;
21
+ oldState: CurrentState;
22
+ }
23
+
24
+ /**
25
+ * Module State previous known as `fsMod` with the previous description:
26
+ *
27
+ * > Used in main modules with a frameset for submodules to keep the ID
28
+ * > between modules Typically that is set by something like this in a
29
+ * > Web>* sub module
30
+ *
31
+ * @exports @typo3/backend/storage/module-state-storage
32
+ */
33
+ export class ModuleStateStorage {
34
+ private static readonly prefix = 't3-module-state-';
35
+
36
+ public static update(module: string, identifier: string|number): CurrentState
37
+ {
38
+ if (typeof identifier === 'number') {
39
+ identifier = identifier.toString(10);
40
+ } else if (typeof identifier !== 'string') {
41
+ throw new SyntaxError('identifier must be of type string');
42
+ }
43
+
44
+ const oldState = ModuleStateStorage.current(module);
45
+ const treeIdentifier = identifier === oldState.identifier ? oldState.treeIdentifier : null;
46
+ const state = { identifier, treeIdentifier };
47
+
48
+ ModuleStateStorage.commit(module, 'update', state);
49
+ return state;
50
+ }
51
+
52
+ public static updateWithTreeIdentifier(module: string, identifier: string|number, treeIdentifier: string|number): CurrentState
53
+ {
54
+ if (typeof identifier === 'number') {
55
+ identifier = identifier.toString(10);
56
+ } else if (typeof identifier !== 'string') {
57
+ throw new SyntaxError('identifier must be of type string');
58
+ }
59
+
60
+ if (typeof treeIdentifier === 'number') {
61
+ treeIdentifier = treeIdentifier.toString(10);
62
+ } else if (typeof treeIdentifier !== 'string') {
63
+ throw new SyntaxError('treeIdentifier must be of type string');
64
+ }
65
+
66
+ const state = { identifier, treeIdentifier };
67
+ ModuleStateStorage.commit(module, 'update-with-tree-identifier', state);
68
+ return state;
69
+ }
70
+
71
+ public static updateWithCurrentMount(module: string, identifier: string|number)
72
+ {
73
+ ModuleStateStorage.update(module, identifier);
74
+ }
75
+
76
+ public static current(module: string): CurrentState {
77
+ const state = {
78
+ ...ModuleStateStorage.getInitialState(),
79
+ ...(ModuleStateStorage.fetch(module) ?? {}),
80
+ };
81
+ return state;
82
+ }
83
+
84
+ public static purge(): void
85
+ {
86
+ Object.keys(sessionStorage)
87
+ .filter((key: string) => key.startsWith(ModuleStateStorage.prefix))
88
+ .forEach((key: string) => sessionStorage.removeItem(key));
89
+ }
90
+
91
+ private static fetch(module: string): CurrentState|null {
92
+ const data = sessionStorage.getItem(ModuleStateStorage.prefix + module);
93
+ if (data === null) {
94
+ return null;
95
+ }
96
+ return JSON.parse(data);
97
+ }
98
+
99
+ private static async commit(module: string, mode: string, state: CurrentState) {
100
+ const oldState = ModuleStateStorage.current(module);
101
+ sessionStorage.setItem(ModuleStateStorage.prefix + module, JSON.stringify(state));
102
+
103
+ top.document.dispatchEvent(new CustomEvent<ModuleStateUpdateEvent>('typo3:module-state-storage:' + mode + ':' + module, {
104
+ detail: {
105
+ state,
106
+ oldState,
107
+ }
108
+ }));
109
+ }
110
+
111
+ private static getInitialState(): CurrentState
112
+ {
113
+ return { identifier: '', treeIdentifier: null };
114
+ }
115
+ }
116
+
117
+ // exposing `ModuleStateStorage`
118
+ window.ModuleStateStorage = ModuleStateStorage;