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,98 @@
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 { ScaffoldIdentifierEnum } from '../enum/viewport/scaffold-identifier';
15
+ import { AbstractContainer } from './abstract-container';
16
+ import ClientRequest from '../event/client-request';
17
+ import InteractionRequest from '../event/interaction-request';
18
+ import Loader from './loader';
19
+ import TriggerRequest from '../event/trigger-request';
20
+
21
+ class ContentContainer extends AbstractContainer {
22
+ public get(): Window {
23
+ return (document.querySelector(ScaffoldIdentifierEnum.contentModuleIframe) as HTMLIFrameElement).contentWindow;
24
+ }
25
+
26
+ public beforeSetUrl(interactionRequest: InteractionRequest): Promise<void> {
27
+ return this.consumerScope.invoke(
28
+ new TriggerRequest('typo3.beforeSetUrl', interactionRequest),
29
+ );
30
+ }
31
+
32
+ public setUrl(urlToLoad: string, interactionRequest?: InteractionRequest, module?: string): Promise<void> {
33
+ const router = this.resolveRouterElement();
34
+ if (router === null && self !== top) {
35
+ // abort, if router can not be found and this module is not used in a top frame (popup)
36
+ return Promise.reject(new Error('Content container used in unsupported frame context'));
37
+ }
38
+
39
+ if (!(interactionRequest instanceof InteractionRequest)) {
40
+ interactionRequest = new ClientRequest('typo3.setUrl', null);
41
+ }
42
+ const promise: Promise<void> = this.consumerScope.invoke(
43
+ new TriggerRequest('typo3.setUrl', interactionRequest),
44
+ );
45
+ promise.then((): void => {
46
+ if (router !== null) {
47
+ Loader.start();
48
+ router.setAttribute('endpoint', urlToLoad);
49
+ router.setAttribute('module', module ? module : null);
50
+ router.parentElement.addEventListener('typo3-module-loaded', (): void => Loader.finish(), { once: true });
51
+ } else {
52
+ // popup mode assume that we're in a standalone frame if the router cannot be found.
53
+ document.location.assign(urlToLoad);
54
+ }
55
+ });
56
+ return promise;
57
+ }
58
+
59
+ /**
60
+ * @returns {string}
61
+ */
62
+ public getUrl(): string {
63
+ return this.resolveRouterElement().getAttribute('endpoint');
64
+ }
65
+
66
+ public refresh(interactionRequest?: InteractionRequest): Promise<void> {
67
+ const iFrame = <HTMLIFrameElement>this.resolveIFrameElement();
68
+ // abort, if no IFRAME can be found
69
+ if (iFrame === null) {
70
+ return Promise.reject();
71
+ }
72
+ const promise: Promise<void> = this.consumerScope.invoke(
73
+ new TriggerRequest('typo3.refresh', interactionRequest),
74
+ );
75
+ promise.then((): void => {
76
+ iFrame.contentWindow.location.reload();
77
+ });
78
+ return promise;
79
+ }
80
+
81
+ public getIdFromUrl(): number {
82
+ if (this.getUrl()) {
83
+ const id = new URL(this.getUrl(), window.location.origin).searchParams.get('id') ?? '';
84
+ return parseInt(id, 10);
85
+ }
86
+ return 0;
87
+ }
88
+
89
+ private resolveIFrameElement(): HTMLElement|null {
90
+ return document.querySelector(ScaffoldIdentifierEnum.contentModuleIframe);
91
+ }
92
+
93
+ private resolveRouterElement(): HTMLElement|null {
94
+ return document.querySelector(ScaffoldIdentifierEnum.contentModuleRouter);
95
+ }
96
+ }
97
+
98
+ export default ContentContainer;
@@ -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 { ScaffoldIdentifierEnum } from '../enum/viewport/scaffold-identifier';
15
+ import NProgress from 'nprogress';
16
+
17
+ class Loader {
18
+ public static start(): void {
19
+ NProgress.configure({ parent: ScaffoldIdentifierEnum.contentModule, showSpinner: false });
20
+ NProgress.start();
21
+ }
22
+
23
+ public static finish(): void {
24
+ NProgress.done();
25
+ }
26
+ }
27
+
28
+ export default Loader;
@@ -0,0 +1,119 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { ScaffoldIdentifierEnum } from '../enum/viewport/scaffold-identifier';
15
+ import { AbstractContainer } from './abstract-container';
16
+ import TriggerRequest from '../event/trigger-request';
17
+ import { selector } from '@typo3/core/literals';
18
+ import type InteractionRequest from '../event/interaction-request';
19
+
20
+ class NavigationContainer extends AbstractContainer {
21
+ private activeComponentId: string = '';
22
+
23
+ public constructor(consumerScope: any)
24
+ {
25
+ super(consumerScope);
26
+ }
27
+
28
+ private get parent(): HTMLElement
29
+ {
30
+ return document.querySelector(ScaffoldIdentifierEnum.scaffold);
31
+ }
32
+
33
+ private get container(): HTMLElement
34
+ {
35
+ return document.querySelector(ScaffoldIdentifierEnum.contentNavigation);
36
+ }
37
+
38
+ /**
39
+ * Renders registered (non-iframe) navigation component e.g. a page tree
40
+ *
41
+ * @param {string} navigationComponentId
42
+ */
43
+ public showComponent(navigationComponentId: string): void {
44
+ const container = this.container;
45
+ this.show(navigationComponentId);
46
+ // Component is already loaded and active, nothing to do
47
+ if (navigationComponentId === this.activeComponentId) {
48
+ return;
49
+ }
50
+ if (this.activeComponentId !== '') {
51
+ const activeComponentElement = container.querySelector('#navigationComponent-' + this.activeComponentId.replace(/[/@]/g, '_')) as HTMLElement;
52
+ if (activeComponentElement) {
53
+ activeComponentElement.style.display = 'none';
54
+ }
55
+ }
56
+
57
+ const componentCssName = navigationComponentId.replace(/[/@]/g, '_');
58
+ const navigationComponentElement = 'navigationComponent-' + componentCssName;
59
+
60
+ // The component was already set up, so requiring the module again can be excluded.
61
+ if (container.querySelectorAll(selector`[data-component="${navigationComponentId}"]`).length === 1) {
62
+ this.show(navigationComponentId);
63
+ this.activeComponentId = navigationComponentId;
64
+ return;
65
+ }
66
+
67
+ import(navigationComponentId + '.js').then((__esModule: {navigationComponentName?: string}): void => {
68
+ if (typeof __esModule.navigationComponentName === 'string') {
69
+ const tagName: string = __esModule.navigationComponentName;
70
+ const element = document.createElement(tagName);
71
+ element.setAttribute('id', navigationComponentElement);
72
+ element.classList.add('scaffold-content-navigation-component');
73
+ element.dataset.component = navigationComponentId;
74
+ container.append(element);
75
+ } else {
76
+ // Because the component does not exist, let's create the div as wrapper
77
+ container.insertAdjacentHTML(
78
+ 'beforeend',
79
+ '<div class="scaffold-content-navigation-component" data-component="' + navigationComponentId + '" id="' + navigationComponentElement + '"></div>'
80
+ );
81
+
82
+ // manual static initialize method, unused but kept for backwards-compatibility until TYPO3 v12
83
+ const navigationComponent = Object.values(__esModule)[0] as any;
84
+ navigationComponent.initialize('#' + navigationComponentElement);
85
+ }
86
+ this.show(navigationComponentId);
87
+ this.activeComponentId = navigationComponentId;
88
+ });
89
+ }
90
+
91
+ public hide(): void {
92
+ const parent = this.parent;
93
+ parent.classList.remove('scaffold-content-navigation-available');
94
+ }
95
+
96
+ public show(component: string): void {
97
+ const parent = this.parent;
98
+ const container = this.container;
99
+ container.querySelectorAll(ScaffoldIdentifierEnum.contentNavigationDataComponent).forEach((el: HTMLElement) => el.style.display = 'none');
100
+ parent.classList.add('scaffold-content-navigation-available');
101
+ const selectedElement = container.querySelector('[data-component="' + component + '"]') as HTMLElement;
102
+ if (selectedElement) {
103
+ // Re-set to the display setting from CSS
104
+ selectedElement.style.display = null;
105
+ }
106
+ }
107
+
108
+ public setUrl(urlToLoad: string, interactionRequest: InteractionRequest): Promise<void> {
109
+ const promise = this.consumerScope.invoke(
110
+ new TriggerRequest('typo3.setUrl', interactionRequest),
111
+ );
112
+ promise.then((): void => {
113
+ this.parent.classList.add('scaffold-content-navigation-expanded');
114
+ });
115
+ return promise;
116
+ }
117
+ }
118
+
119
+ export default NavigationContainer;
@@ -0,0 +1,176 @@
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, LitElement, type TemplateResult } from 'lit';
15
+ import { customElement, property, state } from 'lit/decorators';
16
+ import { lll } from '@typo3/core/lit-helper';
17
+ import Persistent from '../storage/persistent';
18
+ import '@typo3/backend/element/icon-element';
19
+
20
+ const selectorConverter = {
21
+ fromAttribute(selector: string) {
22
+ return document.querySelector(selector);
23
+ }
24
+ };
25
+
26
+ enum ReadingModeDirection {
27
+ ltr = 'ltr',
28
+ rtl = 'rtl',
29
+ }
30
+
31
+ class ReadingMode {
32
+ public static get(): ReadingModeDirection {
33
+ return document.querySelector('html').dir === 'rtl' ? ReadingModeDirection.rtl : ReadingModeDirection.ltr;
34
+ }
35
+ }
36
+
37
+ @customElement('typo3-backend-navigation-switcher')
38
+ export class ResizableNavigation extends LitElement {
39
+ @property({ type: Number, attribute: 'minimum-width' }) minimumWidth: number = 250;
40
+ @property({ type: Number, attribute: 'initial-width' }) initialWidth: number;
41
+ @property({ type: String, attribute: 'persistence-identifier' }) persistenceIdentifier: string;
42
+
43
+ @property({ attribute: 'parent', converter: selectorConverter }) parentContainer: HTMLElement;
44
+ @property({ attribute: 'navigation', converter: selectorConverter }) navigationContainer: HTMLElement;
45
+
46
+ @state() resizing: boolean = false;
47
+
48
+ public override connectedCallback(): void {
49
+ super.connectedCallback();
50
+ const initialWidth = this.initialWidth || parseInt(Persistent.get(this.persistenceIdentifier), 10);
51
+ this.setNavigationWidth(initialWidth);
52
+ window.addEventListener('resize', this.fallbackNavigationSizeIfNeeded, { passive: true });
53
+ }
54
+
55
+ public override disconnectedCallback(): void {
56
+ super.disconnectedCallback();
57
+ window.removeEventListener('resize', this.fallbackNavigationSizeIfNeeded);
58
+ }
59
+
60
+ // disable shadow dom
61
+ protected override createRenderRoot(): HTMLElement | ShadowRoot {
62
+ return this;
63
+ }
64
+
65
+ protected override async firstUpdated(): Promise<void> {
66
+ // Give the browser a chance to paint
67
+ await new Promise((r) => setTimeout(r, 0));
68
+ // needed to avoid any issues related to browsers, as lit-decorators (eventOptions) do not work yet
69
+ // properly https://lit-element.polymer-project.org/guide/events - @touchstart would throw warnings in browser console without passive=true
70
+ this.querySelector('.scaffold-content-navigation-switcher-btn').addEventListener('touchstart', this.toggleNavigation, { passive: true });
71
+ this.querySelector('.scaffold-content-navigation-drag').addEventListener('touchstart', this.startResizeNavigation, { passive: true });
72
+ }
73
+
74
+ protected override render(): TemplateResult {
75
+ return html`
76
+ <div class="scaffold-content-navigation-switcher">
77
+ <button @click="${this.toggleNavigation}" class="btn btn-sm btn-default btn-borderless scaffold-content-navigation-switcher-btn scaffold-content-navigation-switcher-open" role="button" title="${lll('viewport_navigation_show')}">
78
+ <typo3-backend-icon identifier="actions-chevron-end" size="small"></typo3-backend-icon>
79
+ </button>
80
+ <button @click="${this.toggleNavigation}" class="btn btn-sm btn-default btn-borderless scaffold-content-navigation-switcher-btn scaffold-content-navigation-switcher-close" role="button" title="${lll('viewport_navigation_hide')}">
81
+ <typo3-backend-icon identifier="actions-chevron-start" size="small"></typo3-backend-icon>
82
+ </button>
83
+ </div>
84
+ <div @mousedown="${this.startResizeNavigation}" class="scaffold-content-navigation-drag ${this.resizing ? 'resizing' : ''}"></div>
85
+ `;
86
+ }
87
+
88
+ private readonly toggleNavigation = (event: MouseEvent | TouchEvent | KeyboardEvent) => {
89
+ event.stopPropagation();
90
+ this.parentContainer.classList.toggle('scaffold-content-navigation-expanded');
91
+
92
+ if (event.currentTarget instanceof HTMLElement) {
93
+ const sibling = (event.currentTarget.nextElementSibling ?? event.currentTarget.previousElementSibling) as HTMLElement;
94
+ sibling.focus();
95
+ }
96
+ };
97
+
98
+ private readonly fallbackNavigationSizeIfNeeded = (event: UIEvent) => {
99
+ const window = <Window>event.currentTarget;
100
+ if (this.getNavigationWidth() === 0) {
101
+ return;
102
+ }
103
+ if (window.outerWidth < this.getNavigationWidth() + this.getNavigationPosition().left + this.minimumWidth) {
104
+ this.autoNavigationWidth();
105
+ }
106
+ };
107
+
108
+ private readonly handleMouseMove = (event: MouseEvent) => {
109
+ this.resizeNavigation(<number>event.clientX);
110
+ };
111
+
112
+ private readonly handleTouchMove = (event: TouchEvent) => {
113
+ this.resizeNavigation(<number>event.changedTouches[0].clientX);
114
+ };
115
+
116
+ private readonly resizeNavigation = (position: number) => {
117
+ let width : number = 0;
118
+ if (ReadingMode.get() === ReadingModeDirection.ltr) {
119
+ width = Math.round(position) - Math.round(this.getNavigationPosition().left);
120
+ } else {
121
+ width = Math.round(this.getNavigationPosition().right) - Math.round(position);
122
+ }
123
+
124
+ this.setNavigationWidth(width);
125
+ };
126
+
127
+ private readonly startResizeNavigation = (event: MouseEvent | TouchEvent) => {
128
+ if (event instanceof MouseEvent && event.button === 2) {
129
+ return;
130
+ }
131
+ event.stopPropagation();
132
+ this.resizing = true;
133
+ document.addEventListener('mousemove', this.handleMouseMove, false);
134
+ document.addEventListener('mouseup', this.stopResizeNavigation, false);
135
+ document.addEventListener('touchmove', this.handleTouchMove, false);
136
+ document.addEventListener('touchend', this.stopResizeNavigation, false);
137
+ };
138
+
139
+ private readonly stopResizeNavigation = () => {
140
+ this.resizing = false;
141
+ document.removeEventListener('mousemove', this.handleMouseMove, false);
142
+ document.removeEventListener('mouseup', this.stopResizeNavigation, false);
143
+ document.removeEventListener('touchmove', this.handleTouchMove, false);
144
+ document.removeEventListener('touchend', this.stopResizeNavigation, false);
145
+ Persistent.set(this.persistenceIdentifier, <string><unknown>this.getNavigationWidth());
146
+ document.dispatchEvent(new CustomEvent('typo3:navigation:resized'));
147
+ };
148
+
149
+ private getNavigationPosition(): DOMRect {
150
+ return this.navigationContainer.getBoundingClientRect();
151
+ }
152
+
153
+ private getNavigationWidth(): number {
154
+ return <number>this.navigationContainer.offsetWidth;
155
+ }
156
+
157
+ private autoNavigationWidth(): void {
158
+ this.navigationContainer.style.width = 'auto';
159
+ }
160
+
161
+ private setNavigationWidth(width: number): void {
162
+ // Allow only 50% of the main document
163
+ const maxWidth = Math.round(this.parentContainer.getBoundingClientRect().width / 2);
164
+ if (width > maxWidth) {
165
+ width = maxWidth;
166
+ }
167
+ width = width > this.minimumWidth ? width : this.minimumWidth;
168
+ this.navigationContainer.style.width = width + 'px';
169
+ }
170
+ }
171
+
172
+ declare global {
173
+ interface HTMLElementTagNameMap {
174
+ 'typo3-backend-navigation-switcher': ResizableNavigation;
175
+ }
176
+ }
@@ -0,0 +1,27 @@
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 { ScaffoldIdentifierEnum } from '../enum/viewport/scaffold-identifier';
15
+ import DocumentService from '@typo3/core/document-service';
16
+ import RegularEvent from '@typo3/core/event/regular-event';
17
+
18
+ class Toolbar {
19
+ public registerEvent(callback: () => void): void {
20
+ DocumentService.ready().then(() => {
21
+ callback();
22
+ });
23
+ new RegularEvent('t3-topbar-update', callback).bindTo(document.querySelector(ScaffoldIdentifierEnum.header));
24
+ }
25
+ }
26
+
27
+ export default Toolbar;
@@ -0,0 +1,39 @@
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 { ScaffoldIdentifierEnum } from '../enum/viewport/scaffold-identifier';
15
+ import Toolbar from './toolbar';
16
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
17
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
18
+
19
+ class Topbar {
20
+ public static readonly topbarSelector: string = ScaffoldIdentifierEnum.header;
21
+ public readonly Toolbar: Toolbar;
22
+
23
+ public constructor() {
24
+ this.Toolbar = new Toolbar();
25
+ }
26
+
27
+ public refresh(): void {
28
+ new AjaxRequest(TYPO3.settings.ajaxUrls.topbar).get().then(async (response: AjaxResponse): Promise<void> => {
29
+ const data = await response.resolve();
30
+ const topbar = document.querySelector(Topbar.topbarSelector);
31
+ if (topbar !== null) {
32
+ topbar.innerHTML = data.topbar;
33
+ topbar.dispatchEvent(new Event('t3-topbar-update'));
34
+ }
35
+ });
36
+ }
37
+ }
38
+
39
+ export default Topbar;
@@ -0,0 +1,46 @@
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 ContentContainer from './viewport/content-container';
15
+ import ConsumerScope from './event/consumer-scope';
16
+ import Loader from './viewport/loader';
17
+ import NavigationContainer from './viewport/navigation-container';
18
+ import Topbar from './viewport/topbar';
19
+
20
+ class Viewport {
21
+ // The attributes are uppercase for compatibility reasons
22
+ public readonly Loader: Loader = Loader;
23
+ public readonly Topbar: Topbar;
24
+ public readonly NavigationContainer: NavigationContainer = null;
25
+ public readonly ContentContainer: ContentContainer = null;
26
+ public readonly consumerScope: any = ConsumerScope;
27
+
28
+ constructor() {
29
+ this.Topbar = new Topbar();
30
+ this.NavigationContainer = new NavigationContainer(this.consumerScope);
31
+ this.ContentContainer = new ContentContainer(this.consumerScope);
32
+ }
33
+ }
34
+
35
+ let viewportObject: Viewport;
36
+
37
+ if (!top.TYPO3 || !top.TYPO3.Backend) {
38
+ viewportObject = new Viewport();
39
+ if (typeof top.TYPO3 !== 'undefined') {
40
+ top.TYPO3.Backend = viewportObject;
41
+ }
42
+ } else {
43
+ viewportObject = top.TYPO3.Backend;
44
+ }
45
+
46
+ export default viewportObject;
@@ -0,0 +1,84 @@
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 Utility from '@typo3/backend/utility';
15
+
16
+ /**
17
+ * Module: @typo3/backend/window-manager
18
+ */
19
+ class WindowManager {
20
+ private windows: {[key: string]: Window} = {};
21
+
22
+ // alias for `localOpen`
23
+ public open(...params: any[]): Window {
24
+ return this._localOpen.apply(null, params);
25
+ }
26
+
27
+ // @todo Not implemented, yet
28
+ public globalOpen(...params: any[]): Window {
29
+ return this._localOpen.apply(null, params);
30
+ }
31
+
32
+ public localOpen = (uri: string, switchFocus?: boolean, windowName: string = 'newTYPO3frontendWindow', windowFeatures: string = ''): Window | null => this._localOpen(uri, switchFocus, windowName, windowFeatures);
33
+
34
+ private _localOpen(uri: string, switchFocus?: boolean, windowName: string = 'newTYPO3frontendWindow', windowFeatures: string = ''): Window | null {
35
+ if (!uri) {
36
+ return null;
37
+ }
38
+ if (switchFocus === null) {
39
+ // @todo Check how this would happen, taken from legacy code
40
+ switchFocus = !window.opener;
41
+ } else if (switchFocus === undefined) {
42
+ switchFocus = true;
43
+ }
44
+ const existingWindow = this.windows[windowName] ?? window.open('', windowName, windowFeatures);
45
+ let isInstanceOfWindow = false;
46
+ try {
47
+ // Note: `existingWindow instanceof Window` wouldn't work here as `existingWindow` is from another browser context/window.
48
+ // Note: this will still fail if `existingWindow` points to a cross-origin frame
49
+ // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof#instanceof_and_multiple_realms
50
+ isInstanceOfWindow = existingWindow.constructor.name === 'Window';
51
+ } catch {
52
+ // Intended fall-thru
53
+ // DOMException is thrown if existingWindow points to a cross-origin frame which we're not allowed to access
54
+ }
55
+ const existingUri = isInstanceOfWindow && !existingWindow.closed ? existingWindow.location.href : null;
56
+
57
+ if (Utility.urlsPointToSameServerSideResource(uri, existingUri)) {
58
+ existingWindow.location.replace(uri);
59
+ existingWindow.location.reload();
60
+ existingWindow.focus();
61
+ return existingWindow;
62
+ }
63
+ const newWindow = window.open(uri, windowName, windowFeatures);
64
+ this.windows[windowName] = newWindow;
65
+ if (switchFocus) {
66
+ newWindow.focus();
67
+ }
68
+ return newWindow;
69
+ }
70
+ }
71
+
72
+ const windowManager = new WindowManager();
73
+
74
+ if (!top.TYPO3.WindowManager) {
75
+ if (top.document === window.document) {
76
+ // our instance is available in top/global scope
77
+ top.TYPO3.WindowManager = windowManager;
78
+ } else {
79
+ // ensure there is an instance in top/global scope
80
+ top.TYPO3.WindowManager = new WindowManager();
81
+ }
82
+ }
83
+
84
+ export default windowManager;