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,396 @@
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 { lll } from '@typo3/core/lit-helper';
15
+ import DocumentService from '@typo3/core/document-service';
16
+ import Notification from '@typo3/backend/notification';
17
+ import InfoWindow from '@typo3/backend/info-window';
18
+ import { FileListActionEvent, type FileListActionDetail, FileListActionSelector, FileListActionUtility } from '@typo3/filelist/file-list-actions';
19
+ import NProgress from 'nprogress';
20
+ import Icons from '@typo3/backend/icons';
21
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
22
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
23
+ import RegularEvent from '@typo3/core/event/regular-event';
24
+ import { ModuleStateStorage } from '@typo3/backend/storage/module-state-storage';
25
+ import { default as Modal, type ModalElement } from '@typo3/backend/modal';
26
+ import { SeverityEnum } from '@typo3/backend/enum/severity';
27
+ import Severity from '@typo3/backend/severity';
28
+ import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selection';
29
+ import ContextMenu from '@typo3/backend/context-menu';
30
+ import type { ActionConfiguration, ActionEventDetails } from '@typo3/backend/multi-record-selection-action';
31
+ import type { ResourceInterface } from '@typo3/backend/resource/resource';
32
+
33
+ type QueryParameters = Record<string, string>;
34
+
35
+ interface EditFileMetadataConfiguration extends ActionConfiguration {
36
+ table: string;
37
+ columnsOnly: Array<string>;
38
+ returnUrl: string;
39
+ }
40
+ interface DownloadConfiguration extends ActionConfiguration {
41
+ downloadUrl: string;
42
+ }
43
+
44
+ interface DeleteFileMetadataConfiguration {
45
+ ok: string;
46
+ title: string;
47
+ content: string;
48
+ }
49
+
50
+ enum Selectors {
51
+ fileListFormSelector = 'form[name="fileListForm"]',
52
+ commandSelector = 'input[name="cmd"]',
53
+ searchFieldSelector = 'input[name="searchTerm"]',
54
+ pointerFieldSelector = 'input[name="pointer"]',
55
+ }
56
+
57
+ /**
58
+ * @internal
59
+ */
60
+ export const fileListOpenElementBrowser = 'typo3:filelist:openElementBrowser';
61
+
62
+ /**
63
+ * Module: @typo3/filelist/filelist
64
+ * @exports @typo3/filelist/filelist
65
+ */
66
+ export default class Filelist {
67
+ constructor() {
68
+ new RegularEvent(fileListOpenElementBrowser, (event: CustomEvent): void => {
69
+ const url = new URL(event.detail.actionUrl, window.location.origin);
70
+
71
+ url.searchParams.set('expandFolder', event.detail.identifier);
72
+ url.searchParams.set('mode', event.detail.mode);
73
+
74
+ const modal = Modal.advanced({
75
+ type: Modal.types.iframe,
76
+ content: url.toString(),
77
+ size: Modal.sizes.large
78
+ });
79
+ modal.addEventListener('typo3-modal-hidden', (): void => {
80
+ // @todo: this needs to be done when a folder was created. Apparently, backend user signals are not parsed in
81
+ // the modal's context. The best solution is probably to reload the "document space" via AJAX.
82
+ top.list_frame.document.location.reload();
83
+ });
84
+ }).bindTo(document);
85
+
86
+ // Filelist resource events
87
+ new RegularEvent(FileListActionEvent.primary, (event: CustomEvent): void => {
88
+ const detail: FileListActionDetail = event.detail;
89
+ const resource = detail.resources[0];
90
+ const resourceElement: HTMLElement = detail.trigger.closest('[data-default-language-access]') as HTMLElement;
91
+ if (resource.type === 'file' && resourceElement !== null) {
92
+ const formEngineUrl = new URL(top.TYPO3.settings.FormEngine.moduleUrl, window.location.origin);
93
+ if (resource.metaUid > 0) {
94
+ formEngineUrl.searchParams.set('edit[sys_file_metadata][' + resource.metaUid + ']', 'edit');
95
+ } else {
96
+ formEngineUrl.searchParams.set('edit[sys_file_metadata][0]', 'new');
97
+ formEngineUrl.searchParams.set('defVals[sys_file_metadata][file]', resource.uid.toString(10));
98
+ }
99
+ formEngineUrl.searchParams.set('returnUrl', Filelist.getReturnUrl(''));
100
+ window.location.href = formEngineUrl.toString();
101
+ }
102
+ if (resource.type === 'folder') {
103
+ const parameters = Filelist.parseQueryParameters(document.location);
104
+ parameters.id = resource.identifier;
105
+ const url = new URL(window.location.pathname, window.location.origin);
106
+ for (const [key, value] of Object.entries(parameters)) {
107
+ url.searchParams.set(key, value);
108
+ }
109
+ window.location.href = url.toString();
110
+ }
111
+ }).bindTo(document);
112
+
113
+ new RegularEvent(FileListActionEvent.primaryContextmenu, (event: CustomEvent): void => {
114
+ const detail: FileListActionDetail = event.detail;
115
+ const resource = detail.resources[0];
116
+ ContextMenu.show('sys_file', resource.identifier, '', '', '', detail.trigger, detail.event as PointerEvent);
117
+ }).bindTo(document);
118
+
119
+ new RegularEvent(FileListActionEvent.show, (event: CustomEvent): void => {
120
+ const detail: FileListActionDetail = event.detail;
121
+ const resource = detail.resources[0];
122
+ Filelist.openInfoPopup('_' + resource.type.toUpperCase(), resource.identifier);
123
+ }).bindTo(document);
124
+
125
+ new RegularEvent(FileListActionEvent.download, (event: CustomEvent): void => {
126
+ const detail: FileListActionDetail = event.detail;
127
+ const resource = detail.resources[0];
128
+ this.triggerDownload([resource], detail.url, detail.trigger);
129
+ }).bindTo(document);
130
+
131
+ new RegularEvent(FileListActionEvent.updateOnlineMedia, (event: CustomEvent): void => {
132
+ const detail: FileListActionDetail = event.detail;
133
+ const resource = detail.resources[0];
134
+ this.updateOnlineMedia(resource, detail.url);
135
+ }).bindTo(document);
136
+
137
+ DocumentService.ready().then((): void => {
138
+ Filelist.processTriggers();
139
+
140
+ new RegularEvent('click', (e: Event, trigger: HTMLAnchorElement): void => {
141
+ e.preventDefault();
142
+
143
+ document.dispatchEvent(new CustomEvent(fileListOpenElementBrowser, {
144
+ detail: {
145
+ actionUrl: trigger.href,
146
+ identifier: trigger.dataset.identifier,
147
+ mode: trigger.dataset.mode,
148
+ }
149
+ }));
150
+ }).delegateTo(document, '.t3js-element-browser');
151
+ });
152
+
153
+ // Respond to multi record selection action events
154
+ new RegularEvent('multiRecordSelection:action:edit', this.editFileMetadata).bindTo(document);
155
+ new RegularEvent('multiRecordSelection:action:delete', this.deleteMultiple).bindTo(document);
156
+ new RegularEvent('multiRecordSelection:action:download', this.downloadFilesAndFolders).bindTo(document);
157
+ new RegularEvent('multiRecordSelection:action:copyMarked', (event: CustomEvent): void => {
158
+ Filelist.submitClipboardFormWithCommand('copyMarked', event.target as HTMLButtonElement);
159
+ }).bindTo(document);
160
+ new RegularEvent('multiRecordSelection:action:removeMarked', (event: CustomEvent): void => {
161
+ Filelist.submitClipboardFormWithCommand('removeMarked', event.target as HTMLButtonElement);
162
+ }).bindTo(document);
163
+
164
+ // Respond to browser related clearable event
165
+ const activeSearch: boolean = (document.querySelector([Selectors.fileListFormSelector, Selectors.searchFieldSelector].join(' ')) as HTMLInputElement)?.value !== '';
166
+ new RegularEvent('search', (event: Event): void => {
167
+ const searchField: HTMLInputElement = event.target as HTMLInputElement;
168
+ if (searchField.value === '' && activeSearch) {
169
+ (searchField.closest(Selectors.fileListFormSelector) as HTMLFormElement)?.submit();
170
+ }
171
+ }).delegateTo(document, Selectors.searchFieldSelector);
172
+ }
173
+
174
+ public static submitClipboardFormWithCommand(cmd: string, target: HTMLButtonElement): void {
175
+ const fileListForm: HTMLFormElement = target.closest(Selectors.fileListFormSelector);
176
+ if (!fileListForm) {
177
+ return;
178
+ }
179
+ const commandField: HTMLInputElement = fileListForm.querySelector(Selectors.commandSelector);
180
+ if (!commandField) {
181
+ return;
182
+ }
183
+ commandField.value = cmd;
184
+ // In case we just change elements on the clipboard, we try to fetch a possible pointer from the query
185
+ // parameters, so after the form submit, we get to the same view as before. This is not done for delete
186
+ // commands, since this may lead to empty sites, in case all elements from the current site are deleted.
187
+ if (cmd === 'copyMarked' || cmd === 'removeMarked') {
188
+ const pointerField: HTMLInputElement = fileListForm.querySelector(Selectors.pointerFieldSelector);
189
+ const pointerValue: string = Filelist.parseQueryParameters(document.location).pointer;
190
+ if (pointerField && pointerValue) {
191
+ pointerField.value = pointerValue;
192
+ }
193
+ }
194
+ fileListForm.submit();
195
+ }
196
+
197
+ protected static openInfoPopup(type: string, identifier: string): void {
198
+ InfoWindow.showItem(type, identifier);
199
+ }
200
+
201
+ private static processTriggers(): void {
202
+ const mainElement: HTMLElement = document.querySelector('.filelist-main');
203
+ if (mainElement === null) {
204
+ return;
205
+ }
206
+ // update ModuleStateStorage to the current folder identifier
207
+ ModuleStateStorage.update('media', mainElement.dataset.filelistCurrentIdentifier);
208
+ }
209
+
210
+ private static parseQueryParameters(location: Location): QueryParameters {
211
+ const searchParams = new URLSearchParams(location.search);
212
+ return Object.fromEntries(searchParams.entries());
213
+ }
214
+
215
+ private static getReturnUrl(returnUrl: string): string {
216
+ if (returnUrl === '') {
217
+ const form = top.list_frame.document.forms.namedItem('fileListForm');
218
+ if (form !== null) {
219
+ returnUrl = form.action;
220
+ } else {
221
+ returnUrl = top.list_frame.document.location.pathname + top.list_frame.document.location.search;
222
+ }
223
+ }
224
+ return returnUrl;
225
+ }
226
+
227
+ private deleteMultiple(e: CustomEvent): void {
228
+ e.preventDefault();
229
+ const eventDetails: ActionEventDetails = e.detail as ActionEventDetails;
230
+ const configuration: DeleteFileMetadataConfiguration = eventDetails.configuration;
231
+ Modal.advanced({
232
+ title: configuration.title || 'Delete',
233
+ content: configuration.content || 'Are you sure you want to delete those files and folders?',
234
+ severity: SeverityEnum.warning,
235
+ buttons: [
236
+ {
237
+ text: TYPO3.lang['button.close'] || 'Close',
238
+ active: true,
239
+ btnClass: 'btn-default',
240
+ trigger: (modalEvent: Event, modal: ModalElement) => modal.hideModal(),
241
+ },
242
+ {
243
+ text: configuration.ok || TYPO3.lang['button.ok'] || 'OK',
244
+ btnClass: 'btn-' + Severity.getCssClass(SeverityEnum.warning),
245
+ trigger: (modalEvent: Event, modal: ModalElement) => {
246
+ Filelist.submitClipboardFormWithCommand('delete', e.target as HTMLButtonElement);
247
+ modal.hideModal();
248
+ }
249
+ }
250
+ ]
251
+ });
252
+ }
253
+
254
+ private editFileMetadata(e: CustomEvent): void {
255
+ e.preventDefault();
256
+ const eventDetails: ActionEventDetails = e.detail;
257
+ const configuration: EditFileMetadataConfiguration = eventDetails.configuration;
258
+ if (!configuration || !configuration.idField || !configuration.table) {
259
+ return;
260
+ }
261
+ const list: Array<string> = [];
262
+ (eventDetails.checkboxes as NodeListOf<HTMLInputElement>).forEach((checkbox: HTMLInputElement) => {
263
+ const checkboxContainer: HTMLElement = checkbox.closest(MultiRecordSelectionSelectors.elementSelector);
264
+ if (checkboxContainer !== null && checkboxContainer.dataset[configuration.idField]) {
265
+ list.push(checkboxContainer.dataset[configuration.idField]);
266
+ }
267
+ });
268
+
269
+ if (list.length) {
270
+ const url = new URL(top.TYPO3.settings.FormEngine.moduleUrl, window.location.origin);
271
+ url.searchParams.set('edit[' + configuration.table + '][' + list.join(',') + ']', 'edit');
272
+ url.searchParams.set('returnUrl', Filelist.getReturnUrl(configuration.returnUrl || ''));
273
+ const columnsOnly = configuration.columnsOnly || [];
274
+ columnsOnly.forEach((column: string, i: number): void => {
275
+ url.searchParams.set('columnsOnly[' + configuration.table + '][' + i + ']', column);
276
+ });
277
+ window.location.href = url.toString();
278
+ } else {
279
+ Notification.warning('The selected elements can not be edited.');
280
+ }
281
+ }
282
+
283
+ private readonly downloadFilesAndFolders = (event: CustomEvent): void => {
284
+ event.preventDefault();
285
+
286
+ const target: HTMLElement = event.target as HTMLElement;
287
+ const eventDetails: ActionEventDetails = (event.detail as ActionEventDetails);
288
+ const configuration: DownloadConfiguration = (eventDetails.configuration as DownloadConfiguration);
289
+
290
+ const filesAndFolders: ResourceInterface[] = [];
291
+ eventDetails.checkboxes.forEach((checkbox: HTMLInputElement) => {
292
+ if (checkbox.checked) {
293
+ const element = checkbox.closest(FileListActionSelector.elementSelector) as HTMLInputElement;
294
+ const resource = FileListActionUtility.getResourceForElement(element);
295
+ filesAndFolders.unshift(resource);
296
+ }
297
+ });
298
+
299
+ if (filesAndFolders.length) {
300
+ this.triggerDownload(filesAndFolders, configuration.downloadUrl, target);
301
+ } else {
302
+ Notification.warning(lll('file_download.invalidSelection'));
303
+ }
304
+ };
305
+
306
+ private triggerDownload(items: ResourceInterface[], downloadUrl: string, button: HTMLElement | null): void {
307
+ if (items.length === 1) {
308
+ const item = items.at(0);
309
+ if (item.type === 'file') {
310
+ // We deal with a single file in the selection, download directly
311
+ this.invokeDownload(item.url, item.name);
312
+ return;
313
+ }
314
+ }
315
+
316
+ // Add notification about the download being prepared
317
+ Notification.info(lll('file_download.prepare'), '', 2);
318
+ // Store the targets' (button) content and replace with a spinner
319
+ // icon, while the download is being prepared. Also disable the
320
+ // button for this time to prevent the user from triggering it again.
321
+ const targetContent: string | null = button?.innerHTML;
322
+ if (button) {
323
+ button.setAttribute('disabled', 'disabled');
324
+ Icons.getIcon('spinner-circle', Icons.sizes.small).then((spinner: string): void => {
325
+ button.innerHTML = spinner;
326
+ });
327
+ }
328
+
329
+ // Configure and start the progress bar, while preparing
330
+ NProgress
331
+ .configure({ parent: '#typo3-filelist', showSpinner: false })
332
+ .start();
333
+
334
+ const itemIdentifiers = items.map((resource: ResourceInterface) => resource.identifier);
335
+ (new AjaxRequest(downloadUrl)).post({ items: itemIdentifiers })
336
+ .then(async (response: AjaxResponse): Promise<void> => {
337
+ let fileName = response.response.headers.get('Content-Disposition');
338
+ if (!fileName) {
339
+ const data = await response.resolve();
340
+ if (data.success === false && data.status) {
341
+ Notification.warning(lll('file_download.' + data.status), lll('file_download.' + data.status + '.message'), 10);
342
+ } else {
343
+ Notification.error(lll('file_download.error'));
344
+ }
345
+ return;
346
+ }
347
+ fileName = fileName.substring(fileName.indexOf(' filename=') + 10);
348
+ const data = await response.raw().arrayBuffer();
349
+ const blob = new Blob([data], { type: response.raw().headers.get('Content-Type') });
350
+ const downloadUrl = URL.createObjectURL(blob);
351
+ this.invokeDownload(downloadUrl, fileName);
352
+ // Add notification about successful preparation
353
+ Notification.success(lll('file_download.success'), '', 2);
354
+ })
355
+ .catch(() => {
356
+ Notification.error(lll('file_download.error'));
357
+ })
358
+ .finally(() => {
359
+ // Remove progress bar and restore target (button)
360
+ NProgress.done();
361
+ if (button) {
362
+ button.removeAttribute('disabled');
363
+ button.innerHTML = targetContent;
364
+ }
365
+ });
366
+ }
367
+
368
+ private updateOnlineMedia(resource: ResourceInterface, url: string): void {
369
+ if (!url || !resource.uid || resource.type !== 'file') {
370
+ return;
371
+ }
372
+
373
+ NProgress.configure({ parent: '#typo3-filelist', showSpinner: false }).start();
374
+ (new AjaxRequest(url)).post({ resource: resource })
375
+ .then(() => {
376
+ Notification.success(lll('online_media.update.success'));
377
+ })
378
+ .catch(() => {
379
+ Notification.error(lll('online_media.update.error'));
380
+ })
381
+ .finally(() => {
382
+ NProgress.done();
383
+ window.location.reload();
384
+ });
385
+ }
386
+
387
+ private invokeDownload(downloadUrl: string, fileName: string): void {
388
+ const anchorTag = document.createElement('a');
389
+ anchorTag.href = downloadUrl;
390
+ anchorTag.download = fileName;
391
+ document.body.appendChild(anchorTag);
392
+ anchorTag.click();
393
+ URL.revokeObjectURL(downloadUrl);
394
+ document.body.removeChild(anchorTag);
395
+ }
396
+ }
@@ -0,0 +1,37 @@
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 RegularEvent from '@typo3/core/event/regular-event';
15
+ import DocumentService from '@typo3/core/document-service';
16
+
17
+ class FileReplace {
18
+ constructor() {
19
+ DocumentService.ready().then((): void => {
20
+ this.registerEvents();
21
+ });
22
+ }
23
+
24
+ private registerEvents(): void {
25
+ new RegularEvent('click', function (this: HTMLElement): void {
26
+ const targetSelector = this.dataset.filelistClickTarget;
27
+ (document.querySelector(targetSelector) as HTMLElement).click();
28
+ }).delegateTo(document.body, '[data-filelist-click-target]:not([data-filelist-click-target=""]');
29
+
30
+ new RegularEvent('change', function (this: HTMLInputElement): void {
31
+ const targetSelector = this.dataset.filelistChangeTarget;
32
+ (document.querySelector(targetSelector) as HTMLInputElement).value = this.value;
33
+ }).delegateTo(document.body, '[data-filelist-change-target]:not([data-filelist-change-target=""])');
34
+ }
35
+ }
36
+
37
+ export default new FileReplace();
@@ -0,0 +1,94 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import LinkBrowser from '@typo3/backend/link-browser';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+ import { FileListActionEvent, type FileListActionDetail } from '@typo3/filelist/file-list-actions';
17
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
18
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
19
+ import type { ResourceInterface } from '@typo3/backend/resource/resource';
20
+ import InfoWindow from '@typo3/backend/info-window';
21
+ import Notification from '@typo3/backend/notification';
22
+ import type MessageInterface from '@typo3/backend/ajax-data-handler/message-interface';
23
+
24
+ class LinkBrowserFileHandler {
25
+ constructor() {
26
+
27
+ new RegularEvent(FileListActionEvent.primary, (event: CustomEvent): void => {
28
+ event.preventDefault();
29
+ const detail: FileListActionDetail = event.detail;
30
+ detail.action = FileListActionEvent.select;
31
+ document.dispatchEvent(new CustomEvent(FileListActionEvent.select, { detail: detail }));
32
+ }).bindTo(document);
33
+
34
+ new RegularEvent(FileListActionEvent.select, (event: CustomEvent): void => {
35
+ event.preventDefault();
36
+ const detail: FileListActionDetail = event.detail;
37
+ const resource = detail.resources[0];
38
+ if (resource.type === 'file') {
39
+ this.insertLink(resource);
40
+ }
41
+ if (resource.type === 'folder') {
42
+ this.loadContent(resource);
43
+ }
44
+ }).bindTo(document);
45
+
46
+ new RegularEvent(FileListActionEvent.show, (event: CustomEvent): void => {
47
+ event.preventDefault();
48
+ const detail: FileListActionDetail = event.detail;
49
+ const resource = detail.resources[0];
50
+ InfoWindow.showItem('_' + resource.type.toUpperCase(), resource.identifier);
51
+ }).bindTo(document);
52
+
53
+ }
54
+
55
+ private insertLink(resource: ResourceInterface): void
56
+ {
57
+ const request = new AjaxRequest(TYPO3.settings.ajaxUrls.link_resource);
58
+ request.post({
59
+ identifier: resource.identifier,
60
+ }).then(async (success: AjaxResponse): Promise<void> => {
61
+ const data = await success.resolve();
62
+ data.status.forEach((message: MessageInterface): void => {
63
+ Notification.showMessage(message.title, message.message, message.severity);
64
+ });
65
+ if (data.success) {
66
+ LinkBrowser.finalizeFunction(data.link);
67
+ }
68
+ });
69
+ }
70
+
71
+ private async loadContent(resource: ResourceInterface): Promise<void>
72
+ {
73
+ if (resource.type !== 'folder') {
74
+ return;
75
+ }
76
+ const contentsUrl = document.location.href + '&contentOnly=1&expandFolder=' + resource.identifier;
77
+ const response = await new AjaxRequest(contentsUrl).get();
78
+ const html = await response.resolve();
79
+ const contentContainer = document.querySelector('.element-browser-main-content .element-browser-body') as HTMLElement;
80
+ contentContainer.innerHTML = html;
81
+ const tree = document.querySelector('typo3-backend-component-filestorage-browser-tree');
82
+ if (tree) {
83
+ const treeNodeIdentifier = encodeURIComponent(resource.identifier);
84
+ // @todo Support loading the node via rootline, in case the node has not be loaded in the tree yet, see @typo3/backend/tree/tree-module-state
85
+ const node = tree.nodes.find((node) => node.identifier === treeNodeIdentifier);
86
+ if (node) {
87
+ await tree.expandNodeParents(node);
88
+ tree.selectNode(node, false);
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ export default new LinkBrowserFileHandler();
@@ -0,0 +1,74 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import LinkBrowser from '@typo3/backend/link-browser';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+ import { FileListActionEvent, type FileListActionDetail } from '@typo3/filelist/file-list-actions';
17
+ import type { ResourceInterface } from '@typo3/backend/resource/resource';
18
+ import InfoWindow from '@typo3/backend/info-window';
19
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
20
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
21
+ import Notification from '@typo3/backend/notification';
22
+ import type MessageInterface from '@typo3/backend/ajax-data-handler/message-interface';
23
+
24
+ class LinkBrowserFolderHandler {
25
+ constructor() {
26
+
27
+ new RegularEvent('click', (event: PointerEvent, target: HTMLElement): void => {
28
+ event.preventDefault();
29
+ LinkBrowser.finalizeFunction(target.dataset.linkbrowserLink);
30
+ }).delegateTo(document, '[data-linkbrowser-link]');
31
+
32
+ new RegularEvent(FileListActionEvent.primary, (event: CustomEvent): void => {
33
+ event.preventDefault();
34
+ const detail: FileListActionDetail = event.detail;
35
+ detail.action = FileListActionEvent.select;
36
+ document.dispatchEvent(new CustomEvent(FileListActionEvent.select, { detail: detail }));
37
+ }).bindTo(document);
38
+
39
+ new RegularEvent(FileListActionEvent.select, (event: CustomEvent): void => {
40
+ event.preventDefault();
41
+ const detail: FileListActionDetail = event.detail;
42
+ const resource = detail.resources[0];
43
+ if (resource.type === 'folder') {
44
+ this.insertLink(resource);
45
+ }
46
+ }).bindTo(document);
47
+
48
+ new RegularEvent(FileListActionEvent.show, (event: CustomEvent): void => {
49
+ event.preventDefault();
50
+ const detail: FileListActionDetail = event.detail;
51
+ const resource = detail.resources[0];
52
+ InfoWindow.showItem('_' + resource.type.toUpperCase(), resource.identifier);
53
+ }).bindTo(document);
54
+
55
+ }
56
+
57
+ private insertLink(resource: ResourceInterface): void
58
+ {
59
+ const request = new AjaxRequest(TYPO3.settings.ajaxUrls.link_resource);
60
+ request.post({
61
+ identifier: resource.identifier,
62
+ }).then(async (success: AjaxResponse): Promise<void> => {
63
+ const data = await success.resolve();
64
+ data.status.forEach((message: MessageInterface): void => {
65
+ Notification.showMessage(message.title, message.message, message.severity);
66
+ });
67
+ if (data.success) {
68
+ LinkBrowser.finalizeFunction(data.link);
69
+ }
70
+ });
71
+ }
72
+ }
73
+
74
+ export default new LinkBrowserFolderHandler();