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,243 @@
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 AjaxRequest from '@typo3/core/ajax/ajax-request';
15
+ import DocumentService from '@typo3/core/document-service';
16
+ import DebounceEvent from '@typo3/core/event/debounce-event';
17
+ import RegularEvent from '@typo3/core/event/regular-event';
18
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
19
+
20
+ interface FieldOptions {
21
+ pageId: number;
22
+ recordId: number;
23
+ tableName: string;
24
+ fieldName: string;
25
+ config: { [key: string]: any };
26
+ listenerFieldNames: Record<string, string>;
27
+ language: number;
28
+ originalValue: string;
29
+ signature: string;
30
+ command: string;
31
+ parentPageId: number;
32
+ includeUidInValues: boolean;
33
+ }
34
+
35
+ interface Response {
36
+ hasConflicts: boolean;
37
+ manual: string;
38
+ proposal: ProposalModes;
39
+ }
40
+
41
+ enum Selectors {
42
+ toggleButton = '.t3js-form-field-slug-toggle',
43
+ recreateButton = '.t3js-form-field-slug-recreate',
44
+ inputField = '.t3js-form-field-slug-input',
45
+ readOnlyField = '.t3js-form-field-slug-readonly',
46
+ hiddenField = '.t3js-form-field-slug-hidden',
47
+ }
48
+
49
+ enum ProposalModes {
50
+ AUTO = 'auto',
51
+ RECREATE = 'recreate',
52
+ MANUAL = 'manual',
53
+ }
54
+
55
+ /**
56
+ * Module: @typo3/backend/form-engine/element/slug-element
57
+ * Logic for a TCA type "slug"
58
+ *
59
+ * For new records, changes on the other fields of the record (typically the record title) are listened
60
+ * on as well and the response is put in as "placeholder" into the input field.
61
+ *
62
+ * For new and existing records, the toggle switch will allow editors to modify the slug
63
+ * - for new records, we only need to see if that is already in use or not (uniqueInSite), if it is taken, show a message.
64
+ * - for existing records, we also check for conflicts, and check if we have subpages, or if we want to add a redirect (todo)
65
+ */
66
+ class SlugElement {
67
+ private readonly options: FieldOptions = null;
68
+ private fullElement: HTMLElement = null;
69
+ private manuallyChanged: boolean = false;
70
+ private readOnlyField: HTMLInputElement = null;
71
+ private inputField: HTMLInputElement = null;
72
+ private hiddenField: HTMLInputElement = null;
73
+ private request: AjaxRequest = null;
74
+ private readonly fieldsToListenOn: Record<string, string> = {};
75
+
76
+ constructor(selector: string, options: FieldOptions) {
77
+ this.options = options;
78
+ this.fieldsToListenOn = this.options.listenerFieldNames || {};
79
+
80
+ DocumentService.ready().then((document: Document): void => {
81
+ this.fullElement = document.querySelector(selector);
82
+ this.inputField = this.fullElement.querySelector(Selectors.inputField);
83
+ this.readOnlyField = this.fullElement.querySelector(Selectors.readOnlyField);
84
+ this.hiddenField = this.fullElement.querySelector(Selectors.hiddenField);
85
+
86
+ this.registerEvents();
87
+ });
88
+ }
89
+
90
+ private registerEvents(): void {
91
+ const fieldsToListenOnList = Object.values(this.getAvailableFieldsForProposalGeneration()).map((field: HTMLElement) => `[id="${field.id}"]`);
92
+ const recreateButton: HTMLButtonElement = this.fullElement.querySelector(Selectors.recreateButton);
93
+
94
+ // Listen on 'listenerFieldNames' for new pages. This is typically the 'title' field
95
+ // of a page to create slugs from the title when title is set / changed.
96
+ if (fieldsToListenOnList.length > 0) {
97
+ if (this.options.command === 'new') {
98
+ new DebounceEvent('input', (): void => {
99
+ if (!this.manuallyChanged) {
100
+ this.sendSlugProposal(ProposalModes.AUTO);
101
+ }
102
+ }).delegateTo(document, fieldsToListenOnList.join(','));
103
+ }
104
+ }
105
+
106
+ // Clicking the recreate button makes new slug proposal created from 'title' field or any defined postModifiers
107
+ if (fieldsToListenOnList.length > 0 || this.hasPostModifiersDefined()) {
108
+ new RegularEvent('click', (e: Event): void => {
109
+ e.preventDefault();
110
+ if (this.readOnlyField.classList.contains('hidden')) {
111
+ // Switch to readonly version - similar to 'new' page where field is
112
+ // written on the fly with title change
113
+ this.readOnlyField.classList.toggle('hidden', false);
114
+ this.inputField.classList.toggle('hidden', true);
115
+ }
116
+ this.sendSlugProposal(ProposalModes.RECREATE);
117
+ }).bindTo(recreateButton);
118
+ } else {
119
+ recreateButton.classList.add('disabled');
120
+ recreateButton.disabled = true;
121
+ }
122
+
123
+ // Scenario for new pages: Usually, slug is created from the page title. However, if user toggles the
124
+ // input field and feeds an own slug, and then changes title again, the slug should stay. manuallyChanged
125
+ // is used to track this.
126
+ new DebounceEvent('input', (): void => {
127
+ this.manuallyChanged = true;
128
+ this.sendSlugProposal(ProposalModes.MANUAL);
129
+ }).bindTo(this.inputField);
130
+
131
+ // Clicking the toggle button toggles the read only field and the input field.
132
+ // Also set the value of either the read only or the input field to the hidden field
133
+ // and update the value of the read only field after manual change of the input field.
134
+ const toggleButton = this.fullElement.querySelector(Selectors.toggleButton);
135
+ new RegularEvent('click', (e: Event): void => {
136
+ e.preventDefault();
137
+ const showReadOnlyField = this.readOnlyField.classList.contains('hidden');
138
+ this.readOnlyField.classList.toggle('hidden', !showReadOnlyField);
139
+ this.inputField.classList.toggle('hidden', showReadOnlyField);
140
+ if (!showReadOnlyField) {
141
+ this.hiddenField.value = this.inputField.value;
142
+ return;
143
+ }
144
+ if (this.inputField.value !== this.readOnlyField.value) {
145
+ this.readOnlyField.value = this.inputField.value;
146
+ } else {
147
+ this.manuallyChanged = false;
148
+ this.fullElement.querySelector('.t3js-form-proposal-accepted').classList.add('hidden');
149
+ this.fullElement.querySelector('.t3js-form-proposal-different').classList.add('hidden');
150
+ }
151
+ this.hiddenField.value = this.readOnlyField.value;
152
+ }).bindTo(toggleButton);
153
+ }
154
+
155
+ /**
156
+ * @param {ProposalModes} mode
157
+ */
158
+ private sendSlugProposal(mode: ProposalModes): void {
159
+ const input: Record<string, string> = {};
160
+ if (mode === ProposalModes.AUTO || mode === ProposalModes.RECREATE) {
161
+ Object.entries(this.getAvailableFieldsForProposalGeneration()).forEach((entry: [fieldName: string, field: HTMLInputElement|HTMLSelectElement]) => {
162
+ input[entry[0]] = entry[1].value;
163
+ });
164
+ if (this.options.includeUidInValues === true) {
165
+ input.uid = this.options.recordId.toString();
166
+ }
167
+ } else {
168
+ input.manual = this.inputField.value;
169
+ }
170
+ if (this.request instanceof AjaxRequest) {
171
+ this.request.abort();
172
+ }
173
+ this.request = (new AjaxRequest(TYPO3.settings.ajaxUrls.record_slug_suggest));
174
+ this.request.post({
175
+ values: input,
176
+ mode: mode,
177
+ tableName: this.options.tableName,
178
+ pageId: this.options.pageId,
179
+ parentPageId: this.options.parentPageId,
180
+ recordId: this.options.recordId,
181
+ language: this.options.language,
182
+ fieldName: this.options.fieldName,
183
+ command: this.options.command,
184
+ signature: this.options.signature,
185
+ }).then(async (response: AjaxResponse): Promise<void> => {
186
+ const data: Response = await response.resolve();
187
+ const visualProposal = '/' + data.proposal.replace(/^\//, '');
188
+ const acceptedProposalField: HTMLElement = this.fullElement.querySelector('.t3js-form-proposal-accepted');
189
+ const differentProposalField: HTMLElement = this.fullElement.querySelector('.t3js-form-proposal-different');
190
+
191
+ acceptedProposalField.classList.toggle('hidden', data.hasConflicts);
192
+ differentProposalField.classList.toggle('hidden', !data.hasConflicts);
193
+ (data.hasConflicts ? differentProposalField : acceptedProposalField).querySelector('span').innerText = visualProposal;
194
+
195
+ const isChanged = this.hiddenField.value !== data.proposal;
196
+ if (isChanged) {
197
+ this.fullElement.querySelector('input[data-formengine-input-name]')
198
+ .dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
199
+ }
200
+ if (mode === ProposalModes.AUTO || mode === ProposalModes.RECREATE) {
201
+ this.readOnlyField.value = data.proposal;
202
+ this.hiddenField.value = data.proposal;
203
+ this.inputField.value = data.proposal;
204
+ } else {
205
+ this.hiddenField.value = data.proposal;
206
+ }
207
+ }).finally((): void => {
208
+ this.request = null;
209
+ });
210
+ }
211
+
212
+ /**
213
+ * Gets a list of all available fields that can be used for slug generation
214
+ *
215
+ * @return Record<string, string>
216
+ */
217
+ private getAvailableFieldsForProposalGeneration(): { [key: string]: HTMLElement } {
218
+ const availableFields: { [key: string]: HTMLElement } = {};
219
+ for (const [fieldName, selector] of Object.entries(this.fieldsToListenOn)) {
220
+ let field = document.querySelector('[data-formengine-input-name="' + selector + '"]') as HTMLElement;
221
+ if (field === null) {
222
+ // Also check for fields, which do not point to a hidden input field (e.g. "input type=hidden", readOnly, or select fields)
223
+ field = document.querySelector('[name="' + selector + '"]') as HTMLElement;
224
+ }
225
+ if (field !== null) {
226
+ availableFields[fieldName] = field;
227
+ }
228
+ }
229
+
230
+ return availableFields;
231
+ }
232
+
233
+ /**
234
+ * Check whether the slug element has post modifiers defined for slug generation
235
+ *
236
+ * @return boolean
237
+ */
238
+ private hasPostModifiersDefined(): boolean {
239
+ return Array.isArray(this.options.config.generatorOptions.postModifiers) && this.options.config.generatorOptions.postModifiers.length > 0;
240
+ }
241
+ }
242
+
243
+ export default SlugElement;
@@ -0,0 +1,118 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { customElement, property } from 'lit/decorators';
15
+ import { css, html, LitElement, type TemplateResult } from 'lit';
16
+ import { lll } from '@typo3/core/lit-helper';
17
+ import './result-item';
18
+ import type { ResultItemInterface } from './result-item';
19
+
20
+ @customElement('typo3-backend-formengine-suggest-result-container')
21
+ export class ResultContainer extends LitElement {
22
+ @property({ type: Object }) results: ResultItemInterface[]|null = null;
23
+
24
+ public override connectedCallback(): void {
25
+ super.connectedCallback();
26
+
27
+ this.addEventListener('keydown', this.handleKeyDown);
28
+ }
29
+
30
+ public override disconnectedCallback(): void {
31
+ this.removeEventListener('keydown', this.handleKeyDown);
32
+
33
+ super.disconnectedCallback();
34
+ }
35
+
36
+ protected override createRenderRoot(): HTMLElement | ShadowRoot {
37
+ // Avoid shadow DOM for Bootstrap CSS to be applied
38
+ return this;
39
+ }
40
+
41
+ protected override render(): TemplateResult {
42
+ let content;
43
+ if (this.results !== null) {
44
+ if (this.results.length === 0) {
45
+ content = html`<div class="alert alert-info">${lll('search.no_records_found')}</div>`;
46
+ } else {
47
+ content = html`${this.results.map((result: ResultItemInterface) => this.renderResultItem(result))}`;
48
+ }
49
+ }
50
+
51
+ return html`<typo3-backend-formengine-suggest-result-list>${content}</typo3-backend-formengine-suggest-result-list>`;
52
+ }
53
+
54
+ private renderResultItem(result: ResultItemInterface): TemplateResult {
55
+ return html`<typo3-backend-formengine-suggest-result-item
56
+ tabindex="1"
57
+ icon="${JSON.stringify(result.icon)}"
58
+ uid="${result.uid}"
59
+ table="${result.table}"
60
+ label="${result.label}"
61
+ path="${result.path}">
62
+ </typo3-backend-formengine-suggest-result-item>`;
63
+ }
64
+
65
+ private handleKeyDown(e: KeyboardEvent): void {
66
+ e.preventDefault();
67
+
68
+ if (e.key === 'Escape') {
69
+ (this.closest('.t3-form-suggest-container').querySelector('input[type="search"]') as HTMLInputElement).focus();
70
+ this.hidden = true;
71
+
72
+ return;
73
+ }
74
+
75
+ if (!['ArrowDown', 'ArrowUp'].includes(e.key)) {
76
+ return;
77
+ }
78
+
79
+ if (document.activeElement.tagName.toLowerCase() !== 'typo3-backend-formengine-suggest-result-item') {
80
+ return;
81
+ }
82
+
83
+ let focusableCandidate;
84
+ if (e.key === 'ArrowDown') {
85
+ focusableCandidate = document.activeElement.nextElementSibling;
86
+ } else {
87
+ focusableCandidate = document.activeElement.previousElementSibling;
88
+ if (focusableCandidate === null) {
89
+ // No possible candidate found, fall back to search input
90
+ focusableCandidate = this.closest('.t3-form-suggest-container').querySelector('input[type="search"]');
91
+ }
92
+ }
93
+
94
+ if (focusableCandidate !== null) {
95
+ (focusableCandidate as HTMLElement).focus();
96
+ }
97
+ }
98
+ }
99
+
100
+ @customElement('typo3-backend-formengine-suggest-result-list')
101
+ export class ResultList extends LitElement {
102
+ static override styles = css`
103
+ :host {
104
+ display: block;
105
+ }
106
+ `;
107
+
108
+ protected override render(): TemplateResult {
109
+ return html`<slot></slot>`;
110
+ }
111
+ }
112
+
113
+ declare global {
114
+ interface HTMLElementTagNameMap {
115
+ 'typo3-backend-formengine-suggest-result-container': ResultContainer;
116
+ 'typo3-backend-formengine-suggest-result-list': ResultList;
117
+ }
118
+ }
@@ -0,0 +1,90 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { html, type TemplateResult } from 'lit';
15
+ import { customElement, property } from 'lit/decorators';
16
+ import { PseudoButtonLitElement } from '@typo3/backend/element/pseudo-button';
17
+ import '@typo3/backend/element/icon-element';
18
+
19
+ export interface ResultItemInterface {
20
+ icon: Record<string, string>;
21
+ uid: number;
22
+ table: string;
23
+ label: string;
24
+ path: string;
25
+ }
26
+
27
+ @customElement('typo3-backend-formengine-suggest-result-item')
28
+ export class ResultItem extends PseudoButtonLitElement {
29
+ @property({ type: Object }) icon: Record<string, string>;
30
+ @property({ type: Number }) uid: number;
31
+ @property({ type: String }) table: string;
32
+ @property({ type: String }) label: string;
33
+ @property({ type: String }) path: string;
34
+
35
+ constructor() {
36
+ super();
37
+
38
+ this.addEventListener('blur', this.onBlur);
39
+ }
40
+
41
+ protected override buttonActivated(e: Event): void {
42
+ this.dispatchItemChosenEvent(e.currentTarget as Element);
43
+ }
44
+
45
+ protected override createRenderRoot(): HTMLElement | ShadowRoot {
46
+ // Avoid shadow DOM for Bootstrap CSS to be applied
47
+ return this;
48
+ }
49
+
50
+ protected override render(): TemplateResult {
51
+ return html`
52
+ <div class="formengine-suggest-result-item-icon">
53
+ <typo3-backend-icon title="${this.icon.title}" identifier="${this.icon.identifier}" overlay="${this.icon.overlay}" size="small"></typo3-backend-icon>
54
+ </div>
55
+ <div class="formengine-suggest-result-item-label">
56
+ ${this.label} <small>[${this.uid}] ${this.path}</small>
57
+ </div>
58
+ `;
59
+ }
60
+
61
+ private onBlur(e: FocusEvent): void {
62
+ let closeResultContainer = true;
63
+ const relatedElement = e.relatedTarget as HTMLElement|null;
64
+ const resultContainer = this.closest('typo3-backend-formengine-suggest-result-container') as HTMLElement;
65
+
66
+ if (relatedElement?.tagName.toLowerCase() === 'typo3-backend-formengine-suggest-result-item') {
67
+ closeResultContainer = false;
68
+ }
69
+
70
+ if (relatedElement?.matches('input[type="search"]') && resultContainer.contains(relatedElement)) {
71
+ closeResultContainer = false;
72
+ }
73
+
74
+ resultContainer.hidden = closeResultContainer;
75
+ }
76
+
77
+ private dispatchItemChosenEvent(selectedItem: Element): void {
78
+ selectedItem.closest('typo3-backend-formengine-suggest-result-container').dispatchEvent(new CustomEvent('typo3:formengine:suggest-item-chosen', {
79
+ detail: {
80
+ element: selectedItem
81
+ }
82
+ }));
83
+ }
84
+ }
85
+
86
+ declare global {
87
+ interface HTMLElementTagNameMap {
88
+ 'typo3-backend-formengine-suggest-result-item': ResultItem;
89
+ }
90
+ }
@@ -0,0 +1,101 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import DocumentService from '@typo3/core/document-service';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+ import { selector } from '@typo3/core/literals';
17
+ import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selection';
18
+
19
+ enum Permissions {
20
+ none = 'none',
21
+ select = 'select',
22
+ modify = 'modify',
23
+ }
24
+
25
+ /**
26
+ * Module: @typo3/backend/form-engine/element/table-permissions-element
27
+ *
28
+ * Functionality for the tablePermission form element
29
+ *
30
+ * @example
31
+ * <typo3-formengine-element-tablepermission selectStateFieldName="<field>" modifyStateFieldName="<field>">
32
+ * ...
33
+ * </typo3-formengine-element-tablepermission>
34
+ *
35
+ * This is based on W3C custom elements ("web components") specification, see
36
+ * https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
37
+ */
38
+ class TablePermissionElement extends HTMLElement {
39
+ private selectStateField: HTMLInputElement = null;
40
+ private modifyStateField: HTMLInputElement = null;
41
+
42
+ public async connectedCallback(): Promise<void> {
43
+ await DocumentService.ready();
44
+ this.selectStateField = <HTMLInputElement>this.querySelector(selector`input[name=${this.getAttribute('selectStateFieldName') || '' as string}]`);
45
+ this.modifyStateField = <HTMLInputElement>this.querySelector(selector`input[name=${this.getAttribute('modifyStateFieldName') || '' as string}]`);
46
+
47
+ if (this.selectStateField === null || this.modifyStateField === null) {
48
+ return;
49
+ }
50
+
51
+ this.registerEventHandler();
52
+ }
53
+
54
+ private registerEventHandler() {
55
+ new RegularEvent('change', (e: CustomEvent): void => {
56
+ this.handleSingleItemChange(e.target as HTMLInputElement);
57
+ }).delegateTo(this.querySelector('table'), '.t3js-table-permissions-item');
58
+ new RegularEvent('multiRecordSelection:checkbox:state:changed', (e: CustomEvent): void => {
59
+ const name = (e.target as HTMLInputElement).name;
60
+ if (this.querySelectorAll(selector`input[name="${name}"]:checked`).length === 0) {
61
+ const item: HTMLInputElement = this.querySelector(selector`input[name="${name}"]`) as HTMLInputElement;
62
+ item.value = Permissions.none;
63
+ this.handleSingleItemChange(item);
64
+ (this.querySelector(selector`input[name="${name}"][value="${Permissions.none}"]`) as HTMLInputElement).checked = true;
65
+ }
66
+ }).delegateTo(this.querySelector('table') , MultiRecordSelectionSelectors.checkboxSelector);
67
+ }
68
+
69
+ private handleSingleItemChange(target: HTMLInputElement): void {
70
+ switch (target.value) {
71
+ case Permissions.select:
72
+ this.addItem(target.dataset.table, this.selectStateField);
73
+ this.removeItem(target.dataset.table, this.modifyStateField);
74
+ break;
75
+ case Permissions.modify:
76
+ this.addItem(target.dataset.table, this.selectStateField);
77
+ this.addItem(target.dataset.table, this.modifyStateField);
78
+ break;
79
+ case Permissions.none:
80
+ default:
81
+ this.removeItem(target.dataset.table, this.selectStateField);
82
+ this.removeItem(target.dataset.table, this.modifyStateField);
83
+ break;
84
+ }
85
+ }
86
+
87
+ private removeItem(table: string, field: HTMLInputElement) {
88
+ field.value = (field.value.length ? field.value.split(',') : []).filter(item => item !== table).join(',');
89
+ }
90
+
91
+ private addItem(table: string, field: HTMLInputElement) {
92
+ const list: string[] = field.value.length ? field.value.split(',') : [];
93
+ if (list.includes(table)) {
94
+ return;
95
+ }
96
+ list.push(table);
97
+ field.value = list.join(',');
98
+ }
99
+ }
100
+
101
+ window.customElements.define('typo3-formengine-element-tablepermission', TablePermissionElement);