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,366 @@
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 { LitElement, html, type TemplateResult } from 'lit';
15
+ import { customElement, property, state } from 'lit/decorators';
16
+ import { classMap } from 'lit/directives/class-map';
17
+ import { ifDefined } from 'lit/directives/if-defined';
18
+ import type { AbstractAction } from './action-button/abstract-action';
19
+ import { SeverityEnum } from './enum/severity';
20
+ import Severity from './severity';
21
+ import '@typo3/backend/element/icon-element';
22
+ import { lll } from '@typo3/core/lit-helper';
23
+
24
+ interface Action {
25
+ label: string;
26
+ action?: AbstractAction;
27
+ }
28
+
29
+ /**
30
+ * Module: @typo3/backend/notification
31
+ * Notification API for the TYPO3 backend
32
+ */
33
+ class Notification {
34
+ private static readonly duration: number = 5;
35
+ private static readonly showClearAllButtonCount: number = 2;
36
+ private static totalNotifications: number = 0;
37
+ private static messageContainer: HTMLElement = null;
38
+ private static notificationList: HTMLElement = null;
39
+ private static clearAllButton: HTMLElement = null;
40
+
41
+ /**
42
+ * Show a notice notification
43
+ *
44
+ * @param {string} title
45
+ * @param {string} message
46
+ * @param {number} duration
47
+ * @param {Action[]} actions
48
+ */
49
+ public static notice(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
50
+ Notification.showMessage(title, message, SeverityEnum.notice, duration, actions);
51
+ }
52
+
53
+ /**
54
+ * Show a info notification
55
+ *
56
+ * @param {string} title
57
+ * @param {string} message
58
+ * @param {number} duration
59
+ * @param {Action[]} actions
60
+ */
61
+ public static info(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
62
+ Notification.showMessage(title, message, SeverityEnum.info, duration, actions);
63
+ }
64
+
65
+ /**
66
+ * Show a success notification
67
+ *
68
+ * @param {string} title
69
+ * @param {string} message
70
+ * @param {number} duration
71
+ * @param {Action[]} actions
72
+ */
73
+ public static success(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
74
+ Notification.showMessage(title, message, SeverityEnum.ok, duration, actions);
75
+ }
76
+
77
+ /**
78
+ * Show a warning notification
79
+ *
80
+ * @param {string} title
81
+ * @param {string} message
82
+ * @param {number} duration
83
+ * @param {Action[]} actions
84
+ */
85
+ public static warning(title: string, message?: string, duration?: number, actions?: Array<Action>): void {
86
+ Notification.showMessage(title, message, SeverityEnum.warning, duration, actions);
87
+ }
88
+
89
+ /**
90
+ * Show a error notification
91
+ *
92
+ * @param {string} title
93
+ * @param {string} message
94
+ * @param {number} duration
95
+ * @param {Action[]} actions
96
+ */
97
+ public static error(title: string, message?: string, duration: number = 0, actions?: Array<Action>): void {
98
+ Notification.showMessage(title, message, SeverityEnum.error, duration, actions);
99
+ }
100
+
101
+ /**
102
+ * @param {string} title
103
+ * @param {string} message
104
+ * @param {SeverityEnum} severity
105
+ * @param {number} duration
106
+ * @param {Action[]} actions
107
+ */
108
+ public static showMessage(
109
+ title: string,
110
+ message?: string,
111
+ severity: SeverityEnum = SeverityEnum.info,
112
+ duration?: number | string,
113
+ actions: Array<Action> = [],
114
+ ): void {
115
+ if (typeof duration === 'undefined') {
116
+ duration = (severity === SeverityEnum.error) ? 0 : this.duration;
117
+ }
118
+
119
+ if (this.messageContainer === null || document.getElementById('alert-container') === null) {
120
+ this.messageContainer = document.createElement('div');
121
+ this.messageContainer.setAttribute('id', 'alert-container');
122
+ this.notificationList = document.createElement('div');
123
+ this.notificationList.setAttribute('class', 'alert-list');
124
+ // Enable focusing for keyboard scrolling (accessibility)
125
+ this.notificationList.setAttribute('tabindex', '0');
126
+ this.messageContainer.appendChild(this.notificationList);
127
+
128
+ this.clearAllButton = <ClearNotificationMessages>document.createElement('typo3-notification-clear-all');
129
+ this.containerItemVisibility();
130
+ this.messageContainer.prepend(this.clearAllButton);
131
+ document.body.appendChild(this.messageContainer);
132
+
133
+ document.addEventListener('typo3-notification-open', () => {
134
+ this.totalNotifications++;
135
+ this.containerItemVisibility();
136
+ });
137
+
138
+ document.addEventListener('typo3-notification-clear', () => {
139
+ // Avoid negative value
140
+ if(this.totalNotifications > 0) {
141
+ this.totalNotifications--;
142
+ }
143
+
144
+ this.containerItemVisibility();
145
+ });
146
+ }
147
+
148
+ const box = <NotificationMessage>document.createElement('typo3-notification-message');
149
+ box.setAttribute('notification-id', 'notification-' + Math.random().toString(36).substring(2, 6));
150
+ box.setAttribute('notification-title', title);
151
+ if (message) {
152
+ box.setAttribute('notification-message', message);
153
+ }
154
+ box.setAttribute('notification-severity', severity.toString());
155
+ box.setAttribute('notification-duration', duration.toString());
156
+ box.actions = actions;
157
+
158
+ // Wait for the animation to finish, before scrolling into view
159
+ setTimeout(() => {
160
+ this.notificationList.querySelector('typo3-notification-message:last-child').scrollIntoView();
161
+ }, Number(duration));
162
+
163
+ this.notificationList.appendChild(box);
164
+ }
165
+
166
+ protected static containerItemVisibility() {
167
+ this.clearAllButton.hidden = this.totalNotifications < this.showClearAllButtonCount;
168
+ this.messageContainer.hidden = this.totalNotifications === 0;
169
+ }
170
+ }
171
+
172
+ @customElement('typo3-notification-clear-all')
173
+ export class ClearNotificationMessages extends LitElement {
174
+ @property({ type: String, attribute: 'notification-container' }) notificationId: string;
175
+
176
+ public async clearAll() {
177
+ this.dispatchEvent(
178
+ new CustomEvent('typo3-notification-clear-all', { bubbles: true, composed: true })
179
+ );
180
+
181
+ this.hidden = true;
182
+ }
183
+
184
+ protected override createRenderRoot(): HTMLElement | DocumentFragment {
185
+ return this;
186
+ }
187
+
188
+ protected override render(): TemplateResult {
189
+ return html`<div><button @click=${() => this.clearAll()} class="btn btn-default">
190
+ <typo3-backend-icon identifier="actions-close" size="small"></typo3-backend-icon> ${lll('button.clearAll') || 'Clear all'}
191
+ </button></div>`;
192
+ }
193
+
194
+ }
195
+
196
+ @customElement('typo3-notification-message')
197
+ export class NotificationMessage extends LitElement {
198
+ @property({ type: String, attribute: 'notification-id' }) notificationId: string;
199
+ @property({ type: String, attribute: 'notification-title' }) notificationTitle: string;
200
+ @property({ type: String, attribute: 'notification-message' }) notificationMessage: string;
201
+ @property({ type: Number, attribute: 'notification-severity' }) notificationSeverity: SeverityEnum = SeverityEnum.info;
202
+ @property({ type: Number, attribute: 'notification-duration' }) notificationDuration: number = 0;
203
+ @property({ type: Array, attribute: false }) actions: Array<Action> = [];
204
+
205
+ @state() executingAction: number = -1;
206
+
207
+ public override async firstUpdated(): Promise<void> {
208
+ document.addEventListener('typo3-notification-clear-all', async () => {
209
+ this.clear();
210
+ });
211
+
212
+ const event = new CustomEvent('typo3-notification-open', { bubbles: true, composed: true });
213
+ this.dispatchEvent(event);
214
+
215
+ await new Promise(resolve => window.setTimeout(resolve, 200));
216
+ await this.requestUpdate();
217
+ if (this.notificationDuration > 0) {
218
+ await new Promise(resolve => window.setTimeout(resolve, this.notificationDuration * 1000));
219
+ this.clear();
220
+ }
221
+ }
222
+
223
+ public async clear(): Promise<void> {
224
+ this.dispatchEvent(
225
+ new CustomEvent('typo3-notification-clear', { bubbles: true, composed: true })
226
+ );
227
+
228
+ this.addEventListener('typo3-notification-clear-finish', (): void => {
229
+ this.parentNode?.removeChild(this);
230
+ });
231
+
232
+ const dispatchFinishEvent = (): void => {
233
+ this.dispatchEvent(new CustomEvent('typo3-notification-clear-finish'));
234
+ };
235
+
236
+ const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
237
+ if (!prefersReducedMotion && 'animate' in this) {
238
+ this.style.overflow = 'hidden';
239
+ this.style.display = 'block';
240
+ this.animate(
241
+ [
242
+ { height: this.getBoundingClientRect().height + 'px' },
243
+ { height: 0, opacity: 0, marginTop: 0 },
244
+ ], {
245
+ duration: 400,
246
+ easing: 'cubic-bezier(.02, .01, .47, 1)'
247
+ }
248
+ ).onfinish = dispatchFinishEvent;
249
+ } else {
250
+ dispatchFinishEvent();
251
+ }
252
+ }
253
+
254
+ protected override createRenderRoot(): HTMLElement | DocumentFragment {
255
+ return this;
256
+ }
257
+
258
+ protected override render(): TemplateResult {
259
+ const className = Severity.getCssClass(this.notificationSeverity);
260
+ let icon = '';
261
+ switch (this.notificationSeverity) {
262
+ case SeverityEnum.notice:
263
+ icon = 'actions-lightbulb';
264
+ break;
265
+ case SeverityEnum.ok:
266
+ icon = 'actions-check';
267
+ break;
268
+ case SeverityEnum.warning:
269
+ icon = 'actions-exclamation';
270
+ break;
271
+ case SeverityEnum.error:
272
+ icon = 'actions-close';
273
+ break;
274
+ case SeverityEnum.info:
275
+ default:
276
+ icon = 'actions-info';
277
+ }
278
+
279
+ const randomSuffix = (Math.random() + 1).toString(36).substring(2);
280
+
281
+ /* eslint-disable @stylistic/indent */
282
+ return html`
283
+ <div
284
+ id="${ifDefined(this.notificationId || undefined)}"
285
+ class="alert alert-${className} alert-dismissible"
286
+ role="alertdialog"
287
+ aria-labelledby="alert-title-${randomSuffix}"
288
+ aria-describedby="alert-message-${randomSuffix}"
289
+ >
290
+ <button type="button" class="close" @click="${async () => this.clear()}">
291
+ <span aria-hidden="true"><typo3-backend-icon identifier="actions-close" size="small"></typo3-backend-icon></span>
292
+ <span class="visually-hidden">Close</span>
293
+ </button>
294
+ <div class="alert-inner">
295
+ <div class="alert-icon">
296
+ <span class="icon-emphasized">
297
+ <typo3-backend-icon identifier="${icon}" size="small"></typo3-backend-icon>
298
+ </span>
299
+ </div>
300
+ <div class="alert-content">
301
+ <div class="alert-title" id="alert-title-${randomSuffix}">${this.notificationTitle}</div>
302
+ <p class="alert-message" id="alert-message-${randomSuffix}">${this.notificationMessage ? this.notificationMessage : ''}</p>
303
+ </div>
304
+ </div>
305
+ ${this.actions.length === 0 ? '' : html`
306
+ <div class="alert-actions">
307
+ ${this.actions.map((action, index) => html`
308
+ <a href="#"
309
+ title="${action.label}"
310
+ @click="${async (event: PointerEvent) => {
311
+ event.preventDefault();
312
+ this.executingAction = index;
313
+ await this.updateComplete;
314
+ if ('action' in action) {
315
+ await action.action.execute(event.currentTarget as HTMLAnchorElement);
316
+ }
317
+ this.clear();
318
+ }}"
319
+ class="${classMap({
320
+ executing: this.executingAction === index,
321
+ disabled: this.executingAction >= 0 && this.executingAction !== index
322
+ })}"
323
+ >${action.label}</a>
324
+ `)}
325
+ </div>
326
+ `}
327
+ </div>
328
+ `;
329
+ /* eslint-enable @stylistic/indent */
330
+ }
331
+ }
332
+
333
+ declare global {
334
+ interface HTMLElementTagNameMap {
335
+ 'typo3-notification-message': NotificationMessage;
336
+ }
337
+ }
338
+
339
+ let notificationObject: typeof Notification;
340
+
341
+ try {
342
+ // fetch from parent
343
+ if (parent && parent.window.TYPO3 && parent.window.TYPO3.Notification) {
344
+ notificationObject = parent.window.TYPO3.Notification;
345
+ }
346
+
347
+ // fetch object from outer frame
348
+ if (top && top.TYPO3.Notification) {
349
+ notificationObject = top.TYPO3.Notification;
350
+ }
351
+ } catch {
352
+ // This only happens if the opener, parent or top is some other url (eg a local file)
353
+ // which loaded the current window. Then the browser's cross domain policy jumps in
354
+ // and raises an exception.
355
+ // For this case we are safe and we can create our global object below.
356
+ }
357
+
358
+ if (!notificationObject) {
359
+ notificationObject = Notification;
360
+
361
+ // attach to global frame
362
+ if (typeof TYPO3 !== 'undefined') {
363
+ TYPO3.Notification = notificationObject;
364
+ }
365
+ }
366
+ export default notificationObject;
@@ -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
+ /**
15
+ * @internal
16
+ */
17
+ export class Offset {
18
+ constructor(
19
+ public left: number,
20
+ public top: number,
21
+ public width: number,
22
+ public height: number
23
+ ) {}
24
+
25
+ get right(): number {
26
+ return this.left + this.width;
27
+ }
28
+
29
+ get bottom(): number {
30
+ return this.top + this.height;
31
+ }
32
+
33
+ public static fromObject({ left, top, width, height }: { left: number, top: number, width: number, height: number }): Offset {
34
+ return new Offset(left, top, width, height);
35
+ }
36
+
37
+ public clone(): Offset {
38
+ return new Offset(this.left, this.top, this.width, this.height);
39
+ }
40
+ }
@@ -0,0 +1,110 @@
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 { MessageUtility } from '@typo3/backend/utility/message-utility';
16
+ import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
17
+ import NProgress from 'nprogress';
18
+ import AjaxRequest from '@typo3/core/ajax/ajax-request';
19
+ import Modal, { type ModalElement, Types } from './modal';
20
+ import Notification from './notification';
21
+ import Severity from './severity';
22
+ import RegularEvent from '@typo3/core/event/regular-event';
23
+ import { topLevelModuleImport } from '@typo3/backend/utility/top-level-module-import';
24
+
25
+ interface Response {
26
+ file?: number;
27
+ error?: string;
28
+ }
29
+
30
+ /**
31
+ * Module: @typo3/backend/online-media
32
+ * Javascript for show the online media dialog
33
+ */
34
+ class OnlineMedia {
35
+ constructor() {
36
+ DocumentService.ready().then(async (): Promise<void> => {
37
+ // Since the web component is used in a modal and therefore in outer frames, we have to import the module in the
38
+ // top level scope. Not doing so causes issues in at least Firefox.
39
+ await topLevelModuleImport('@typo3/backend/form-engine/element/online-media-form-element.js');
40
+ this.registerEvents();
41
+ });
42
+ }
43
+
44
+ private registerEvents(): void {
45
+ new RegularEvent('click', (e: Event, target: HTMLButtonElement): void => {
46
+ this.triggerModal(target);
47
+ }).delegateTo(document, '.t3js-online-media-add-btn');
48
+ }
49
+
50
+ private addOnlineMedia(trigger: HTMLButtonElement, modalElement: ModalElement, url: string): void {
51
+ const target = trigger.dataset.targetFolder;
52
+ const allowed = trigger.dataset.onlineMediaAllowed;
53
+ const irreObjectUid = trigger.dataset.fileIrreObject;
54
+
55
+ NProgress.start();
56
+ new AjaxRequest(TYPO3.settings.ajaxUrls.online_media_create).post({
57
+ url: url,
58
+ targetFolder: target,
59
+ allowed: allowed,
60
+ }).then(async (response: AjaxResponse): Promise<void> => {
61
+ const data: Response = await response.resolve();
62
+ if (data.file) {
63
+ const message = {
64
+ actionName: 'typo3:foreignRelation:insert',
65
+ objectGroup: irreObjectUid,
66
+ table: 'sys_file',
67
+ uid: data.file,
68
+ };
69
+ MessageUtility.send(message);
70
+ modalElement.hideModal();
71
+ } else {
72
+ Notification.error(top.TYPO3.lang['online_media.error.new_media.failed'], data.error);
73
+ }
74
+ NProgress.done();
75
+ });
76
+ }
77
+
78
+ private triggerModal(trigger: HTMLButtonElement): void {
79
+ const btnSubmit = trigger.dataset.btnSubmit || 'Add';
80
+ const placeholder = trigger.dataset.placeholder || 'Paste media url here...';
81
+ const allowedHelpText = trigger.dataset.onlineMediaAllowedHelpText || 'Allow to embed from sources:';
82
+
83
+ const onlineMediaForm = document.createElement('typo3-backend-formengine-online-media-form');
84
+ onlineMediaForm.placeholder = placeholder;
85
+ onlineMediaForm.setAttribute('help-text', allowedHelpText);
86
+ onlineMediaForm.setAttribute('extensions', trigger.dataset.onlineMediaAllowed);
87
+
88
+ Modal.advanced({
89
+ type: Types.default,
90
+ title: trigger.title,
91
+ content: onlineMediaForm,
92
+ severity: Severity.notice,
93
+ callback: (modalElement: ModalElement): void => {
94
+ modalElement.querySelector('typo3-backend-formengine-online-media-form').addEventListener('typo3:formengine:online-media-added', (e: CustomEvent): void => {
95
+ this.addOnlineMedia(trigger, modalElement, e.detail['online-media-url']);
96
+ });
97
+ },
98
+ buttons: [{
99
+ text: btnSubmit,
100
+ btnClass: 'btn btn-primary',
101
+ name: 'ok',
102
+ trigger: (): void => {
103
+ onlineMediaForm.querySelector('form').requestSubmit();
104
+ },
105
+ }],
106
+ });
107
+ }
108
+ }
109
+
110
+ export default new OnlineMedia();
@@ -0,0 +1,91 @@
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 PersistentStorage from './storage/persistent';
17
+
18
+ enum IdentifierEnum {
19
+ hiddenElements = '.t3js-hidden-record',
20
+ }
21
+
22
+ /**
23
+ * Module: @typo3/backend/page-actions
24
+ * JavaScript implementations for page actions
25
+ */
26
+ class PageActions {
27
+ constructor() {
28
+ DocumentService.ready().then((): void => {
29
+ const pageLayoutToggleShowHidden = document.getElementById('pageLayoutToggleShowHidden') as HTMLButtonElement|null;
30
+ if (pageLayoutToggleShowHidden !== null) {
31
+ new RegularEvent('click', this.toggleContentElementVisibility).bindTo(pageLayoutToggleShowHidden);
32
+ }
33
+ });
34
+ }
35
+
36
+ /**
37
+ * Toggles the "Show hidden content elements"
38
+ */
39
+ private toggleContentElementVisibility(e: Event): void {
40
+ const me = e.target as HTMLButtonElement;
41
+ const hiddenElements = document.querySelectorAll(IdentifierEnum.hiddenElements) as NodeListOf<HTMLElement>;
42
+ const show = me.dataset.dropdowntoggleStatus !== 'active';
43
+ me.disabled = true;
44
+
45
+ for (const hiddenElement of hiddenElements) {
46
+ hiddenElement.style.display = 'flow-root';
47
+ const scrollHeight = hiddenElement.scrollHeight;
48
+
49
+ // Always set `overflow: clip` after storing scrollHeight
50
+ // * For hidden state `height: 0px` is already set.
51
+ // * For visible state setting `overflow: clip` is fine anyway.
52
+ hiddenElement.style.overflow = 'clip';
53
+
54
+ if (!show) {
55
+ // * Invisible elements must not be accessible/focusable by keyboard.
56
+ // * Spacing between content elements is kept uniform by collapsed margins,
57
+ // hidden elements have a height of 0 and the margins of the surrounding elements
58
+ // cannot collapse, causing a visual gap.
59
+ // Therefore do not display the element at all by setting `display: none`.
60
+ hiddenElement.addEventListener('transitionend', (): void => {
61
+ hiddenElement.style.display = 'none';
62
+ hiddenElement.style.overflow = '';
63
+ }, { once: true });
64
+
65
+ // We use requestAnimationFrame() as we have to set the container's height at first before resizing to
66
+ // collapsed-element-height. This results in a smooth animation.
67
+ requestAnimationFrame(function() {
68
+ hiddenElement.style.height = scrollHeight + 'px';
69
+ requestAnimationFrame(function() {
70
+ hiddenElement.style.height = 0 + 'px';
71
+ });
72
+ });
73
+ } else {
74
+ hiddenElement.addEventListener('transitionend', (): void => {
75
+ hiddenElement.style.display = '';
76
+ hiddenElement.style.overflow = '';
77
+ hiddenElement.style.height = '';
78
+ }, { once: true });
79
+
80
+ hiddenElement.style.height = scrollHeight + 'px';
81
+ }
82
+ }
83
+
84
+ me.dataset.dropdowntoggleStatus = show ? 'active' : 'inactive';
85
+ PersistentStorage.set('moduleData.web_layout.showHidden', show ? '1' : '0').then((): void => {
86
+ me.disabled = false;
87
+ });
88
+ }
89
+ }
90
+
91
+ export default new PageActions();
@@ -0,0 +1,51 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import LinkBrowser from './link-browser';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+
17
+ /**
18
+ * Module: @typo3/backend/page-link-handler
19
+ * @exports @typo3/backend/page-link-handler
20
+ * Page link interaction
21
+ */
22
+ class PageLinkHandler {
23
+ constructor() {
24
+ new RegularEvent('click', (evt: MouseEvent, targetEl: HTMLElement): void => {
25
+ evt.preventDefault();
26
+ LinkBrowser.finalizeFunction(targetEl.getAttribute('href'));
27
+ }).delegateTo(document, 'a.t3js-pageLink');
28
+
29
+ // Input field
30
+ new RegularEvent('click', (evt: MouseEvent): void => {
31
+ evt.preventDefault();
32
+ this.linkPageByTextfield();
33
+ }).delegateTo(document, 'input.t3js-pageLink');
34
+ }
35
+
36
+ private readonly linkPageByTextfield = (): void => {
37
+ const textField = document.getElementById('luid') as HTMLInputElement;
38
+ let value = textField.value;
39
+ if (!value) {
40
+ return;
41
+ }
42
+ // make sure we use proper link syntax if this is an integer only
43
+ const valueAsNumber = parseInt(value, 10);
44
+ if (!isNaN(valueAsNumber)) {
45
+ value = 't3://page?uid=' + valueAsNumber;
46
+ }
47
+ LinkBrowser.finalizeFunction(value);
48
+ };
49
+ }
50
+
51
+ export default new PageLinkHandler();