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,427 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import { html, LitElement, type TemplateResult } from 'lit';
15
+ import { customElement, property } from 'lit/decorators';
16
+ import { lll } from '@typo3/core/lit-helper';
17
+ import '@typo3/backend/element/icon-element';
18
+ import Modal from '@typo3/backend/modal';
19
+
20
+ /**
21
+ * Module: @typo3/backend/form-engine/element/table-wizard-element
22
+ *
23
+ * @example
24
+ * <typo3-formengine-table-wizard table="[["quot;a"quot;,"quot;b"quot;],["quot;c"quot;,"quot;d"quot;]]">
25
+ * </typo3-formengine-table-wizard>
26
+ *
27
+ * This is based on W3C custom elements ("web components") specification, see
28
+ * https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
29
+ */
30
+ @customElement('typo3-formengine-table-wizard')
31
+ export class TableWizardElement extends LitElement {
32
+ @property({ type: String }) type: string = 'textarea';
33
+ @property({ type: String }) selectorData: string = '';
34
+ @property({ type: String }) delimiter: string = '|';
35
+ @property({ type: String }) enclosure: string = '';
36
+ @property({ type: Number, attribute: 'append-rows' }) appendRows: number = 1;
37
+
38
+ private table: string[][] = [];
39
+
40
+ private get firstRow(): string[] {
41
+ return this.table[0] || [];
42
+ }
43
+
44
+ public override connectedCallback(): void {
45
+ super.connectedCallback();
46
+
47
+ this.selectorData = this.getAttribute('selector');
48
+ this.delimiter = this.getAttribute('delimiter');
49
+ this.enclosure = this.getAttribute('enclosure') || '';
50
+ this.readTableFromTextarea();
51
+ }
52
+
53
+ protected override createRenderRoot(): HTMLElement | ShadowRoot {
54
+ return this;
55
+ }
56
+
57
+ protected override render(): TemplateResult {
58
+ return this.renderTemplate();
59
+ }
60
+
61
+ private provideMinimalTable(): void {
62
+ if (this.table.length === 0 || this.firstRow.length === 0) {
63
+ // create a table with one row and one column
64
+ this.table = [
65
+ ['']
66
+ ];
67
+ }
68
+ }
69
+
70
+ private readTableFromTextarea(): void {
71
+ // Note: We do not wait for `DocumentService.ready()` here, as the <textarea> is placed as a previous sibling before this element in DOM
72
+ const textarea: HTMLTextAreaElement = document.querySelector(this.selectorData);
73
+ const table: string[][] = [];
74
+
75
+ textarea.value.split('\n').forEach((row: string) => {
76
+ if (row !== '') {
77
+ if(this.enclosure) {
78
+ row = row.replace(new RegExp(this.enclosure, 'g'), '');
79
+ }
80
+
81
+ const cols = row.split(this.delimiter);
82
+ table.push(cols);
83
+ }
84
+ });
85
+
86
+ this.table = table;
87
+ }
88
+
89
+ private writeTableSyntaxToTextarea(): void {
90
+ const textarea: HTMLTextAreaElement = document.querySelector(this.selectorData);
91
+ let text = '';
92
+ this.table.forEach((row) => {
93
+ const count = row.length;
94
+ text += row.reduce((result, word, index) => {
95
+ // Do not add delimiter at the end of each row
96
+ const delimiter = (count - 1) === index ? '' : this.delimiter;
97
+ // Substitute newlines by `<br>`
98
+ word = word.replace(/\r?\n/g, '<br>');
99
+ // Build enclosed representation of column value
100
+ return result + this.enclosure + word + this.enclosure + delimiter;
101
+ }, '') + '\n';
102
+ });
103
+ textarea.value = text;
104
+ textarea.dispatchEvent(new CustomEvent('change', { bubbles: true }));
105
+ }
106
+
107
+ private modifyTable(evt: Event, rowIndex: number, colIndex: number): void {
108
+ const target = evt.target as HTMLInputElement | HTMLTextAreaElement;
109
+ this.table[rowIndex][colIndex] = target.value;
110
+ this.writeTableSyntaxToTextarea();
111
+ this.requestUpdate();
112
+ }
113
+
114
+ private toggleType(): void {
115
+ this.type = this.type === 'input' ? 'textarea' : 'input';
116
+ }
117
+
118
+ private moveColumn(col: number, target: number): void {
119
+ this.table = this.table.map((row: string[]): string[] => {
120
+ const temp = row.splice(col, 1);
121
+ row.splice(target, 0, ...temp);
122
+ return row;
123
+ });
124
+ this.writeTableSyntaxToTextarea();
125
+ this.requestUpdate();
126
+ }
127
+
128
+ private appendColumn(evt: Event, col: number): void {
129
+ this.table = this.table.map((row: string[]): string[] => {
130
+ row.splice(col + 1, 0, '');
131
+ return row;
132
+ });
133
+ this.writeTableSyntaxToTextarea();
134
+ this.requestUpdate();
135
+ }
136
+
137
+ private removeColumn(evt: Event, col: number): void {
138
+ this.table = this.table.map((row: string[]): string[] => {
139
+ row.splice(col, 1);
140
+ return row;
141
+ });
142
+ this.writeTableSyntaxToTextarea();
143
+ this.requestUpdate();
144
+ }
145
+
146
+ private moveRow(evt: Event, row: number, target: number): void {
147
+ const temp = this.table.splice(row, 1);
148
+ this.table.splice(target, 0, ...temp);
149
+ this.writeTableSyntaxToTextarea();
150
+ this.requestUpdate();
151
+ }
152
+
153
+ private appendRow(evt: Event, row: number): void {
154
+ const columns = this.firstRow.concat().fill('');
155
+ const rows = (new Array(this.appendRows)).fill(columns);
156
+ this.table.splice(row + 1, 0, ...rows);
157
+ this.writeTableSyntaxToTextarea();
158
+ this.requestUpdate();
159
+ }
160
+
161
+ private removeRow(evt: Event, row: number): void {
162
+ this.table.splice(row, 1);
163
+ this.writeTableSyntaxToTextarea();
164
+ this.requestUpdate();
165
+ }
166
+
167
+ private renderTemplate(): TemplateResult {
168
+ this.provideMinimalTable();
169
+ const colIndexes = Object.keys(this.firstRow).map((item: string) => parseInt(item, 10));
170
+ const lastColIndex = colIndexes[colIndexes.length - 1];
171
+ const lastRowIndex = this.table.length - 1;
172
+
173
+ return html`
174
+ <div class="table-fit table-fit-inline-block">
175
+ <table class="table table-center">
176
+ <thead>
177
+ <th>${this.renderTypeButton()}</th>
178
+ ${colIndexes.map((colIndex: number) => html`
179
+ <th>${this.renderColButtons(colIndex, lastColIndex)}</th>
180
+ `)}
181
+ </thead>
182
+ <tbody>
183
+ ${this.table.map((row: string[], rowIndex: number) => html`
184
+ <tr>
185
+ <td>${this.renderRowButtons(rowIndex, lastRowIndex)}</td>
186
+ ${row.map((value: string, colIndex: number) => html`
187
+ <td>${this.renderDataElement(value, rowIndex, colIndex)}</td>
188
+ `)}
189
+ </tr>
190
+ `)}
191
+ </tbody>
192
+ </table>
193
+ </div>
194
+ `;
195
+ }
196
+
197
+ private renderDataElement(value: string, rowIndex: number, colIndex: number): TemplateResult {
198
+ const modifyTable = (evt: Event) => this.modifyTable(evt, rowIndex, colIndex);
199
+ switch (this.type) {
200
+ case 'input':
201
+ return html`
202
+ <input class="form-control" type="text" data-row="${rowIndex}" data-col="${colIndex}"
203
+ @change="${modifyTable}" .value="${value.replace(/\n/g, '<br>')}">
204
+ `;
205
+ case 'textarea':
206
+ default:
207
+ return html`
208
+ <textarea class="form-control" rows="6" data-row="${rowIndex}" data-col="${colIndex}"
209
+ @change="${modifyTable}" .value="${value.replace(/<br[ ]*\/?>/g, '\n')}"></textarea>
210
+ `;
211
+ }
212
+ }
213
+
214
+ private renderTypeButton(): TemplateResult {
215
+ return html`
216
+ <span class="btn-group">
217
+ <button class="btn btn-default" type="button" title="${lll('table_smallFields')}"
218
+ @click="${() => this.toggleType()}">
219
+ <typo3-backend-icon identifier="${this.type === 'input' ? 'actions-chevron-expand' : 'actions-chevron-contract'}" size="small"></typo3-backend-icon>
220
+ </button>
221
+ <button class="btn btn-default" type="button" title="${lll('table_setCount')}"
222
+ @click="${(evt: Event) => this.showTableConfigurationModal(evt)}">
223
+ <typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
224
+ </button>
225
+ <button class="btn btn-default" type="button" title="${lll('table_showCode')}"
226
+ @click="${() => this.showTableSyntax()}">
227
+ <typo3-backend-icon identifier="actions-code" size="small"></typo3-backend-icon>
228
+ </button>
229
+ </span>
230
+ `;
231
+ }
232
+
233
+ private renderColButtons(col: number, last: number): TemplateResult {
234
+ const leftButton = {
235
+ title: col === 0 ? lll('table_end') : lll('table_left'),
236
+ class: col === 0 ? 'bar-right' : 'left',
237
+ target: col === 0 ? last : col - 1,
238
+ };
239
+ const rightButton = {
240
+ title: col === last ? lll('table_start') : lll('table_right'),
241
+ class: col === last ? 'bar-left' : 'right',
242
+ target: col === last ? 0 : col + 1,
243
+ };
244
+ return html`
245
+ <span class="btn-group">
246
+ <button class="btn btn-default" type="button" title="${leftButton.title}"
247
+ @click="${() => this.moveColumn(col, leftButton.target)}">
248
+ <typo3-backend-icon identifier="actions-chevron-${leftButton.class}" size="small"></typo3-backend-icon>
249
+ </button>
250
+ <button class="btn btn-default" type="button" title="${rightButton.title}"
251
+ @click="${() => this.moveColumn(col, rightButton.target)}">
252
+ <typo3-backend-icon identifier="actions-chevron-${rightButton.class}" size="small"></typo3-backend-icon>
253
+ </button>
254
+ <button class="btn btn-default" type="button" title="${lll('table_removeColumn')}"
255
+ @click="${(evt: Event) => this.removeColumn(evt, col)}">
256
+ <typo3-backend-icon identifier="actions-delete" size="small"></typo3-backend-icon>
257
+ </button>
258
+ <button class="btn btn-default" type="button" title="${lll('table_addColumn')}"
259
+ @click="${(evt: Event) => this.appendColumn(evt, col)}">
260
+ <typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
261
+ </button>
262
+ </span>
263
+ `;
264
+ }
265
+
266
+ private renderRowButtons(row: number, last: number): TemplateResult {
267
+ const topButton = {
268
+ title: row === 0 ? lll('table_bottom') : lll('table_up'),
269
+ class: row === 0 ? 'bar-down' : 'up',
270
+ target: row === 0 ? last : row - 1,
271
+ };
272
+ const bottomButton = {
273
+ title: row === last ? lll('table_top') : lll('table_down'),
274
+ class: row === last ? 'bar-up' : 'down',
275
+ target: row === last ? 0 : row + 1,
276
+ };
277
+ return html`
278
+ <span class="btn-group${this.type === 'input' ? '' : '-vertical'}">
279
+ <button class="btn btn-default" type="button" title="${topButton.title}"
280
+ @click="${(evt: Event) => this.moveRow(evt, row, topButton.target)}">
281
+ <typo3-backend-icon identifier="actions-chevron-${topButton.class}" size="small"></typo3-backend-icon>
282
+ </button>
283
+ <button class="btn btn-default" type="button" title="${bottomButton.title}"
284
+ @click="${(evt: Event) => this.moveRow(evt, row, bottomButton.target)}">
285
+ <typo3-backend-icon identifier="actions-chevron-${bottomButton.class}" size="small"></typo3-backend-icon>
286
+ </button>
287
+ <button class="btn btn-default" type="button" title="${lll('table_removeRow')}"
288
+ @click="${(evt: Event) => this.removeRow(evt, row)}">
289
+ <typo3-backend-icon identifier="actions-delete" size="small"></typo3-backend-icon>
290
+ </button>
291
+ <button class="btn btn-default" type="button" title="${lll('table_addRow')}"
292
+ @click="${(evt: Event) => this.appendRow(evt, row)}">
293
+ <typo3-backend-icon identifier="actions-plus" size="small"></typo3-backend-icon>
294
+ </button>
295
+ </span>
296
+ `;
297
+ }
298
+
299
+ private showTableConfigurationModal(evt: Event): void {
300
+ const lastColIndex: number = this.firstRow.length;
301
+ const lastRowIndex: number = this.table.length;
302
+ const initRowValue: number = lastRowIndex || 1;
303
+ const initTableValue: number = lastColIndex || 1;
304
+
305
+ const modal = Modal.advanced({
306
+ content: html`
307
+ <div class="form-group">
308
+ <label for="t3js-expand-rows" class="form-label">${lll('table_rowCount')}</label>
309
+ <input id="t3js-expand-rows" class="form-control" type="number" min="1" required value="${initRowValue}">
310
+ </div>
311
+ <div class="form-group">
312
+ <label for="t3js-expand-cols" class="form-label">${lll('table_colCount')}</label>
313
+ <input id="t3js-expand-cols" class="form-control" type="number" min="1" required value="${initTableValue}">
314
+ </div>
315
+ `,
316
+ title: lll('table_setCountHeadline'),
317
+ size: Modal.sizes.small,
318
+ buttons: [
319
+ {
320
+ text: lll('labels.cancel') || 'Cancel',
321
+ btnClass: 'btn-default',
322
+ name: 'cancel',
323
+ trigger: (): void => modal.hideModal(),
324
+ },
325
+ {
326
+ text: lll('table_buttonUpdate') || 'Update',
327
+ active: true,
328
+ btnClass: 'btn-primary',
329
+ name: 'apply',
330
+ trigger: (): void => {
331
+ const rows: HTMLInputElement = modal.querySelector('#t3js-expand-rows');
332
+ const cols: HTMLInputElement = modal.querySelector('#t3js-expand-cols');
333
+
334
+ if (rows === null || cols === null) {
335
+ return;
336
+ }
337
+
338
+ if (rows.checkValidity() && cols.checkValidity()) {
339
+ const modifyRows: number = Number(rows.value) - lastRowIndex;
340
+ const modifyCols: number = Number(cols.value) - lastColIndex;
341
+ this.setColAndRowCount(evt, modifyCols, modifyRows);
342
+ modal.hideModal();
343
+ } else {
344
+ rows.reportValidity();
345
+ cols.reportValidity();
346
+ }
347
+ }
348
+ }
349
+ ]
350
+ });
351
+ }
352
+
353
+ private showTableSyntax(): void {
354
+ const textarea: HTMLTextAreaElement = document.querySelector(this.selectorData);
355
+ const modal = Modal.advanced({
356
+ content: html`
357
+ <div class="form-group">
358
+ <label for="table-wizard-textarea-raw" class="form-label">${lll('table_showCodeLabel')}</label>
359
+ <textarea id="table-wizard-textarea-raw" rows="8" class="form-control">${textarea.value}</textarea>
360
+ </div>
361
+ `,
362
+ title: lll('table_showCodeHeadline'),
363
+ size: Modal.sizes.small,
364
+ buttons: [
365
+ {
366
+ text: lll('labels.cancel') || 'Cancel',
367
+ btnClass: 'btn-default',
368
+ name: 'cancel',
369
+ trigger: (): void => modal.hideModal(),
370
+ },
371
+ {
372
+ text: lll('table_buttonUpdate') || 'Update',
373
+ active: true,
374
+ btnClass: 'btn-primary',
375
+ name: 'apply',
376
+ trigger: (): void => {
377
+ // Apply table changes
378
+ textarea.value = modal.querySelector('textarea').value;
379
+ textarea.dispatchEvent(new CustomEvent('change', { bubbles: true }));
380
+ this.readTableFromTextarea();
381
+ this.requestUpdate();
382
+
383
+ modal.hideModal();
384
+ }
385
+ }
386
+ ]
387
+ });
388
+ }
389
+
390
+ /**
391
+ * Allow user to set a specific row/col count
392
+ *
393
+ * @param evt
394
+ * @param colCount
395
+ * @param rowCount
396
+ * @private
397
+ */
398
+ private setColAndRowCount(evt: Event, colCount: number, rowCount: number) {
399
+ const lastRowIndex: number = this.table.length;
400
+
401
+ if (rowCount > 0) {
402
+ for (let count = 0; count < rowCount; count++) {
403
+ this.appendRow(evt, lastRowIndex);
404
+ }
405
+ } else {
406
+ for (let count = 0; count < Math.abs(rowCount); count++) {
407
+ this.removeRow(evt, this.table.length - 1);
408
+ }
409
+ }
410
+
411
+ if (colCount > 0) {
412
+ for (let count = 0; count < colCount; count++) {
413
+ this.appendColumn(evt, colCount);
414
+ }
415
+ } else {
416
+ for (let count = 0; count < Math.abs(colCount); count++) {
417
+ this.removeColumn(evt, this.firstRow.length - 1);
418
+ }
419
+ }
420
+ }
421
+ }
422
+
423
+ declare global {
424
+ interface HTMLElementTagNameMap {
425
+ 'typo3-formengine-table-wizard': TableWizardElement;
426
+ }
427
+ }
@@ -0,0 +1,52 @@
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 { Resizable } from './modifier/resizable';
16
+ import { Tabbable } from './modifier/tabbable';
17
+
18
+ /**
19
+ * Module: @typo3/backend/form-engine/element/text-element
20
+ *
21
+ * Functionality for the text element
22
+ *
23
+ * @example
24
+ * <typo3-formengine-element-text recordFieldId="some-id">
25
+ * ...
26
+ * </typo3-formengine-element-text>
27
+ *
28
+ * This is based on W3C custom elements ("web components") specification, see
29
+ * https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
30
+ */
31
+ class TextElement extends HTMLElement {
32
+ private element: HTMLTextAreaElement = null;
33
+
34
+ public async connectedCallback(): Promise<void> {
35
+ if (this.element !== null) {
36
+ // Element is already initialized, which means the component has been rendered before. Nothing to do here.
37
+ return;
38
+ }
39
+
40
+ await DocumentService.ready();
41
+ this.element = document.getElementById((this.getAttribute('recordFieldId') || '' as string)) as HTMLTextAreaElement;
42
+
43
+ if (!this.element) {
44
+ return;
45
+ }
46
+
47
+ Resizable.enable(this.element);
48
+ Tabbable.enable(this.element);
49
+ }
50
+ }
51
+
52
+ window.customElements.define('typo3-formengine-element-text', TextElement);
@@ -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 { Resizable } from './modifier/resizable';
15
+ import { Tabbable } from './modifier/tabbable';
16
+ import DocumentService from '@typo3/core/document-service';
17
+
18
+ class TextTableElement {
19
+ private element: HTMLTextAreaElement = null;
20
+
21
+ constructor(elementId: string) {
22
+ DocumentService.ready().then((): void => {
23
+ this.element = <HTMLTextAreaElement>document.getElementById(elementId);
24
+
25
+ Resizable.enable(this.element);
26
+ Tabbable.enable(this.element);
27
+ });
28
+ }
29
+ }
30
+
31
+ export default TextTableElement;
@@ -0,0 +1,40 @@
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 FormEngine from '@typo3/backend/form-engine';
16
+
17
+ /**
18
+ * Handles the "Add record" field control that renders a new FormEngine instance
19
+ */
20
+ class AddRecord {
21
+ private controlElement: HTMLElement = null;
22
+
23
+ constructor(controlElementId: string) {
24
+ DocumentService.ready().then((): void => {
25
+ this.controlElement = <HTMLElement>document.querySelector(controlElementId);
26
+ this.controlElement.addEventListener('click', this.registerClickHandler);
27
+ });
28
+ }
29
+
30
+ /**
31
+ * @param {Event} e
32
+ */
33
+ private readonly registerClickHandler = (e: Event): void => {
34
+ e.preventDefault();
35
+
36
+ FormEngine.preventFollowLinkIfNotSaved(this.controlElement.getAttribute('href'));
37
+ };
38
+ }
39
+
40
+ export default AddRecord;
@@ -0,0 +1,64 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import DocumentService from '@typo3/core/document-service';
15
+
16
+ /**
17
+ * Handles the "Edit popup" field control that renders a new FormEngine instance
18
+ */
19
+ class EditPopup {
20
+ private controlElement: HTMLAnchorElement = null;
21
+ private assignedFormField: HTMLSelectElement = null;
22
+
23
+ constructor(controlElementId: string) {
24
+ DocumentService.ready().then((): void => {
25
+ this.controlElement = <HTMLAnchorElement>document.querySelector(controlElementId);
26
+ this.assignedFormField = <HTMLSelectElement>document.querySelector(
27
+ 'select[data-formengine-input-name="' + this.controlElement.dataset.element + '"]',
28
+ );
29
+
30
+ if (this.assignedFormField.options.selectedIndex === -1) {
31
+ this.controlElement.classList.add('disabled');
32
+ }
33
+
34
+ this.assignedFormField.addEventListener('change', this.registerChangeHandler);
35
+ this.controlElement.addEventListener('click', this.registerClickHandler);
36
+ });
37
+ }
38
+
39
+ private readonly registerChangeHandler = (): void => {
40
+ this.controlElement.classList.toggle('disabled', this.assignedFormField.options.selectedIndex === -1);
41
+ };
42
+
43
+ /**
44
+ * @param {Event} e
45
+ */
46
+ private readonly registerClickHandler = (e: Event): void => {
47
+ e.preventDefault();
48
+
49
+ const values: Array<string> = [];
50
+ for (let i = 0; i < this.assignedFormField.selectedOptions.length; ++i) {
51
+ const option = this.assignedFormField.selectedOptions.item(i);
52
+ values.push(option.value);
53
+ }
54
+
55
+ const url = this.controlElement.getAttribute('href')
56
+ + '&P[currentValue]=' + encodeURIComponent(this.assignedFormField.value)
57
+ + '&P[currentSelectedValues]=' + values.join(',')
58
+ ;
59
+ const popupWindow = window.open(url, '', this.controlElement.dataset.windowParameters);
60
+ popupWindow.focus();
61
+ };
62
+ }
63
+
64
+ export default EditPopup;
@@ -0,0 +1,50 @@
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 FormEngine from '@typo3/backend/form-engine';
16
+
17
+ interface ClipboardItem {
18
+ title: string;
19
+ value: string;
20
+ }
21
+
22
+ /**
23
+ * Handles the "Insert clipboard" field control that pastes the clipboard into a "group" field
24
+ */
25
+ class InsertClipboard {
26
+ private controlElement: HTMLElement = null;
27
+
28
+ constructor(controlElementId: string) {
29
+ DocumentService.ready().then((): void => {
30
+ this.controlElement = <HTMLElement>document.querySelector(controlElementId);
31
+ this.controlElement.addEventListener('click', this.registerClickHandler);
32
+ });
33
+ }
34
+
35
+ /**
36
+ * @param {Event} e
37
+ */
38
+ private readonly registerClickHandler = (e: Event): void => {
39
+ e.preventDefault();
40
+
41
+ const assignedElement: string = this.controlElement.dataset.element;
42
+ const clipboardItems: Array<ClipboardItem> = JSON.parse(this.controlElement.dataset.clipboardItems);
43
+
44
+ for (const item of clipboardItems) {
45
+ FormEngine.setSelectOptionFromExternalSource(assignedElement, item.value, item.title, item.title);
46
+ }
47
+ };
48
+ }
49
+
50
+ export default InsertClipboard;