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,1343 @@
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
+ * Module: @typo3/form/backend/form-editor/view-model
16
+ */
17
+ import $ from 'jquery';
18
+ import * as TreeComponent from '@typo3/form/backend/form-editor/tree-component';
19
+ import * as ModalsComponent from '@typo3/form/backend/form-editor/modals-component';
20
+ import * as InspectorComponent from '@typo3/form/backend/form-editor/inspector-component';
21
+ import * as StageComponent from '@typo3/form/backend/form-editor/stage-component';
22
+ import * as Helper from '@typo3/form/backend/form-editor/helper';
23
+ import Icons from '@typo3/backend/icons';
24
+ import Notification from '@typo3/backend/notification';
25
+ import { loadModule } from '@typo3/core/java-script-item-processor';
26
+
27
+ import type {
28
+ FormEditor,
29
+ } from '@typo3/form/backend/form-editor';
30
+ import type {
31
+ Utility,
32
+ CollectionElementConfiguration,
33
+ FormEditorDefinitions,
34
+ FormElement,
35
+ FormElementDefinition,
36
+ PublisherSubscriber,
37
+ } from '@typo3/form/backend/form-editor/core';
38
+ import type {
39
+ Configuration as HelperConfiguration,
40
+ } from '@typo3/form/backend/form-editor/helper';
41
+ import type { InsertElementsModalConfiguration } from '@typo3/form/backend/form-editor/modals-component';
42
+ import type { JavaScriptItemPayload } from '@typo3/core/java-script-item-processor';
43
+
44
+ type AdditionalViewModelModules = JavaScriptItemPayload[];
45
+
46
+ const configuration: Partial<HelperConfiguration> = {
47
+ domElementClassNames: {
48
+ formElementIsComposit: 'formeditor-element-composit',
49
+ formElementIsTopLevel: 'formeditor-element-toplevel',
50
+ hasError: 'has-error',
51
+ selectedCompositFormElement: 'selected',
52
+ selectedFormElement: 'selected',
53
+ selectedRootFormElement: 'selected',
54
+ selectedStagePanel: 't3-form-form-stage-selected',
55
+ sortableHover: 'sortable-hover',
56
+ viewModeAbstract: 'formeditor-module-viewmode-abstract',
57
+ viewModePreview: 'formeditor-module-viewmode-preview',
58
+ validationErrors: 'formeditor-validation-errors',
59
+ validationChildHasErrors: 'formeditor-validation-child-has-error'
60
+ },
61
+ domElementDataAttributeNames: {
62
+ abstractType: 'data-element-abstract-type'
63
+ },
64
+ domElementDataAttributeValues: {
65
+ buttonHeaderClose: 'closeButton',
66
+ buttonHeaderPaginationNext: 'buttonPaginationNext',
67
+ buttonHeaderPaginationPrevious: 'buttonPaginationPrevious',
68
+ buttonHeaderRedo: 'redoButton',
69
+ buttonHeaderSave: 'saveButton',
70
+ buttonHeaderUndo: 'undoButton',
71
+ buttonHeaderViewModeAbstract: 'buttonViewModeAbstract',
72
+ buttonHeaderViewModePreview: 'buttonViewModePreview',
73
+ buttonStageNewElementBottom: 'stageNewElementBottom',
74
+ buttonFormSettings: 'formSettings',
75
+ buttonToggleStructure: 'formeditorStructureToggle',
76
+ buttonToggleInspector: 'formeditorInspectorToggle',
77
+ buttonNewPage: 'newPage',
78
+ iconMailform: 'content-form',
79
+ iconSave: 'actions-document-save',
80
+ iconSaveSpinner: 'spinner-circle',
81
+ inspectorSection: 'inspectorSection',
82
+ moduleLoadingIndicator: 'moduleLoadingIndicator',
83
+ moduleWrapper: 'moduleWrapper',
84
+ stageArea: 'stageArea',
85
+ stageContainer: 'stageContainer',
86
+ stageContainerInner: 'stageContainerInner',
87
+ stageNewElementRow: 'stageNewElementRow',
88
+ stagePanelHeading: 'panelHeading',
89
+ stageSection: 'stageSection',
90
+ structure: 'structure-element',
91
+ structureSection: 'structureSection',
92
+ structureRootContainer: 'treeRootContainer',
93
+ structureRootElement: 'treeRootElement'
94
+ }
95
+ };
96
+
97
+ let previewMode: boolean = false;
98
+
99
+ let formEditorApp: FormEditor = null;
100
+
101
+ let structureComponent: typeof TreeComponent = null;
102
+
103
+ let modalsComponent: typeof ModalsComponent = null;
104
+
105
+ let inspectorsComponent: typeof InspectorComponent = null;
106
+
107
+ let stageComponent: typeof StageComponent = null;
108
+
109
+ function getRootFormElement(): FormElement {
110
+ return getFormEditorApp().getRootFormElement();
111
+ }
112
+
113
+ function assert(test: boolean|(() => boolean), message: string, messageCode: number): void {
114
+ return getFormEditorApp().assert(test, message, messageCode);
115
+ }
116
+
117
+ function getUtility(): Utility {
118
+ return getFormEditorApp().getUtility();
119
+ }
120
+
121
+ function getCurrentlySelectedFormElement(): FormElement {
122
+ return getFormEditorApp().getCurrentlySelectedFormElement();
123
+ }
124
+
125
+ function getPublisherSubscriber(): PublisherSubscriber {
126
+ return getFormEditorApp().getPublisherSubscriber();
127
+ }
128
+
129
+ function addPropertyValidators(): void {
130
+ getFormEditorApp().addPropertyValidationValidator('NotEmpty', function(formElement, propertyPath) {
131
+ const value = formElement.get(propertyPath);
132
+ if (!value || value === '' || $.isArray(value) && !value.length) {
133
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('NotEmpty').errorMessage || 'invalid value';
134
+ }
135
+ return undefined;
136
+ });
137
+
138
+ getFormEditorApp().addPropertyValidationValidator('Integer', function(formElement, propertyPath) {
139
+ if (!$.isNumeric(formElement.get(propertyPath))) {
140
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('Integer').errorMessage || 'invalid value';
141
+ }
142
+ return undefined;
143
+ });
144
+
145
+ getFormEditorApp().addPropertyValidationValidator('IntegerOrEmpty', function(formElement, propertyPath) {
146
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
147
+ return undefined;
148
+ }
149
+ if (formElement.get(propertyPath).length > 0 && !$.isNumeric(formElement.get(propertyPath))) {
150
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('Integer').errorMessage || 'invalid value';
151
+ }
152
+ return undefined;
153
+ });
154
+
155
+ getFormEditorApp().addPropertyValidationValidator('NaiveEmail', function(formElement, propertyPath) {
156
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
157
+ return undefined;
158
+ }
159
+ if (!formElement.get(propertyPath).match(/\S+@\S+\.\S+/)) {
160
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('NaiveEmail').errorMessage || 'invalid value';
161
+ }
162
+ return undefined;
163
+ });
164
+
165
+ getFormEditorApp().addPropertyValidationValidator('NaiveEmailOrEmpty', function(formElement, propertyPath) {
166
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
167
+ return undefined;
168
+ }
169
+ if (formElement.get(propertyPath).length > 0 && !formElement.get(propertyPath).match(/\S+@\S+\.\S+/)) {
170
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('NaiveEmailOrEmpty').errorMessage || 'invalid value';
171
+ }
172
+ return undefined;
173
+ });
174
+
175
+ getFormEditorApp().addPropertyValidationValidator('FormElementIdentifierWithinCurlyBracesInclusive', function(formElement, propertyPath) {
176
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
177
+ return undefined;
178
+ }
179
+
180
+ const regex = /\{([a-z0-9-_]+)?\}/gi;
181
+ const match = regex.exec(formElement.get(propertyPath));
182
+ if (match && ((match[1] && match[1] !== '__currentTimestamp' && !getFormEditorApp().isFormElementIdentifierUsed(match[1])) || !match[1])) {
183
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('FormElementIdentifierWithinCurlyBracesInclusive').errorMessage || 'invalid value';
184
+ }
185
+ return undefined;
186
+ });
187
+
188
+ getFormEditorApp().addPropertyValidationValidator('FormElementIdentifierWithinCurlyBracesExclusive', function(formElement, propertyPath) {
189
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
190
+ return undefined;
191
+ }
192
+
193
+ const regex = /^\{([a-z0-9-_]+)?\}$/i;
194
+ const match = regex.exec(formElement.get(propertyPath));
195
+ if (!match || ((match[1] && match[1] !== '__currentTimestamp' && !getFormEditorApp().isFormElementIdentifierUsed(match[1])) || !match[1])) {
196
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('FormElementIdentifierWithinCurlyBracesInclusive').errorMessage || 'invalid value';
197
+ }
198
+ return undefined;
199
+ });
200
+
201
+ getFormEditorApp().addPropertyValidationValidator('FileSize', function(formElement, propertyPath) {
202
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
203
+ return undefined;
204
+ }
205
+ if (!formElement.get(propertyPath).match(/^(\d*\.?\d+)(B|K|M|G)$/i)) {
206
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('FileSize').errorMessage || 'invalid value';
207
+ }
208
+ return undefined;
209
+ });
210
+
211
+ getFormEditorApp().addPropertyValidationValidator('RFC3339FullDate', function(formElement, propertyPath) {
212
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
213
+ return undefined;
214
+ }
215
+ if (!formElement.get(propertyPath).match(/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])$/i)) {
216
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('RFC3339FullDate').errorMessage || 'invalid value';
217
+ }
218
+ return undefined;
219
+ });
220
+
221
+ getFormEditorApp().addPropertyValidationValidator('RFC3339FullDateOrEmpty', function(formElement, propertyPath) {
222
+ if (getUtility().isUndefinedOrNull(formElement.get(propertyPath))) {
223
+ return undefined;
224
+ }
225
+ if (formElement.get(propertyPath).length > 0 && !formElement.get(propertyPath).match(/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])$/i)) {
226
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('RFC3339FullDate').errorMessage || 'invalid value';
227
+ }
228
+ return undefined;
229
+ });
230
+
231
+ getFormEditorApp().addPropertyValidationValidator('RegularExpressionPattern', function(formElement, propertyPath) {
232
+ const value = formElement.get(propertyPath);
233
+ let isValid = true;
234
+
235
+ if (!getUtility().isNonEmptyString(value)) {
236
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('RegularExpressionPattern').errorMessage || 'invalid value';
237
+ }
238
+
239
+ try {
240
+ const matches = value.match(/^\/(.*)\/[gmixsuUAJD]*$/);
241
+
242
+ if (null !== matches) {
243
+ new RegExp(matches[1]);
244
+ } else {
245
+ isValid = false;
246
+ }
247
+ } catch {
248
+ isValid = false;
249
+ }
250
+
251
+ if (!isValid) {
252
+ return getFormEditorApp().getFormElementPropertyValidatorDefinition('RegularExpressionPattern').errorMessage || 'invalid value';
253
+ }
254
+ return undefined;
255
+ });
256
+ }
257
+
258
+ /**
259
+ * @publish view/ready
260
+ * @throws 1475425785
261
+ */
262
+ function loadAdditionalModules(_additionalViewModelModules: AdditionalViewModelModules | Record<string, JavaScriptItemPayload>): void {
263
+ let additionalViewModelModules: AdditionalViewModelModules = [];
264
+ if (typeof _additionalViewModelModules === 'object' && !Array.isArray(_additionalViewModelModules)) {
265
+ for (const key of Object.keys(_additionalViewModelModules)) {
266
+ additionalViewModelModules.push(_additionalViewModelModules[key]);
267
+ }
268
+ } else {
269
+ additionalViewModelModules = _additionalViewModelModules as AdditionalViewModelModules;
270
+ }
271
+
272
+ if ('array' !== $.type(additionalViewModelModules)) {
273
+ getPublisherSubscriber().publish('view/ready');
274
+ return;
275
+ }
276
+ const additionalViewModelModulesLength = additionalViewModelModules.length;
277
+
278
+ if (additionalViewModelModulesLength > 0) {
279
+ let loadedAdditionalViewModelModules = 0;
280
+ for (let i = 0; i < additionalViewModelModulesLength; ++i) {
281
+ loadModule(additionalViewModelModules[i]).then(function(additionalViewModelModule) {
282
+ assert(
283
+ 'function' === $.type(additionalViewModelModule.bootstrap),
284
+ 'The module "' + additionalViewModelModules[i].name + '" does not implement the method "bootstrap"',
285
+ 1475425785
286
+ );
287
+ additionalViewModelModule.bootstrap(getFormEditorApp());
288
+
289
+ loadedAdditionalViewModelModules++;
290
+ if (additionalViewModelModulesLength === loadedAdditionalViewModelModules) {
291
+ getPublisherSubscriber().publish('view/ready');
292
+ }
293
+ });
294
+ }
295
+ } else {
296
+ getPublisherSubscriber().publish('view/ready');
297
+ }
298
+ }
299
+
300
+ /**
301
+ * @throws 1478268639
302
+ */
303
+ function structureComponentSetup(): void {
304
+ assert(
305
+ 'function' === $.type(TreeComponent.bootstrap),
306
+ 'The structure component does not implement the method "bootstrap"',
307
+ 1478268639
308
+ );
309
+
310
+ structureComponent = TreeComponent.bootstrap(
311
+ getFormEditorApp(),
312
+ $(getHelper().getDomElementDataAttribute('identifier', 'bracesWithKeyValue', [
313
+ getHelper().getDomElementDataAttributeValue('structure')
314
+ ]))
315
+ );
316
+
317
+ $(getHelper().getDomElementDataIdentifierSelector('iconMailform'),
318
+ $(getHelper().getDomElementDataIdentifierSelector('structureRootContainer'))
319
+ ).attr('title', 'identifier: ' + getRootFormElement().get('identifier'));
320
+ }
321
+
322
+ /**
323
+ * @throws 1478895106
324
+ */
325
+ function modalsComponentSetup(): void {
326
+ assert(
327
+ 'function' === $.type(ModalsComponent.bootstrap),
328
+ 'The modals component does not implement the method "bootstrap"',
329
+ 1478895106
330
+ );
331
+ modalsComponent = ModalsComponent.bootstrap(getFormEditorApp());
332
+ }
333
+
334
+ /**
335
+ * @throws 1478895106
336
+ */
337
+ function inspectorsComponentSetup(): void {
338
+ assert(
339
+ 'function' === $.type(InspectorComponent.bootstrap),
340
+ 'The inspector component does not implement the method "bootstrap"',
341
+ 1478895106
342
+ );
343
+ inspectorsComponent = InspectorComponent.bootstrap(getFormEditorApp());
344
+ }
345
+
346
+ /**
347
+ * @throws 1478986610
348
+ */
349
+ function stageComponentSetup(): void {
350
+ assert(
351
+ 'function' === $.type(InspectorComponent.bootstrap),
352
+ 'The stage component does not implement the method "bootstrap"',
353
+ 1478986610
354
+ );
355
+ stageComponent = StageComponent.bootstrap(
356
+ getFormEditorApp(),
357
+ $(getHelper().getDomElementDataAttribute('identifier', 'bracesWithKeyValue', [
358
+ getHelper().getDomElementDataAttributeValue('stageArea')
359
+ ]))
360
+ );
361
+
362
+ getStage().getStagePanelDomElement().on('click', function(e) {
363
+ if (
364
+ $(e.target).attr(getHelper().getDomElementDataAttribute('identifier')) === getHelper().getDomElementDataAttributeValue('stagePanelHeading')
365
+ || $(e.target).attr(getHelper().getDomElementDataAttribute('identifier')) === getHelper().getDomElementDataAttributeValue('stageSection')
366
+ || $(e.target).attr(getHelper().getDomElementDataAttribute('identifier')) === getHelper().getDomElementDataAttributeValue('stageArea')
367
+ ) {
368
+ selectPageBatch(getFormEditorApp().getCurrentlySelectedPageIndex());
369
+ }
370
+ getPublisherSubscriber().publish('view/stage/panel/clicked', []);
371
+ });
372
+ }
373
+
374
+ /**
375
+ * @publish view/header/button/save/clicked
376
+ * @publish view/stage/abstract/button/newElement/clicked
377
+ * @publish view/header/button/newPage/clicked
378
+ * @publish view/structure/button/newPage/clicked
379
+ * @publish view/header/button/close/clicked
380
+ */
381
+ function buttonsSetup(): void {
382
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderSave')).on('click', function() {
383
+ getPublisherSubscriber().publish('view/header/button/save/clicked', []);
384
+ });
385
+
386
+ $(getHelper().getDomElementDataIdentifierSelector('buttonStageNewElementBottom')).on('click', function() {
387
+ getPublisherSubscriber().publish(
388
+ 'view/stage/abstract/button/newElement/clicked', [
389
+ 'view/insertElements/perform/bottom'
390
+ ]
391
+ );
392
+ });
393
+
394
+ $(getHelper().getDomElementDataIdentifierSelector('buttonToggleStructure')).on('click', function() {
395
+ $(getHelper().getDomElementDataIdentifierSelector('structureSection')).toggleClass('formeditor-sidebar-expanded');
396
+ });
397
+
398
+ $(getHelper().getDomElementDataIdentifierSelector('buttonToggleInspector')).on('click', function() {
399
+ $(getHelper().getDomElementDataIdentifierSelector('inspectorSection')).toggleClass('formeditor-sidebar-expanded');
400
+ });
401
+
402
+
403
+ $(getHelper().getDomElementDataIdentifierSelector('buttonFormSettings')).on('click', function() {
404
+ getPublisherSubscriber().publish('view/header/formSettings/clicked', []);
405
+ });
406
+
407
+ $(getHelper().getDomElementDataIdentifierSelector('buttonNewPage')).on('click', function() {
408
+ getPublisherSubscriber().publish('view/structure/button/newPage/clicked', ['view/insertPages/perform']);
409
+ });
410
+
411
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderClose')).on('click', function(e) {
412
+ if (!getFormEditorApp().getUnsavedContent()) {
413
+ return;
414
+ }
415
+ e.preventDefault();
416
+ getPublisherSubscriber().publish('view/header/button/close/clicked', []);
417
+ });
418
+
419
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderUndo')).on('click', function() {
420
+ getPublisherSubscriber().publish('view/undoButton/clicked', []);
421
+ });
422
+
423
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderRedo')).on('click', function() {
424
+ getPublisherSubscriber().publish('view/redoButton/clicked', []);
425
+ });
426
+
427
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModeAbstract')).on('click', function() {
428
+ getPublisherSubscriber().publish('view/viewModeButton/abstract/clicked', []);
429
+ });
430
+
431
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModePreview')).on('click', function() {
432
+ getPublisherSubscriber().publish('view/viewModeButton/preview/clicked', []);
433
+ });
434
+
435
+ $(getHelper().getDomElementDataIdentifierSelector('structureRootContainer')).on('click', function() {
436
+ getPublisherSubscriber().publish('view/structure/root/selected');
437
+ });
438
+
439
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderPaginationNext')).on('click', function() {
440
+ getPublisherSubscriber().publish('view/paginationNext/clicked', []);
441
+ });
442
+
443
+ $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderPaginationPrevious')).on('click', function() {
444
+ getPublisherSubscriber().publish('view/paginationPrevious/clicked', []);
445
+ });
446
+ }
447
+
448
+ /* *************************************************************
449
+ * Public Methods
450
+ * ************************************************************/
451
+
452
+ export function getFormEditorApp(): FormEditor {
453
+ return formEditorApp;
454
+ }
455
+
456
+ export function getHelper(_configuration?: HelperConfiguration): typeof Helper {
457
+ if (getUtility().isUndefinedOrNull(_configuration)) {
458
+ return Helper.setConfiguration(configuration);
459
+ }
460
+ return Helper.setConfiguration(_configuration);
461
+ }
462
+
463
+ export function getFormElementDefinition<T extends keyof FormElementDefinition>(
464
+ formElement: FormElement,
465
+ formElementDefinitionKey?: T
466
+ ): T extends keyof FormElementDefinition ? FormElementDefinition[T] : FormElementDefinition {
467
+ return getFormEditorApp().getFormElementDefinition(formElement, formElementDefinitionKey);
468
+ }
469
+
470
+ export function getConfiguration(): Partial<HelperConfiguration> {
471
+ return $.extend(true, {}, configuration);
472
+ }
473
+
474
+ export function getPreviewMode(): boolean {
475
+ return previewMode;
476
+ }
477
+
478
+ export function setPreviewMode(newPreviewMode: boolean): void {
479
+ previewMode = !!newPreviewMode;
480
+ }
481
+
482
+ /* *************************************************************
483
+ * Structure
484
+ * ************************************************************/
485
+
486
+ export function getStructure(): typeof TreeComponent {
487
+ return structureComponent;
488
+ }
489
+
490
+ /**
491
+ * @publish view/structure/renew/postProcess
492
+ */
493
+ export function renewStructure(): void {
494
+ getStructure().renew();
495
+ getPublisherSubscriber().publish('view/structure/renew/postProcess');
496
+ }
497
+
498
+ export function addStructureSelection(formElement?: FormElement): void {
499
+ getStructure().getTreeNode(formElement).addClass(getHelper().getDomElementClassName('selectedFormElement'));
500
+ }
501
+
502
+ /**
503
+ * @todo deprecate, method is unused
504
+ */
505
+ export function removeStructureSelection(formElement?: FormElement): void {
506
+ getStructure().getTreeNode(formElement).removeClass(getHelper().getDomElementClassName('selectedFormElement'));
507
+ }
508
+
509
+ export function removeAllStructureSelections(): void {
510
+ $(getHelper().getDomElementClassName('selectedFormElement', true), getStructure().getTreeDomElement())
511
+ .removeClass(getHelper().getDomElementClassName('selectedFormElement'));
512
+ }
513
+
514
+ export function getStructureRootContainer(): JQuery {
515
+ return $(getHelper().getDomElementDataAttribute('identifier', 'bracesWithKeyValue', [
516
+ getHelper().getDomElementDataAttributeValue('structureRootContainer')
517
+ ]));
518
+ }
519
+
520
+ export function getStructureRootElement(): JQuery {
521
+ return $(getHelper().getDomElementDataAttribute('identifier', 'bracesWithKeyValue', [
522
+ getHelper().getDomElementDataAttributeValue('structureRootElement')
523
+ ]));
524
+ }
525
+
526
+ export function removeStructureRootElementSelection(): void {
527
+ $(getHelper().getDomElementDataAttribute('identifier', 'bracesWithKeyValue', [
528
+ getHelper().getDomElementDataAttributeValue('structureRootContainer')
529
+ ])).removeClass(getHelper().getDomElementClassName('selectedRootFormElement'));
530
+ }
531
+
532
+ export function addStructureRootElementSelection(): void {
533
+ $(getHelper().getDomElementDataAttribute('identifier', 'bracesWithKeyValue', [
534
+ getHelper().getDomElementDataAttributeValue('structureRootContainer')
535
+ ])).addClass(getHelper().getDomElementClassName('selectedRootFormElement'));
536
+ }
537
+
538
+ export function setStructureRootElementTitle(title?: string): void {
539
+ if (getUtility().isUndefinedOrNull(title)) {
540
+ title = $('<span></span>')
541
+ .text((getRootFormElement().get('label') ? getRootFormElement().get('label') : getRootFormElement().get('identifier')))
542
+ .text();
543
+ }
544
+ getStructureRootElement().text(title);
545
+ }
546
+
547
+ export function addStructureValidationResults(): void {
548
+ getStructure().getAllTreeNodes()
549
+ .removeClass(getHelper().getDomElementClassName('validationErrors'))
550
+ .removeClass(getHelper().getDomElementClassName('validationChildHasErrors'));
551
+
552
+ removeElementValidationErrorClass(getStructureRootContainer());
553
+
554
+ const validationResults = getFormEditorApp().validateFormElementRecursive(getRootFormElement());
555
+ for (let i = 0, len = validationResults.length; i < len; ++i) {
556
+ let hasError = false;
557
+ for (let j = 0, len2 = validationResults[i].validationResults.length; j < len2; ++j) {
558
+ if (
559
+ validationResults[i].validationResults[j].validationResults
560
+ && validationResults[i].validationResults[j].validationResults.length > 0
561
+ ) {
562
+ hasError = true;
563
+ break;
564
+ }
565
+ }
566
+
567
+ if (hasError) {
568
+ if (i === 0) {
569
+ setElementValidationErrorClass(getStructureRootContainer());
570
+ } else {
571
+ let validationElement = getStructure().getTreeNode(validationResults[i].formElementIdentifierPath);
572
+ setElementValidationErrorClass(validationElement);
573
+
574
+ const pathParts = validationResults[i].formElementIdentifierPath.split('/');
575
+ while (pathParts.pop()) {
576
+ validationElement = getStructure().getTreeNode(pathParts.join('/'));
577
+ if ('object' === $.type(validationElement)) {
578
+ setElementValidationErrorClass(validationElement, 'validationChildHasErrors');
579
+ }
580
+ }
581
+ }
582
+ }
583
+ }
584
+ }
585
+
586
+ /* *************************************************************
587
+ * Modals
588
+ * ************************************************************/
589
+
590
+ export function getModals(): typeof ModalsComponent {
591
+ return modalsComponent;
592
+ }
593
+
594
+ export function showRemoveFormElementModal(formElement?: FormElement): void {
595
+ if (getUtility().isUndefinedOrNull(formElement)) {
596
+ formElement = getCurrentlySelectedFormElement();
597
+ }
598
+ getModals().showRemoveFormElementModal(formElement);
599
+ }
600
+
601
+ export function showRemoveCollectionElementModal(
602
+ collectionElementIdentifier: string,
603
+ collectionName: keyof FormEditorDefinitions,
604
+ formElement?: FormElement
605
+ ): void {
606
+ if (getUtility().isUndefinedOrNull(formElement)) {
607
+ formElement = getCurrentlySelectedFormElement();
608
+ }
609
+ getModals().showRemoveCollectionElementModal(collectionElementIdentifier, collectionName, formElement);
610
+ }
611
+
612
+ export function showCloseConfirmationModal(): void {
613
+ getModals().showCloseConfirmationModal();
614
+ }
615
+
616
+ export function showInsertElementsModal(
617
+ targetEvent: keyof PublisherSubscriberTopicArgumentsMap,
618
+ configuration: InsertElementsModalConfiguration
619
+ ): void {
620
+ getModals().showInsertElementsModal(targetEvent, configuration);
621
+ }
622
+
623
+ export function showInsertPagesModal(
624
+ targetEvent: keyof PublisherSubscriberTopicArgumentsMap
625
+ ): void {
626
+ getModals().showInsertPagesModal(targetEvent);
627
+ }
628
+
629
+ export function showValidationErrorsModal(): void {
630
+ const validationResults = getFormEditorApp().validateFormElementRecursive(getRootFormElement());
631
+
632
+ getModals().showValidationErrorsModal(validationResults);
633
+ }
634
+
635
+ /* *************************************************************
636
+ * Inspector
637
+ * ************************************************************/
638
+
639
+ export function getInspector(): typeof InspectorComponent {
640
+ return inspectorsComponent;
641
+ }
642
+
643
+ export function renderInspectorEditors(formElement?: FormElement | string, useFadeEffect?: boolean): void {
644
+ if (getUtility().isUndefinedOrNull(useFadeEffect)) {
645
+ useFadeEffect = true;
646
+ }
647
+
648
+ const render = (callback?: () => void): void => {
649
+ getInspector().renderEditors(formElement, callback);
650
+ };
651
+
652
+ if (useFadeEffect) {
653
+ getInspector().getInspectorDomElement().fadeOut('fast', function() {
654
+ render(function() {
655
+ getInspector().getInspectorDomElement().fadeIn('fast');
656
+ });
657
+ });
658
+ } else {
659
+ render();
660
+ }
661
+ }
662
+
663
+ export function showInspectorSidebar(): void {
664
+ // Expand inspector sidebar if expander button is visible
665
+ if (document.querySelector(getHelper().getDomElementDataIdentifierSelector('buttonToggleInspector'))?.getClientRects().length === 1) {
666
+ document.querySelector(getHelper().getDomElementDataIdentifierSelector('inspectorSection')).classList.add('formeditor-sidebar-expanded');
667
+ }
668
+ }
669
+
670
+ export function renderInspectorCollectionElementEditors(
671
+ collectionName: keyof FormEditorDefinitions,
672
+ collectionElementIdentifier: string
673
+ ): void {
674
+ getInspector().renderCollectionElementEditors(collectionName, collectionElementIdentifier);
675
+ }
676
+
677
+ /* *************************************************************
678
+ * Stage
679
+ * ************************************************************/
680
+
681
+ export function getStage(): typeof StageComponent {
682
+ return stageComponent;
683
+ }
684
+
685
+ export function setStageHeadline(title?: string): void {
686
+ getStage().setStageHeadline(title);
687
+ }
688
+
689
+ export function addStagePanelSelection(): void {
690
+ getStage().getStagePanelDomElement().addClass(getHelper().getDomElementClassName('selectedStagePanel'));
691
+ }
692
+
693
+ export function removeStagePanelSelection(): void {
694
+ getStage().getStagePanelDomElement().removeClass(getHelper().getDomElementClassName('selectedStagePanel'));
695
+ }
696
+
697
+ export function renderPagination(): void {
698
+ getStage().renderPagination();
699
+ }
700
+
701
+ export function renderUndoRedo(): void {
702
+ getStage().renderUndoRedo();
703
+ }
704
+
705
+ /**
706
+ * @publish view/stage/abstract/render/postProcess
707
+ * @publish view/stage/abstract/render/preProcess
708
+ */
709
+ export function renderAbstractStageArea(useFadeEffect?: boolean, toolbarUseFadeEffect?: boolean): void {
710
+ if (getUtility().isUndefinedOrNull(useFadeEffect)) {
711
+ useFadeEffect = true;
712
+ }
713
+
714
+ if (getUtility().isUndefinedOrNull(toolbarUseFadeEffect)) {
715
+ toolbarUseFadeEffect = true;
716
+ }
717
+
718
+ setButtonActive($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModeAbstract')));
719
+ removeButtonActive($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModePreview')));
720
+
721
+ $(getHelper().getDomElementDataIdentifierSelector('moduleWrapper'))
722
+ .addClass(getHelper().getDomElementClassName('viewModeAbstract'))
723
+ .removeClass(getHelper().getDomElementClassName('viewModePreview'));
724
+
725
+ const render = (callback: () => void): void => {
726
+ getStage().renderAbstractStageArea(undefined, callback);
727
+ };
728
+
729
+ const renderPostProcess = (): void => {
730
+ const formElementTypeDefinition = getFormElementDefinition(getCurrentlySelectedFormElement(), undefined);
731
+ getStage().getAllFormElementDomElements().hover(function(this: HTMLElement) {
732
+ getStage().getAllFormElementDomElements().parent().removeClass(getHelper().getDomElementClassName('sortableHover'));
733
+ if (
734
+ $(this).parent().hasClass(getHelper().getDomElementClassName('formElementIsComposit'))
735
+ && !$(this).parent().hasClass(getHelper().getDomElementClassName('formElementIsTopLevel'))
736
+ ) {
737
+ $(this).parent().addClass(getHelper().getDomElementClassName('sortableHover'));
738
+ }
739
+ });
740
+
741
+ if (
742
+ formElementTypeDefinition._isTopLevelFormElement
743
+ && !formElementTypeDefinition._isCompositeFormElement
744
+ && !getFormEditorApp().isRootFormElementSelected()
745
+ ) {
746
+ hideComponent($(getHelper().getDomElementDataIdentifierSelector('buttonStageNewElementBottom')));
747
+ hideComponent($(getHelper().getDomElementDataIdentifierSelector('stageNewElementRow')));
748
+ } else {
749
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('buttonStageNewElementBottom')));
750
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('stageNewElementRow')));
751
+ }
752
+
753
+ refreshSelectedElementItemsBatch(toolbarUseFadeEffect);
754
+ getPublisherSubscriber().publish('view/stage/abstract/render/postProcess');
755
+ };
756
+
757
+ if (useFadeEffect) {
758
+ $(getHelper().getDomElementDataIdentifierSelector('stageSection')).fadeOut(400, function() {
759
+ render(function() {
760
+ getPublisherSubscriber().publish('view/stage/abstract/render/preProcess');
761
+ $(getHelper().getDomElementDataIdentifierSelector('stageSection')).fadeIn(400);
762
+ renderPostProcess();
763
+ getPublisherSubscriber().publish('view/stage/abstract/render/postProcess');
764
+ });
765
+ });
766
+ } else {
767
+ render(function() {
768
+ getPublisherSubscriber().publish('view/stage/abstract/render/preProcess');
769
+ renderPostProcess();
770
+ getPublisherSubscriber().publish('view/stage/abstract/render/postProcess');
771
+ });
772
+ }
773
+ }
774
+
775
+ /**
776
+ * @publish view/stage/preview/render/postProcess
777
+ */
778
+ export function renderPreviewStageArea(html: string): void {
779
+ setButtonActive($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModePreview')));
780
+ removeButtonActive($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModeAbstract')));
781
+
782
+ $(getHelper().getDomElementDataIdentifierSelector('moduleWrapper'))
783
+ .addClass(getHelper().getDomElementClassName('viewModePreview'))
784
+ .removeClass(getHelper().getDomElementClassName('viewModeAbstract'));
785
+
786
+ $(getHelper().getDomElementDataIdentifierSelector('stageSection')).fadeOut(400, function() {
787
+ hideComponent($(getHelper().getDomElementDataIdentifierSelector('buttonStageNewElementBottom')));
788
+ getStage().renderPreviewStageArea(html);
789
+ $(getHelper().getDomElementDataIdentifierSelector('stageSection')).fadeIn(400);
790
+ getPublisherSubscriber().publish('view/stage/preview/render/postProcess');
791
+ });
792
+ }
793
+
794
+ export function addAbstractViewValidationResults(): void {
795
+ const validationResults = getFormEditorApp().validateFormElementRecursive(getRootFormElement());
796
+ for (let i = 0, len = validationResults.length; i < len; ++i) {
797
+ let hasError = false;
798
+ for (let j = 0, len2 = validationResults[i].validationResults.length; j < len2; ++j) {
799
+ if (
800
+ validationResults[i].validationResults[j].validationResults
801
+ && validationResults[i].validationResults[j].validationResults.length > 0
802
+ ) {
803
+ hasError = true;
804
+ break;
805
+ }
806
+ }
807
+
808
+ if (hasError) {
809
+ if (i > 0) {
810
+ const validationElement = getStage().getAbstractViewFormElementDomElement(validationResults[i].formElementIdentifierPath);
811
+ setElementValidationErrorClass(validationElement);
812
+ }
813
+ }
814
+ }
815
+ }
816
+
817
+ /* *************************************************************
818
+ * Form element methods
819
+ * ************************************************************/
820
+
821
+ /**
822
+ * @publish view/formElement/inserted
823
+ */
824
+ export function createAndAddFormElement(
825
+ formElementType: string,
826
+ referenceFormElement?: FormElement | string,
827
+ disablePublishersOnSet?: boolean
828
+ ): FormElement {
829
+ const newFormElement = getFormEditorApp().createAndAddFormElement(formElementType, referenceFormElement);
830
+ if (!disablePublishersOnSet) {
831
+ getPublisherSubscriber().publish('view/formElement/inserted', [newFormElement]);
832
+ }
833
+ return newFormElement;
834
+ }
835
+
836
+ /**
837
+ * @publish view/formElement/moved
838
+ */
839
+ export function moveFormElement(
840
+ formElementToMove: FormElement | string,
841
+ position: string,
842
+ referenceFormElement: FormElement | string,
843
+ disablePublishersOnSet?: boolean
844
+ ): FormElement {
845
+ const movedFormElement = getFormEditorApp().moveFormElement(formElementToMove, position, referenceFormElement, false);
846
+ if (!disablePublishersOnSet) {
847
+ getPublisherSubscriber().publish('view/formElement/moved', [movedFormElement]);
848
+ }
849
+ return movedFormElement;
850
+ }
851
+
852
+ /**
853
+ * @publish view/formElement/removed
854
+ */
855
+ export function removeFormElement(formElement: FormElement, disablePublishersOnSet?: boolean): FormElement {
856
+ let parentFormElement;
857
+
858
+ if (getUtility().isUndefinedOrNull(formElement)) {
859
+ formElement = getCurrentlySelectedFormElement();
860
+ }
861
+
862
+ if (
863
+ getFormElementDefinition(formElement, '_isTopLevelFormElement')
864
+ && getFormElementDefinition(formElement, '_isCompositeFormElement')
865
+ && getRootFormElement().get('renderables').length === 1
866
+ ) {
867
+ Notification.error(
868
+ getFormElementDefinition(getRootFormElement(), 'modalRemoveElementLastAvailablePageFlashMessageTitle'),
869
+ getFormElementDefinition(getRootFormElement(), 'modalRemoveElementLastAvailablePageFlashMessageMessage'),
870
+ 2
871
+ );
872
+ } else {
873
+ parentFormElement = getFormEditorApp().removeFormElement(formElement, false);
874
+ if (!disablePublishersOnSet) {
875
+ getPublisherSubscriber().publish('view/formElement/removed', [parentFormElement]);
876
+ }
877
+ }
878
+ return parentFormElement;
879
+ }
880
+
881
+ /**
882
+ * @publish view/collectionElement/new/added
883
+ */
884
+ export function createAndAddPropertyCollectionElement(
885
+ collectionElementIdentifier: string,
886
+ collectionName: keyof FormEditorDefinitions,
887
+ formElement?: FormElement,
888
+ collectionElementConfiguration?: CollectionElementConfiguration,
889
+ referenceCollectionElementIdentifier?: string,
890
+ disablePublishersOnSet?: boolean
891
+ ): void {
892
+ getFormEditorApp().createAndAddPropertyCollectionElement(
893
+ collectionElementIdentifier,
894
+ collectionName,
895
+ formElement,
896
+ collectionElementConfiguration,
897
+ referenceCollectionElementIdentifier
898
+ );
899
+ if (!disablePublishersOnSet) {
900
+ getPublisherSubscriber().publish('view/collectionElement/new/added', [
901
+ collectionElementIdentifier,
902
+ collectionName,
903
+ formElement,
904
+ collectionElementConfiguration,
905
+ referenceCollectionElementIdentifier
906
+ ]);
907
+ }
908
+ }
909
+
910
+ export function movePropertyCollectionElement(
911
+ collectionElementToMove: string,
912
+ position: string,
913
+ referenceCollectionElement: string,
914
+ collectionName: keyof FormEditorDefinitions,
915
+ formElement?: FormElement,
916
+ disablePublishersOnSet?: boolean
917
+ ): void {
918
+ if (getUtility().isUndefinedOrNull(formElement)) {
919
+ formElement = getCurrentlySelectedFormElement();
920
+ }
921
+ getFormEditorApp().movePropertyCollectionElement(
922
+ collectionElementToMove,
923
+ position,
924
+ referenceCollectionElement,
925
+ collectionName,
926
+ formElement,
927
+ false
928
+ );
929
+ if (!disablePublishersOnSet) {
930
+ getPublisherSubscriber().publish('view/collectionElement/moved', [
931
+ collectionElementToMove,
932
+ position,
933
+ referenceCollectionElement,
934
+ collectionName,
935
+ formElement
936
+ ]);
937
+ }
938
+ }
939
+
940
+ /**
941
+ * @publish view/collectionElement/removed
942
+ */
943
+ export function removePropertyCollectionElement(
944
+ collectionElementIdentifier: string,
945
+ collectionName: keyof FormEditorDefinitions,
946
+ formElement?: FormElement,
947
+ disablePublishersOnSet?: boolean
948
+ ): void {
949
+ let propertyData, propertyPath;
950
+
951
+ getFormEditorApp().removePropertyCollectionElement(collectionElementIdentifier, collectionName, formElement);
952
+
953
+ const collectionElementConfiguration = getFormEditorApp().getPropertyCollectionElementConfiguration(
954
+ collectionElementIdentifier,
955
+ collectionName
956
+ );
957
+ if ('array' === $.type(collectionElementConfiguration.editors)) {
958
+ for (let i = 0, len1 = collectionElementConfiguration.editors.length; i < len1; ++i) {
959
+ if ('array' === $.type(collectionElementConfiguration.editors[i].additionalElementPropertyPaths)) {
960
+ for (let j = 0, len2 = collectionElementConfiguration.editors[i].additionalElementPropertyPaths.length; j < len2; ++j) {
961
+ getCurrentlySelectedFormElement().unset(collectionElementConfiguration.editors[i].additionalElementPropertyPaths[j], true);
962
+ }
963
+ } else if (collectionElementConfiguration.editors[i].identifier === 'validationErrorMessage') {
964
+ propertyPath = getFormEditorApp().buildPropertyPath(
965
+ collectionElementConfiguration.editors[i].propertyPath
966
+ );
967
+ propertyData = getCurrentlySelectedFormElement().get(propertyPath);
968
+ if (!getUtility().isUndefinedOrNull(propertyData)) {
969
+ for (let j = 0, len2 = collectionElementConfiguration.editors[i].errorCodes.length; j < len2; ++j) {
970
+ for (let k = 0, len3 = propertyData.length; k < len3; ++k) {
971
+ if (parseInt(collectionElementConfiguration.editors[i].errorCodes[j], 10) === parseInt(propertyData[k].code, 10)) {
972
+ propertyData.splice(k, 1);
973
+ --len3;
974
+ }
975
+ }
976
+ }
977
+ getCurrentlySelectedFormElement().set(propertyPath, propertyData);
978
+ }
979
+ }
980
+ }
981
+ }
982
+
983
+ if (!disablePublishersOnSet) {
984
+ getPublisherSubscriber().publish('view/collectionElement/removed', [
985
+ collectionElementIdentifier,
986
+ collectionName,
987
+ formElement
988
+ ]);
989
+ }
990
+ }
991
+
992
+ /* *************************************************************
993
+ * Batch methods
994
+ * ************************************************************/
995
+
996
+ export function refreshSelectedElementItemsBatch(toolbarUseFadeEffect?: boolean): void {
997
+ if (getUtility().isUndefinedOrNull(toolbarUseFadeEffect)) {
998
+ toolbarUseFadeEffect = true;
999
+ }
1000
+
1001
+ const formElementTypeDefinition = getFormElementDefinition(getCurrentlySelectedFormElement(), undefined);
1002
+
1003
+ getStage().removeAllStageToolbars();
1004
+ removeAllStageElementSelectionsBatch();
1005
+ removeAllStructureSelections();
1006
+
1007
+ if (!getFormEditorApp().isRootFormElementSelected()) {
1008
+ removeStructureRootElementSelection();
1009
+ addStructureSelection();
1010
+
1011
+ const selectedElement = getStage().getAbstractViewFormElementDomElement();
1012
+
1013
+ if (formElementTypeDefinition._isTopLevelFormElement) {
1014
+ addStagePanelSelection();
1015
+ } else {
1016
+ selectedElement.addClass(getHelper().getDomElementClassName('selectedFormElement'));
1017
+ getStage().createAndAddAbstractViewFormElementToolbar(selectedElement, undefined, toolbarUseFadeEffect);
1018
+ }
1019
+
1020
+ getStage().getAllFormElementDomElements().parent().removeClass(getHelper().getDomElementClassName('selectedCompositFormElement'));
1021
+ if (!formElementTypeDefinition._isTopLevelFormElement && formElementTypeDefinition._isCompositeFormElement) {
1022
+ selectedElement.parent().addClass(getHelper().getDomElementClassName('selectedCompositFormElement'));
1023
+ }
1024
+ }
1025
+ }
1026
+
1027
+ /**
1028
+ * @throws 1478651732
1029
+ * @throws 1478651733
1030
+ * @throws 1478651734
1031
+ */
1032
+ export function selectPageBatch(pageIndex: number): void {
1033
+ assert('number' === $.type(pageIndex), 'Invalid parameter "pageIndex"', 1478651732);
1034
+ assert(pageIndex >= 0, 'Invalid parameter "pageIndex"', 1478651733);
1035
+ assert(pageIndex < getRootFormElement().get('renderables').length, 'Invalid parameter "pageIndex"', 1478651734);
1036
+
1037
+ getFormEditorApp().setCurrentlySelectedFormElement(getRootFormElement().get('renderables')[pageIndex]);
1038
+ renewStructure();
1039
+ renderPagination();
1040
+ refreshSelectedElementItemsBatch();
1041
+ renderInspectorEditors();
1042
+ }
1043
+
1044
+ export function removeAllStageElementSelectionsBatch(): void {
1045
+ getStage().getAllFormElementDomElements().removeClass(getHelper().getDomElementClassName('selectedFormElement'));
1046
+ removeStagePanelSelection();
1047
+ getStage().getAllFormElementDomElements().parent().removeClass(getHelper().getDomElementClassName('sortableHover'));
1048
+ }
1049
+
1050
+ export function onViewReadyBatch(): void {
1051
+ hideComponent($(getHelper().getDomElementDataIdentifierSelector('buttonStageNewElementBottom')));
1052
+ hideComponent($(getHelper().getDomElementDataIdentifierSelector('stageNewElementRow')));
1053
+
1054
+ setStageHeadline();
1055
+ setStructureRootElementTitle();
1056
+ renderAbstractStageArea(false);
1057
+ renewStructure();
1058
+ addStructureRootElementSelection();
1059
+ renderInspectorEditors();
1060
+ renderPagination();
1061
+
1062
+ hideComponent($(getHelper().getDomElementDataIdentifierSelector('moduleLoadingIndicator')));
1063
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('moduleWrapper')));
1064
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderSave')));
1065
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderClose')));
1066
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderUndo')));
1067
+ showComponent($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderRedo')));
1068
+ setButtonActive($(getHelper().getDomElementDataIdentifierSelector('buttonHeaderViewModeAbstract')));
1069
+ }
1070
+
1071
+ export function onAbstractViewDndStartBatch(
1072
+ draggedFormElementDomElement: HTMLElement | JQuery,
1073
+ draggedFormPlaceholderDomElement: HTMLElement | JQuery
1074
+ ): void {
1075
+ $(draggedFormPlaceholderDomElement).removeClass(getHelper().getDomElementClassName('sortableHover'));
1076
+ }
1077
+
1078
+ export function onAbstractViewDndChangeBatch(
1079
+ placeholderDomElement: HTMLElement | JQuery,
1080
+ parentFormElementIdentifierPath: string,
1081
+ enclosingCompositeFormElement?: FormElement | string
1082
+ ): void {
1083
+ getStage().getAllFormElementDomElements().parent().removeClass(getHelper().getDomElementClassName('sortableHover'));
1084
+ if (enclosingCompositeFormElement) {
1085
+ getStage().getAbstractViewParentFormElementWithinDomElement(placeholderDomElement).parent().addClass(getHelper().getDomElementClassName('sortableHover'));
1086
+ }
1087
+ }
1088
+
1089
+ /**
1090
+ * @throws 1472502237
1091
+ */
1092
+ export function onAbstractViewDndUpdateBatch(
1093
+ movedDomElement: HTMLElement | JQuery,
1094
+ movedFormElementIdentifierPath: string,
1095
+ previousFormElementIdentifierPath: string,
1096
+ nextFormElementIdentifierPath: string
1097
+ ): void {
1098
+ let movedFormElement, parentFormElementIdentifierPath;
1099
+ if (nextFormElementIdentifierPath) {
1100
+ movedFormElement = moveFormElement(movedFormElementIdentifierPath, 'before', nextFormElementIdentifierPath);
1101
+ } else if (previousFormElementIdentifierPath) {
1102
+ movedFormElement = moveFormElement(movedFormElementIdentifierPath, 'after', previousFormElementIdentifierPath);
1103
+ } else {
1104
+ parentFormElementIdentifierPath = getStage().getAbstractViewParentFormElementIdentifierPathWithinDomElement(movedDomElement);
1105
+ if (parentFormElementIdentifierPath) {
1106
+ movedFormElement = moveFormElement(movedFormElementIdentifierPath, 'inside', parentFormElementIdentifierPath);
1107
+ } else {
1108
+ assert(false, 'Next element, previous or parent element need to be set.', 1472502237);
1109
+ }
1110
+ }
1111
+
1112
+ getStage()
1113
+ .getAbstractViewFormElementWithinDomElement(movedDomElement)
1114
+ .attr(
1115
+ getHelper().getDomElementDataAttribute('elementIdentifier'),
1116
+ movedFormElement.get('__identifierPath')
1117
+ );
1118
+ }
1119
+
1120
+ export function onStructureDndChangeBatch(
1121
+ placeholderDomElement: HTMLElement | JQuery,
1122
+ parentFormElementIdentifierPath: string,
1123
+ enclosingCompositeFormElement?: FormElement | string
1124
+ ): void {
1125
+ getStructure()
1126
+ .getAllTreeNodes()
1127
+ .parent()
1128
+ .removeClass(getHelper().getDomElementClassName('sortableHover'));
1129
+
1130
+ getStage()
1131
+ .getAllFormElementDomElements()
1132
+ .parent()
1133
+ .removeClass(getHelper().getDomElementClassName('sortableHover'));
1134
+
1135
+ if (enclosingCompositeFormElement) {
1136
+ getStructure()
1137
+ .getParentTreeNodeWithinDomElement(placeholderDomElement)
1138
+ .parent()
1139
+ .addClass(getHelper().getDomElementClassName('sortableHover'));
1140
+
1141
+ getStage()
1142
+ .getAbstractViewFormElementDomElement(enclosingCompositeFormElement)
1143
+ .parent()
1144
+ .addClass(getHelper().getDomElementClassName('sortableHover'));
1145
+ }
1146
+ }
1147
+
1148
+ /**
1149
+ * @throws 1479048646
1150
+ */
1151
+ export function onStructureDndUpdateBatch(
1152
+ movedDomElement: HTMLElement | JQuery,
1153
+ movedFormElementIdentifierPath: string,
1154
+ previousFormElementIdentifierPath: string,
1155
+ nextFormElementIdentifierPath: string
1156
+ ): void {
1157
+ let movedFormElement, parentFormElementIdentifierPath;
1158
+ if (nextFormElementIdentifierPath) {
1159
+ movedFormElement = moveFormElement(movedFormElementIdentifierPath, 'before', nextFormElementIdentifierPath);
1160
+ } else if (previousFormElementIdentifierPath) {
1161
+ movedFormElement = moveFormElement(movedFormElementIdentifierPath, 'after', previousFormElementIdentifierPath);
1162
+ } else {
1163
+ parentFormElementIdentifierPath = getStructure().getParentTreeNodeIdentifierPathWithinDomElement(movedDomElement);
1164
+ if (parentFormElementIdentifierPath) {
1165
+ movedFormElement = moveFormElement(movedFormElementIdentifierPath, 'inside', parentFormElementIdentifierPath);
1166
+ } else {
1167
+ getFormEditorApp().assert(false, 'Next element, previous or parent element need to be set.', 1479048646);
1168
+ }
1169
+ }
1170
+
1171
+ getStructure()
1172
+ .getTreeNodeWithinDomElement(movedDomElement)
1173
+ .attr(
1174
+ getHelper().getDomElementDataAttribute('elementIdentifier'),
1175
+ movedFormElement.get('__identifierPath')
1176
+ );
1177
+ }
1178
+
1179
+ /* *************************************************************
1180
+ * Misc
1181
+ * ************************************************************/
1182
+
1183
+ export function closeEditor(): void {
1184
+ document.location.href = $(getHelper().getDomElementDataIdentifierSelector('buttonHeaderClose')).prop('href');
1185
+ }
1186
+
1187
+ export function setElementValidationErrorClass(element: JQuery, classIdentifier?: string): void {
1188
+ if (getFormEditorApp().getUtility().isUndefinedOrNull(classIdentifier)) {
1189
+ element.addClass(getHelper().getDomElementClassName('validationErrors'));
1190
+ } else {
1191
+ element.addClass(getHelper().getDomElementClassName(classIdentifier));
1192
+ }
1193
+ }
1194
+
1195
+ export function removeElementValidationErrorClass(element: JQuery, classIdentifier?: string): void {
1196
+ if (getFormEditorApp().getUtility().isUndefinedOrNull(classIdentifier)) {
1197
+ element.removeClass(getHelper().getDomElementClassName('validationErrors'));
1198
+ } else {
1199
+ element.removeClass(getHelper().getDomElementClassName(classIdentifier));
1200
+ }
1201
+ }
1202
+
1203
+ export function showComponent(element: JQuery): void {
1204
+ element.removeClass(getHelper().getDomElementClassName('hidden')).show();
1205
+ }
1206
+
1207
+ export function hideComponent(element: JQuery): void {
1208
+ element.addClass(getHelper().getDomElementClassName('hidden')).hide();
1209
+ }
1210
+
1211
+ export function enableButton(buttonElement: JQuery): void {
1212
+ buttonElement.prop('disabled', false).removeClass(getHelper().getDomElementClassName('disabled'));
1213
+ }
1214
+
1215
+ export function disableButton(buttonElement: JQuery): void {
1216
+ buttonElement.prop('disabled', 'disabled').addClass(getHelper().getDomElementClassName('disabled'));
1217
+ }
1218
+
1219
+ export function setButtonActive(buttonElement: JQuery): void {
1220
+ buttonElement.addClass(getHelper().getDomElementClassName('active'));
1221
+ }
1222
+
1223
+ export function removeButtonActive(buttonElement: JQuery): void {
1224
+ buttonElement.removeClass(getHelper().getDomElementClassName('active'));
1225
+ }
1226
+
1227
+ export function showSaveButtonSpinnerIcon(): void {
1228
+ Icons.getIcon(getHelper().getDomElementDataAttributeValue('iconSaveSpinner'), Icons.sizes.small).then(function(markup) {
1229
+ $(getHelper().getDomElementDataIdentifierSelector('iconSave')).replaceWith($(markup));
1230
+ });
1231
+ }
1232
+
1233
+ export function showSaveButtonSaveIcon(): void {
1234
+ Icons.getIcon(getHelper().getDomElementDataAttributeValue('iconSave'), Icons.sizes.small).then(function(markup) {
1235
+ $(getHelper().getDomElementDataIdentifierSelector('iconSaveSpinner')).replaceWith($(markup));
1236
+ });
1237
+ }
1238
+
1239
+ export function showSaveSuccessMessage(): void {
1240
+ Notification.success(
1241
+ getFormElementDefinition(getRootFormElement(), 'saveSuccessFlashMessageTitle'),
1242
+ getFormElementDefinition(getRootFormElement(), 'saveSuccessFlashMessageMessage'),
1243
+ 2
1244
+ );
1245
+ }
1246
+
1247
+ export function showSaveErrorMessage(response: { message: string }): void {
1248
+ Notification.error(
1249
+ getFormElementDefinition(getRootFormElement(), 'saveErrorFlashMessageTitle'),
1250
+ getFormElementDefinition(getRootFormElement(), 'saveErrorFlashMessageMessage') +
1251
+ ' ' +
1252
+ response.message
1253
+ );
1254
+ }
1255
+
1256
+ export function showErrorFlashMessage(title: string, message: string): void {
1257
+ Notification.error(title, message, 2);
1258
+ }
1259
+
1260
+ export function bootstrap(_formEditorApp: FormEditor, additionalViewModelModules: AdditionalViewModelModules): void {
1261
+ formEditorApp = _formEditorApp;
1262
+
1263
+ Helper.bootstrap(formEditorApp);
1264
+ structureComponentSetup();
1265
+ modalsComponentSetup();
1266
+ inspectorsComponentSetup();
1267
+ stageComponentSetup();
1268
+ buttonsSetup();
1269
+ addPropertyValidators();
1270
+ loadAdditionalModules(additionalViewModelModules);
1271
+ }
1272
+
1273
+ declare global {
1274
+ interface PublisherSubscriberTopicArgumentsMap {
1275
+ 'view/collectionElement/new/added': readonly [
1276
+ collectionElementIdentifier: string,
1277
+ collectionName: keyof FormEditorDefinitions,
1278
+ formElement: FormElement,
1279
+ collectionElementConfiguration: CollectionElementConfiguration,
1280
+ referenceCollectionElementIdentifier: string
1281
+ ];
1282
+ 'view/collectionElement/moved': readonly [
1283
+ collectionElementToMove: string,
1284
+ position: string,
1285
+ referenceCollectionElement: string,
1286
+ collectionName: keyof FormEditorDefinitions,
1287
+ formElement: FormElement
1288
+ ];
1289
+ 'view/collectionElement/removed': readonly [
1290
+ collectionElementIdentifier: string,
1291
+ collectionName: keyof FormEditorDefinitions,
1292
+ formElement: FormElement
1293
+ ];
1294
+ 'view/formElement/inserted': [
1295
+ newFormElement: FormElement
1296
+ ];
1297
+ 'view/formElement/moved': readonly [
1298
+ movedFormElement: FormElement
1299
+ ];
1300
+ 'view/formElement/removed': readonly [
1301
+ parentFormElement: FormElement
1302
+ ];
1303
+ 'view/header/button/save/clicked': readonly [];
1304
+ 'view/header/button/close/clicked': readonly [];
1305
+ 'view/header/button/newPage/clicked': readonly [
1306
+ targetEvent: 'view/insertPages/perform'
1307
+ ];
1308
+ 'view/header/formSettings/clicked': readonly [];
1309
+ // triggered by 'view/stage/abstract/button/newElement/clicked'
1310
+ // ModalComponent.insertElementsModalSetup()
1311
+ 'view/insertElements/perform/bottom': readonly [
1312
+ formElementType: string,
1313
+ ];
1314
+ // triggered by 'view/header/button/newPage/clicked' via
1315
+ // ModalComponent.insertElementsModalSetup()
1316
+ 'view/insertPages/perform': readonly [
1317
+ formElementType: string,
1318
+ ];
1319
+ 'view/paginationNext/clicked': readonly [];
1320
+ 'view/paginationPrevious/clicked': readonly [];
1321
+ 'view/ready': undefined;
1322
+ 'view/redoButton/clicked': readonly [];
1323
+ 'view/stage/abstract/button/newElement/clicked': readonly [
1324
+ targetEvent: 'view/insertElements/perform/bottom',
1325
+ // @todo modalConfiguration is never published, but used by
1326
+ // mediator in subscribe('view/stage/abstract/button/newElement/clicked', …)
1327
+ // Can this be removed or is it possibly used by extensions?
1328
+ modalConfiguration?: InsertElementsModalConfiguration
1329
+ ];
1330
+ 'view/stage/abstract/render/postProcess': undefined,
1331
+ 'view/stage/abstract/render/preProcess': undefined,
1332
+ 'view/stage/panel/clicked': readonly [];
1333
+ 'view/stage/preview/render/postProcess': undefined;
1334
+ 'view/structure/button/newPage/clicked': readonly [
1335
+ targetEvent: 'view/insertPages/perform'
1336
+ ];
1337
+ 'view/structure/renew/postProcess': undefined;
1338
+ 'view/structure/root/selected': undefined;
1339
+ 'view/undoButton/clicked': readonly [];
1340
+ 'view/viewModeButton/abstract/clicked': readonly [];
1341
+ 'view/viewModeButton/preview/clicked': readonly [];
1342
+ }
1343
+ }