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,77 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import DocumentService from '@typo3/core/document-service';
15
+ import { default as Modal } from '@typo3/backend/modal';
16
+ import { topLevelModuleImport } from '@typo3/backend/utility/top-level-module-import';
17
+ import { html, type TemplateResult } from 'lit';
18
+ import { until } from 'lit/directives/until';
19
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
20
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
21
+ import type { JavaScriptItemPayload } from '@typo3/core/java-script-item-processor';
22
+
23
+ /**
24
+ * @todo: This could be code-de-duplicated with ext:tstemplate template-analyzer.ts,
25
+ * by making "Show t3editor code in a modal" a more general solution.
26
+ * Main trigger is t3js-pagetsconfig-includes-modal vs. t3js-typoscript-analyzer-modal
27
+ */
28
+ class PageTsConfigIncludes {
29
+ constructor() {
30
+ this.registerEventListeners();
31
+ }
32
+
33
+ private async registerEventListeners(): Promise<void> {
34
+ await DocumentService.ready();
35
+
36
+ document.querySelectorAll('.t3js-pagetsconfig-includes-modal').forEach((link: HTMLAnchorElement): void => {
37
+ link.addEventListener('click', (e: Event): void => {
38
+ e.preventDefault();
39
+
40
+ const type = Modal.types.default;
41
+ const title = link.dataset.modalTitle || link.textContent.trim();
42
+ const url = link.getAttribute('href');
43
+ const size = Modal.sizes.large;
44
+ const content = html`${until(
45
+ this.fetchModalContent(url),
46
+ html`<div class="modal-loading"><typo3-backend-spinner size="large"></typo3-backend-spinner></div>`
47
+ )}`;
48
+ Modal.advanced({ type, title, size, content });
49
+ });
50
+ });
51
+ }
52
+
53
+ private async fetchModalContent(url: string): Promise<TemplateResult> {
54
+ // no `await` purpose (webcomponents initialize lazily)
55
+ topLevelModuleImport('@typo3/backend/code-editor/element/code-mirror-element.js');
56
+
57
+ const response: AjaxResponse = await (new AjaxRequest(url)).get();
58
+ const source: string = await response.resolve();
59
+
60
+ const mode: JavaScriptItemPayload = {
61
+ name: '@typo3/backend/code-editor/language/typoscript.js',
62
+ flags: 2 /* FLAG_USE_IMPORTMAP */,
63
+ exportName: 'typoscript',
64
+ items: [
65
+ { type: 'invoke', args: [] }
66
+ ]
67
+ };
68
+
69
+ return html`
70
+ <typo3-t3editor-codemirror .mode="${mode}" nolazyload readonly class="flex-grow-1 mh-100">
71
+ <textarea readonly disabled class="form-control">${source}</textarea>
72
+ </typo3-t3editor-codemirror>
73
+ `;
74
+ }
75
+ }
76
+
77
+ export default new PageTsConfigIncludes();
@@ -0,0 +1,165 @@
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 { Popover as BootstrapPopover } from 'bootstrap';
15
+
16
+ /**
17
+ * Module: @typo3/backend/popover
18
+ * API for popover windows powered by Twitter Bootstrap.
19
+ * @exports @typo3/backend/popover
20
+ */
21
+ class Popover {
22
+
23
+ /**
24
+ * Default selector string.
25
+ *
26
+ * @return {string}
27
+ */
28
+ private readonly DEFAULT_SELECTOR: string = '[data-bs-toggle="popover"]';
29
+
30
+ constructor() {
31
+ this.initialize();
32
+ }
33
+
34
+ /**
35
+ * Initialize
36
+ */
37
+ public initialize(selector?: string): void {
38
+ selector = selector || this.DEFAULT_SELECTOR;
39
+ document.querySelectorAll(selector).forEach((element: HTMLElement): void => {
40
+ this.applyTitleIfAvailable(element);
41
+ new BootstrapPopover(element);
42
+ });
43
+ }
44
+
45
+ // noinspection JSMethodCanBeStatic
46
+ /**
47
+ * Popover wrapper function
48
+ */
49
+ public popover(element: NodeListOf<HTMLElement> | HTMLElement) {
50
+ this.toIterable(element).forEach((element: HTMLElement): void => {
51
+ this.applyTitleIfAvailable(element);
52
+ new BootstrapPopover(element);
53
+ });
54
+ }
55
+
56
+ // noinspection JSMethodCanBeStatic
57
+ /**
58
+ * Set popover options on $element
59
+ */
60
+ public setOptions(element: HTMLElement, options?: BootstrapPopover.Options): void {
61
+ options = options || <BootstrapPopover.Options>{};
62
+ const title: string = (options.title as string) || element.dataset.title || element.dataset.bsTitle || '';
63
+ const content: string = (options.content as string) || element.dataset.bsContent || '';
64
+ element.dataset.bsTitle = title;
65
+ element.dataset.bsOriginalTitle = title;
66
+ element.dataset.bsContent = content;
67
+ element.dataset.bsPlacement = 'auto';
68
+
69
+ delete options.title;
70
+ delete options.content;
71
+
72
+ const popover = BootstrapPopover.getInstance(element);
73
+ if (popover === null) {
74
+ console.warn('Failed to get popover instance for element.');
75
+ return;
76
+ }
77
+ popover.setContent({
78
+ '.popover-header': title,
79
+ '.popover-body': content
80
+ });
81
+
82
+ for (const [optionName, optionValue] of Object.entries(options)) {
83
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
84
+ // @ts-ignore: using internal _config attribute
85
+ popover._config[optionName] = optionValue;
86
+ }
87
+ }
88
+
89
+ // noinspection JSMethodCanBeStatic
90
+ /**
91
+ * Show popover with title and content on $element
92
+ */
93
+ public show(element: HTMLElement): void {
94
+ const popover = BootstrapPopover.getInstance(element);
95
+ if (popover === null) {
96
+ console.warn('Failed to get popover instance for element.');
97
+ return;
98
+ }
99
+ popover.show();
100
+ }
101
+
102
+ // noinspection JSMethodCanBeStatic
103
+ /**
104
+ * Hide popover on $element
105
+ */
106
+ public hide(element: HTMLElement): void {
107
+ const popover = BootstrapPopover.getInstance(element);
108
+ if (popover === null) {
109
+ console.warn('Failed to get popover instance for element.');
110
+ return;
111
+ }
112
+ popover.hide();
113
+ }
114
+
115
+ // noinspection JSMethodCanBeStatic
116
+ /**
117
+ * Destroy popover on $element
118
+ */
119
+ public destroy(element: HTMLElement): void {
120
+ const popover = BootstrapPopover.getInstance(element);
121
+ if (popover === null) {
122
+ console.warn('Failed to get popover instance for element.');
123
+ return;
124
+ }
125
+ popover.dispose();
126
+ }
127
+
128
+ // noinspection JSMethodCanBeStatic
129
+ /**
130
+ * Toggle popover on $element
131
+ */
132
+ public toggle(element: HTMLElement): void {
133
+ const popover = BootstrapPopover.getInstance(element);
134
+ if (popover === null) {
135
+ console.warn('Failed to get popover instance for element.');
136
+ return;
137
+ }
138
+ popover.toggle();
139
+ }
140
+
141
+ private toIterable(element: NodeListOf<HTMLElement> | HTMLElement | unknown): NodeList | HTMLElement[] {
142
+ let elementList;
143
+ if (element instanceof HTMLElement) {
144
+ elementList = [element];
145
+ } else if (element instanceof NodeList) {
146
+ elementList = element;
147
+ } else {
148
+ throw `Cannot consume element of type ${element.constructor.name}, expected NodeListOf<HTMLElement> or HTMLElement`;
149
+ }
150
+
151
+ return elementList;
152
+ }
153
+
154
+ /**
155
+ * If the element contains an attributes that qualifies as a title, store it as data attribute "bs-title"
156
+ */
157
+ private applyTitleIfAvailable(element: HTMLElement): void {
158
+ const title = (element.title as string) || element.dataset.title || '';
159
+ if (title) {
160
+ element.dataset.bsTitle = title;
161
+ }
162
+ }
163
+ }
164
+
165
+ export default new Popover();
@@ -0,0 +1,104 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { customElement, property } from 'lit/decorators';
15
+ import { PseudoButtonLitElement } from '@typo3/backend/element/pseudo-button';
16
+ import { SeverityEnum } from '@typo3/backend/enum/severity';
17
+ import Severity from '@typo3/backend/severity';
18
+ import Modal from '@typo3/backend/modal';
19
+ import { lll } from '@typo3/core/lit-helper';
20
+
21
+ enum Selectors {
22
+ formatSelector = '.t3js-record-download-format-selector',
23
+ formatOptions = '.t3js-record-download-format-option'
24
+ }
25
+
26
+ /**
27
+ * Module: @typo3/backend/record-download-button
28
+ *
29
+ * @example
30
+ * <typo3-recordlist-record-download-button url="/url/to/configuration/form" subject="Download records" ok="Download" close="Cancel">
31
+ * <button>Download records/button>
32
+ * </typo3-recordlist-record-download-button>
33
+ */
34
+ @customElement('typo3-recordlist-record-download-button')
35
+ export class RecordDownloadButton extends PseudoButtonLitElement {
36
+ @property({ type: String }) url: string;
37
+ @property({ type: String }) subject: string;
38
+ @property({ type: String }) ok: string;
39
+ @property({ type: String }) close: string;
40
+
41
+ protected override buttonActivated(): void {
42
+ this.showDownloadConfigurationModal();
43
+ }
44
+
45
+ private showDownloadConfigurationModal(): void {
46
+ if (!this.url) {
47
+ // Don't render modal in case no url is given
48
+ return;
49
+ }
50
+
51
+ const modal = Modal.advanced({
52
+ content: this.url,
53
+ title: this.subject || 'Download records',
54
+ severity: SeverityEnum.notice,
55
+ size: Modal.sizes.small,
56
+ type: Modal.types.ajax,
57
+ buttons: [
58
+ {
59
+ text: this.close || lll('button.close') || 'Close',
60
+ active: true,
61
+ btnClass: 'btn-default',
62
+ name: 'cancel',
63
+ trigger: (): void => modal.hideModal(),
64
+ },
65
+ {
66
+ text: this.ok || lll('button.ok') || 'Download',
67
+ btnClass: 'btn-' + Severity.getCssClass(SeverityEnum.info),
68
+ name: 'download',
69
+ trigger: (): void => {
70
+ const form: HTMLFormElement = modal.querySelector('form');
71
+ form?.submit();
72
+ modal.hideModal();
73
+ }
74
+ }
75
+ ],
76
+ ajaxCallback: (): void => {
77
+ const formatSelect: HTMLSelectElement = modal.querySelector(Selectors.formatSelector);
78
+ const formatOptions: NodeListOf<HTMLDivElement> = modal.querySelectorAll(Selectors.formatOptions);
79
+
80
+ if (formatSelect === null || !formatOptions.length) {
81
+ // Return in case elements do not exist in the ajax loaded modal content
82
+ return;
83
+ }
84
+
85
+ formatSelect.addEventListener('change', (e: Event): void => {
86
+ const selectetFormat: string = (<HTMLSelectElement>e.target).value;
87
+ formatOptions.forEach((option: HTMLDivElement) => {
88
+ if (option.dataset.formatname !== selectetFormat) {
89
+ option.classList.add('hide');
90
+ } else {
91
+ option.classList.remove('hide');
92
+ }
93
+ });
94
+ });
95
+ }
96
+ });
97
+ }
98
+ }
99
+
100
+ declare global {
101
+ interface HTMLElementTagNameMap {
102
+ 'typo3-recordlist-record-download-button': RecordDownloadButton;
103
+ }
104
+ }
@@ -0,0 +1,31 @@
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 './link-browser';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+
17
+ /**
18
+ * Module: @typo3/backend/record-link-handler
19
+ * record link interaction
20
+ */
21
+ class RecordLinkHandler {
22
+ constructor() {
23
+ new RegularEvent('click', (evt: MouseEvent, targetEl: HTMLElement): void => {
24
+ evt.preventDefault();
25
+ const data = targetEl.closest('span').dataset;
26
+ LinkBrowser.finalizeFunction(document.body.dataset.linkbrowserIdentifier + data.uid);
27
+ }).delegateTo(document, '[data-close]');
28
+ }
29
+ }
30
+
31
+ export default new RecordLinkHandler();
@@ -0,0 +1,44 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import DocumentService from '@typo3/core/document-service';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+
17
+ enum Selectors {
18
+ searchFieldSelector = '#recordsearchbox-searchterm',
19
+ }
20
+
21
+ /**
22
+ * Module: @typo3/backend/record-search
23
+ * Usability improvements for the record search
24
+ * @exports @typo3/backend/record-search
25
+ */
26
+ class RecordSearch {
27
+ private readonly searchField: HTMLInputElement = document.querySelector(Selectors.searchFieldSelector);
28
+ private readonly activeSearch: boolean = this.searchField ? (this.searchField.value !== '') : false;
29
+
30
+ constructor() {
31
+ DocumentService.ready().then((): void => {
32
+ // Respond to browser related clearable event
33
+ if (this.searchField) {
34
+ new RegularEvent('search', (): void => {
35
+ if (this.searchField.value === '' && this.activeSearch) {
36
+ this.searchField.closest('form').submit();
37
+ }
38
+ }).bindTo(this.searchField);
39
+ }
40
+ });
41
+ }
42
+ }
43
+
44
+ export default new RecordSearch();
@@ -0,0 +1,230 @@
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 Icons from '@typo3/backend/icons';
15
+ import PersistentStorage from '@typo3/backend/storage/persistent';
16
+ import RegularEvent from '@typo3/core/event/regular-event';
17
+ import DocumentService from '@typo3/core/document-service';
18
+ import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selection';
19
+ import { selector } from '@typo3/core/literals';
20
+ import type { ActionConfiguration, ActionEventDetails } from '@typo3/backend/multi-record-selection-action';
21
+
22
+ interface IconIdentifier {
23
+ collapse: string;
24
+ expand: string;
25
+ }
26
+ interface RecordlistIdentifier {
27
+ entity: string;
28
+ toggle: string;
29
+ localize: string;
30
+ editMultiple: string;
31
+ icons: IconIdentifier;
32
+ }
33
+ interface EditRecordsConfiguration extends ActionConfiguration {
34
+ tableName: string;
35
+ columnsOnly: Array<string>;
36
+ returnUrl: string;
37
+ }
38
+
39
+ /**
40
+ * Module: @typo3/backend/recordlist
41
+ * Usability improvements for the record list
42
+ * @exports @typo3/backend/recordlist
43
+ */
44
+ class Recordlist {
45
+ identifier: RecordlistIdentifier = {
46
+ entity: '.t3js-entity',
47
+ toggle: '.t3js-toggle-recordlist',
48
+ localize: '.t3js-action-localize',
49
+ editMultiple: '.t3js-record-edit-multiple',
50
+ icons: {
51
+ collapse: 'actions-view-list-collapse',
52
+ expand: 'actions-view-list-expand'
53
+ },
54
+ };
55
+
56
+ constructor() {
57
+ new RegularEvent('click', this.toggleClick).delegateTo(document, this.identifier.toggle);
58
+ new RegularEvent('click', this.onEditMultiple).delegateTo(document, this.identifier.editMultiple);
59
+ new RegularEvent('click', this.disableButton).delegateTo(document, this.identifier.localize);
60
+ DocumentService.ready().then((): void => {
61
+ this.registerPaginationEvents();
62
+ });
63
+
64
+ // multi record selection events
65
+ new RegularEvent('multiRecordSelection:action:edit', this.onEditMultiple).bindTo(document);
66
+ new RegularEvent('multiRecordSelection:action:copyMarked', (event: CustomEvent): void => {
67
+ Recordlist.submitClipboardFormWithCommand('copyMarked', event.target as HTMLButtonElement);
68
+ }).bindTo(document);
69
+ new RegularEvent('multiRecordSelection:action:removeMarked', (event: CustomEvent): void => {
70
+ Recordlist.submitClipboardFormWithCommand('removeMarked', event.target as HTMLButtonElement);
71
+ }).bindTo(document);
72
+ }
73
+
74
+ private static submitClipboardFormWithCommand(cmd: string, target: HTMLButtonElement) {
75
+ const clipboardForm = <HTMLFormElement>target.closest('form');
76
+ if (!clipboardForm) {
77
+ return;
78
+ }
79
+ const commandField = <HTMLInputElement>clipboardForm.querySelector('input[name="cmd"]');
80
+ if (!commandField) {
81
+ return;
82
+ }
83
+ commandField.value = cmd;
84
+ clipboardForm.submit();
85
+ }
86
+
87
+ private static getReturnUrl(returnUrl: string): string {
88
+ if (returnUrl === '') {
89
+ returnUrl = top.list_frame.document.location.pathname + top.list_frame.document.location.search;
90
+ }
91
+ return encodeURIComponent(returnUrl);
92
+ }
93
+
94
+ public toggleClick = (e: MouseEvent, targetEl: HTMLElement): void => {
95
+ e.preventDefault();
96
+
97
+ const table = targetEl.dataset.table;
98
+ const target = document.querySelector(targetEl.dataset.bsTarget) as HTMLElement;
99
+ const isExpanded = target.dataset.state === 'expanded';
100
+ const collapseIcon = targetEl.querySelector('.t3js-icon');
101
+ const toggleIcon = isExpanded ? this.identifier.icons.expand : this.identifier.icons.collapse;
102
+
103
+ Icons.getIcon(toggleIcon, Icons.sizes.small).then((icon: string): void => {
104
+ collapseIcon.replaceWith(document.createRange().createContextualFragment(icon));
105
+ });
106
+
107
+ // Store collapse state in UC
108
+ let storedModuleDataList = {};
109
+
110
+ if (PersistentStorage.isset('moduleData.web_list.collapsedTables')) {
111
+ storedModuleDataList = PersistentStorage.get('moduleData.web_list.collapsedTables');
112
+ }
113
+
114
+ const collapseConfig: Record<string, number> = {};
115
+ collapseConfig[table] = isExpanded ? 1 : 0;
116
+
117
+ storedModuleDataList = Object.assign(storedModuleDataList, collapseConfig);
118
+ PersistentStorage.set('moduleData.web_list.collapsedTables', storedModuleDataList).then((): void => {
119
+ target.dataset.state = isExpanded ? 'collapsed' : 'expanded';
120
+ });
121
+ };
122
+
123
+ /**
124
+ * Handles editing multiple records.
125
+ */
126
+ public onEditMultiple = (event: Event, target: HTMLElement): void => {
127
+ event.preventDefault();
128
+ let tableName: string = '';
129
+ let returnUrl: string = '';
130
+ let columnsOnly: Array<string> = [];
131
+ const entityIdentifiers: Array<string> = [];
132
+
133
+ if (event.type === 'multiRecordSelection:action:edit') {
134
+ // In case the request is triggerd by the multi record selection event, handling
135
+ // is slightly different since the event data already contain the selected records.
136
+ const eventDetails: ActionEventDetails = (event as CustomEvent).detail as ActionEventDetails;
137
+ const configuration: EditRecordsConfiguration = eventDetails.configuration;
138
+ returnUrl = configuration.returnUrl || '';
139
+ columnsOnly = configuration.columnsOnly || [];
140
+ tableName = configuration.tableName || '';
141
+ if (tableName === '') {
142
+ return;
143
+ }
144
+ // Evaluate all checked records and if valid, add their uid to the list
145
+ eventDetails.checkboxes.forEach((checkbox: HTMLInputElement): void => {
146
+ const checkboxContainer: HTMLElement = checkbox.closest(MultiRecordSelectionSelectors.elementSelector);
147
+ if (checkboxContainer !== null && checkboxContainer.dataset[configuration.idField]) {
148
+ entityIdentifiers.push(checkboxContainer.dataset[configuration.idField]);
149
+ }
150
+ });
151
+ } else {
152
+ // Edit record request was triggered via t3js-* class on target.
153
+ const tableContainer: HTMLElement = target.closest('[data-table]');
154
+ if (tableContainer === null) {
155
+ return;
156
+ }
157
+ tableName = tableContainer.dataset.table || '';
158
+ if (tableName === '') {
159
+ return;
160
+ }
161
+ returnUrl = target.dataset.returnUrl || '';
162
+ columnsOnly = JSON.parse(target.dataset.columnsOnly || '{}');
163
+ // Check if there are selected records, which would limit the records to edit
164
+ const selection: NodeListOf<HTMLElement> = tableContainer.querySelectorAll(
165
+ this.identifier.entity + '[data-uid][data-table="' + tableName + '"] td.col-checkbox input[type="checkbox"]:checked'
166
+ );
167
+ if (selection.length) {
168
+ // If there are selected records, only those are added to the list
169
+ selection.forEach((entity: HTMLInputElement): void => {
170
+ entityIdentifiers.push((entity.closest(this.identifier.entity + selector`[data-uid][data-table="${tableName}"]`) as HTMLElement).dataset.uid);
171
+ });
172
+ } else {
173
+ // Get all records for the current table and add their uid to the list
174
+ const entities: NodeListOf<HTMLElement> = tableContainer.querySelectorAll(this.identifier.entity + selector`[data-uid][data-table="${tableName}"]`);
175
+ if (!entities.length) {
176
+ return;
177
+ }
178
+ entities.forEach((entity: HTMLElement): void => {
179
+ entityIdentifiers.push(entity.dataset.uid);
180
+ });
181
+ }
182
+ }
183
+
184
+ if (!entityIdentifiers.length) {
185
+ // Return in case no records to edit were found
186
+ return;
187
+ }
188
+
189
+ let editUrl: string = top.TYPO3.settings.FormEngine.moduleUrl
190
+ + '&edit[' + tableName + '][' + entityIdentifiers.join(',') + ']=edit'
191
+ + '&returnUrl=' + Recordlist.getReturnUrl(returnUrl);
192
+
193
+ if (columnsOnly.length > 0) {
194
+ editUrl += columnsOnly.map((column: string, i: number): string => '&columnsOnly[' + tableName + '][' + i + ']=' + column).join('');
195
+ }
196
+
197
+ window.location.href = editUrl;
198
+ };
199
+
200
+ private readonly disableButton = (event: Event, target: HTMLElement): void => {
201
+ target.setAttribute('disabled', 'disabled');
202
+ target.classList.add('disabled');
203
+ };
204
+
205
+ private readonly registerPaginationEvents = (): void => {
206
+ document.querySelectorAll('.t3js-recordlist-paging').forEach((trigger: HTMLInputElement) => {
207
+ trigger.addEventListener('keyup', (e: KeyboardEvent) => {
208
+ e.preventDefault();
209
+ let value = Number(trigger.value);
210
+ const min = Number(trigger.min);
211
+ const max = Number(trigger.max);
212
+ if (min && value < min) {
213
+ value = min;
214
+ }
215
+ if (max && value > max) {
216
+ value = max;
217
+ }
218
+ trigger.value = value.toString(10);
219
+ if (e.key === 'Enter' && value !== Number(trigger.dataset.currentpage)) {
220
+ const form = trigger.closest('form[name^="list-table-form-"]') as HTMLFormElement;
221
+ const submitUrl = new URL(form.action, window.origin);
222
+ submitUrl.searchParams.set('pointer', value.toString());
223
+ window.location.href = submitUrl.toString();
224
+ }
225
+ });
226
+ });
227
+ };
228
+ }
229
+
230
+ export default new Recordlist();
@@ -0,0 +1,35 @@
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
+ export interface ResourceInterface {
15
+ type: string;
16
+ identifier: string;
17
+ name: string;
18
+ hasPreview: boolean;
19
+ uid: number | null;
20
+ metaUid: number | null;
21
+ url: string | null;
22
+ }
23
+
24
+ export class Resource implements ResourceInterface {
25
+ public constructor(
26
+ public readonly type: string,
27
+ public readonly identifier: string,
28
+ public readonly name: string,
29
+ public readonly hasPreview: boolean = false,
30
+ public readonly uid: number | null = null,
31
+ public readonly metaUid: number | null = null,
32
+ public readonly url: string | null = null,
33
+ ) {
34
+ }
35
+ }