@webiny/app-admin 0.0.0-unstable.b14eaecf38 → 0.0.0-unstable.b6d7105cee

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 (2264) hide show
  1. package/README.md +7 -17
  2. package/assets/icons/add-18px.js +20 -0
  3. package/assets/icons/add-18px.js.map +1 -0
  4. package/assets/icons/arrow_drop_down-24px.js +20 -0
  5. package/assets/icons/arrow_drop_down-24px.js.map +1 -0
  6. package/assets/icons/attach_file_black_24dp.js +20 -0
  7. package/assets/icons/attach_file_black_24dp.js.map +1 -0
  8. package/assets/icons/baseline-menu-24px.js +20 -0
  9. package/assets/icons/baseline-menu-24px.js.map +1 -0
  10. package/assets/icons/baseline-notification_important-24px.js +19 -0
  11. package/assets/icons/baseline-notification_important-24px.js.map +1 -0
  12. package/assets/icons/baseline-security-24px.js +19 -0
  13. package/assets/icons/baseline-security-24px.js.map +1 -0
  14. package/assets/icons/file_download.js +19 -0
  15. package/assets/icons/file_download.js.map +1 -0
  16. package/assets/icons/file_download.svg +1 -0
  17. package/assets/icons/file_upload.js +19 -0
  18. package/assets/icons/file_upload.js.map +1 -0
  19. package/assets/icons/file_upload.svg +1 -0
  20. package/assets/icons/filter-24px.js +23 -0
  21. package/assets/icons/filter-24px.js.map +1 -0
  22. package/assets/icons/github-brands.js +19 -0
  23. package/assets/icons/github-brands.js.map +1 -0
  24. package/assets/icons/highlight-24px.js +19 -0
  25. package/assets/icons/highlight-24px.js.map +1 -0
  26. package/assets/icons/icon-community.js +18 -0
  27. package/assets/icons/icon-community.js.map +1 -0
  28. package/assets/icons/icon-documentation.js +18 -0
  29. package/assets/icons/icon-documentation.js.map +1 -0
  30. package/assets/icons/info.js +19 -0
  31. package/assets/icons/info.js.map +1 -0
  32. package/assets/icons/insert_drive_file-24px.js +19 -0
  33. package/assets/icons/insert_drive_file-24px.js.map +1 -0
  34. package/assets/icons/insert_photo-24px.js +19 -0
  35. package/assets/icons/insert_photo-24px.js.map +1 -0
  36. package/assets/icons/label-24px.js +19 -0
  37. package/assets/icons/label-24px.js.map +1 -0
  38. package/assets/icons/round-account_circle-24px.js +19 -0
  39. package/assets/icons/round-account_circle-24px.js.map +1 -0
  40. package/assets/icons/round-add-24px.js +20 -0
  41. package/assets/icons/round-add-24px.js.map +1 -0
  42. package/assets/icons/round-arrow_drop_down-24px.js +19 -0
  43. package/assets/icons/round-arrow_drop_down-24px.js.map +1 -0
  44. package/assets/icons/round-chevron_right-24px.js +20 -0
  45. package/assets/icons/round-chevron_right-24px.js.map +1 -0
  46. package/assets/icons/round-feedback-24px.js +20 -0
  47. package/assets/icons/round-feedback-24px.js.map +1 -0
  48. package/assets/icons/round-help-24px.js +19 -0
  49. package/assets/icons/round-help-24px.js.map +1 -0
  50. package/assets/icons/round-invert_colors-24px.js +20 -0
  51. package/assets/icons/round-invert_colors-24px.js.map +1 -0
  52. package/assets/icons/round-keyboard_arrow_down-24px.js +17 -0
  53. package/assets/icons/round-keyboard_arrow_down-24px.js.map +1 -0
  54. package/assets/icons/round-keyboard_arrow_up-24px.js +17 -0
  55. package/assets/icons/round-keyboard_arrow_up-24px.js.map +1 -0
  56. package/assets/icons/round-lock_open-24px.js +22 -0
  57. package/assets/icons/round-lock_open-24px.js.map +1 -0
  58. package/assets/icons/round-more_vert-24px.js +20 -0
  59. package/assets/icons/round-more_vert-24px.js.map +1 -0
  60. package/assets/icons/round-open_in_new-24px.js +20 -0
  61. package/assets/icons/round-open_in_new-24px.js.map +1 -0
  62. package/assets/icons/round-settings-24px.js +20 -0
  63. package/assets/icons/round-settings-24px.js.map +1 -0
  64. package/assets/icons/search-24px.js +21 -0
  65. package/assets/icons/search-24px.js.map +1 -0
  66. package/assets/icons/slack-logo.js +14 -0
  67. package/assets/icons/slack-logo.js.map +1 -0
  68. package/assets/icons/today-24px.js +19 -0
  69. package/assets/icons/today-24px.js.map +1 -0
  70. package/assets/icons/touch_app.js +20 -0
  71. package/assets/icons/touch_app.js.map +1 -0
  72. package/assets/images/webiny-logo.js +34 -0
  73. package/assets/images/webiny-logo.js.map +1 -0
  74. package/assets/images/webiny-orange-logo.js +34 -0
  75. package/assets/images/webiny-orange-logo.js.map +1 -0
  76. package/base/Admin.d.ts +5 -2
  77. package/base/Admin.js +65 -40
  78. package/base/Admin.js.map +1 -1
  79. package/base/Base/DefaultFieldRenderers.d.ts +2 -0
  80. package/base/Base/DefaultFieldRenderers.js +137 -0
  81. package/base/Base/DefaultFieldRenderers.js.map +1 -0
  82. package/base/Base/DefaultLayoutRenderers.d.ts +2 -0
  83. package/base/Base/DefaultLayoutRenderers.js +14 -0
  84. package/base/Base/DefaultLayoutRenderers.js.map +1 -0
  85. package/base/Base/FieldRenderers/ApiKeyTokenRenderer.d.ts +4 -0
  86. package/base/Base/FieldRenderers/ApiKeyTokenRenderer.js +26 -0
  87. package/base/Base/FieldRenderers/ApiKeyTokenRenderer.js.map +1 -0
  88. package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
  89. package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
  90. package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
  91. package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
  92. package/base/Base/FieldRenderers/CodeEditorRenderer.js +14 -0
  93. package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
  94. package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
  95. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +70 -0
  96. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
  97. package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
  98. package/base/Base/FieldRenderers/DateTimeRenderer.js +45 -0
  99. package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
  100. package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +13 -0
  101. package/base/Base/FieldRenderers/FilePickerRenderer.js +46 -0
  102. package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
  103. package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
  104. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +21 -0
  105. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
  106. package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
  107. package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
  108. package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
  109. package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
  110. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
  111. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
  112. package/base/Base/FieldRenderers/InputRenderer.d.ts +12 -0
  113. package/base/Base/FieldRenderers/InputRenderer.js +20 -0
  114. package/base/Base/FieldRenderers/InputRenderer.js.map +1 -0
  115. package/base/Base/FieldRenderers/LexicalEditorsRenderer.d.ts +14 -0
  116. package/base/Base/FieldRenderers/LexicalEditorsRenderer.js +78 -0
  117. package/base/Base/FieldRenderers/LexicalEditorsRenderer.js.map +1 -0
  118. package/base/Base/FieldRenderers/LexicalRenderer.d.ts +12 -0
  119. package/base/Base/FieldRenderers/LexicalRenderer.js +48 -0
  120. package/base/Base/FieldRenderers/LexicalRenderer.js.map +1 -0
  121. package/base/Base/FieldRenderers/MultiAutoCompleteRenderer.d.ts +13 -0
  122. package/base/Base/FieldRenderers/MultiAutoCompleteRenderer.js +29 -0
  123. package/base/Base/FieldRenderers/MultiAutoCompleteRenderer.js.map +1 -0
  124. package/base/Base/FieldRenderers/MultiFilePickerRenderer.d.ts +13 -0
  125. package/base/Base/FieldRenderers/MultiFilePickerRenderer.js +73 -0
  126. package/base/Base/FieldRenderers/MultiFilePickerRenderer.js.map +1 -0
  127. package/base/Base/FieldRenderers/MultiSelectRenderer.d.ts +15 -0
  128. package/base/Base/FieldRenderers/MultiSelectRenderer.js +31 -0
  129. package/base/Base/FieldRenderers/MultiSelectRenderer.js.map +1 -0
  130. package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
  131. package/base/Base/FieldRenderers/NumberInputRenderer.js +21 -0
  132. package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
  133. package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
  134. package/base/Base/FieldRenderers/NumberInputsRenderer.js +60 -0
  135. package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
  136. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +16 -0
  137. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
  138. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
  139. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
  140. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +60 -0
  141. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
  142. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.d.ts +11 -0
  143. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +189 -0
  144. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -0
  145. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZonePresenter.d.ts +13 -0
  146. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZonePresenter.js +28 -0
  147. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZonePresenter.js.map +1 -0
  148. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/abstractions.d.ts +15 -0
  149. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/abstractions.js +5 -0
  150. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/abstractions.js.map +1 -0
  151. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.d.ts +1 -0
  152. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js +11 -0
  153. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js.map +1 -0
  154. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/index.d.ts +2 -0
  155. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/index.js +2 -0
  156. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +18 -0
  157. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +66 -0
  158. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
  159. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +27 -0
  160. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +102 -0
  161. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -0
  162. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +17 -0
  163. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +44 -0
  164. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -0
  165. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +11 -0
  166. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +103 -0
  167. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
  168. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
  169. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +68 -0
  170. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
  171. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.d.ts +5 -0
  172. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js +28 -0
  173. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js.map +1 -0
  174. package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +12 -0
  175. package/base/Base/FieldRenderers/PassthroughRenderer.js +12 -0
  176. package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -0
  177. package/base/Base/FieldRenderers/PasswordInputRenderer.d.ts +12 -0
  178. package/base/Base/FieldRenderers/PasswordInputRenderer.js +22 -0
  179. package/base/Base/FieldRenderers/PasswordInputRenderer.js.map +1 -0
  180. package/base/Base/FieldRenderers/PermissionsRenderer.d.ts +14 -0
  181. package/base/Base/FieldRenderers/PermissionsRenderer.js +18 -0
  182. package/base/Base/FieldRenderers/PermissionsRenderer.js.map +1 -0
  183. package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
  184. package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
  185. package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
  186. package/base/Base/FieldRenderers/RolesMultiSelectRenderer.d.ts +12 -0
  187. package/base/Base/FieldRenderers/RolesMultiSelectRenderer.js +21 -0
  188. package/base/Base/FieldRenderers/RolesMultiSelectRenderer.js.map +1 -0
  189. package/base/Base/FieldRenderers/SelectRenderer.d.ts +19 -0
  190. package/base/Base/FieldRenderers/SelectRenderer.js +29 -0
  191. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -0
  192. package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
  193. package/base/Base/FieldRenderers/SwitchRenderer.js +16 -0
  194. package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
  195. package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
  196. package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
  197. package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
  198. package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
  199. package/base/Base/FieldRenderers/TextInputsRenderer.js +59 -0
  200. package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
  201. package/base/Base/FieldRenderers/TextareaRenderer.d.ts +14 -0
  202. package/base/Base/FieldRenderers/TextareaRenderer.js +21 -0
  203. package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -0
  204. package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
  205. package/base/Base/FieldRenderers/TextareasRenderer.js +56 -0
  206. package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
  207. package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +5 -0
  208. package/base/Base/FieldRenderers/VerticalTabsRenderer.js +40 -0
  209. package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -0
  210. package/base/Base/LexicalPreset.d.ts +2 -0
  211. package/base/Base/LexicalPreset.js +63 -0
  212. package/base/Base/LexicalPreset.js.map +1 -0
  213. package/base/Base/Menus/SupportMenuItems.d.ts +2 -0
  214. package/base/Base/Menus/SupportMenuItems.js +14 -0
  215. package/base/Base/Menus/SupportMenuItems.js.map +1 -0
  216. package/base/Base/Menus/WebinyVersion.d.ts +2 -0
  217. package/base/Base/Menus/WebinyVersion.js +23 -0
  218. package/base/Base/Menus/WebinyVersion.js.map +1 -0
  219. package/base/Base/Menus.d.ts +2 -0
  220. package/base/Base/Menus.js +58 -0
  221. package/base/Base/Menus.js.map +1 -0
  222. package/base/Base/RoutesConfig.d.ts +2 -0
  223. package/base/Base/RoutesConfig.js +28 -0
  224. package/base/Base/RoutesConfig.js.map +1 -0
  225. package/base/Base/Tenant/wby-horizontal.js +33 -0
  226. package/base/Base/Tenant/wby-horizontal.js.map +1 -0
  227. package/base/Base/Tenant/wby-horizontal.svg +23 -0
  228. package/base/Base/Tenant/wby-square.js +20 -0
  229. package/base/Base/Tenant/wby-square.js.map +1 -0
  230. package/base/Base/Tenant/wby-square.svg +3 -0
  231. package/base/Base/Tenant.d.ts +2 -0
  232. package/base/Base/Tenant.js +22 -0
  233. package/base/Base/Tenant.js.map +1 -0
  234. package/base/Base/UserMenu/ExitTenant.d.ts +20 -0
  235. package/base/Base/UserMenu/ExitTenant.js +26 -0
  236. package/base/Base/UserMenu/ExitTenant.js.map +1 -0
  237. package/base/Base/UserMenu/SignOut.d.ts +2 -0
  238. package/base/Base/UserMenu/SignOut.js +18 -0
  239. package/base/Base/UserMenu/SignOut.js.map +1 -0
  240. package/base/Base/UserMenu/UserInfo.d.ts +6 -0
  241. package/base/Base/UserMenu/UserInfo.js +30 -0
  242. package/base/Base/UserMenu/UserInfo.js.map +1 -0
  243. package/base/Base/UserMenu.d.ts +2 -0
  244. package/base/Base/UserMenu.js +20 -0
  245. package/base/Base/UserMenu.js.map +1 -0
  246. package/base/Base.d.ts +3 -1
  247. package/base/Base.js +14 -71
  248. package/base/Base.js.map +1 -1
  249. package/base/TelemetryAdminAppStart.d.ts +1 -0
  250. package/base/TelemetryAdminAppStart.js +16 -0
  251. package/base/TelemetryAdminAppStart.js.map +1 -0
  252. package/base/WebinyVersion.d.ts +2 -0
  253. package/base/WebinyVersion.js +23 -0
  254. package/base/WebinyVersion.js.map +1 -0
  255. package/base/createRootContainer.d.ts +2 -0
  256. package/base/createRootContainer.js +69 -0
  257. package/base/createRootContainer.js.map +1 -0
  258. package/base/plugins/AddGraphQLQuerySelection.d.ts +2 -3
  259. package/base/plugins/AddGraphQLQuerySelection.js +18 -26
  260. package/base/plugins/AddGraphQLQuerySelection.js.map +1 -1
  261. package/base/providers/AdminUiStateProvider.d.ts +1 -0
  262. package/base/providers/AdminUiStateProvider.js +9 -0
  263. package/base/providers/AdminUiStateProvider.js.map +1 -0
  264. package/base/providers/ApolloProvider.d.ts +5 -2
  265. package/base/providers/ApolloProvider.js +9 -20
  266. package/base/providers/ApolloProvider.js.map +1 -1
  267. package/base/providers/UiProviders.d.ts +1 -0
  268. package/base/providers/UiProviders.js +29 -0
  269. package/base/providers/UiProviders.js.map +1 -0
  270. package/base/providers/UiStateProvider.d.ts +1 -2
  271. package/base/providers/UiStateProvider.js +8 -17
  272. package/base/providers/UiStateProvider.js.map +1 -1
  273. package/base/ui/Brand.d.ts +39 -2
  274. package/base/ui/Brand.js +6 -14
  275. package/base/ui/Brand.js.map +1 -1
  276. package/base/ui/CenteredView.d.ts +21 -1
  277. package/base/ui/CenteredView.js +10 -34
  278. package/base/ui/CenteredView.js.map +1 -1
  279. package/base/ui/Dashboard.d.ts +39 -2
  280. package/base/ui/Dashboard.js +6 -14
  281. package/base/ui/Dashboard.js.map +1 -1
  282. package/base/ui/FileManager.d.ts +38 -29
  283. package/base/ui/FileManager.js +45 -59
  284. package/base/ui/FileManager.js.map +1 -1
  285. package/base/ui/Layout.d.ts +40 -2
  286. package/base/ui/Layout.js +6 -18
  287. package/base/ui/Layout.js.map +1 -1
  288. package/base/ui/LoginScreen.d.ts +40 -2
  289. package/base/ui/LoginScreen.js +20 -20
  290. package/base/ui/LoginScreen.js.map +1 -1
  291. package/base/ui/Logo.d.ts +38 -7
  292. package/base/ui/Logo.js +6 -29
  293. package/base/ui/Logo.js.map +1 -1
  294. package/base/ui/Navigation.d.ts +39 -23
  295. package/base/ui/Navigation.js +14 -149
  296. package/base/ui/Navigation.js.map +1 -1
  297. package/base/ui/NotFound.d.ts +39 -2
  298. package/base/ui/NotFound.js +6 -14
  299. package/base/ui/NotFound.js.map +1 -1
  300. package/base/ui/Tags.d.ts +2 -2
  301. package/base/ui/Tags.js +14 -20
  302. package/base/ui/Tags.js.map +1 -1
  303. package/base/ui/TenantSelector.d.ts +39 -0
  304. package/base/ui/TenantSelector.js +7 -0
  305. package/base/ui/TenantSelector.js.map +1 -0
  306. package/base/ui/UserMenu/UserMenu.d.ts +39 -0
  307. package/base/ui/UserMenu/UserMenu.js +7 -0
  308. package/base/ui/UserMenu/UserMenu.js.map +1 -0
  309. package/base/ui/UserMenu/UserMenuHandle.d.ts +39 -0
  310. package/base/ui/UserMenu/UserMenuHandle.js +7 -0
  311. package/base/ui/UserMenu/UserMenuHandle.js.map +1 -0
  312. package/base/ui/UserMenu/UserMenuItem.d.ts +81 -0
  313. package/base/ui/UserMenu/UserMenuItem.js +9 -0
  314. package/base/ui/UserMenu/UserMenuItem.js.map +1 -0
  315. package/base/ui/UserMenu/UserMenuLink.d.ts +81 -0
  316. package/base/ui/UserMenu/UserMenuLink.js +9 -0
  317. package/base/ui/UserMenu/UserMenuLink.js.map +1 -0
  318. package/base/ui/UserMenu/UserMenuSeparator.d.ts +42 -0
  319. package/base/ui/UserMenu/UserMenuSeparator.js +7 -0
  320. package/base/ui/UserMenu/UserMenuSeparator.js.map +1 -0
  321. package/base/ui/UserMenu.d.ts +79 -29
  322. package/base/ui/UserMenu.js +11 -112
  323. package/base/ui/UserMenu.js.map +1 -1
  324. package/components/AdminLayout.d.ts +2 -1
  325. package/components/AdminLayout.js +7 -16
  326. package/components/AdminLayout.js.map +1 -1
  327. package/components/BulkActions/BulkActionButton.d.ts +6 -0
  328. package/components/BulkActions/BulkActionButton.js +17 -0
  329. package/components/BulkActions/BulkActionButton.js.map +1 -0
  330. package/components/BulkActions/BulkActionRunner.d.ts +41 -0
  331. package/components/BulkActions/BulkActionRunner.js +32 -0
  332. package/components/BulkActions/BulkActionRunner.js.map +1 -0
  333. package/components/BulkActions/Worker.d.ts +34 -0
  334. package/components/BulkActions/Worker.js +59 -0
  335. package/components/BulkActions/Worker.js.map +1 -0
  336. package/components/BulkActions/index.d.ts +5 -0
  337. package/components/BulkActions/index.js +5 -0
  338. package/components/BulkActions/useDialogWithReport/DialogMessage.d.ts +5 -0
  339. package/components/BulkActions/useDialogWithReport/DialogMessage.js +19 -0
  340. package/components/BulkActions/useDialogWithReport/DialogMessage.js.map +1 -0
  341. package/components/BulkActions/useDialogWithReport/index.d.ts +1 -0
  342. package/components/BulkActions/useDialogWithReport/index.js +1 -0
  343. package/components/BulkActions/useDialogWithReport/useDialogWithReport.d.ts +19 -0
  344. package/components/BulkActions/useDialogWithReport/useDialogWithReport.js +40 -0
  345. package/components/BulkActions/useDialogWithReport/useDialogWithReport.js.map +1 -0
  346. package/components/Buttons/Buttons.d.ts +24 -0
  347. package/components/Buttons/Buttons.js +50 -0
  348. package/components/Buttons/Buttons.js.map +1 -0
  349. package/components/Buttons/Buttons.styles.d.ts +4 -0
  350. package/components/Buttons/Buttons.styles.js +11 -0
  351. package/components/Buttons/Buttons.styles.js.map +1 -0
  352. package/components/Buttons/index.d.ts +2 -0
  353. package/components/Buttons/index.js +2 -0
  354. package/components/Buttons/useButtons.d.ts +14 -0
  355. package/components/Buttons/useButtons.js +19 -0
  356. package/components/Buttons/useButtons.js.map +1 -0
  357. package/components/ConfirmationDialog/ConfirmationDialog.d.ts +11 -0
  358. package/components/ConfirmationDialog/ConfirmationDialog.js +41 -0
  359. package/components/ConfirmationDialog/ConfirmationDialog.js.map +1 -0
  360. package/components/ConfirmationDialog/index.d.ts +1 -0
  361. package/components/ConfirmationDialog/index.js +1 -0
  362. package/components/DeveloperMode/DeveloperMode.d.ts +11 -0
  363. package/components/DeveloperMode/DeveloperMode.js +8 -0
  364. package/components/DeveloperMode/DeveloperMode.js.map +1 -0
  365. package/components/DeveloperMode/index.d.ts +2 -0
  366. package/components/DeveloperMode/index.js +1 -0
  367. package/components/Dialogs/Dialog.d.ts +22 -0
  368. package/components/Dialogs/Dialog.js +50 -0
  369. package/components/Dialogs/Dialog.js.map +1 -0
  370. package/components/Dialogs/DialogParamsContext.d.ts +6 -0
  371. package/components/Dialogs/DialogParamsContext.js +10 -0
  372. package/components/Dialogs/DialogParamsContext.js.map +1 -0
  373. package/components/Dialogs/DialogsContext.d.ts +41 -0
  374. package/components/Dialogs/DialogsContext.js +143 -0
  375. package/components/Dialogs/DialogsContext.js.map +1 -0
  376. package/components/Dialogs/useDialogs.d.ts +2 -0
  377. package/components/Dialogs/useDialogs.js +10 -0
  378. package/components/Dialogs/useDialogs.js.map +1 -0
  379. package/components/EmptyView.d.ts +4 -4
  380. package/components/EmptyView.js +28 -61
  381. package/components/EmptyView.js.map +1 -1
  382. package/components/Filters/Filters.d.ts +16 -0
  383. package/components/Filters/Filters.js +21 -0
  384. package/components/Filters/Filters.js.map +1 -0
  385. package/components/Filters/FiltersToggle.d.ts +7 -0
  386. package/components/Filters/FiltersToggle.js +21 -0
  387. package/components/Filters/FiltersToggle.js.map +1 -0
  388. package/components/Filters/index.d.ts +2 -0
  389. package/components/Filters/index.js +2 -0
  390. package/components/FloatingActionButton.d.ts +4 -1
  391. package/components/FloatingActionButton.js +15 -22
  392. package/components/FloatingActionButton.js.map +1 -1
  393. package/components/IconPicker/IconPicker.d.ts +15 -0
  394. package/components/IconPicker/IconPicker.js +37 -0
  395. package/components/IconPicker/IconPicker.js.map +1 -0
  396. package/components/IconPicker/IconPickerComponent.d.ts +17 -0
  397. package/components/IconPicker/IconPickerComponent.js +65 -0
  398. package/components/IconPicker/IconPickerComponent.js.map +1 -0
  399. package/components/IconPicker/IconPickerPresenter.d.ts +53 -0
  400. package/components/IconPicker/IconPickerPresenter.js +71 -0
  401. package/components/IconPicker/IconPickerPresenter.js.map +1 -0
  402. package/components/IconPicker/IconPickerPresenter.test.d.ts +1 -0
  403. package/components/IconPicker/IconPickerPresenter.test.js +84 -0
  404. package/components/IconPicker/IconPickerPresenter.test.js.map +1 -0
  405. package/components/IconPicker/IconPickerPresenterProvider.d.ts +9 -0
  406. package/components/IconPicker/IconPickerPresenterProvider.js +13 -0
  407. package/components/IconPicker/IconPickerPresenterProvider.js.map +1 -0
  408. package/components/IconPicker/IconPickerTab.d.ts +33 -0
  409. package/components/IconPicker/IconPickerTab.js +116 -0
  410. package/components/IconPicker/IconPickerTab.js.map +1 -0
  411. package/components/IconPicker/IconRenderer.d.ts +34 -0
  412. package/components/IconPicker/IconRenderer.js +19 -0
  413. package/components/IconPicker/IconRenderer.js.map +1 -0
  414. package/components/IconPicker/IconRepository.d.ts +19 -0
  415. package/components/IconPicker/IconRepository.js +48 -0
  416. package/components/IconPicker/IconRepository.js.map +1 -0
  417. package/components/IconPicker/IconRepository.test.d.ts +1 -0
  418. package/components/IconPicker/IconRepository.test.js +60 -0
  419. package/components/IconPicker/IconRepository.test.js.map +1 -0
  420. package/components/IconPicker/IconRepositoryFactory.d.ts +9 -0
  421. package/components/IconPicker/IconRepositoryFactory.js +21 -0
  422. package/components/IconPicker/IconRepositoryFactory.js.map +1 -0
  423. package/components/IconPicker/Loading.d.ts +14 -0
  424. package/components/IconPicker/Loading.js +51 -0
  425. package/components/IconPicker/Loading.js.map +1 -0
  426. package/components/IconPicker/components/IconPickerCell.d.ts +12 -0
  427. package/components/IconPicker/components/IconPickerCell.js +25 -0
  428. package/components/IconPicker/components/IconPickerCell.js.map +1 -0
  429. package/components/IconPicker/components/IconPickerContent.d.ts +11 -0
  430. package/components/IconPicker/components/IconPickerContent.js +33 -0
  431. package/components/IconPicker/components/IconPickerContent.js.map +1 -0
  432. package/components/IconPicker/components/IconPickerRow.d.ts +4 -0
  433. package/components/IconPicker/components/IconPickerRow.js +9 -0
  434. package/components/IconPicker/components/IconPickerRow.js.map +1 -0
  435. package/components/IconPicker/components/IconPickerTrigger.d.ts +13 -0
  436. package/components/IconPicker/components/IconPickerTrigger.js +50 -0
  437. package/components/IconPicker/components/IconPickerTrigger.js.map +1 -0
  438. package/components/IconPicker/components/index.d.ts +4 -0
  439. package/components/IconPicker/components/index.js +4 -0
  440. package/components/IconPicker/config/Emojis.d.ts +2 -0
  441. package/components/IconPicker/config/Emojis.js +22 -0
  442. package/components/IconPicker/config/Emojis.js.map +1 -0
  443. package/components/IconPicker/config/FontAwesomeIcons.d.ts +2 -0
  444. package/components/IconPicker/config/FontAwesomeIcons.js +57 -0
  445. package/components/IconPicker/config/FontAwesomeIcons.js.map +1 -0
  446. package/components/IconPicker/config/IconPackProvider.d.ts +7 -0
  447. package/components/IconPicker/config/IconPackProvider.js +21 -0
  448. package/components/IconPicker/config/IconPackProvider.js.map +1 -0
  449. package/components/IconPicker/config/IconType.d.ts +32 -0
  450. package/components/IconPicker/config/IconType.js +57 -0
  451. package/components/IconPicker/config/IconType.js.map +1 -0
  452. package/components/IconPicker/config/index.d.ts +32 -0
  453. package/components/IconPicker/config/index.js +42 -0
  454. package/components/IconPicker/config/index.js.map +1 -0
  455. package/components/IconPicker/defaultIcon.d.ts +6 -0
  456. package/components/IconPicker/defaultIcon.js +9 -0
  457. package/components/IconPicker/defaultIcon.js.map +1 -0
  458. package/components/IconPicker/index.d.ts +7 -0
  459. package/components/IconPicker/index.js +6 -0
  460. package/components/IconPicker/plugins/customPlugin.d.ts +2 -0
  461. package/components/IconPicker/plugins/customPlugin.js +104 -0
  462. package/components/IconPicker/plugins/customPlugin.js.map +1 -0
  463. package/components/IconPicker/plugins/emojisPlugin.d.ts +2 -0
  464. package/components/IconPicker/plugins/emojisPlugin.js +102 -0
  465. package/components/IconPicker/plugins/emojisPlugin.js.map +1 -0
  466. package/components/IconPicker/plugins/graphql.d.ts +20 -0
  467. package/components/IconPicker/plugins/graphql.js +22 -0
  468. package/components/IconPicker/plugins/graphql.js.map +1 -0
  469. package/components/IconPicker/plugins/iconsPlugin.d.ts +2 -0
  470. package/components/IconPicker/plugins/iconsPlugin.js +84 -0
  471. package/components/IconPicker/plugins/iconsPlugin.js.map +1 -0
  472. package/components/IconPicker/types.d.ts +22 -0
  473. package/components/IconPicker/types.js +7 -0
  474. package/components/IconPicker/types.js.map +1 -0
  475. package/components/LexicalEditor/DefaultLexicalEditorConfig.d.ts +2 -0
  476. package/components/LexicalEditor/DefaultLexicalEditorConfig.js +81 -0
  477. package/components/LexicalEditor/DefaultLexicalEditorConfig.js.map +1 -0
  478. package/components/LexicalEditor/LexicalEditor.d.ts +12 -0
  479. package/components/LexicalEditor/LexicalEditor.js +48 -0
  480. package/components/LexicalEditor/LexicalEditor.js.map +1 -0
  481. package/components/LexicalEditor/LexicalLinkForm.d.ts +6 -0
  482. package/components/LexicalEditor/LexicalLinkForm.js +88 -0
  483. package/components/LexicalEditor/LexicalLinkForm.js.map +1 -0
  484. package/components/LexicalEditor/TypographyDropDown.d.ts +8 -0
  485. package/components/LexicalEditor/TypographyDropDown.js +60 -0
  486. package/components/LexicalEditor/TypographyDropDown.js.map +1 -0
  487. package/components/LexicalEditor/index.d.ts +3 -0
  488. package/components/LexicalEditor/index.js +3 -0
  489. package/components/LexicalEditor/lexicalValueFromHtml.d.ts +7 -0
  490. package/components/LexicalEditor/lexicalValueFromHtml.js +28 -0
  491. package/components/LexicalEditor/lexicalValueFromHtml.js.map +1 -0
  492. package/components/LexicalEditor/lexicalValueWithHtml.d.ts +7 -0
  493. package/components/LexicalEditor/lexicalValueWithHtml.js +30 -0
  494. package/components/LexicalEditor/lexicalValueWithHtml.js.map +1 -0
  495. package/components/ListView/ListView.d.ts +17 -0
  496. package/components/ListView/ListView.js +36 -0
  497. package/components/ListView/ListView.js.map +1 -0
  498. package/components/ListView/ListViewBottomBar.d.ts +14 -0
  499. package/components/ListView/ListViewBottomBar.js +45 -0
  500. package/components/ListView/ListViewBottomBar.js.map +1 -0
  501. package/components/ListView/ListViewBulkActions.d.ts +11 -0
  502. package/components/ListView/ListViewBulkActions.js +41 -0
  503. package/components/ListView/ListViewBulkActions.js.map +1 -0
  504. package/components/ListView/ListViewContent.d.ts +12 -0
  505. package/components/ListView/ListViewContent.js +25 -0
  506. package/components/ListView/ListViewContent.js.map +1 -0
  507. package/components/ListView/ListViewFilters.d.ts +15 -0
  508. package/components/ListView/ListViewFilters.js +21 -0
  509. package/components/ListView/ListViewFilters.js.map +1 -0
  510. package/components/ListView/ListViewHeader.d.ts +17 -0
  511. package/components/ListView/ListViewHeader.js +72 -0
  512. package/components/ListView/ListViewHeader.js.map +1 -0
  513. package/components/ListView/ListViewSidebar.d.ts +17 -0
  514. package/components/ListView/ListViewSidebar.js +25 -0
  515. package/components/ListView/ListViewSidebar.js.map +1 -0
  516. package/components/ListView/ListViewTable.d.ts +18 -0
  517. package/components/ListView/ListViewTable.js +33 -0
  518. package/components/ListView/ListViewTable.js.map +1 -0
  519. package/components/ListView/context.d.ts +3 -0
  520. package/components/ListView/context.js +11 -0
  521. package/components/ListView/context.js.map +1 -0
  522. package/components/ListView/index.d.ts +24 -0
  523. package/components/ListView/index.js +22 -0
  524. package/components/ListView/index.js.map +1 -0
  525. package/components/ListView/types.d.ts +7 -0
  526. package/components/ListView/types.js +0 -0
  527. package/components/MultiImageUpload.d.ts +1 -1
  528. package/components/MultiImageUpload.js +6 -33
  529. package/components/MultiImageUpload.js.map +1 -1
  530. package/components/NotAuthorizedError/NotAuthorizedError.d.ts +2 -0
  531. package/components/NotAuthorizedError/NotAuthorizedError.js +19 -0
  532. package/components/NotAuthorizedError/NotAuthorizedError.js.map +1 -0
  533. package/components/NotAuthorizedError/SecureRouteError.js +297 -0
  534. package/components/NotAuthorizedError/SecureRouteError.js.map +1 -0
  535. package/components/NotAuthorizedError/SecureRouteError.svg +1 -0
  536. package/components/NotAuthorizedError/index.d.ts +1 -0
  537. package/components/NotAuthorizedError/index.js +1 -0
  538. package/components/OptionsMenu/OptionsMenu.d.ts +16 -0
  539. package/components/OptionsMenu/OptionsMenu.js +24 -0
  540. package/components/OptionsMenu/OptionsMenu.js.map +1 -0
  541. package/components/OptionsMenu/OptionsMenuItem.d.ts +11 -0
  542. package/components/OptionsMenu/OptionsMenuItem.js +19 -0
  543. package/components/OptionsMenu/OptionsMenuItem.js.map +1 -0
  544. package/components/OptionsMenu/OptionsMenuLink.d.ts +12 -0
  545. package/components/OptionsMenu/OptionsMenuLink.js +16 -0
  546. package/components/OptionsMenu/OptionsMenuLink.js.map +1 -0
  547. package/components/OptionsMenu/index.d.ts +4 -0
  548. package/components/OptionsMenu/index.js +4 -0
  549. package/components/OptionsMenu/useOptionsMenuItem.d.ts +13 -0
  550. package/components/OptionsMenu/useOptionsMenuItem.js +18 -0
  551. package/components/OptionsMenu/useOptionsMenuItem.js.map +1 -0
  552. package/components/OverlayLayout/OverlayLayout.d.ts +6 -17
  553. package/components/OverlayLayout/OverlayLayout.js +42 -154
  554. package/components/OverlayLayout/OverlayLayout.js.map +1 -1
  555. package/components/OverlayLayout/components/OverlayBackdrop.d.ts +7 -0
  556. package/components/OverlayLayout/components/OverlayBackdrop.js +10 -0
  557. package/components/OverlayLayout/components/OverlayBackdrop.js.map +1 -0
  558. package/components/OverlayLayout/components/OverlayContent.d.ts +6 -0
  559. package/components/OverlayLayout/components/OverlayContent.js +23 -0
  560. package/components/OverlayLayout/components/OverlayContent.js.map +1 -0
  561. package/components/OverlayLayout/components/OverlayHeader.d.ts +13 -0
  562. package/components/OverlayLayout/components/OverlayHeader.js +37 -0
  563. package/components/OverlayLayout/components/OverlayHeader.js.map +1 -0
  564. package/components/OverlayLayout/components/OverlayRoot.d.ts +9 -0
  565. package/components/OverlayLayout/components/OverlayRoot.js +18 -0
  566. package/components/OverlayLayout/components/OverlayRoot.js.map +1 -0
  567. package/components/OverlayLayout/components/index.d.ts +4 -0
  568. package/components/OverlayLayout/components/index.js +4 -0
  569. package/components/OverlayLayout/index.d.ts +1 -1
  570. package/components/OverlayLayout/index.js +1 -16
  571. package/components/Permissions/CannotUseAaclAlert.d.ts +2 -0
  572. package/components/Permissions/CannotUseAaclAlert.js +13 -0
  573. package/components/Permissions/CannotUseAaclAlert.js.map +1 -0
  574. package/components/Permissions/Permissions.d.ts +2 -4
  575. package/components/Permissions/Permissions.js +38 -51
  576. package/components/Permissions/Permissions.js.map +1 -1
  577. package/components/Permissions/PermissionsGroup.d.ts +6 -0
  578. package/components/Permissions/PermissionsGroup.js +12 -0
  579. package/components/Permissions/PermissionsGroup.js.map +1 -0
  580. package/components/Permissions/StyledComponents.d.ts +2 -3
  581. package/components/Permissions/StyledComponents.js +13 -28
  582. package/components/Permissions/StyledComponents.js.map +1 -1
  583. package/components/Permissions/index.d.ts +4 -2
  584. package/components/Permissions/index.js +4 -27
  585. package/components/RegisterFeature.d.ts +11 -0
  586. package/components/RegisterFeature.js +19 -0
  587. package/components/RegisterFeature.js.map +1 -0
  588. package/components/ResizablePanels/index.d.ts +1 -0
  589. package/components/ResizablePanels/index.js +1 -0
  590. package/components/RolesMultiAutocomplete/graphql.d.ts +1 -0
  591. package/components/RolesMultiAutocomplete/graphql.js +24 -0
  592. package/components/RolesMultiAutocomplete/graphql.js.map +1 -0
  593. package/components/RolesMultiAutocomplete/index.d.ts +7 -0
  594. package/components/RolesMultiAutocomplete/index.js +37 -0
  595. package/components/RolesMultiAutocomplete/index.js.map +1 -0
  596. package/components/SearchUI.d.ts +2 -2
  597. package/components/SearchUI.js +20 -72
  598. package/components/SearchUI.js.map +1 -1
  599. package/components/SimpleForm/SimpleForm.d.ts +19 -8
  600. package/components/SimpleForm/SimpleForm.js +60 -75
  601. package/components/SimpleForm/SimpleForm.js.map +1 -1
  602. package/components/SimpleForm/index.d.ts +1 -1
  603. package/components/SimpleForm/index.js +1 -30
  604. package/components/SimpleUI/InputField.d.ts +4 -3
  605. package/components/SimpleUI/InputField.js +76 -99
  606. package/components/SimpleUI/InputField.js.map +1 -1
  607. package/components/SingleImageUpload.d.ts +21 -9
  608. package/components/SingleImageUpload.js +39 -97
  609. package/components/SingleImageUpload.js.map +1 -1
  610. package/components/SplitView/SplitView.d.ts +11 -9
  611. package/components/SplitView/SplitView.js +52 -73
  612. package/components/SplitView/SplitView.js.map +1 -1
  613. package/components/SplitView/index.d.ts +1 -1
  614. package/components/SplitView/index.js +1 -24
  615. package/components/Table/cells/CellAuthor.d.ts +2 -0
  616. package/components/Table/cells/CellAuthor.js +10 -0
  617. package/components/Table/cells/CellAuthor.js.map +1 -0
  618. package/components/Table/cells/CellCreated.d.ts +2 -0
  619. package/components/Table/cells/CellCreated.js +13 -0
  620. package/components/Table/cells/CellCreated.js.map +1 -0
  621. package/components/Table/cells/CellModified.d.ts +2 -0
  622. package/components/Table/cells/CellModified.js +13 -0
  623. package/components/Table/cells/CellModified.js.map +1 -0
  624. package/components/Table/cells/index.d.ts +3 -0
  625. package/components/Table/cells/index.js +3 -0
  626. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityDecorator.d.ts +9 -0
  627. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityDecorator.js +23 -0
  628. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityDecorator.js.map +1 -0
  629. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.d.ts +9 -0
  630. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.js +21 -0
  631. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.js.map +1 -0
  632. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.d.ts +1 -0
  633. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.js +128 -0
  634. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.js.map +1 -0
  635. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityRepository.d.ts +10 -0
  636. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityRepository.js +30 -0
  637. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityRepository.js.map +1 -0
  638. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityRepositoryFactory.d.ts +9 -0
  639. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityRepositoryFactory.js +18 -0
  640. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityRepositoryFactory.js.map +1 -0
  641. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityUpdater.d.ts +8 -0
  642. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityUpdater.js +16 -0
  643. package/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityUpdater.js.map +1 -0
  644. package/components/Table/components/Table/ColumnVisibility/IColumnsVisibilityRepository.d.ts +5 -0
  645. package/components/Table/components/Table/ColumnVisibility/IColumnsVisibilityRepository.js +0 -0
  646. package/components/Table/components/Table/ColumnVisibility/IColumnsVisibilityUpdater.d.ts +4 -0
  647. package/components/Table/components/Table/ColumnVisibility/IColumnsVisibilityUpdater.js +0 -0
  648. package/components/Table/components/Table/ColumnVisibility/index.d.ts +7 -0
  649. package/components/Table/components/Table/ColumnVisibility/index.js +5 -0
  650. package/components/Table/components/Table/Columns/Column.d.ts +42 -0
  651. package/components/Table/components/Table/Columns/Column.js +21 -0
  652. package/components/Table/components/Table/Columns/Column.js.map +1 -0
  653. package/components/Table/components/Table/Columns/ColumnMapper.d.ts +7 -0
  654. package/components/Table/components/Table/Columns/ColumnMapper.js +34 -0
  655. package/components/Table/components/Table/Columns/ColumnMapper.js.map +1 -0
  656. package/components/Table/components/Table/Columns/ColumnsPresenter.d.ts +9 -0
  657. package/components/Table/components/Table/Columns/ColumnsPresenter.js +18 -0
  658. package/components/Table/components/Table/Columns/ColumnsPresenter.js.map +1 -0
  659. package/components/Table/components/Table/Columns/ColumnsPresenter.test.d.ts +1 -0
  660. package/components/Table/components/Table/Columns/ColumnsPresenter.test.js +73 -0
  661. package/components/Table/components/Table/Columns/ColumnsPresenter.test.js.map +1 -0
  662. package/components/Table/components/Table/Columns/ColumnsRepository.d.ts +9 -0
  663. package/components/Table/components/Table/Columns/ColumnsRepository.js +19 -0
  664. package/components/Table/components/Table/Columns/ColumnsRepository.js.map +1 -0
  665. package/components/Table/components/Table/Columns/ColumnsRepositoryFactory.d.ts +9 -0
  666. package/components/Table/components/Table/Columns/ColumnsRepositoryFactory.js +21 -0
  667. package/components/Table/components/Table/Columns/ColumnsRepositoryFactory.js.map +1 -0
  668. package/components/Table/components/Table/Columns/IColumnsRepository.d.ts +5 -0
  669. package/components/Table/components/Table/Columns/IColumnsRepository.js +0 -0
  670. package/components/Table/components/Table/Columns/index.d.ts +6 -0
  671. package/components/Table/components/Table/Columns/index.js +5 -0
  672. package/components/Table/components/Table/Table.d.ts +17 -0
  673. package/components/Table/components/Table/Table.js +47 -0
  674. package/components/Table/components/Table/Table.js.map +1 -0
  675. package/components/Table/components/Table/TableInner.d.ts +24 -0
  676. package/components/Table/components/Table/TableInner.js +40 -0
  677. package/components/Table/components/Table/TableInner.js.map +1 -0
  678. package/components/Table/components/Table/TablePresenter.d.ts +15 -0
  679. package/components/Table/components/Table/TablePresenter.js +15 -0
  680. package/components/Table/components/Table/TablePresenter.js.map +1 -0
  681. package/components/Table/components/Table/gateways/ColumnsVisibilityLocalStorageGateway.d.ts +9 -0
  682. package/components/Table/components/Table/gateways/ColumnsVisibilityLocalStorageGateway.js +15 -0
  683. package/components/Table/components/Table/gateways/ColumnsVisibilityLocalStorageGateway.js.map +1 -0
  684. package/components/Table/components/Table/gateways/IColumnsVisibilityGateway.d.ts +4 -0
  685. package/components/Table/components/Table/gateways/IColumnsVisibilityGateway.js +0 -0
  686. package/components/Table/components/Table/gateways/index.d.ts +2 -0
  687. package/components/Table/components/Table/gateways/index.js +1 -0
  688. package/components/Table/components/Table/index.d.ts +1 -0
  689. package/components/Table/components/Table/index.js +1 -0
  690. package/components/Table/components/index.d.ts +1 -0
  691. package/components/Table/components/index.js +1 -0
  692. package/components/Table/createTableData.d.ts +5 -0
  693. package/components/Table/createTableData.js +9 -0
  694. package/components/Table/createTableData.js.map +1 -0
  695. package/components/Table/index.d.ts +5 -0
  696. package/components/Table/index.js +5 -0
  697. package/components/Table/table.types.d.ts +9 -0
  698. package/components/Table/table.types.js +0 -0
  699. package/components/Table/useTableRow.d.ts +18 -0
  700. package/components/Table/useTableRow.js +22 -0
  701. package/components/Table/useTableRow.js.map +1 -0
  702. package/components/TeamAutocomplete/graphql.d.ts +1 -0
  703. package/components/TeamAutocomplete/graphql.js +19 -0
  704. package/components/TeamAutocomplete/graphql.js.map +1 -0
  705. package/components/TeamAutocomplete/index.d.ts +7 -0
  706. package/components/TeamAutocomplete/index.js +26 -0
  707. package/components/TeamAutocomplete/index.js.map +1 -0
  708. package/components/TeamsMultiAutocomplete/graphql.d.ts +1 -0
  709. package/components/TeamsMultiAutocomplete/graphql.js +24 -0
  710. package/components/TeamsMultiAutocomplete/graphql.js.map +1 -0
  711. package/components/TeamsMultiAutocomplete/index.d.ts +7 -0
  712. package/components/TeamsMultiAutocomplete/index.js +38 -0
  713. package/components/TeamsMultiAutocomplete/index.js.map +1 -0
  714. package/components/Wcp.d.ts +21 -0
  715. package/components/Wcp.js +42 -0
  716. package/components/Wcp.js.map +1 -0
  717. package/components/index.d.ts +28 -1
  718. package/components/index.js +26 -12
  719. package/config/AdminConfig/Dashboard.d.ts +4 -0
  720. package/config/AdminConfig/Dashboard.js +7 -0
  721. package/config/AdminConfig/Dashboard.js.map +1 -0
  722. package/config/AdminConfig/Dialog.d.ts +10 -0
  723. package/config/AdminConfig/Dialog.js +19 -0
  724. package/config/AdminConfig/Dialog.js.map +1 -0
  725. package/config/AdminConfig/FieldRenderer.d.ts +11 -0
  726. package/config/AdminConfig/FieldRenderer.js +19 -0
  727. package/config/AdminConfig/FieldRenderer.js.map +1 -0
  728. package/config/AdminConfig/Form.d.ts +6 -0
  729. package/config/AdminConfig/Form.js +9 -0
  730. package/config/AdminConfig/Form.js.map +1 -0
  731. package/config/AdminConfig/LayoutRenderer.d.ts +10 -0
  732. package/config/AdminConfig/LayoutRenderer.js +19 -0
  733. package/config/AdminConfig/LayoutRenderer.js.map +1 -0
  734. package/config/AdminConfig/LexicalTheme/AllowCustomColors.d.ts +5 -0
  735. package/config/AdminConfig/LexicalTheme/AllowCustomColors.js +18 -0
  736. package/config/AdminConfig/LexicalTheme/AllowCustomColors.js.map +1 -0
  737. package/config/AdminConfig/LexicalTheme/Color.d.ts +11 -0
  738. package/config/AdminConfig/LexicalTheme/Color.js +38 -0
  739. package/config/AdminConfig/LexicalTheme/Color.js.map +1 -0
  740. package/config/AdminConfig/LexicalTheme/Typography.d.ts +30 -0
  741. package/config/AdminConfig/LexicalTheme/Typography.js +66 -0
  742. package/config/AdminConfig/LexicalTheme/Typography.js.map +1 -0
  743. package/config/AdminConfig/LexicalTheme.d.ts +12 -0
  744. package/config/AdminConfig/LexicalTheme.js +11 -0
  745. package/config/AdminConfig/LexicalTheme.js.map +1 -0
  746. package/config/AdminConfig/Logo.d.ts +26 -0
  747. package/config/AdminConfig/Logo.js +19 -0
  748. package/config/AdminConfig/Logo.js.map +1 -0
  749. package/config/AdminConfig/Menu/MenuGroup.d.ts +63 -0
  750. package/config/AdminConfig/Menu/MenuGroup.js +12 -0
  751. package/config/AdminConfig/Menu/MenuGroup.js.map +1 -0
  752. package/config/AdminConfig/Menu/MenuItem.d.ts +45 -0
  753. package/config/AdminConfig/Menu/MenuItem.js +13 -0
  754. package/config/AdminConfig/Menu/MenuItem.js.map +1 -0
  755. package/config/AdminConfig/Menu/MenuLink.d.ts +45 -0
  756. package/config/AdminConfig/Menu/MenuLink.js +22 -0
  757. package/config/AdminConfig/Menu/MenuLink.js.map +1 -0
  758. package/config/AdminConfig/Menu/SupportMenu/SupportMenuItem.d.ts +44 -0
  759. package/config/AdminConfig/Menu/SupportMenu/SupportMenuItem.js +11 -0
  760. package/config/AdminConfig/Menu/SupportMenu/SupportMenuItem.js.map +1 -0
  761. package/config/AdminConfig/Menu/SupportMenu/SupportMenuLink.d.ts +25 -0
  762. package/config/AdminConfig/Menu/SupportMenu/SupportMenuLink.js +11 -0
  763. package/config/AdminConfig/Menu/SupportMenu/SupportMenuLink.js.map +1 -0
  764. package/config/AdminConfig/Menu/SupportMenu.d.ts +74 -0
  765. package/config/AdminConfig/Menu/SupportMenu.js +38 -0
  766. package/config/AdminConfig/Menu/SupportMenu.js.map +1 -0
  767. package/config/AdminConfig/Menu/UserMenu/UserMenuItem.d.ts +40 -0
  768. package/config/AdminConfig/Menu/UserMenu/UserMenuItem.js +7 -0
  769. package/config/AdminConfig/Menu/UserMenu/UserMenuItem.js.map +1 -0
  770. package/config/AdminConfig/Menu/UserMenu/UserMenuLink.d.ts +40 -0
  771. package/config/AdminConfig/Menu/UserMenu/UserMenuLink.js +7 -0
  772. package/config/AdminConfig/Menu/UserMenu/UserMenuLink.js.map +1 -0
  773. package/config/AdminConfig/Menu/UserMenu/UserMenuSeparator.d.ts +1 -0
  774. package/config/AdminConfig/Menu/UserMenu/UserMenuSeparator.js +1 -0
  775. package/config/AdminConfig/Menu/UserMenu/types.d.ts +7 -0
  776. package/config/AdminConfig/Menu/UserMenu/types.js +0 -0
  777. package/config/AdminConfig/Menu/UserMenu.d.ts +131 -0
  778. package/config/AdminConfig/Menu/UserMenu.js +48 -0
  779. package/config/AdminConfig/Menu/UserMenu.js.map +1 -0
  780. package/config/AdminConfig/Menu/types.d.ts +7 -0
  781. package/config/AdminConfig/Menu/types.js +0 -0
  782. package/config/AdminConfig/Menu.d.ts +357 -0
  783. package/config/AdminConfig/Menu.js +69 -0
  784. package/config/AdminConfig/Menu.js.map +1 -0
  785. package/config/AdminConfig/Route.d.ts +3 -0
  786. package/config/AdminConfig/Route.js +7 -0
  787. package/config/AdminConfig/Route.js.map +1 -0
  788. package/config/AdminConfig/Security.d.ts +4 -0
  789. package/config/AdminConfig/Security.js +7 -0
  790. package/config/AdminConfig/Security.js.map +1 -0
  791. package/config/AdminConfig/SecurityPermissions.d.ts +17 -0
  792. package/config/AdminConfig/SecurityPermissions.js +24 -0
  793. package/config/AdminConfig/SecurityPermissions.js.map +1 -0
  794. package/config/AdminConfig/Tenant/TenantLogo.d.ts +26 -0
  795. package/config/AdminConfig/Tenant/TenantLogo.js +22 -0
  796. package/config/AdminConfig/Tenant/TenantLogo.js.map +1 -0
  797. package/config/AdminConfig/Tenant/TenantName.d.ts +25 -0
  798. package/config/AdminConfig/Tenant/TenantName.js +18 -0
  799. package/config/AdminConfig/Tenant/TenantName.js.map +1 -0
  800. package/config/AdminConfig/Tenant.d.ts +51 -0
  801. package/config/AdminConfig/Tenant.js +11 -0
  802. package/config/AdminConfig/Tenant.js.map +1 -0
  803. package/config/AdminConfig/Theme/assignColor.d.ts +2 -0
  804. package/config/AdminConfig/Theme/assignColor.js +55 -0
  805. package/config/AdminConfig/Theme/assignColor.js.map +1 -0
  806. package/config/AdminConfig/Theme/consts.d.ts +2 -0
  807. package/config/AdminConfig/Theme/consts.js +22 -0
  808. package/config/AdminConfig/Theme/consts.js.map +1 -0
  809. package/config/AdminConfig/Theme/types.d.ts +3 -0
  810. package/config/AdminConfig/Theme/types.js +0 -0
  811. package/config/AdminConfig/Theme.d.ts +16 -0
  812. package/config/AdminConfig/Theme.js +15 -0
  813. package/config/AdminConfig/Theme.js.map +1 -0
  814. package/config/AdminConfig/Title.d.ts +25 -0
  815. package/config/AdminConfig/Title.js +15 -0
  816. package/config/AdminConfig/Title.js.map +1 -0
  817. package/config/AdminConfig/Widget.d.ts +15 -0
  818. package/config/AdminConfig/Widget.js +29 -0
  819. package/config/AdminConfig/Widget.js.map +1 -0
  820. package/config/AdminConfig.d.ts +490 -0
  821. package/config/AdminConfig.js +70 -0
  822. package/config/AdminConfig.js.map +1 -0
  823. package/config/createAdminConfig.d.ts +57 -0
  824. package/config/createAdminConfig.js +63 -0
  825. package/config/createAdminConfig.js.map +1 -0
  826. package/config/table/Column.d.ts +34 -0
  827. package/config/table/Column.js +69 -0
  828. package/config/table/Column.js.map +1 -0
  829. package/config/table/Sorting.d.ts +11 -0
  830. package/config/table/Sorting.js +28 -0
  831. package/config/table/Sorting.js.map +1 -0
  832. package/config/table/index.d.ts +13 -0
  833. package/config/table/index.js +9 -0
  834. package/config/table/index.js.map +1 -0
  835. package/css/tokens.css +379 -0
  836. package/css/typography.css +70 -0
  837. package/domain/Identity.d.ts +59 -0
  838. package/domain/Identity.js +86 -0
  839. package/domain/Identity.js.map +1 -0
  840. package/domain/securityPermissionsSchema.d.ts +20 -0
  841. package/domain/securityPermissionsSchema.js +34 -0
  842. package/domain/securityPermissionsSchema.js.map +1 -0
  843. package/errors/ErrorOverlayNetworkErrorHandler.d.ts +11 -0
  844. package/errors/ErrorOverlayNetworkErrorHandler.js +51 -0
  845. package/errors/ErrorOverlayNetworkErrorHandler.js.map +1 -0
  846. package/errors/TenantIsDisabled.d.ts +2 -0
  847. package/errors/TenantIsDisabled.js +22 -0
  848. package/errors/TenantIsDisabled.js.map +1 -0
  849. package/exports/admin/build-params.d.ts +4 -0
  850. package/exports/admin/build-params.js +2 -0
  851. package/exports/admin/configs.d.ts +1 -0
  852. package/exports/admin/configs.js +1 -0
  853. package/exports/admin/form.d.ts +18 -0
  854. package/exports/admin/form.js +6 -0
  855. package/exports/admin/security.d.ts +14 -0
  856. package/exports/admin/security.js +9 -0
  857. package/exports/admin/tenancy.d.ts +2 -0
  858. package/exports/admin/tenancy.js +2 -0
  859. package/exports/admin/ui/file-manager.d.ts +3 -0
  860. package/exports/admin/ui/file-manager.js +2 -0
  861. package/exports/admin/ui/lexical.d.ts +1 -0
  862. package/exports/admin/ui/lexical.js +1 -0
  863. package/exports/admin/ui.d.ts +11 -0
  864. package/exports/admin/ui.js +7 -0
  865. package/exports/admin.d.ts +13 -0
  866. package/exports/admin.js +12 -0
  867. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyGateway.d.ts +12 -0
  868. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyGateway.js +50 -0
  869. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyGateway.js.map +1 -0
  870. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyRepository.d.ts +13 -0
  871. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyRepository.js +25 -0
  872. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyRepository.js.map +1 -0
  873. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyUseCase.d.ts +11 -0
  874. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyUseCase.js +18 -0
  875. package/features/accessManagement/apiKeys/createApiKey/CreateApiKeyUseCase.js.map +1 -0
  876. package/features/accessManagement/apiKeys/createApiKey/abstractions.d.ts +29 -0
  877. package/features/accessManagement/apiKeys/createApiKey/abstractions.js +7 -0
  878. package/features/accessManagement/apiKeys/createApiKey/abstractions.js.map +1 -0
  879. package/features/accessManagement/apiKeys/createApiKey/feature.d.ts +3 -0
  880. package/features/accessManagement/apiKeys/createApiKey/feature.js +21 -0
  881. package/features/accessManagement/apiKeys/createApiKey/feature.js.map +1 -0
  882. package/features/accessManagement/apiKeys/createApiKey/index.d.ts +3 -0
  883. package/features/accessManagement/apiKeys/createApiKey/index.js +2 -0
  884. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyGateway.d.ts +11 -0
  885. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyGateway.js +39 -0
  886. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyGateway.js.map +1 -0
  887. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyRepository.d.ts +12 -0
  888. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyRepository.js +22 -0
  889. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyRepository.js.map +1 -0
  890. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyUseCase.d.ts +10 -0
  891. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyUseCase.js +18 -0
  892. package/features/accessManagement/apiKeys/deleteApiKey/DeleteApiKeyUseCase.js.map +1 -0
  893. package/features/accessManagement/apiKeys/deleteApiKey/abstractions.d.ts +21 -0
  894. package/features/accessManagement/apiKeys/deleteApiKey/abstractions.js +7 -0
  895. package/features/accessManagement/apiKeys/deleteApiKey/abstractions.js.map +1 -0
  896. package/features/accessManagement/apiKeys/deleteApiKey/feature.d.ts +3 -0
  897. package/features/accessManagement/apiKeys/deleteApiKey/feature.js +21 -0
  898. package/features/accessManagement/apiKeys/deleteApiKey/feature.js.map +1 -0
  899. package/features/accessManagement/apiKeys/deleteApiKey/index.d.ts +3 -0
  900. package/features/accessManagement/apiKeys/deleteApiKey/index.js +2 -0
  901. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyGateway.d.ts +12 -0
  902. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyGateway.js +49 -0
  903. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyGateway.js.map +1 -0
  904. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyRepository.d.ts +11 -0
  905. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyRepository.js +18 -0
  906. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyRepository.js.map +1 -0
  907. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyUseCase.d.ts +11 -0
  908. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyUseCase.js +18 -0
  909. package/features/accessManagement/apiKeys/getApiKey/GetApiKeyUseCase.js.map +1 -0
  910. package/features/accessManagement/apiKeys/getApiKey/abstractions.d.ts +22 -0
  911. package/features/accessManagement/apiKeys/getApiKey/abstractions.js +7 -0
  912. package/features/accessManagement/apiKeys/getApiKey/abstractions.js.map +1 -0
  913. package/features/accessManagement/apiKeys/getApiKey/feature.d.ts +3 -0
  914. package/features/accessManagement/apiKeys/getApiKey/feature.js +21 -0
  915. package/features/accessManagement/apiKeys/getApiKey/feature.js.map +1 -0
  916. package/features/accessManagement/apiKeys/getApiKey/index.d.ts +3 -0
  917. package/features/accessManagement/apiKeys/getApiKey/index.js +2 -0
  918. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysGateway.d.ts +11 -0
  919. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysGateway.js +44 -0
  920. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysGateway.js.map +1 -0
  921. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysRepository.d.ts +11 -0
  922. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysRepository.js +22 -0
  923. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysRepository.js.map +1 -0
  924. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysUseCase.d.ts +10 -0
  925. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysUseCase.js +18 -0
  926. package/features/accessManagement/apiKeys/listApiKeys/ListApiKeysUseCase.js.map +1 -0
  927. package/features/accessManagement/apiKeys/listApiKeys/abstractions.d.ts +30 -0
  928. package/features/accessManagement/apiKeys/listApiKeys/abstractions.js +8 -0
  929. package/features/accessManagement/apiKeys/listApiKeys/abstractions.js.map +1 -0
  930. package/features/accessManagement/apiKeys/listApiKeys/feature.d.ts +3 -0
  931. package/features/accessManagement/apiKeys/listApiKeys/feature.js +23 -0
  932. package/features/accessManagement/apiKeys/listApiKeys/feature.js.map +1 -0
  933. package/features/accessManagement/apiKeys/listApiKeys/index.d.ts +3 -0
  934. package/features/accessManagement/apiKeys/listApiKeys/index.js +2 -0
  935. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyGateway.d.ts +12 -0
  936. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyGateway.js +51 -0
  937. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyGateway.js.map +1 -0
  938. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyRepository.d.ts +13 -0
  939. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyRepository.js +23 -0
  940. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyRepository.js.map +1 -0
  941. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyUseCase.d.ts +11 -0
  942. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyUseCase.js +18 -0
  943. package/features/accessManagement/apiKeys/updateApiKey/UpdateApiKeyUseCase.js.map +1 -0
  944. package/features/accessManagement/apiKeys/updateApiKey/abstractions.d.ts +28 -0
  945. package/features/accessManagement/apiKeys/updateApiKey/abstractions.js +7 -0
  946. package/features/accessManagement/apiKeys/updateApiKey/abstractions.js.map +1 -0
  947. package/features/accessManagement/apiKeys/updateApiKey/feature.d.ts +3 -0
  948. package/features/accessManagement/apiKeys/updateApiKey/feature.js +21 -0
  949. package/features/accessManagement/apiKeys/updateApiKey/feature.js.map +1 -0
  950. package/features/accessManagement/apiKeys/updateApiKey/index.d.ts +3 -0
  951. package/features/accessManagement/apiKeys/updateApiKey/index.js +2 -0
  952. package/features/accessManagement/constants.d.ts +5 -0
  953. package/features/accessManagement/constants.js +9 -0
  954. package/features/accessManagement/constants.js.map +1 -0
  955. package/features/accessManagement/permissions/abstractions.d.ts +17 -0
  956. package/features/accessManagement/permissions/abstractions.js +6 -0
  957. package/features/accessManagement/permissions/abstractions.js.map +1 -0
  958. package/features/accessManagement/permissions/feature.d.ts +14 -0
  959. package/features/accessManagement/permissions/feature.js +7 -0
  960. package/features/accessManagement/permissions/feature.js.map +1 -0
  961. package/features/accessManagement/roles/createRole/CreateRoleGateway.d.ts +12 -0
  962. package/features/accessManagement/roles/createRole/CreateRoleGateway.js +51 -0
  963. package/features/accessManagement/roles/createRole/CreateRoleGateway.js.map +1 -0
  964. package/features/accessManagement/roles/createRole/CreateRoleRepository.d.ts +13 -0
  965. package/features/accessManagement/roles/createRole/CreateRoleRepository.js +25 -0
  966. package/features/accessManagement/roles/createRole/CreateRoleRepository.js.map +1 -0
  967. package/features/accessManagement/roles/createRole/CreateRoleUseCase.d.ts +11 -0
  968. package/features/accessManagement/roles/createRole/CreateRoleUseCase.js +18 -0
  969. package/features/accessManagement/roles/createRole/CreateRoleUseCase.js.map +1 -0
  970. package/features/accessManagement/roles/createRole/abstractions.d.ts +29 -0
  971. package/features/accessManagement/roles/createRole/abstractions.js +7 -0
  972. package/features/accessManagement/roles/createRole/abstractions.js.map +1 -0
  973. package/features/accessManagement/roles/createRole/feature.d.ts +3 -0
  974. package/features/accessManagement/roles/createRole/feature.js +21 -0
  975. package/features/accessManagement/roles/createRole/feature.js.map +1 -0
  976. package/features/accessManagement/roles/createRole/index.d.ts +3 -0
  977. package/features/accessManagement/roles/createRole/index.js +2 -0
  978. package/features/accessManagement/roles/deleteRole/DeleteRoleGateway.d.ts +11 -0
  979. package/features/accessManagement/roles/deleteRole/DeleteRoleGateway.js +40 -0
  980. package/features/accessManagement/roles/deleteRole/DeleteRoleGateway.js.map +1 -0
  981. package/features/accessManagement/roles/deleteRole/DeleteRoleRepository.d.ts +12 -0
  982. package/features/accessManagement/roles/deleteRole/DeleteRoleRepository.js +22 -0
  983. package/features/accessManagement/roles/deleteRole/DeleteRoleRepository.js.map +1 -0
  984. package/features/accessManagement/roles/deleteRole/DeleteRoleUseCase.d.ts +10 -0
  985. package/features/accessManagement/roles/deleteRole/DeleteRoleUseCase.js +18 -0
  986. package/features/accessManagement/roles/deleteRole/DeleteRoleUseCase.js.map +1 -0
  987. package/features/accessManagement/roles/deleteRole/abstractions.d.ts +21 -0
  988. package/features/accessManagement/roles/deleteRole/abstractions.js +7 -0
  989. package/features/accessManagement/roles/deleteRole/abstractions.js.map +1 -0
  990. package/features/accessManagement/roles/deleteRole/feature.d.ts +3 -0
  991. package/features/accessManagement/roles/deleteRole/feature.js +21 -0
  992. package/features/accessManagement/roles/deleteRole/feature.js.map +1 -0
  993. package/features/accessManagement/roles/deleteRole/index.d.ts +3 -0
  994. package/features/accessManagement/roles/deleteRole/index.js +2 -0
  995. package/features/accessManagement/roles/getRole/GetRoleGateway.d.ts +12 -0
  996. package/features/accessManagement/roles/getRole/GetRoleGateway.js +50 -0
  997. package/features/accessManagement/roles/getRole/GetRoleGateway.js.map +1 -0
  998. package/features/accessManagement/roles/getRole/GetRoleRepository.d.ts +11 -0
  999. package/features/accessManagement/roles/getRole/GetRoleRepository.js +18 -0
  1000. package/features/accessManagement/roles/getRole/GetRoleRepository.js.map +1 -0
  1001. package/features/accessManagement/roles/getRole/GetRoleUseCase.d.ts +11 -0
  1002. package/features/accessManagement/roles/getRole/GetRoleUseCase.js +18 -0
  1003. package/features/accessManagement/roles/getRole/GetRoleUseCase.js.map +1 -0
  1004. package/features/accessManagement/roles/getRole/abstractions.d.ts +22 -0
  1005. package/features/accessManagement/roles/getRole/abstractions.js +7 -0
  1006. package/features/accessManagement/roles/getRole/abstractions.js.map +1 -0
  1007. package/features/accessManagement/roles/getRole/feature.d.ts +3 -0
  1008. package/features/accessManagement/roles/getRole/feature.js +21 -0
  1009. package/features/accessManagement/roles/getRole/feature.js.map +1 -0
  1010. package/features/accessManagement/roles/getRole/index.d.ts +3 -0
  1011. package/features/accessManagement/roles/getRole/index.js +2 -0
  1012. package/features/accessManagement/roles/listRoles/ListRolesGateway.d.ts +11 -0
  1013. package/features/accessManagement/roles/listRoles/ListRolesGateway.js +45 -0
  1014. package/features/accessManagement/roles/listRoles/ListRolesGateway.js.map +1 -0
  1015. package/features/accessManagement/roles/listRoles/ListRolesRepository.d.ts +11 -0
  1016. package/features/accessManagement/roles/listRoles/ListRolesRepository.js +22 -0
  1017. package/features/accessManagement/roles/listRoles/ListRolesRepository.js.map +1 -0
  1018. package/features/accessManagement/roles/listRoles/ListRolesUseCase.d.ts +10 -0
  1019. package/features/accessManagement/roles/listRoles/ListRolesUseCase.js +18 -0
  1020. package/features/accessManagement/roles/listRoles/ListRolesUseCase.js.map +1 -0
  1021. package/features/accessManagement/roles/listRoles/abstractions.d.ts +30 -0
  1022. package/features/accessManagement/roles/listRoles/abstractions.js +8 -0
  1023. package/features/accessManagement/roles/listRoles/abstractions.js.map +1 -0
  1024. package/features/accessManagement/roles/listRoles/feature.d.ts +3 -0
  1025. package/features/accessManagement/roles/listRoles/feature.js +23 -0
  1026. package/features/accessManagement/roles/listRoles/feature.js.map +1 -0
  1027. package/features/accessManagement/roles/listRoles/index.d.ts +3 -0
  1028. package/features/accessManagement/roles/listRoles/index.js +2 -0
  1029. package/features/accessManagement/roles/updateRole/UpdateRoleGateway.d.ts +12 -0
  1030. package/features/accessManagement/roles/updateRole/UpdateRoleGateway.js +52 -0
  1031. package/features/accessManagement/roles/updateRole/UpdateRoleGateway.js.map +1 -0
  1032. package/features/accessManagement/roles/updateRole/UpdateRoleRepository.d.ts +13 -0
  1033. package/features/accessManagement/roles/updateRole/UpdateRoleRepository.js +23 -0
  1034. package/features/accessManagement/roles/updateRole/UpdateRoleRepository.js.map +1 -0
  1035. package/features/accessManagement/roles/updateRole/UpdateRoleUseCase.d.ts +11 -0
  1036. package/features/accessManagement/roles/updateRole/UpdateRoleUseCase.js +18 -0
  1037. package/features/accessManagement/roles/updateRole/UpdateRoleUseCase.js.map +1 -0
  1038. package/features/accessManagement/roles/updateRole/abstractions.d.ts +28 -0
  1039. package/features/accessManagement/roles/updateRole/abstractions.js +7 -0
  1040. package/features/accessManagement/roles/updateRole/abstractions.js.map +1 -0
  1041. package/features/accessManagement/roles/updateRole/feature.d.ts +3 -0
  1042. package/features/accessManagement/roles/updateRole/feature.js +21 -0
  1043. package/features/accessManagement/roles/updateRole/feature.js.map +1 -0
  1044. package/features/accessManagement/roles/updateRole/index.d.ts +3 -0
  1045. package/features/accessManagement/roles/updateRole/index.js +2 -0
  1046. package/features/accessManagement/teams/createTeam/CreateTeamGateway.d.ts +12 -0
  1047. package/features/accessManagement/teams/createTeam/CreateTeamGateway.js +55 -0
  1048. package/features/accessManagement/teams/createTeam/CreateTeamGateway.js.map +1 -0
  1049. package/features/accessManagement/teams/createTeam/CreateTeamRepository.d.ts +13 -0
  1050. package/features/accessManagement/teams/createTeam/CreateTeamRepository.js +25 -0
  1051. package/features/accessManagement/teams/createTeam/CreateTeamRepository.js.map +1 -0
  1052. package/features/accessManagement/teams/createTeam/CreateTeamUseCase.d.ts +11 -0
  1053. package/features/accessManagement/teams/createTeam/CreateTeamUseCase.js +18 -0
  1054. package/features/accessManagement/teams/createTeam/CreateTeamUseCase.js.map +1 -0
  1055. package/features/accessManagement/teams/createTeam/abstractions.d.ts +28 -0
  1056. package/features/accessManagement/teams/createTeam/abstractions.js +7 -0
  1057. package/features/accessManagement/teams/createTeam/abstractions.js.map +1 -0
  1058. package/features/accessManagement/teams/createTeam/feature.d.ts +3 -0
  1059. package/features/accessManagement/teams/createTeam/feature.js +21 -0
  1060. package/features/accessManagement/teams/createTeam/feature.js.map +1 -0
  1061. package/features/accessManagement/teams/createTeam/index.d.ts +3 -0
  1062. package/features/accessManagement/teams/createTeam/index.js +2 -0
  1063. package/features/accessManagement/teams/deleteTeam/DeleteTeamGateway.d.ts +11 -0
  1064. package/features/accessManagement/teams/deleteTeam/DeleteTeamGateway.js +40 -0
  1065. package/features/accessManagement/teams/deleteTeam/DeleteTeamGateway.js.map +1 -0
  1066. package/features/accessManagement/teams/deleteTeam/DeleteTeamRepository.d.ts +12 -0
  1067. package/features/accessManagement/teams/deleteTeam/DeleteTeamRepository.js +22 -0
  1068. package/features/accessManagement/teams/deleteTeam/DeleteTeamRepository.js.map +1 -0
  1069. package/features/accessManagement/teams/deleteTeam/DeleteTeamUseCase.d.ts +10 -0
  1070. package/features/accessManagement/teams/deleteTeam/DeleteTeamUseCase.js +18 -0
  1071. package/features/accessManagement/teams/deleteTeam/DeleteTeamUseCase.js.map +1 -0
  1072. package/features/accessManagement/teams/deleteTeam/abstractions.d.ts +21 -0
  1073. package/features/accessManagement/teams/deleteTeam/abstractions.js +7 -0
  1074. package/features/accessManagement/teams/deleteTeam/abstractions.js.map +1 -0
  1075. package/features/accessManagement/teams/deleteTeam/feature.d.ts +3 -0
  1076. package/features/accessManagement/teams/deleteTeam/feature.js +21 -0
  1077. package/features/accessManagement/teams/deleteTeam/feature.js.map +1 -0
  1078. package/features/accessManagement/teams/deleteTeam/index.d.ts +3 -0
  1079. package/features/accessManagement/teams/deleteTeam/index.js +2 -0
  1080. package/features/accessManagement/teams/getTeam/GetTeamGateway.d.ts +12 -0
  1081. package/features/accessManagement/teams/getTeam/GetTeamGateway.js +54 -0
  1082. package/features/accessManagement/teams/getTeam/GetTeamGateway.js.map +1 -0
  1083. package/features/accessManagement/teams/getTeam/GetTeamRepository.d.ts +11 -0
  1084. package/features/accessManagement/teams/getTeam/GetTeamRepository.js +18 -0
  1085. package/features/accessManagement/teams/getTeam/GetTeamRepository.js.map +1 -0
  1086. package/features/accessManagement/teams/getTeam/GetTeamUseCase.d.ts +11 -0
  1087. package/features/accessManagement/teams/getTeam/GetTeamUseCase.js +18 -0
  1088. package/features/accessManagement/teams/getTeam/GetTeamUseCase.js.map +1 -0
  1089. package/features/accessManagement/teams/getTeam/abstractions.d.ts +22 -0
  1090. package/features/accessManagement/teams/getTeam/abstractions.js +7 -0
  1091. package/features/accessManagement/teams/getTeam/abstractions.js.map +1 -0
  1092. package/features/accessManagement/teams/getTeam/feature.d.ts +3 -0
  1093. package/features/accessManagement/teams/getTeam/feature.js +21 -0
  1094. package/features/accessManagement/teams/getTeam/feature.js.map +1 -0
  1095. package/features/accessManagement/teams/getTeam/index.d.ts +3 -0
  1096. package/features/accessManagement/teams/getTeam/index.js +2 -0
  1097. package/features/accessManagement/teams/listTeams/ListTeamsGateway.d.ts +11 -0
  1098. package/features/accessManagement/teams/listTeams/ListTeamsGateway.js +49 -0
  1099. package/features/accessManagement/teams/listTeams/ListTeamsGateway.js.map +1 -0
  1100. package/features/accessManagement/teams/listTeams/ListTeamsRepository.d.ts +11 -0
  1101. package/features/accessManagement/teams/listTeams/ListTeamsRepository.js +22 -0
  1102. package/features/accessManagement/teams/listTeams/ListTeamsRepository.js.map +1 -0
  1103. package/features/accessManagement/teams/listTeams/ListTeamsUseCase.d.ts +10 -0
  1104. package/features/accessManagement/teams/listTeams/ListTeamsUseCase.js +18 -0
  1105. package/features/accessManagement/teams/listTeams/ListTeamsUseCase.js.map +1 -0
  1106. package/features/accessManagement/teams/listTeams/abstractions.d.ts +30 -0
  1107. package/features/accessManagement/teams/listTeams/abstractions.js +8 -0
  1108. package/features/accessManagement/teams/listTeams/abstractions.js.map +1 -0
  1109. package/features/accessManagement/teams/listTeams/feature.d.ts +3 -0
  1110. package/features/accessManagement/teams/listTeams/feature.js +23 -0
  1111. package/features/accessManagement/teams/listTeams/feature.js.map +1 -0
  1112. package/features/accessManagement/teams/listTeams/index.d.ts +3 -0
  1113. package/features/accessManagement/teams/listTeams/index.js +2 -0
  1114. package/features/accessManagement/teams/updateTeam/UpdateTeamGateway.d.ts +12 -0
  1115. package/features/accessManagement/teams/updateTeam/UpdateTeamGateway.js +56 -0
  1116. package/features/accessManagement/teams/updateTeam/UpdateTeamGateway.js.map +1 -0
  1117. package/features/accessManagement/teams/updateTeam/UpdateTeamRepository.d.ts +13 -0
  1118. package/features/accessManagement/teams/updateTeam/UpdateTeamRepository.js +23 -0
  1119. package/features/accessManagement/teams/updateTeam/UpdateTeamRepository.js.map +1 -0
  1120. package/features/accessManagement/teams/updateTeam/UpdateTeamUseCase.d.ts +11 -0
  1121. package/features/accessManagement/teams/updateTeam/UpdateTeamUseCase.js +18 -0
  1122. package/features/accessManagement/teams/updateTeam/UpdateTeamUseCase.js.map +1 -0
  1123. package/features/accessManagement/teams/updateTeam/abstractions.d.ts +27 -0
  1124. package/features/accessManagement/teams/updateTeam/abstractions.js +7 -0
  1125. package/features/accessManagement/teams/updateTeam/abstractions.js.map +1 -0
  1126. package/features/accessManagement/teams/updateTeam/feature.d.ts +3 -0
  1127. package/features/accessManagement/teams/updateTeam/feature.js +21 -0
  1128. package/features/accessManagement/teams/updateTeam/feature.js.map +1 -0
  1129. package/features/accessManagement/teams/updateTeam/index.d.ts +3 -0
  1130. package/features/accessManagement/teams/updateTeam/index.js +2 -0
  1131. package/features/accessManagement/types.d.ts +34 -0
  1132. package/features/accessManagement/types.js +0 -0
  1133. package/features/apolloClient/abstraction.d.ts +5 -0
  1134. package/features/apolloClient/abstraction.js +5 -0
  1135. package/features/apolloClient/abstraction.js.map +1 -0
  1136. package/features/apolloClient/feature.d.ts +2 -0
  1137. package/features/apolloClient/feature.js +31 -0
  1138. package/features/apolloClient/feature.js.map +1 -0
  1139. package/features/buildParams/BuildParams.d.ts +9 -0
  1140. package/features/buildParams/BuildParams.js +24 -0
  1141. package/features/buildParams/BuildParams.js.map +1 -0
  1142. package/features/buildParams/abstractions.d.ts +15 -0
  1143. package/features/buildParams/abstractions.js +6 -0
  1144. package/features/buildParams/abstractions.js.map +1 -0
  1145. package/features/buildParams/feature.d.ts +1 -0
  1146. package/features/buildParams/feature.js +15 -0
  1147. package/features/buildParams/feature.js.map +1 -0
  1148. package/features/buildParams/index.d.ts +2 -0
  1149. package/features/buildParams/index.js +2 -0
  1150. package/features/clipboard/ClipboardService.d.ts +15 -0
  1151. package/features/clipboard/ClipboardService.js +51 -0
  1152. package/features/clipboard/ClipboardService.js.map +1 -0
  1153. package/features/clipboard/abstractions.d.ts +14 -0
  1154. package/features/clipboard/abstractions.js +5 -0
  1155. package/features/clipboard/abstractions.js.map +1 -0
  1156. package/features/clipboard/feature.d.ts +3 -0
  1157. package/features/clipboard/feature.js +17 -0
  1158. package/features/clipboard/feature.js.map +1 -0
  1159. package/features/clipboard/index.d.ts +2 -0
  1160. package/features/clipboard/index.js +2 -0
  1161. package/features/confirmation/Confirmation.d.ts +11 -0
  1162. package/features/confirmation/Confirmation.js +29 -0
  1163. package/features/confirmation/Confirmation.js.map +1 -0
  1164. package/features/confirmation/ConfirmationBridge.d.ts +1 -0
  1165. package/features/confirmation/ConfirmationBridge.js +20 -0
  1166. package/features/confirmation/ConfirmationBridge.js.map +1 -0
  1167. package/features/confirmation/abstractions.d.ts +15 -0
  1168. package/features/confirmation/abstractions.js +6 -0
  1169. package/features/confirmation/abstractions.js.map +1 -0
  1170. package/features/confirmation/feature.d.ts +1 -0
  1171. package/features/confirmation/feature.js +11 -0
  1172. package/features/confirmation/feature.js.map +1 -0
  1173. package/features/confirmation/index.d.ts +3 -0
  1174. package/features/confirmation/index.js +3 -0
  1175. package/features/fileUrlFormatter/abstractions.d.ts +6 -0
  1176. package/features/fileUrlFormatter/abstractions.js +5 -0
  1177. package/features/fileUrlFormatter/abstractions.js.map +1 -0
  1178. package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
  1179. package/features/formModel/ConditionRuleEvaluator.js +49 -0
  1180. package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
  1181. package/features/formModel/Field.d.ts +100 -0
  1182. package/features/formModel/Field.js +414 -0
  1183. package/features/formModel/Field.js.map +1 -0
  1184. package/features/formModel/FieldBuilder.d.ts +48 -0
  1185. package/features/formModel/FieldBuilder.js +167 -0
  1186. package/features/formModel/FieldBuilder.js.map +1 -0
  1187. package/features/formModel/FieldBuilder.test.d.ts +1 -0
  1188. package/features/formModel/FieldBuilder.test.js +236 -0
  1189. package/features/formModel/FieldBuilder.test.js.map +1 -0
  1190. package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
  1191. package/features/formModel/FieldBuilderRegistry.js +29 -0
  1192. package/features/formModel/FieldBuilderRegistry.js.map +1 -0
  1193. package/features/formModel/FocusManager.d.ts +14 -0
  1194. package/features/formModel/FocusManager.js +83 -0
  1195. package/features/formModel/FocusManager.js.map +1 -0
  1196. package/features/formModel/FormErrors.d.ts +10 -0
  1197. package/features/formModel/FormErrors.js +36 -0
  1198. package/features/formModel/FormErrors.js.map +1 -0
  1199. package/features/formModel/FormModel.d.ts +65 -0
  1200. package/features/formModel/FormModel.js +433 -0
  1201. package/features/formModel/FormModel.js.map +1 -0
  1202. package/features/formModel/FormModel.test.d.ts +1 -0
  1203. package/features/formModel/FormModel.test.js +4108 -0
  1204. package/features/formModel/FormModel.test.js.map +1 -0
  1205. package/features/formModel/FormModelFactory.d.ts +11 -0
  1206. package/features/formModel/FormModelFactory.js +33 -0
  1207. package/features/formModel/FormModelFactory.js.map +1 -0
  1208. package/features/formModel/FormView.d.ts +46 -0
  1209. package/features/formModel/FormView.js +206 -0
  1210. package/features/formModel/FormView.js.map +1 -0
  1211. package/features/formModel/LayoutBuilderFactory.d.ts +62 -0
  1212. package/features/formModel/LayoutBuilderFactory.js +369 -0
  1213. package/features/formModel/LayoutBuilderFactory.js.map +1 -0
  1214. package/features/formModel/LayoutMutator.d.ts +11 -0
  1215. package/features/formModel/LayoutMutator.js +135 -0
  1216. package/features/formModel/LayoutMutator.js.map +1 -0
  1217. package/features/formModel/LayoutResolver.d.ts +27 -0
  1218. package/features/formModel/LayoutResolver.js +220 -0
  1219. package/features/formModel/LayoutResolver.js.map +1 -0
  1220. package/features/formModel/ObjectField.d.ts +99 -0
  1221. package/features/formModel/ObjectField.js +603 -0
  1222. package/features/formModel/ObjectField.js.map +1 -0
  1223. package/features/formModel/PresenterErrors.d.ts +9 -0
  1224. package/features/formModel/PresenterErrors.js +32 -0
  1225. package/features/formModel/PresenterErrors.js.map +1 -0
  1226. package/features/formModel/Rules.test.d.ts +1 -0
  1227. package/features/formModel/Rules.test.js +324 -0
  1228. package/features/formModel/Rules.test.js.map +1 -0
  1229. package/features/formModel/abstractions.d.ts +779 -0
  1230. package/features/formModel/abstractions.js +8 -0
  1231. package/features/formModel/abstractions.js.map +1 -0
  1232. package/features/formModel/createFieldRenderer.d.ts +20 -0
  1233. package/features/formModel/createFieldRenderer.js +38 -0
  1234. package/features/formModel/createFieldRenderer.js.map +1 -0
  1235. package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
  1236. package/features/formModel/demo/FieldRenderersDemoPresenter.js +299 -0
  1237. package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
  1238. package/features/formModel/demo/FormModelDemo.d.ts +4 -0
  1239. package/features/formModel/demo/FormModelDemo.js +206 -0
  1240. package/features/formModel/demo/FormModelDemo.js.map +1 -0
  1241. package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
  1242. package/features/formModel/demo/FormModelDemoPresenter.js +140 -0
  1243. package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
  1244. package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
  1245. package/features/formModel/demo/FormModelPhase11Presenter.js +107 -0
  1246. package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
  1247. package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
  1248. package/features/formModel/demo/FormModelPhase8c1Presenter.js +69 -0
  1249. package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
  1250. package/features/formModel/feature.d.ts +3 -0
  1251. package/features/formModel/feature.js +33 -0
  1252. package/features/formModel/feature.js.map +1 -0
  1253. package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
  1254. package/features/formModel/fieldTypes/BooleanFieldType.js +26 -0
  1255. package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
  1256. package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
  1257. package/features/formModel/fieldTypes/DateTimeFieldType.js +246 -0
  1258. package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
  1259. package/features/formModel/fieldTypes/FileFieldType.d.ts +29 -0
  1260. package/features/formModel/fieldTypes/FileFieldType.js +56 -0
  1261. package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
  1262. package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
  1263. package/features/formModel/fieldTypes/FileUrlFieldType.js +23 -0
  1264. package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
  1265. package/features/formModel/fieldTypes/LexicalFieldType.d.ts +19 -0
  1266. package/features/formModel/fieldTypes/LexicalFieldType.js +23 -0
  1267. package/features/formModel/fieldTypes/LexicalFieldType.js.map +1 -0
  1268. package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
  1269. package/features/formModel/fieldTypes/NumberFieldType.js +28 -0
  1270. package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
  1271. package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
  1272. package/features/formModel/fieldTypes/ObjectFieldType.js +96 -0
  1273. package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
  1274. package/features/formModel/fieldTypes/PasswordFieldType.d.ts +18 -0
  1275. package/features/formModel/fieldTypes/PasswordFieldType.js +23 -0
  1276. package/features/formModel/fieldTypes/PasswordFieldType.js.map +1 -0
  1277. package/features/formModel/fieldTypes/PermissionsFieldType.d.ts +18 -0
  1278. package/features/formModel/fieldTypes/PermissionsFieldType.js +27 -0
  1279. package/features/formModel/fieldTypes/PermissionsFieldType.js.map +1 -0
  1280. package/features/formModel/fieldTypes/RolesMultiSelectFieldType.d.ts +18 -0
  1281. package/features/formModel/fieldTypes/RolesMultiSelectFieldType.js +24 -0
  1282. package/features/formModel/fieldTypes/RolesMultiSelectFieldType.js.map +1 -0
  1283. package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
  1284. package/features/formModel/fieldTypes/TextFieldType.js +23 -0
  1285. package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
  1286. package/features/formModel/fieldTypes/index.d.ts +11 -0
  1287. package/features/formModel/fieldTypes/index.js +11 -0
  1288. package/features/formModel/index.d.ts +23 -0
  1289. package/features/formModel/index.js +21 -0
  1290. package/features/formModel/renderers.d.ts +25 -0
  1291. package/features/formModel/renderers.js +25 -0
  1292. package/features/formModel/useFieldRenderers.d.ts +2 -0
  1293. package/features/formModel/useFieldRenderers.js +15 -0
  1294. package/features/formModel/useFieldRenderers.js.map +1 -0
  1295. package/features/formModel/useLayoutRenderers.d.ts +2 -0
  1296. package/features/formModel/useLayoutRenderers.js +15 -0
  1297. package/features/formModel/useLayoutRenderers.js.map +1 -0
  1298. package/features/listCache/ListCache.d.ts +31 -0
  1299. package/features/listCache/ListCache.js +58 -0
  1300. package/features/listCache/ListCache.js.map +1 -0
  1301. package/features/listCache/index.d.ts +2 -0
  1302. package/features/listCache/index.js +1 -0
  1303. package/features/newsletter/NewsletterSubscriptionService.d.ts +13 -0
  1304. package/features/newsletter/NewsletterSubscriptionService.js +36 -0
  1305. package/features/newsletter/NewsletterSubscriptionService.js.map +1 -0
  1306. package/features/newsletter/abstractions.d.ts +11 -0
  1307. package/features/newsletter/abstractions.js +5 -0
  1308. package/features/newsletter/abstractions.js.map +1 -0
  1309. package/features/newsletter/index.d.ts +1 -0
  1310. package/features/newsletter/index.js +1 -0
  1311. package/features/notifications/Notifications.d.ts +16 -0
  1312. package/features/notifications/Notifications.js +39 -0
  1313. package/features/notifications/Notifications.js.map +1 -0
  1314. package/features/notifications/NotificationsPresenter.d.ts +11 -0
  1315. package/features/notifications/NotificationsPresenter.js +27 -0
  1316. package/features/notifications/NotificationsPresenter.js.map +1 -0
  1317. package/features/notifications/NotificationsRenderer.d.ts +7 -0
  1318. package/features/notifications/NotificationsRenderer.js +38 -0
  1319. package/features/notifications/NotificationsRenderer.js.map +1 -0
  1320. package/features/notifications/abstractions.d.ts +38 -0
  1321. package/features/notifications/abstractions.js +6 -0
  1322. package/features/notifications/abstractions.js.map +1 -0
  1323. package/features/notifications/feature.d.ts +4 -0
  1324. package/features/notifications/feature.js +20 -0
  1325. package/features/notifications/feature.js.map +1 -0
  1326. package/features/notifications/index.d.ts +3 -0
  1327. package/features/notifications/index.js +3 -0
  1328. package/features/security/AuthenticationContext/AuthenticationContext.d.ts +15 -0
  1329. package/features/security/AuthenticationContext/AuthenticationContext.js +32 -0
  1330. package/features/security/AuthenticationContext/AuthenticationContext.js.map +1 -0
  1331. package/features/security/AuthenticationContext/GraphQLClientDecorator.d.ts +12 -0
  1332. package/features/security/AuthenticationContext/GraphQLClientDecorator.js +31 -0
  1333. package/features/security/AuthenticationContext/GraphQLClientDecorator.js.map +1 -0
  1334. package/features/security/AuthenticationContext/InternalIdTokenProvider.d.ts +10 -0
  1335. package/features/security/AuthenticationContext/InternalIdTokenProvider.js +20 -0
  1336. package/features/security/AuthenticationContext/InternalIdTokenProvider.js.map +1 -0
  1337. package/features/security/AuthenticationContext/abstractions.d.ts +26 -0
  1338. package/features/security/AuthenticationContext/abstractions.js +6 -0
  1339. package/features/security/AuthenticationContext/abstractions.js.map +1 -0
  1340. package/features/security/AuthenticationContext/feature.d.ts +3 -0
  1341. package/features/security/AuthenticationContext/feature.js +21 -0
  1342. package/features/security/AuthenticationContext/feature.js.map +1 -0
  1343. package/features/security/AuthenticationContext/index.d.ts +1 -0
  1344. package/features/security/AuthenticationContext/index.js +1 -0
  1345. package/features/security/AuthenticationContext/types.d.ts +11 -0
  1346. package/features/security/AuthenticationContext/types.js +0 -0
  1347. package/features/security/IdentityContext/IdentityContext.d.ts +13 -0
  1348. package/features/security/IdentityContext/IdentityContext.js +25 -0
  1349. package/features/security/IdentityContext/IdentityContext.js.map +1 -0
  1350. package/features/security/IdentityContext/abstractions.d.ts +10 -0
  1351. package/features/security/IdentityContext/abstractions.js +5 -0
  1352. package/features/security/IdentityContext/abstractions.js.map +1 -0
  1353. package/features/security/IdentityContext/feature.d.ts +3 -0
  1354. package/features/security/IdentityContext/feature.js +17 -0
  1355. package/features/security/IdentityContext/feature.js.map +1 -0
  1356. package/features/security/IdentityContext/index.d.ts +2 -0
  1357. package/features/security/IdentityContext/index.js +2 -0
  1358. package/features/security/LogIn/IdentityMapper.d.ts +9 -0
  1359. package/features/security/LogIn/IdentityMapper.js +14 -0
  1360. package/features/security/LogIn/IdentityMapper.js.map +1 -0
  1361. package/features/security/LogIn/LogInGateway.d.ts +11 -0
  1362. package/features/security/LogIn/LogInGateway.js +25 -0
  1363. package/features/security/LogIn/LogInGateway.js.map +1 -0
  1364. package/features/security/LogIn/LogInRepository.d.ts +14 -0
  1365. package/features/security/LogIn/LogInRepository.js +21 -0
  1366. package/features/security/LogIn/LogInRepository.js.map +1 -0
  1367. package/features/security/LogIn/LogInUseCase.d.ts +15 -0
  1368. package/features/security/LogIn/LogInUseCase.js +32 -0
  1369. package/features/security/LogIn/LogInUseCase.js.map +1 -0
  1370. package/features/security/LogIn/abstractions.d.ts +48 -0
  1371. package/features/security/LogIn/abstractions.js +8 -0
  1372. package/features/security/LogIn/abstractions.js.map +1 -0
  1373. package/features/security/LogIn/createLoginMutation.d.ts +1 -0
  1374. package/features/security/LogIn/createLoginMutation.js +48 -0
  1375. package/features/security/LogIn/createLoginMutation.js.map +1 -0
  1376. package/features/security/LogIn/feature.d.ts +3 -0
  1377. package/features/security/LogIn/feature.js +23 -0
  1378. package/features/security/LogIn/feature.js.map +1 -0
  1379. package/features/security/LogIn/index.d.ts +1 -0
  1380. package/features/security/LogIn/index.js +1 -0
  1381. package/features/security/LogOut/LogOutUseCase.d.ts +13 -0
  1382. package/features/security/LogOut/LogOutUseCase.js +25 -0
  1383. package/features/security/LogOut/LogOutUseCase.js.map +1 -0
  1384. package/features/security/LogOut/abstractions.d.ts +7 -0
  1385. package/features/security/LogOut/abstractions.js +5 -0
  1386. package/features/security/LogOut/abstractions.js.map +1 -0
  1387. package/features/security/LogOut/feature.d.ts +3 -0
  1388. package/features/security/LogOut/feature.js +17 -0
  1389. package/features/security/LogOut/feature.js.map +1 -0
  1390. package/features/security/LogOut/index.d.ts +2 -0
  1391. package/features/security/LogOut/index.js +2 -0
  1392. package/features/security/SecurityFeature.d.ts +1 -0
  1393. package/features/security/SecurityFeature.js +17 -0
  1394. package/features/security/SecurityFeature.js.map +1 -0
  1395. package/features/telemetry/TelemetryService.d.ts +6 -0
  1396. package/features/telemetry/TelemetryService.js +19 -0
  1397. package/features/telemetry/TelemetryService.js.map +1 -0
  1398. package/features/telemetry/abstractions.d.ts +7 -0
  1399. package/features/telemetry/abstractions.js +5 -0
  1400. package/features/telemetry/abstractions.js.map +1 -0
  1401. package/features/telemetry/feature.d.ts +3 -0
  1402. package/features/telemetry/feature.js +17 -0
  1403. package/features/telemetry/feature.js.map +1 -0
  1404. package/features/telemetry/index.d.ts +2 -0
  1405. package/features/telemetry/index.js +2 -0
  1406. package/features/tenancy/GraphQLClientDecorator.d.ts +12 -0
  1407. package/features/tenancy/GraphQLClientDecorator.js +30 -0
  1408. package/features/tenancy/GraphQLClientDecorator.js.map +1 -0
  1409. package/features/tenancy/TenantContext.d.ts +17 -0
  1410. package/features/tenancy/TenantContext.js +57 -0
  1411. package/features/tenancy/TenantContext.js.map +1 -0
  1412. package/features/tenancy/abstractions.d.ts +14 -0
  1413. package/features/tenancy/abstractions.js +5 -0
  1414. package/features/tenancy/abstractions.js.map +1 -0
  1415. package/features/tenancy/feature.d.ts +5 -0
  1416. package/features/tenancy/feature.js +31 -0
  1417. package/features/tenancy/feature.js.map +1 -0
  1418. package/features/tenancy/types.d.ts +4 -0
  1419. package/features/tenancy/types.js +0 -0
  1420. package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
  1421. package/features/tools/LexicalContext/LexicalContext.js +25 -0
  1422. package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
  1423. package/features/tools/LexicalContext/abstractions.d.ts +11 -0
  1424. package/features/tools/LexicalContext/abstractions.js +5 -0
  1425. package/features/tools/LexicalContext/abstractions.js.map +1 -0
  1426. package/features/tools/LexicalContext/index.d.ts +2 -0
  1427. package/features/tools/LexicalContext/index.js +1 -0
  1428. package/features/tools/ToolPipelineRunner.d.ts +10 -0
  1429. package/features/tools/ToolPipelineRunner.js +35 -0
  1430. package/features/tools/ToolPipelineRunner.js.map +1 -0
  1431. package/features/tools/ToolRegistry.d.ts +12 -0
  1432. package/features/tools/ToolRegistry.js +38 -0
  1433. package/features/tools/ToolRegistry.js.map +1 -0
  1434. package/features/tools/abstractions.d.ts +28 -0
  1435. package/features/tools/abstractions.js +7 -0
  1436. package/features/tools/abstractions.js.map +1 -0
  1437. package/features/tools/feature.d.ts +4 -0
  1438. package/features/tools/feature.js +22 -0
  1439. package/features/tools/feature.js.map +1 -0
  1440. package/features/tools/index.d.ts +3 -0
  1441. package/features/tools/index.js +3 -0
  1442. package/features/wcp/ReactLicense.d.ts +27 -0
  1443. package/features/wcp/ReactLicense.js +71 -0
  1444. package/features/wcp/ReactLicense.js.map +1 -0
  1445. package/features/wcp/WcpGateway.d.ts +10 -0
  1446. package/features/wcp/WcpGateway.js +81 -0
  1447. package/features/wcp/WcpGateway.js.map +1 -0
  1448. package/features/wcp/WcpService.d.ts +20 -0
  1449. package/features/wcp/WcpService.js +74 -0
  1450. package/features/wcp/WcpService.js.map +1 -0
  1451. package/features/wcp/abstractions.d.ts +19 -0
  1452. package/features/wcp/abstractions.js +6 -0
  1453. package/features/wcp/abstractions.js.map +1 -0
  1454. package/features/wcp/feature.d.ts +3 -0
  1455. package/features/wcp/feature.js +19 -0
  1456. package/features/wcp/feature.js.map +1 -0
  1457. package/features/wcp/types.d.ts +21 -0
  1458. package/features/wcp/types.js +0 -0
  1459. package/features/webinySdk/WebinySdk.d.ts +11 -0
  1460. package/features/webinySdk/WebinySdk.js +28 -0
  1461. package/features/webinySdk/WebinySdk.js.map +1 -0
  1462. package/features/webinySdk/abstractions.d.ts +6 -0
  1463. package/features/webinySdk/abstractions.js +5 -0
  1464. package/features/webinySdk/abstractions.js.map +1 -0
  1465. package/features/webinySdk/feature.d.ts +3 -0
  1466. package/features/webinySdk/feature.js +17 -0
  1467. package/features/webinySdk/feature.js.map +1 -0
  1468. package/features/webinySdk/index.d.ts +2 -0
  1469. package/features/webinySdk/index.js +2 -0
  1470. package/hooks/index.d.ts +14 -0
  1471. package/hooks/index.js +14 -0
  1472. package/hooks/useConfirmationDialog.d.ts +5 -3
  1473. package/hooks/useConfirmationDialog.js +37 -50
  1474. package/hooks/useConfirmationDialog.js.map +1 -1
  1475. package/hooks/useDialog.d.ts +9 -10
  1476. package/hooks/useDialog.js +18 -31
  1477. package/hooks/useDialog.js.map +1 -1
  1478. package/hooks/useHotkeys.d.ts +9 -0
  1479. package/hooks/useHotkeys.js +68 -0
  1480. package/hooks/useHotkeys.js.map +1 -0
  1481. package/hooks/useIsMounted.d.ts +3 -0
  1482. package/hooks/useIsMounted.js +16 -0
  1483. package/hooks/useIsMounted.js.map +1 -0
  1484. package/hooks/useKeyHandler.d.ts +8 -0
  1485. package/hooks/useKeyHandler.js +56 -0
  1486. package/hooks/useKeyHandler.js.map +1 -0
  1487. package/hooks/useModKey.d.ts +1 -0
  1488. package/hooks/useModKey.js +24 -0
  1489. package/hooks/useModKey.js.map +1 -0
  1490. package/hooks/useNamedConfirmationDialog.d.ts +9 -0
  1491. package/hooks/useNamedConfirmationDialog.js +20 -0
  1492. package/hooks/useNamedConfirmationDialog.js.map +1 -0
  1493. package/hooks/useOpenDialog.d.ts +7 -0
  1494. package/hooks/useOpenDialog.js +18 -0
  1495. package/hooks/useOpenDialog.js.map +1 -0
  1496. package/hooks/useShiftKey.d.ts +5 -0
  1497. package/hooks/useShiftKey.js +42 -0
  1498. package/hooks/useShiftKey.js.map +1 -0
  1499. package/hooks/useSnackbar.d.ts +4 -0
  1500. package/hooks/useSnackbar.js +29 -32
  1501. package/hooks/useSnackbar.js.map +1 -1
  1502. package/hooks/useStateIfMounted.d.ts +1 -0
  1503. package/hooks/useStateIfMounted.js +18 -0
  1504. package/hooks/useStateIfMounted.js.map +1 -0
  1505. package/hooks/useStateWithCallback.d.ts +5 -0
  1506. package/hooks/useStateWithCallback.js +22 -0
  1507. package/hooks/useStateWithCallback.js.map +1 -0
  1508. package/hooks/useToggler.d.ts +7 -0
  1509. package/hooks/useToggler.js +16 -0
  1510. package/hooks/useToggler.js.map +1 -0
  1511. package/index.d.ts +93 -32
  1512. package/index.js +81 -313
  1513. package/lexical.css +2 -0
  1514. package/modules/AccessManagementExtension.d.ts +2 -0
  1515. package/modules/AccessManagementExtension.js +145 -0
  1516. package/modules/AccessManagementExtension.js.map +1 -0
  1517. package/package.json +81 -58
  1518. package/permissions/PermissionRenderer.d.ts +6 -0
  1519. package/permissions/PermissionRenderer.js +205 -0
  1520. package/permissions/PermissionRenderer.js.map +1 -0
  1521. package/permissions/PermissionValueContext.d.ts +11 -0
  1522. package/permissions/PermissionValueContext.js +16 -0
  1523. package/permissions/PermissionValueContext.js.map +1 -0
  1524. package/permissions/createHasPermission.d.ts +4 -0
  1525. package/permissions/createHasPermission.js +39 -0
  1526. package/permissions/createHasPermission.js.map +1 -0
  1527. package/permissions/createPermissionSchema.d.ts +2 -0
  1528. package/permissions/createPermissionSchema.js +9 -0
  1529. package/permissions/createPermissionSchema.js.map +1 -0
  1530. package/permissions/createPermissions.d.ts +6 -0
  1531. package/permissions/createPermissions.js +141 -0
  1532. package/permissions/createPermissions.js.map +1 -0
  1533. package/permissions/createPermissions.test.d.ts +1 -0
  1534. package/permissions/createPermissions.test.js +209 -0
  1535. package/permissions/createPermissions.test.js.map +1 -0
  1536. package/permissions/index.d.ts +9 -0
  1537. package/permissions/index.js +7 -0
  1538. package/permissions/types.d.ts +267 -0
  1539. package/permissions/types.js +0 -0
  1540. package/permissions/usePermissionForm.d.ts +17 -0
  1541. package/permissions/usePermissionForm.js +157 -0
  1542. package/permissions/usePermissionForm.js.map +1 -0
  1543. package/permissions/usePermissions.d.ts +4 -0
  1544. package/permissions/usePermissions.js +10 -0
  1545. package/permissions/usePermissions.js.map +1 -0
  1546. package/presentation/accessManagement/SecurityPermissions.d.ts +2 -0
  1547. package/presentation/accessManagement/SecurityPermissions.js +54 -0
  1548. package/presentation/accessManagement/SecurityPermissions.js.map +1 -0
  1549. package/presentation/accessManagement/apiKeys/ApiKeysDataSource.d.ts +13 -0
  1550. package/presentation/accessManagement/apiKeys/ApiKeysDataSource.js +23 -0
  1551. package/presentation/accessManagement/apiKeys/ApiKeysDataSource.js.map +1 -0
  1552. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.d.ts +38 -0
  1553. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +193 -0
  1554. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -0
  1555. package/presentation/accessManagement/apiKeys/abstractions.d.ts +25 -0
  1556. package/presentation/accessManagement/apiKeys/abstractions.js +5 -0
  1557. package/presentation/accessManagement/apiKeys/abstractions.js.map +1 -0
  1558. package/presentation/accessManagement/apiKeys/components/ApiKeysView.d.ts +4 -0
  1559. package/presentation/accessManagement/apiKeys/components/ApiKeysView.js +234 -0
  1560. package/presentation/accessManagement/apiKeys/components/ApiKeysView.js.map +1 -0
  1561. package/presentation/accessManagement/apiKeys/feature.d.ts +3 -0
  1562. package/presentation/accessManagement/apiKeys/feature.js +17 -0
  1563. package/presentation/accessManagement/apiKeys/feature.js.map +1 -0
  1564. package/presentation/accessManagement/roles/RolesDataSource.d.ts +13 -0
  1565. package/presentation/accessManagement/roles/RolesDataSource.js +23 -0
  1566. package/presentation/accessManagement/roles/RolesDataSource.js.map +1 -0
  1567. package/presentation/accessManagement/roles/RolesPresenter.d.ts +38 -0
  1568. package/presentation/accessManagement/roles/RolesPresenter.js +201 -0
  1569. package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -0
  1570. package/presentation/accessManagement/roles/abstractions.d.ts +27 -0
  1571. package/presentation/accessManagement/roles/abstractions.js +5 -0
  1572. package/presentation/accessManagement/roles/abstractions.js.map +1 -0
  1573. package/presentation/accessManagement/roles/components/RolesView.d.ts +4 -0
  1574. package/presentation/accessManagement/roles/components/RolesView.js +232 -0
  1575. package/presentation/accessManagement/roles/components/RolesView.js.map +1 -0
  1576. package/presentation/accessManagement/roles/feature.d.ts +3 -0
  1577. package/presentation/accessManagement/roles/feature.js +17 -0
  1578. package/presentation/accessManagement/roles/feature.js.map +1 -0
  1579. package/presentation/accessManagement/routes.d.ts +21 -0
  1580. package/presentation/accessManagement/routes.js +36 -0
  1581. package/presentation/accessManagement/routes.js.map +1 -0
  1582. package/presentation/accessManagement/teams/TeamsDataSource.d.ts +13 -0
  1583. package/presentation/accessManagement/teams/TeamsDataSource.js +23 -0
  1584. package/presentation/accessManagement/teams/TeamsDataSource.js.map +1 -0
  1585. package/presentation/accessManagement/teams/TeamsPresenter.d.ts +39 -0
  1586. package/presentation/accessManagement/teams/TeamsPresenter.js +200 -0
  1587. package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -0
  1588. package/presentation/accessManagement/teams/abstractions.d.ts +26 -0
  1589. package/presentation/accessManagement/teams/abstractions.js +5 -0
  1590. package/presentation/accessManagement/teams/abstractions.js.map +1 -0
  1591. package/presentation/accessManagement/teams/components/TeamsView.d.ts +4 -0
  1592. package/presentation/accessManagement/teams/components/TeamsView.js +214 -0
  1593. package/presentation/accessManagement/teams/components/TeamsView.js.map +1 -0
  1594. package/presentation/accessManagement/teams/feature.d.ts +3 -0
  1595. package/presentation/accessManagement/teams/feature.js +17 -0
  1596. package/presentation/accessManagement/teams/feature.js.map +1 -0
  1597. package/presentation/browserFilePicker/BrowserFilePicker.d.ts +3 -0
  1598. package/presentation/browserFilePicker/BrowserFilePicker.js +88 -0
  1599. package/presentation/browserFilePicker/BrowserFilePicker.js.map +1 -0
  1600. package/presentation/browserFilePicker/BrowserFilePickerPresenter.d.ts +10 -0
  1601. package/presentation/browserFilePicker/BrowserFilePickerPresenter.js +84 -0
  1602. package/presentation/browserFilePicker/BrowserFilePickerPresenter.js.map +1 -0
  1603. package/presentation/browserFilePicker/index.d.ts +3 -0
  1604. package/presentation/browserFilePicker/index.js +2 -0
  1605. package/presentation/browserFilePicker/types.d.ts +53 -0
  1606. package/presentation/browserFilePicker/types.js +0 -0
  1607. package/presentation/browserFilePicker/utils.d.ts +2 -0
  1608. package/presentation/browserFilePicker/utils.js +16 -0
  1609. package/presentation/browserFilePicker/utils.js.map +1 -0
  1610. package/presentation/buildParams/useBuildParams.d.ts +1 -0
  1611. package/presentation/buildParams/useBuildParams.js +6 -0
  1612. package/presentation/buildParams/useBuildParams.js.map +1 -0
  1613. package/presentation/commandPalette/CommandPalettePresenter.d.ts +16 -0
  1614. package/presentation/commandPalette/CommandPalettePresenter.js +71 -0
  1615. package/presentation/commandPalette/CommandPalettePresenter.js.map +1 -0
  1616. package/presentation/commandPalette/abstractions.d.ts +62 -0
  1617. package/presentation/commandPalette/abstractions.js +7 -0
  1618. package/presentation/commandPalette/abstractions.js.map +1 -0
  1619. package/presentation/commandPalette/commands/CopyCurrentUrlCommand.d.ts +15 -0
  1620. package/presentation/commandPalette/commands/CopyCurrentUrlCommand.js +33 -0
  1621. package/presentation/commandPalette/commands/CopyCurrentUrlCommand.js.map +1 -0
  1622. package/presentation/commandPalette/commands/SendMessageCommand.d.ts +23 -0
  1623. package/presentation/commandPalette/commands/SendMessageCommand.js +66 -0
  1624. package/presentation/commandPalette/commands/SendMessageCommand.js.map +1 -0
  1625. package/presentation/commandPalette/commands/SignOutCommand.d.ts +18 -0
  1626. package/presentation/commandPalette/commands/SignOutCommand.js +37 -0
  1627. package/presentation/commandPalette/commands/SignOutCommand.js.map +1 -0
  1628. package/presentation/commandPalette/commands/feature.d.ts +5 -0
  1629. package/presentation/commandPalette/commands/feature.js +15 -0
  1630. package/presentation/commandPalette/commands/feature.js.map +1 -0
  1631. package/presentation/commandPalette/feature.d.ts +3 -0
  1632. package/presentation/commandPalette/feature.js +17 -0
  1633. package/presentation/commandPalette/feature.js.map +1 -0
  1634. package/presentation/commandPalette/index.d.ts +3 -0
  1635. package/presentation/commandPalette/index.js +2 -0
  1636. package/presentation/installation/components/SystemInstaller/SystemInstaller.d.ts +8 -0
  1637. package/presentation/installation/components/SystemInstaller/SystemInstaller.js +65 -0
  1638. package/presentation/installation/components/SystemInstaller/SystemInstaller.js.map +1 -0
  1639. package/presentation/installation/components/SystemInstaller/SystemInstallerProvider.d.ts +2 -0
  1640. package/presentation/installation/components/SystemInstaller/SystemInstallerProvider.js +12 -0
  1641. package/presentation/installation/components/SystemInstaller/SystemInstallerProvider.js.map +1 -0
  1642. package/presentation/installation/components/SystemInstaller/index.d.ts +1 -0
  1643. package/presentation/installation/components/SystemInstaller/index.js +1 -0
  1644. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.d.ts +8 -0
  1645. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +17 -0
  1646. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -0
  1647. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/usePasswordValidator.d.ts +1 -0
  1648. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/usePasswordValidator.js +16 -0
  1649. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/usePasswordValidator.js.map +1 -0
  1650. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep.d.ts +7 -0
  1651. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep.js +69 -0
  1652. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep.js.map +1 -0
  1653. package/presentation/installation/components/SystemInstaller/steps/BasicInfoStep.d.ts +7 -0
  1654. package/presentation/installation/components/SystemInstaller/steps/BasicInfoStep.js +85 -0
  1655. package/presentation/installation/components/SystemInstaller/steps/BasicInfoStep.js.map +1 -0
  1656. package/presentation/installation/components/SystemInstaller/steps/Center.d.ts +4 -0
  1657. package/presentation/installation/components/SystemInstaller/steps/Center.js +7 -0
  1658. package/presentation/installation/components/SystemInstaller/steps/Center.js.map +1 -0
  1659. package/presentation/installation/components/SystemInstaller/steps/Container.d.ts +8 -0
  1660. package/presentation/installation/components/SystemInstaller/steps/Container.js +22 -0
  1661. package/presentation/installation/components/SystemInstaller/steps/Container.js.map +1 -0
  1662. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleRestartInstallation.d.ts +1 -0
  1663. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleRestartInstallation.js +6 -0
  1664. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleRestartInstallation.js.map +1 -0
  1665. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.d.ts +2 -0
  1666. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.js +27 -0
  1667. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.js.map +1 -0
  1668. package/presentation/installation/components/SystemInstaller/steps/FinishSetup.d.ts +11 -0
  1669. package/presentation/installation/components/SystemInstaller/steps/FinishSetup.js +53 -0
  1670. package/presentation/installation/components/SystemInstaller/steps/FinishSetup.js.map +1 -0
  1671. package/presentation/installation/components/SystemInstaller/steps/IntroductionStep.d.ts +7 -0
  1672. package/presentation/installation/components/SystemInstaller/steps/IntroductionStep.js +18 -0
  1673. package/presentation/installation/components/SystemInstaller/steps/IntroductionStep.js.map +1 -0
  1674. package/presentation/installation/components/SystemInstaller/steps/introduction.js +723 -0
  1675. package/presentation/installation/components/SystemInstaller/steps/introduction.js.map +1 -0
  1676. package/presentation/installation/components/SystemInstaller/steps/introduction.svg +154 -0
  1677. package/presentation/installation/components/SystemInstaller/steps/referralSources.d.ts +1 -0
  1678. package/presentation/installation/components/SystemInstaller/steps/referralSources.js +16 -0
  1679. package/presentation/installation/components/SystemInstaller/steps/referralSources.js.map +1 -0
  1680. package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.d.ts +10 -0
  1681. package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.js +62 -0
  1682. package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.js.map +1 -0
  1683. package/presentation/installation/presenters/SystemInstaller/SystemInstallerPresenter.d.ts +26 -0
  1684. package/presentation/installation/presenters/SystemInstaller/SystemInstallerPresenter.js +137 -0
  1685. package/presentation/installation/presenters/SystemInstaller/SystemInstallerPresenter.js.map +1 -0
  1686. package/presentation/installation/presenters/SystemInstaller/SystemInstallerRepository.d.ts +11 -0
  1687. package/presentation/installation/presenters/SystemInstaller/SystemInstallerRepository.js +32 -0
  1688. package/presentation/installation/presenters/SystemInstaller/SystemInstallerRepository.js.map +1 -0
  1689. package/presentation/installation/presenters/SystemInstaller/abstractions.d.ts +59 -0
  1690. package/presentation/installation/presenters/SystemInstaller/abstractions.js +7 -0
  1691. package/presentation/installation/presenters/SystemInstaller/abstractions.js.map +1 -0
  1692. package/presentation/installation/presenters/SystemInstaller/feature.d.ts +3 -0
  1693. package/presentation/installation/presenters/SystemInstaller/feature.js +23 -0
  1694. package/presentation/installation/presenters/SystemInstaller/feature.js.map +1 -0
  1695. package/presentation/installation/presenters/SystemInstaller/index.d.ts +3 -0
  1696. package/presentation/installation/presenters/SystemInstaller/index.js +2 -0
  1697. package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
  1698. package/presentation/lexicalContext/useLexicalContext.js +17 -0
  1699. package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
  1700. package/presentation/listPresenter/FolderAwareDataSource.d.ts +50 -0
  1701. package/presentation/listPresenter/FolderAwareDataSource.js +135 -0
  1702. package/presentation/listPresenter/FolderAwareDataSource.js.map +1 -0
  1703. package/presentation/listPresenter/ListPresenter.d.ts +35 -0
  1704. package/presentation/listPresenter/ListPresenter.js +248 -0
  1705. package/presentation/listPresenter/ListPresenter.js.map +1 -0
  1706. package/presentation/listPresenter/ListPresenter.test.d.ts +1 -0
  1707. package/presentation/listPresenter/ListPresenter.test.js +816 -0
  1708. package/presentation/listPresenter/ListPresenter.test.js.map +1 -0
  1709. package/presentation/listPresenter/QueryMatcher.d.ts +56 -0
  1710. package/presentation/listPresenter/QueryMatcher.js +59 -0
  1711. package/presentation/listPresenter/QueryMatcher.js.map +1 -0
  1712. package/presentation/listPresenter/SelectionController.d.ts +21 -0
  1713. package/presentation/listPresenter/SelectionController.js +74 -0
  1714. package/presentation/listPresenter/SelectionController.js.map +1 -0
  1715. package/presentation/listPresenter/SimpleDataSource.d.ts +15 -0
  1716. package/presentation/listPresenter/SimpleDataSource.js +70 -0
  1717. package/presentation/listPresenter/SimpleDataSource.js.map +1 -0
  1718. package/presentation/listPresenter/abstractions.d.ts +116 -0
  1719. package/presentation/listPresenter/abstractions.js +5 -0
  1720. package/presentation/listPresenter/abstractions.js.map +1 -0
  1721. package/presentation/listPresenter/feature.d.ts +3 -0
  1722. package/presentation/listPresenter/feature.js +17 -0
  1723. package/presentation/listPresenter/feature.js.map +1 -0
  1724. package/presentation/listPresenter/index.d.ts +8 -0
  1725. package/presentation/listPresenter/index.js +5 -0
  1726. package/presentation/security/components/HasPermission.d.ts +10 -0
  1727. package/presentation/security/components/HasPermission.js +21 -0
  1728. package/presentation/security/components/HasPermission.js.map +1 -0
  1729. package/presentation/security/components/SecureRoute.d.ts +7 -0
  1730. package/presentation/security/components/SecureRoute.js +10 -0
  1731. package/presentation/security/components/SecureRoute.js.map +1 -0
  1732. package/presentation/security/hooks/useAuthentication.d.ts +9 -0
  1733. package/presentation/security/hooks/useAuthentication.js +18 -0
  1734. package/presentation/security/hooks/useAuthentication.js.map +1 -0
  1735. package/presentation/security/hooks/useIdentity.d.ts +6 -0
  1736. package/presentation/security/hooks/useIdentity.js +26 -0
  1737. package/presentation/security/hooks/useIdentity.js.map +1 -0
  1738. package/presentation/security/hooks/useSecurity.d.ts +10 -0
  1739. package/presentation/security/hooks/useSecurity.js +18 -0
  1740. package/presentation/security/hooks/useSecurity.js.map +1 -0
  1741. package/presentation/sortable/SortablePresenter.d.ts +23 -0
  1742. package/presentation/sortable/SortablePresenter.js +175 -0
  1743. package/presentation/sortable/SortablePresenter.js.map +1 -0
  1744. package/presentation/sortable/abstractions.d.ts +24 -0
  1745. package/presentation/sortable/abstractions.js +5 -0
  1746. package/presentation/sortable/abstractions.js.map +1 -0
  1747. package/presentation/sortable/feature.d.ts +1 -0
  1748. package/presentation/sortable/feature.js +11 -0
  1749. package/presentation/sortable/feature.js.map +1 -0
  1750. package/presentation/sortable/index.d.ts +2 -0
  1751. package/presentation/sortable/index.js +2 -0
  1752. package/presentation/tenancy/TenancyProvider.d.ts +6 -0
  1753. package/presentation/tenancy/TenancyProvider.js +30 -0
  1754. package/presentation/tenancy/TenancyProvider.js.map +1 -0
  1755. package/presentation/tenancy/createTenancyProvider.d.ts +1 -0
  1756. package/presentation/tenancy/createTenancyProvider.js +9 -0
  1757. package/presentation/tenancy/createTenancyProvider.js.map +1 -0
  1758. package/presentation/tenancy/useTenantContext.d.ts +5 -0
  1759. package/presentation/tenancy/useTenantContext.js +23 -0
  1760. package/presentation/tenancy/useTenantContext.js.map +1 -0
  1761. package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +30 -0
  1762. package/presentation/textToLexicalTool/TextToLexicalTool.js +31 -0
  1763. package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -0
  1764. package/presentation/textToLexicalTool/feature.d.ts +1 -0
  1765. package/presentation/textToLexicalTool/feature.js +11 -0
  1766. package/presentation/textToLexicalTool/feature.js.map +1 -0
  1767. package/presentation/textToLexicalTool/textToLexicalState.d.ts +6 -0
  1768. package/presentation/textToLexicalTool/textToLexicalState.js +31 -0
  1769. package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -0
  1770. package/presentation/trashBin/TrashBinDataSource.d.ts +16 -0
  1771. package/presentation/trashBin/TrashBinDataSource.js +82 -0
  1772. package/presentation/trashBin/TrashBinDataSource.js.map +1 -0
  1773. package/presentation/trashBin/TrashBinPresenter.d.ts +20 -0
  1774. package/presentation/trashBin/TrashBinPresenter.js +114 -0
  1775. package/presentation/trashBin/TrashBinPresenter.js.map +1 -0
  1776. package/presentation/trashBin/abstractions.d.ts +105 -0
  1777. package/presentation/trashBin/abstractions.js +9 -0
  1778. package/presentation/trashBin/abstractions.js.map +1 -0
  1779. package/presentation/trashBin/components/Actions/DeleteItemAction.d.ts +2 -0
  1780. package/presentation/trashBin/components/Actions/DeleteItemAction.js +20 -0
  1781. package/presentation/trashBin/components/Actions/DeleteItemAction.js.map +1 -0
  1782. package/presentation/trashBin/components/Actions/RestoreItemAction.d.ts +2 -0
  1783. package/presentation/trashBin/components/Actions/RestoreItemAction.js +19 -0
  1784. package/presentation/trashBin/components/Actions/RestoreItemAction.js.map +1 -0
  1785. package/presentation/trashBin/components/Actions/index.d.ts +2 -0
  1786. package/presentation/trashBin/components/Actions/index.js +2 -0
  1787. package/presentation/trashBin/components/BulkActions/DeleteItems.d.ts +4 -0
  1788. package/presentation/trashBin/components/BulkActions/DeleteItems.js +72 -0
  1789. package/presentation/trashBin/components/BulkActions/DeleteItems.js.map +1 -0
  1790. package/presentation/trashBin/components/BulkActions/RestoreItems.d.ts +4 -0
  1791. package/presentation/trashBin/components/BulkActions/RestoreItems.js +81 -0
  1792. package/presentation/trashBin/components/BulkActions/RestoreItems.js.map +1 -0
  1793. package/presentation/trashBin/components/BulkActions/RestoreItemsReportMessage.d.ts +5 -0
  1794. package/presentation/trashBin/components/BulkActions/RestoreItemsReportMessage.js +12 -0
  1795. package/presentation/trashBin/components/BulkActions/RestoreItemsReportMessage.js.map +1 -0
  1796. package/presentation/trashBin/components/BulkActions/index.d.ts +2 -0
  1797. package/presentation/trashBin/components/BulkActions/index.js +2 -0
  1798. package/presentation/trashBin/components/Cells/CellActions.d.ts +2 -0
  1799. package/presentation/trashBin/components/Cells/CellActions.js +18 -0
  1800. package/presentation/trashBin/components/Cells/CellActions.js.map +1 -0
  1801. package/presentation/trashBin/components/Cells/CellCreatedBy.d.ts +2 -0
  1802. package/presentation/trashBin/components/Cells/CellCreatedBy.js +11 -0
  1803. package/presentation/trashBin/components/Cells/CellCreatedBy.js.map +1 -0
  1804. package/presentation/trashBin/components/Cells/CellDeletedBy.d.ts +2 -0
  1805. package/presentation/trashBin/components/Cells/CellDeletedBy.js +11 -0
  1806. package/presentation/trashBin/components/Cells/CellDeletedBy.js.map +1 -0
  1807. package/presentation/trashBin/components/Cells/CellDeletedOn.d.ts +2 -0
  1808. package/presentation/trashBin/components/Cells/CellDeletedOn.js +14 -0
  1809. package/presentation/trashBin/components/Cells/CellDeletedOn.js.map +1 -0
  1810. package/presentation/trashBin/components/Cells/CellTitle.d.ts +2 -0
  1811. package/presentation/trashBin/components/Cells/CellTitle.js +21 -0
  1812. package/presentation/trashBin/components/Cells/CellTitle.js.map +1 -0
  1813. package/presentation/trashBin/components/Cells/index.d.ts +5 -0
  1814. package/presentation/trashBin/components/Cells/index.js +5 -0
  1815. package/presentation/trashBin/components/TrashBinConfigs.d.ts +2 -0
  1816. package/presentation/trashBin/components/TrashBinConfigs.js +55 -0
  1817. package/presentation/trashBin/components/TrashBinConfigs.js.map +1 -0
  1818. package/presentation/trashBin/components/TrashBinOverlay.d.ts +12 -0
  1819. package/presentation/trashBin/components/TrashBinOverlay.js +139 -0
  1820. package/presentation/trashBin/components/TrashBinOverlay.js.map +1 -0
  1821. package/presentation/trashBin/components/TrashBinTable.d.ts +2 -0
  1822. package/presentation/trashBin/components/TrashBinTable.js +48 -0
  1823. package/presentation/trashBin/components/TrashBinTable.js.map +1 -0
  1824. package/presentation/trashBin/configs/Browser/BulkAction.d.ts +34 -0
  1825. package/presentation/trashBin/configs/Browser/BulkAction.js +59 -0
  1826. package/presentation/trashBin/configs/Browser/BulkAction.js.map +1 -0
  1827. package/presentation/trashBin/configs/Browser/EntryAction.d.ts +18 -0
  1828. package/presentation/trashBin/configs/Browser/EntryAction.js +36 -0
  1829. package/presentation/trashBin/configs/Browser/EntryAction.js.map +1 -0
  1830. package/presentation/trashBin/configs/Browser/Table/Column.d.ts +16 -0
  1831. package/presentation/trashBin/configs/Browser/Table/Column.js +9 -0
  1832. package/presentation/trashBin/configs/Browser/Table/Column.js.map +1 -0
  1833. package/presentation/trashBin/configs/Browser/Table/Sorting.d.ts +5 -0
  1834. package/presentation/trashBin/configs/Browser/Table/Sorting.js +6 -0
  1835. package/presentation/trashBin/configs/Browser/Table/Sorting.js.map +1 -0
  1836. package/presentation/trashBin/configs/Browser/Table/index.d.ts +18 -0
  1837. package/presentation/trashBin/configs/Browser/Table/index.js +9 -0
  1838. package/presentation/trashBin/configs/Browser/Table/index.js.map +1 -0
  1839. package/presentation/trashBin/configs/Browser/index.d.ts +40 -0
  1840. package/presentation/trashBin/configs/Browser/index.js +11 -0
  1841. package/presentation/trashBin/configs/Browser/index.js.map +1 -0
  1842. package/presentation/trashBin/configs/TrashBinListConfig.d.ts +46 -0
  1843. package/presentation/trashBin/configs/TrashBinListConfig.js +43 -0
  1844. package/presentation/trashBin/configs/TrashBinListConfig.js.map +1 -0
  1845. package/presentation/trashBin/configs/index.d.ts +1 -0
  1846. package/presentation/trashBin/configs/index.js +1 -0
  1847. package/presentation/trashBin/feature.d.ts +3 -0
  1848. package/presentation/trashBin/feature.js +17 -0
  1849. package/presentation/trashBin/feature.js.map +1 -0
  1850. package/presentation/trashBin/hooks/index.d.ts +4 -0
  1851. package/presentation/trashBin/hooks/index.js +4 -0
  1852. package/presentation/trashBin/hooks/useDeleteTrashBinItem.d.ts +8 -0
  1853. package/presentation/trashBin/hooks/useDeleteTrashBinItem.js +33 -0
  1854. package/presentation/trashBin/hooks/useDeleteTrashBinItem.js.map +1 -0
  1855. package/presentation/trashBin/hooks/useRestoreTrashBinItem.d.ts +8 -0
  1856. package/presentation/trashBin/hooks/useRestoreTrashBinItem.js +35 -0
  1857. package/presentation/trashBin/hooks/useRestoreTrashBinItem.js.map +1 -0
  1858. package/presentation/trashBin/hooks/useTrashBinItem.d.ts +11 -0
  1859. package/presentation/trashBin/hooks/useTrashBinItem.js +7 -0
  1860. package/presentation/trashBin/hooks/useTrashBinItem.js.map +1 -0
  1861. package/presentation/trashBin/hooks/useTrashBinPresenter.d.ts +13 -0
  1862. package/presentation/trashBin/hooks/useTrashBinPresenter.js +7 -0
  1863. package/presentation/trashBin/hooks/useTrashBinPresenter.js.map +1 -0
  1864. package/presentation/trashBin/index.d.ts +6 -0
  1865. package/presentation/trashBin/index.js +6 -0
  1866. package/presentation/wcp/WcpProvider.d.ts +7 -0
  1867. package/presentation/wcp/WcpProvider.js +23 -0
  1868. package/presentation/wcp/WcpProvider.js.map +1 -0
  1869. package/presentation/wcp/useWcp.d.ts +2 -0
  1870. package/presentation/wcp/useWcp.js +17 -0
  1871. package/presentation/wcp/useWcp.js.map +1 -0
  1872. package/routes.d.ts +6 -0
  1873. package/routes.js +18 -0
  1874. package/routes.js.map +1 -0
  1875. package/static/svg/SecureRouteError.e8b15981.svg +1 -0
  1876. package/static/svg/add-18px.b3062af6.svg +3 -0
  1877. package/static/svg/arrow_drop_down-24px.da74d713.svg +4 -0
  1878. package/static/svg/attach_file_black_24dp.7fb13a7e.svg +1 -0
  1879. package/static/svg/baseline-menu-24px.071b179d.svg +4 -0
  1880. package/static/svg/baseline-notification_important-24px.29277e73.svg +4 -0
  1881. package/static/svg/baseline-security-24px.12e519cc.svg +4 -0
  1882. package/static/svg/file_download.afe3fbec.svg +1 -0
  1883. package/static/svg/file_upload.6865d820.svg +1 -0
  1884. package/static/svg/filter-24px.886d9ff0.svg +8 -0
  1885. package/static/svg/github-brands.6311f0fa.svg +1 -0
  1886. package/static/svg/highlight-24px.959a97f7.svg +1 -0
  1887. package/static/svg/icon-community.cd087355.svg +16 -0
  1888. package/static/svg/icon-documentation.a189d24c.svg +16 -0
  1889. package/static/svg/info.fe810b72.svg +1 -0
  1890. package/static/svg/insert_drive_file-24px.39d490eb.svg +1 -0
  1891. package/static/svg/insert_photo-24px.81a5f945.svg +1 -0
  1892. package/static/svg/introduction.108720aa.svg +154 -0
  1893. package/static/svg/label-24px.9deafa4f.svg +1 -0
  1894. package/static/svg/round-account_circle-24px.f0b48cb7.svg +1 -0
  1895. package/static/svg/round-add-24px.4a5219b4.svg +16 -0
  1896. package/static/svg/round-arrow_drop_down-24px.5fdf92d1.svg +1 -0
  1897. package/static/svg/round-chevron_right-24px.34936511.svg +12 -0
  1898. package/static/svg/round-feedback-24px.4dae7231.svg +54 -0
  1899. package/static/svg/round-help-24px.a61b1d66.svg +1 -0
  1900. package/static/svg/round-invert_colors-24px.a229a1dd.svg +52 -0
  1901. package/static/svg/round-keyboard_arrow_down-24px.6febe804.svg +16 -0
  1902. package/static/svg/round-keyboard_arrow_up-24px.b1f7db34.svg +16 -0
  1903. package/static/svg/round-lock_open-24px.d527f6a5.svg +60 -0
  1904. package/static/svg/round-more_vert-24px.68d41b07.svg +12 -0
  1905. package/static/svg/round-open_in_new-24px.be5b4ddd.svg +44 -0
  1906. package/static/svg/round-settings-24px.c0b3056f.svg +4 -0
  1907. package/static/svg/search-24px.3c0f88dd.svg +20 -0
  1908. package/static/svg/slack-logo.7ee35e7f.svg +1 -0
  1909. package/static/svg/today-24px.df206362.svg +1 -0
  1910. package/static/svg/touch_app.debf3744.svg +1 -0
  1911. package/static/svg/wby-horizontal.03327bf6.svg +23 -0
  1912. package/static/svg/wby-square.ff8f47c3.svg +3 -0
  1913. package/static/svg/webiny-logo.ef56725c.svg +20 -0
  1914. package/static/svg/webiny-orange-logo.4eccf0f2.svg +20 -0
  1915. package/styles.scss +7 -2
  1916. package/types.d.ts +6 -86
  1917. package/types.js +0 -5
  1918. package/assets/images/icons.png +0 -0
  1919. package/assets/images/icons_retina.png +0 -0
  1920. package/assets/images/swich.png +0 -0
  1921. package/base/providers/TelemetryProvider.d.ts +0 -2
  1922. package/base/providers/TelemetryProvider.js +0 -31
  1923. package/base/providers/TelemetryProvider.js.map +0 -1
  1924. package/base/providers/ViewCompositionProvider.d.ts +0 -17
  1925. package/base/providers/ViewCompositionProvider.js +0 -57
  1926. package/base/providers/ViewCompositionProvider.js.map +0 -1
  1927. package/base/ui/LocaleSelector.d.ts +0 -2
  1928. package/base/ui/LocaleSelector.js +0 -15
  1929. package/base/ui/LocaleSelector.js.map +0 -1
  1930. package/base/ui/Menu.d.ts +0 -31
  1931. package/base/ui/Menu.js +0 -137
  1932. package/base/ui/Menu.js.map +0 -1
  1933. package/base/ui/Search.d.ts +0 -19
  1934. package/base/ui/Search.js +0 -63
  1935. package/base/ui/Search.js.map +0 -1
  1936. package/components/AppInstaller/AppInstaller.d.ts +0 -7
  1937. package/components/AppInstaller/AppInstaller.js +0 -117
  1938. package/components/AppInstaller/AppInstaller.js.map +0 -1
  1939. package/components/AppInstaller/Sidebar.d.ts +0 -9
  1940. package/components/AppInstaller/Sidebar.js +0 -145
  1941. package/components/AppInstaller/Sidebar.js.map +0 -1
  1942. package/components/AppInstaller/assets/sign-in-divider.svg +0 -19
  1943. package/components/AppInstaller/index.d.ts +0 -2
  1944. package/components/AppInstaller/index.js +0 -22
  1945. package/components/AppInstaller/index.js.map +0 -1
  1946. package/components/AppInstaller/styled.d.ts +0 -21
  1947. package/components/AppInstaller/styled.js +0 -87
  1948. package/components/AppInstaller/styled.js.map +0 -1
  1949. package/components/AppInstaller/useInstaller.d.ts +0 -25
  1950. package/components/AppInstaller/useInstaller.js +0 -210
  1951. package/components/AppInstaller/useInstaller.js.map +0 -1
  1952. package/components/FileManager/BottomInfoBar/SupportedFileTypes.d.ts +0 -6
  1953. package/components/FileManager/BottomInfoBar/SupportedFileTypes.js +0 -55
  1954. package/components/FileManager/BottomInfoBar/SupportedFileTypes.js.map +0 -1
  1955. package/components/FileManager/BottomInfoBar/UploadStatus.d.ts +0 -6
  1956. package/components/FileManager/BottomInfoBar/UploadStatus.js +0 -60
  1957. package/components/FileManager/BottomInfoBar/UploadStatus.js.map +0 -1
  1958. package/components/FileManager/BottomInfoBar.d.ts +0 -5
  1959. package/components/FileManager/BottomInfoBar.js +0 -60
  1960. package/components/FileManager/BottomInfoBar.js.map +0 -1
  1961. package/components/FileManager/DropFilesHere.d.ts +0 -10
  1962. package/components/FileManager/DropFilesHere.js +0 -76
  1963. package/components/FileManager/DropFilesHere.js.map +0 -1
  1964. package/components/FileManager/File.d.ts +0 -17
  1965. package/components/FileManager/File.js +0 -155
  1966. package/components/FileManager/File.js.map +0 -1
  1967. package/components/FileManager/FileDetails/Name.d.ts +0 -8
  1968. package/components/FileManager/FileDetails/Name.js +0 -138
  1969. package/components/FileManager/FileDetails/Name.js.map +0 -1
  1970. package/components/FileManager/FileDetails/Tags.d.ts +0 -10
  1971. package/components/FileManager/FileDetails/Tags.js +0 -339
  1972. package/components/FileManager/FileDetails/Tags.js.map +0 -1
  1973. package/components/FileManager/FileDetails.d.ts +0 -24
  1974. package/components/FileManager/FileDetails.js +0 -474
  1975. package/components/FileManager/FileDetails.js.map +0 -1
  1976. package/components/FileManager/FileManagerContext.d.ts +0 -42
  1977. package/components/FileManager/FileManagerContext.js +0 -224
  1978. package/components/FileManager/FileManagerContext.js.map +0 -1
  1979. package/components/FileManager/FileManagerView.d.ts +0 -18
  1980. package/components/FileManager/FileManagerView.js +0 -721
  1981. package/components/FileManager/FileManagerView.js.map +0 -1
  1982. package/components/FileManager/LeftSidebar.d.ts +0 -10
  1983. package/components/FileManager/LeftSidebar.js +0 -127
  1984. package/components/FileManager/LeftSidebar.js.map +0 -1
  1985. package/components/FileManager/NoPermissionView.d.ts +0 -3
  1986. package/components/FileManager/NoPermissionView.js +0 -87
  1987. package/components/FileManager/NoPermissionView.js.map +0 -1
  1988. package/components/FileManager/NoResults.d.ts +0 -3
  1989. package/components/FileManager/NoResults.js +0 -28
  1990. package/components/FileManager/NoResults.js.map +0 -1
  1991. package/components/FileManager/getFileTypePlugin.d.ts +0 -4
  1992. package/components/FileManager/getFileTypePlugin.js +0 -57
  1993. package/components/FileManager/getFileTypePlugin.js.map +0 -1
  1994. package/components/FileManager/getFileUploader.d.ts +0 -3
  1995. package/components/FileManager/getFileUploader.js +0 -20
  1996. package/components/FileManager/getFileUploader.js.map +0 -1
  1997. package/components/FileManager/graphql.d.ts +0 -96
  1998. package/components/FileManager/graphql.js +0 -58
  1999. package/components/FileManager/graphql.js.map +0 -1
  2000. package/components/FileManager/icons/content_copy-black-24px.svg +0 -1
  2001. package/components/FileManager/icons/delete.svg +0 -12
  2002. package/components/FileManager/icons/privacy_tip-24px.svg +0 -10
  2003. package/components/FileManager/icons/round-check_box-24px.svg +0 -4
  2004. package/components/FileManager/icons/round-check_box_outline_blank-24px.svg +0 -4
  2005. package/components/FileManager/icons/round-cloud_download-24px.svg +0 -4
  2006. package/components/FileManager/icons/round-cloud_upload-24px.svg +0 -4
  2007. package/components/FileManager/icons/round-description-24px.svg +0 -4
  2008. package/components/FileManager/icons/round-edit-24px.svg +0 -4
  2009. package/components/FileManager/icons/round-info-24px.svg +0 -4
  2010. package/components/FileManager/icons/round-label-24px.svg +0 -4
  2011. package/components/FileManager/icons/round-more_vert-24px.svg +0 -4
  2012. package/components/FileManager/icons/round-search-24px.svg +0 -20
  2013. package/components/FileManager/outputFileSelectionError.d.ts +0 -7
  2014. package/components/FileManager/outputFileSelectionError.js +0 -54
  2015. package/components/FileManager/outputFileSelectionError.js.map +0 -1
  2016. package/components/FileManager/types.d.ts +0 -21
  2017. package/components/FileManager/types.js +0 -5
  2018. package/components/FileManager/types.js.map +0 -1
  2019. package/components/FileManager.d.ts +0 -67
  2020. package/components/FileManager.js +0 -144
  2021. package/components/FileManager.js.map +0 -1
  2022. package/components/OverlayLayout/icons/close.svg +0 -13
  2023. package/components/OverlayLayout/icons/navigate_before.svg +0 -16
  2024. package/components/OverlayLayout/index.js.map +0 -1
  2025. package/components/Permissions/index.js.map +0 -1
  2026. package/components/RichTextEditor/RichTextEditor.d.ts +0 -3
  2027. package/components/RichTextEditor/RichTextEditor.js +0 -23
  2028. package/components/RichTextEditor/RichTextEditor.js.map +0 -1
  2029. package/components/RichTextEditor/index.d.ts +0 -2
  2030. package/components/RichTextEditor/index.js +0 -19
  2031. package/components/RichTextEditor/index.js.map +0 -1
  2032. package/components/RichTextEditor/styles.scss +0 -96
  2033. package/components/RichTextEditor/tools/header/index.d.ts +0 -229
  2034. package/components/RichTextEditor/tools/header/index.js +0 -691
  2035. package/components/RichTextEditor/tools/header/index.js.map +0 -1
  2036. package/components/RichTextEditor/tools/header/styles.scss +0 -48
  2037. package/components/RichTextEditor/tools/image/index.d.ts +0 -124
  2038. package/components/RichTextEditor/tools/image/index.js +0 -244
  2039. package/components/RichTextEditor/tools/image/index.js.map +0 -1
  2040. package/components/RichTextEditor/tools/image/styles.scss +0 -90
  2041. package/components/RichTextEditor/tools/image/svgs.d.ts +0 -6
  2042. package/components/RichTextEditor/tools/image/svgs.js +0 -12
  2043. package/components/RichTextEditor/tools/image/svgs.js.map +0 -1
  2044. package/components/RichTextEditor/tools/image/tunes.d.ts +0 -57
  2045. package/components/RichTextEditor/tools/image/tunes.js +0 -129
  2046. package/components/RichTextEditor/tools/image/tunes.js.map +0 -1
  2047. package/components/RichTextEditor/tools/image/types.d.ts +0 -29
  2048. package/components/RichTextEditor/tools/image/types.js +0 -5
  2049. package/components/RichTextEditor/tools/image/types.js.map +0 -1
  2050. package/components/RichTextEditor/tools/image/ui.d.ts +0 -122
  2051. package/components/RichTextEditor/tools/image/ui.js +0 -278
  2052. package/components/RichTextEditor/tools/image/ui.js.map +0 -1
  2053. package/components/RichTextEditor/tools/paragraph/index.d.ts +0 -209
  2054. package/components/RichTextEditor/tools/paragraph/index.js +0 -488
  2055. package/components/RichTextEditor/tools/paragraph/index.js.map +0 -1
  2056. package/components/RichTextEditor/tools/paragraph/styles.scss +0 -29
  2057. package/components/RichTextEditor/tools/textColor/index.d.ts +0 -64
  2058. package/components/RichTextEditor/tools/textColor/index.js +0 -245
  2059. package/components/RichTextEditor/tools/textColor/index.js.map +0 -1
  2060. package/components/RichTextEditor/tools/textColor/styles.scss +0 -21
  2061. package/components/RichTextEditor/tools/utils.d.ts +0 -19
  2062. package/components/RichTextEditor/tools/utils.js +0 -31
  2063. package/components/RichTextEditor/tools/utils.js.map +0 -1
  2064. package/components/Routes.d.ts +0 -6
  2065. package/components/Routes.js +0 -42
  2066. package/components/Routes.js.map +0 -1
  2067. package/components/SimpleForm/index.js.map +0 -1
  2068. package/components/SplitView/index.js.map +0 -1
  2069. package/components/index.js.map +0 -1
  2070. package/index.js.map +0 -1
  2071. package/plugins/FileManagerFileTypePlugin.d.ts +0 -33
  2072. package/plugins/FileManagerFileTypePlugin.js +0 -63
  2073. package/plugins/FileManagerFileTypePlugin.js.map +0 -1
  2074. package/plugins/MenuPlugin.d.ts +0 -37
  2075. package/plugins/MenuPlugin.js +0 -43
  2076. package/plugins/MenuPlugin.js.map +0 -1
  2077. package/plugins/PermissionRendererPlugin.d.ts +0 -22
  2078. package/plugins/PermissionRendererPlugin.js +0 -43
  2079. package/plugins/PermissionRendererPlugin.js.map +0 -1
  2080. package/plugins/fileManager/fileDefault.d.ts +0 -2
  2081. package/plugins/fileManager/fileDefault.js +0 -34
  2082. package/plugins/fileManager/fileDefault.js.map +0 -1
  2083. package/plugins/fileManager/fileImage/DeleteAction.d.ts +0 -7
  2084. package/plugins/fileManager/fileImage/DeleteAction.js +0 -83
  2085. package/plugins/fileManager/fileImage/DeleteAction.js.map +0 -1
  2086. package/plugins/fileManager/fileImage/EditAction.d.ts +0 -10
  2087. package/plugins/fileManager/fileImage/EditAction.js +0 -179
  2088. package/plugins/fileManager/fileImage/EditAction.js.map +0 -1
  2089. package/plugins/fileManager/fileImage/index.d.ts +0 -2
  2090. package/plugins/fileManager/fileImage/index.js +0 -46
  2091. package/plugins/fileManager/fileImage/index.js.map +0 -1
  2092. package/plugins/fileManager/icons/edit.svg +0 -17
  2093. package/plugins/fileManager/icons/round-description-24px.svg +0 -1
  2094. package/plugins/fileManager/index.d.ts +0 -2
  2095. package/plugins/fileManager/index.js +0 -21
  2096. package/plugins/fileManager/index.js.map +0 -1
  2097. package/plugins/globalSearch/SearchBar.d.ts +0 -15
  2098. package/plugins/globalSearch/SearchBar.js +0 -225
  2099. package/plugins/globalSearch/SearchBar.js.map +0 -1
  2100. package/plugins/globalSearch/SearchBarDropdown.d.ts +0 -23
  2101. package/plugins/globalSearch/SearchBarDropdown.js +0 -83
  2102. package/plugins/globalSearch/SearchBarDropdown.js.map +0 -1
  2103. package/plugins/globalSearch/icons/round-search-24px.svg +0 -20
  2104. package/plugins/globalSearch/index.d.ts +0 -7
  2105. package/plugins/globalSearch/index.js +0 -16
  2106. package/plugins/globalSearch/index.js.map +0 -1
  2107. package/plugins/globalSearch/styled.d.ts +0 -20
  2108. package/plugins/globalSearch/styled.js +0 -131
  2109. package/plugins/globalSearch/styled.js.map +0 -1
  2110. package/plugins/uiLayoutRenderer/index.d.ts +0 -2
  2111. package/plugins/uiLayoutRenderer/index.js +0 -61
  2112. package/plugins/uiLayoutRenderer/index.js.map +0 -1
  2113. package/styles/material-theme-assignments.scss +0 -350
  2114. package/styles/material.scss +0 -43
  2115. package/styles/theme.scss +0 -76
  2116. package/types.js.map +0 -1
  2117. package/ui/UIElement.d.ts +0 -2
  2118. package/ui/UIElement.js +0 -18
  2119. package/ui/UIElement.js.map +0 -1
  2120. package/ui/UILayout.d.ts +0 -1
  2121. package/ui/UILayout.js +0 -18
  2122. package/ui/UILayout.js.map +0 -1
  2123. package/ui/UIRenderer.d.ts +0 -2
  2124. package/ui/UIRenderer.js +0 -12
  2125. package/ui/UIRenderer.js.map +0 -1
  2126. package/ui/UIView.d.ts +0 -2
  2127. package/ui/UIView.js +0 -24
  2128. package/ui/UIView.js.map +0 -1
  2129. package/ui/elements/AccordionElement.d.ts +0 -27
  2130. package/ui/elements/AccordionElement.js +0 -84
  2131. package/ui/elements/AccordionElement.js.map +0 -1
  2132. package/ui/elements/ButtonElement.d.ts +0 -24
  2133. package/ui/elements/ButtonElement.js +0 -86
  2134. package/ui/elements/ButtonElement.js.map +0 -1
  2135. package/ui/elements/ButtonGroupElement.d.ts +0 -6
  2136. package/ui/elements/ButtonGroupElement.js +0 -48
  2137. package/ui/elements/ButtonGroupElement.js.map +0 -1
  2138. package/ui/elements/GenericElement.d.ts +0 -1
  2139. package/ui/elements/GenericElement.js +0 -16
  2140. package/ui/elements/GenericElement.js.map +0 -1
  2141. package/ui/elements/LabelElement.d.ts +0 -16
  2142. package/ui/elements/LabelElement.js +0 -46
  2143. package/ui/elements/LabelElement.js.map +0 -1
  2144. package/ui/elements/NavigationMenuElement.d.ts +0 -33
  2145. package/ui/elements/NavigationMenuElement.js +0 -144
  2146. package/ui/elements/NavigationMenuElement.js.map +0 -1
  2147. package/ui/elements/PanelElement.d.ts +0 -3
  2148. package/ui/elements/PanelElement.js +0 -22
  2149. package/ui/elements/PanelElement.js.map +0 -1
  2150. package/ui/elements/PlaceholderElement.d.ts +0 -6
  2151. package/ui/elements/PlaceholderElement.js +0 -33
  2152. package/ui/elements/PlaceholderElement.js.map +0 -1
  2153. package/ui/elements/SmallButtonElement.d.ts +0 -6
  2154. package/ui/elements/SmallButtonElement.js +0 -45
  2155. package/ui/elements/SmallButtonElement.js.map +0 -1
  2156. package/ui/elements/TypographyElement.d.ts +0 -13
  2157. package/ui/elements/TypographyElement.js +0 -48
  2158. package/ui/elements/TypographyElement.js.map +0 -1
  2159. package/ui/elements/ViewElement.d.ts +0 -1
  2160. package/ui/elements/ViewElement.js +0 -16
  2161. package/ui/elements/ViewElement.js.map +0 -1
  2162. package/ui/elements/form/DynamicFieldsetElement/DynamicFieldsetRowElement.d.ts +0 -6
  2163. package/ui/elements/form/DynamicFieldsetElement/DynamicFieldsetRowElement.js +0 -44
  2164. package/ui/elements/form/DynamicFieldsetElement/DynamicFieldsetRowElement.js.map +0 -1
  2165. package/ui/elements/form/DynamicFieldsetElement.d.ts +0 -43
  2166. package/ui/elements/form/DynamicFieldsetElement.js +0 -135
  2167. package/ui/elements/form/DynamicFieldsetElement.js.map +0 -1
  2168. package/ui/elements/form/FileManagerElement/EmptyStateElement.d.ts +0 -4
  2169. package/ui/elements/form/FileManagerElement/EmptyStateElement.js +0 -26
  2170. package/ui/elements/form/FileManagerElement/EmptyStateElement.js.map +0 -1
  2171. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.d.ts +0 -7
  2172. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.js +0 -73
  2173. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.js.map +0 -1
  2174. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.d.ts +0 -13
  2175. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.js +0 -104
  2176. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.js.map +0 -1
  2177. package/ui/elements/form/FileManagerElement/styled.d.ts +0 -27
  2178. package/ui/elements/form/FileManagerElement/styled.js +0 -115
  2179. package/ui/elements/form/FileManagerElement/styled.js.map +0 -1
  2180. package/ui/elements/form/FileManagerElement.d.ts +0 -24
  2181. package/ui/elements/form/FileManagerElement.js +0 -88
  2182. package/ui/elements/form/FileManagerElement.js.map +0 -1
  2183. package/ui/elements/form/FormElement.d.ts +0 -21
  2184. package/ui/elements/form/FormElement.js +0 -45
  2185. package/ui/elements/form/FormElement.js.map +0 -1
  2186. package/ui/elements/form/FormFieldElement.d.ts +0 -56
  2187. package/ui/elements/form/FormFieldElement.js +0 -173
  2188. package/ui/elements/form/FormFieldElement.js.map +0 -1
  2189. package/ui/elements/form/HiddenElement.d.ts +0 -6
  2190. package/ui/elements/form/HiddenElement.js +0 -47
  2191. package/ui/elements/form/HiddenElement.js.map +0 -1
  2192. package/ui/elements/form/InputElement.d.ts +0 -7
  2193. package/ui/elements/form/InputElement.js +0 -54
  2194. package/ui/elements/form/InputElement.js.map +0 -1
  2195. package/ui/elements/form/PasswordElement.d.ts +0 -6
  2196. package/ui/elements/form/PasswordElement.js +0 -51
  2197. package/ui/elements/form/PasswordElement.js.map +0 -1
  2198. package/ui/elements/form/README.md +0 -2
  2199. package/ui/elements/form/SelectElement.d.ts +0 -15
  2200. package/ui/elements/form/SelectElement.js +0 -69
  2201. package/ui/elements/form/SelectElement.js.map +0 -1
  2202. package/ui/elements/form/TextareaElement.d.ts +0 -15
  2203. package/ui/elements/form/TextareaElement.js +0 -55
  2204. package/ui/elements/form/TextareaElement.js.map +0 -1
  2205. package/ui/views/AdminView/ContentElement.d.ts +0 -4
  2206. package/ui/views/AdminView/ContentElement.js +0 -54
  2207. package/ui/views/AdminView/ContentElement.js.map +0 -1
  2208. package/ui/views/AdminView/HeaderElement.d.ts +0 -13
  2209. package/ui/views/AdminView/HeaderElement.js +0 -104
  2210. package/ui/views/AdminView/HeaderElement.js.map +0 -1
  2211. package/ui/views/AdminView/HeaderSectionCenterElement.d.ts +0 -6
  2212. package/ui/views/AdminView/HeaderSectionCenterElement.js +0 -42
  2213. package/ui/views/AdminView/HeaderSectionCenterElement.js.map +0 -1
  2214. package/ui/views/AdminView/HeaderSectionLeftElement.d.ts +0 -6
  2215. package/ui/views/AdminView/HeaderSectionLeftElement.js +0 -42
  2216. package/ui/views/AdminView/HeaderSectionLeftElement.js.map +0 -1
  2217. package/ui/views/AdminView/HeaderSectionRightElement.d.ts +0 -6
  2218. package/ui/views/AdminView/HeaderSectionRightElement.js +0 -42
  2219. package/ui/views/AdminView/HeaderSectionRightElement.js.map +0 -1
  2220. package/ui/views/AdminView/components/Dialog.d.ts +0 -2
  2221. package/ui/views/AdminView/components/Dialog.js +0 -46
  2222. package/ui/views/AdminView/components/Dialog.js.map +0 -1
  2223. package/ui/views/AdminView/components/Hamburger.d.ts +0 -3
  2224. package/ui/views/AdminView/components/Hamburger.js +0 -31
  2225. package/ui/views/AdminView/components/Hamburger.js.map +0 -1
  2226. package/ui/views/AdminView/components/Snackbar.d.ts +0 -3
  2227. package/ui/views/AdminView/components/Snackbar.js +0 -32
  2228. package/ui/views/AdminView/components/Snackbar.js.map +0 -1
  2229. package/ui/views/FormView/FormContainerElement.d.ts +0 -12
  2230. package/ui/views/FormView/FormContainerElement.js +0 -50
  2231. package/ui/views/FormView/FormContainerElement.js.map +0 -1
  2232. package/ui/views/FormView/FormContentElement.d.ts +0 -3
  2233. package/ui/views/FormView/FormContentElement.js +0 -22
  2234. package/ui/views/FormView/FormContentElement.js.map +0 -1
  2235. package/ui/views/FormView/FormFooterElement.d.ts +0 -6
  2236. package/ui/views/FormView/FormFooterElement.js +0 -49
  2237. package/ui/views/FormView/FormFooterElement.js.map +0 -1
  2238. package/ui/views/FormView/FormHeaderElement.d.ts +0 -14
  2239. package/ui/views/FormView/FormHeaderElement.js +0 -81
  2240. package/ui/views/FormView/FormHeaderElement.js.map +0 -1
  2241. package/ui/views/FormView.d.ts +0 -40
  2242. package/ui/views/FormView.js +0 -167
  2243. package/ui/views/FormView.js.map +0 -1
  2244. package/ui/views/OverlayView/ContentElement.d.ts +0 -6
  2245. package/ui/views/OverlayView/ContentElement.js +0 -42
  2246. package/ui/views/OverlayView/ContentElement.js.map +0 -1
  2247. package/ui/views/OverlayView/HeaderElement.d.ts +0 -24
  2248. package/ui/views/OverlayView/HeaderElement.js +0 -112
  2249. package/ui/views/OverlayView/HeaderElement.js.map +0 -1
  2250. package/ui/views/OverlayView/HeaderTitleElement.d.ts +0 -13
  2251. package/ui/views/OverlayView/HeaderTitleElement.js +0 -51
  2252. package/ui/views/OverlayView/HeaderTitleElement.js.map +0 -1
  2253. package/ui/views/OverlayView/useOverlayView.d.ts +0 -5
  2254. package/ui/views/OverlayView/useOverlayView.js +0 -44
  2255. package/ui/views/OverlayView/useOverlayView.js.map +0 -1
  2256. package/ui/views/OverlayView.d.ts +0 -29
  2257. package/ui/views/OverlayView.js +0 -165
  2258. package/ui/views/OverlayView.js.map +0 -1
  2259. package/ui/views/SplitView/SplitViewPanelElement.d.ts +0 -11
  2260. package/ui/views/SplitView/SplitViewPanelElement.js +0 -71
  2261. package/ui/views/SplitView/SplitViewPanelElement.js.map +0 -1
  2262. package/ui/views/SplitView.d.ts +0 -21
  2263. package/ui/views/SplitView.js +0 -122
  2264. package/ui/views/SplitView.js.map +0 -1
@@ -0,0 +1,4108 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { z } from "zod";
3
+ import { Container } from "@webiny/di";
4
+ import { FormModelFeature } from "./feature.js";
5
+ import { FormModelFactory } from "./abstractions.js";
6
+ function createForm(config) {
7
+ const container = new Container();
8
+ FormModelFeature.register(container);
9
+ return container.resolve(FormModelFactory).create(config);
10
+ }
11
+ function asRow(node) {
12
+ if ("row" !== node.type) throw new Error(`Expected row node, got "${node.type}"`);
13
+ return node;
14
+ }
15
+ function createBasicForm() {
16
+ return createForm({
17
+ fields: (fields)=>({
18
+ title: fields.text().label("Title").required("Title is required"),
19
+ path: fields.text().label("Path").required("Path is required")
20
+ })
21
+ });
22
+ }
23
+ describe("FormModel", ()=>{
24
+ describe("field creation", ()=>{
25
+ it("should create fields from builder definitions", ()=>{
26
+ const form = createBasicForm();
27
+ expect(form.field("title")).toBeDefined();
28
+ expect(form.field("path")).toBeDefined();
29
+ });
30
+ it("should throw on unknown field access", ()=>{
31
+ const form = createBasicForm();
32
+ expect(()=>form.field("unknown")).toThrow('Field "unknown" not found.');
33
+ });
34
+ });
35
+ describe("setValue / getValue", ()=>{
36
+ it("should set and get field values", ()=>{
37
+ const form = createBasicForm();
38
+ form.field("title").setValue("Hello");
39
+ expect(form.field("title").getValue()).toBe("Hello");
40
+ });
41
+ it("should default to null when no defaultValue is set", ()=>{
42
+ const form = createBasicForm();
43
+ expect(form.field("title").getValue()).toBeNull();
44
+ });
45
+ it("should use defaultValue when provided", ()=>{
46
+ const form = createForm({
47
+ fields: (fields)=>({
48
+ status: fields.text().defaultValue("draft")
49
+ })
50
+ });
51
+ expect(form.field("status").getValue()).toBe("draft");
52
+ });
53
+ });
54
+ describe("getData / setData", ()=>{
55
+ it("should return all field values including hidden", ()=>{
56
+ const form = createForm({
57
+ fields: (fields)=>({
58
+ title: fields.text().label("Title"),
59
+ pageType: fields.text().hidden().defaultValue("static")
60
+ })
61
+ });
62
+ form.field("title").setValue("Hello");
63
+ const data = form.getData();
64
+ expect(data).toEqual({
65
+ title: "Hello",
66
+ pageType: "static"
67
+ });
68
+ });
69
+ it("should hydrate fields from data object", ()=>{
70
+ const form = createBasicForm();
71
+ form.setData({
72
+ title: "My Page",
73
+ path: "/my-page"
74
+ });
75
+ expect(form.field("title").getValue()).toBe("My Page");
76
+ expect(form.field("path").getValue()).toBe("/my-page");
77
+ });
78
+ it("should ignore unknown fields in setData", ()=>{
79
+ const form = createBasicForm();
80
+ form.setData({
81
+ title: "Test",
82
+ unknown: "value"
83
+ });
84
+ expect(form.field("title").getValue()).toBe("Test");
85
+ expect(()=>form.field("unknown")).toThrow();
86
+ });
87
+ });
88
+ describe("isDirty", ()=>{
89
+ it("should not be dirty initially", ()=>{
90
+ const form = createBasicForm();
91
+ expect(form.isDirty).toBe(false);
92
+ });
93
+ it("should be dirty after setValue", ()=>{
94
+ const form = createBasicForm();
95
+ form.field("title").setValue("Changed");
96
+ expect(form.isDirty).toBe(true);
97
+ });
98
+ it("should not be dirty after setData", ()=>{
99
+ const form = createBasicForm();
100
+ form.setData({
101
+ title: "Loaded",
102
+ path: "/loaded"
103
+ });
104
+ expect(form.isDirty).toBe(false);
105
+ });
106
+ it("should not be dirty after reverting to baseline value", ()=>{
107
+ const form = createBasicForm();
108
+ form.setData({
109
+ title: "Original",
110
+ path: "/original"
111
+ });
112
+ form.field("title").setValue("Changed");
113
+ expect(form.isDirty).toBe(true);
114
+ form.field("title").setValue("Original");
115
+ expect(form.isDirty).toBe(false);
116
+ });
117
+ });
118
+ describe("reset", ()=>{
119
+ it("should revert values to setData baseline", ()=>{
120
+ const form = createBasicForm();
121
+ form.setData({
122
+ title: "Original",
123
+ path: "/original"
124
+ });
125
+ form.field("title").setValue("Changed");
126
+ form.reset();
127
+ expect(form.field("title").getValue()).toBe("Original");
128
+ expect(form.isDirty).toBe(false);
129
+ });
130
+ it("should clear validation state on reset", async ()=>{
131
+ const form = createBasicForm();
132
+ await form.validate();
133
+ expect(form.errors.length).toBeGreaterThan(0);
134
+ form.reset();
135
+ expect(form.errors).toEqual([]);
136
+ expect(form.isValid).toBeNull();
137
+ });
138
+ });
139
+ describe("validation", ()=>{
140
+ it("should fail validation for empty required fields", async ()=>{
141
+ const form = createBasicForm();
142
+ const valid = await form.validate();
143
+ expect(valid).toBe(false);
144
+ expect(form.isValid).toBe(false);
145
+ expect(form.errors).toHaveLength(2);
146
+ expect(form.errors[0].path).toBe("title");
147
+ expect(form.errors[0].message).toBe("Title is required");
148
+ expect(form.errors[1].path).toBe("path");
149
+ });
150
+ it("should pass validation when required fields have values", async ()=>{
151
+ const form = createBasicForm();
152
+ form.field("title").setValue("My Page");
153
+ form.field("path").setValue("/my-page");
154
+ const valid = await form.validate();
155
+ expect(valid).toBe(true);
156
+ expect(form.isValid).toBe(true);
157
+ expect(form.errors).toHaveLength(0);
158
+ });
159
+ it("should validate zod schemas", async ()=>{
160
+ const form = createForm({
161
+ fields: (fields)=>({
162
+ email: fields.text().label("Email").schema(z.string().email("Invalid email"))
163
+ })
164
+ });
165
+ form.field("email").setValue("not-an-email");
166
+ const valid = await form.validate();
167
+ expect(valid).toBe(false);
168
+ expect(form.errors[0].message).toBe("Invalid email");
169
+ });
170
+ it("should run required check before zod schema", async ()=>{
171
+ const form = createForm({
172
+ fields: (fields)=>({
173
+ email: fields.text().label("Email").required("Email is required").schema(z.string().email("Invalid email"))
174
+ })
175
+ });
176
+ const valid = await form.validate();
177
+ expect(valid).toBe(false);
178
+ expect(form.errors[0].message).toBe("Email is required");
179
+ });
180
+ it("should expose field-level validation in field.vm", async ()=>{
181
+ const form = createBasicForm();
182
+ await form.validate();
183
+ const titleVm = form.field("title").vm;
184
+ expect(titleVm.validation.isValid).toBe(false);
185
+ expect(titleVm.validation.message).toBe("Title is required");
186
+ });
187
+ it("isValid should be null before first validation", ()=>{
188
+ const form = createBasicForm();
189
+ expect(form.isValid).toBeNull();
190
+ });
191
+ });
192
+ describe("submit", ()=>{
193
+ it("should return data when valid", async ()=>{
194
+ const form = createBasicForm();
195
+ form.field("title").setValue("My Page");
196
+ form.field("path").setValue("/my-page");
197
+ const result = await form.submit();
198
+ expect(result).toEqual({
199
+ title: "My Page",
200
+ path: "/my-page"
201
+ });
202
+ });
203
+ it("should return false when invalid", async ()=>{
204
+ const form = createBasicForm();
205
+ const result = await form.submit();
206
+ expect(result).toBe(false);
207
+ });
208
+ });
209
+ describe("vm", ()=>{
210
+ it("should expose layout with field VMs", ()=>{
211
+ const form = createBasicForm();
212
+ const vm = form.vm;
213
+ expect(vm.layout).toHaveLength(2);
214
+ expect(vm.layout[0].type).toBe("row");
215
+ expect(asRow(vm.layout[0]).fields[0].name).toBe("title");
216
+ expect(asRow(vm.layout[1]).fields[0].name).toBe("path");
217
+ });
218
+ it("should exclude hidden fields from layout", ()=>{
219
+ const form = createForm({
220
+ fields: (fields)=>({
221
+ title: fields.text().label("Title"),
222
+ pageType: fields.text().hidden().defaultValue("static")
223
+ })
224
+ });
225
+ const vm = form.vm;
226
+ expect(vm.layout).toHaveLength(1);
227
+ expect(asRow(vm.layout[0]).fields[0].name).toBe("title");
228
+ });
229
+ it("should expose isDirty and isValid", ()=>{
230
+ const form = createBasicForm();
231
+ expect(form.vm.isDirty).toBe(false);
232
+ expect(form.vm.isValid).toBeNull();
233
+ });
234
+ it("should expose field onChange that calls setValue", ()=>{
235
+ const form = createBasicForm();
236
+ const fieldVM = asRow(form.vm.layout[0]).fields[0];
237
+ fieldVM.onChange("New Value");
238
+ expect(form.field("title").getValue()).toBe("New Value");
239
+ });
240
+ });
241
+ describe("layout", ()=>{
242
+ it("should generate default layout (one row per non-hidden field)", ()=>{
243
+ const form = createBasicForm();
244
+ expect(form.vm.layout).toHaveLength(2);
245
+ });
246
+ it("should use explicit layout when provided", ()=>{
247
+ const form = createForm({
248
+ fields: (fields)=>({
249
+ title: fields.text().label("Title"),
250
+ path: fields.text().label("Path")
251
+ }),
252
+ layout: (layout)=>[
253
+ layout.row("title", "path")
254
+ ]
255
+ });
256
+ expect(form.vm.layout).toHaveLength(1);
257
+ expect(asRow(form.vm.layout[0]).fields).toHaveLength(2);
258
+ });
259
+ it("should warn about orphan fields in explicit layout", ()=>{
260
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(()=>{});
261
+ createForm({
262
+ fields: (fields)=>({
263
+ title: fields.text().label("Title"),
264
+ path: fields.text().label("Path")
265
+ }),
266
+ layout: (layout)=>[
267
+ layout.row("title")
268
+ ]
269
+ });
270
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Field "path" is not in the layout'));
271
+ warnSpy.mockRestore();
272
+ });
273
+ it("should not warn about hidden orphan fields", ()=>{
274
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(()=>{});
275
+ createForm({
276
+ fields: (fields)=>({
277
+ title: fields.text().label("Title"),
278
+ pageType: fields.text().hidden().defaultValue("static")
279
+ }),
280
+ layout: (layout)=>[
281
+ layout.row("title")
282
+ ]
283
+ });
284
+ expect(warnSpy).not.toHaveBeenCalled();
285
+ warnSpy.mockRestore();
286
+ });
287
+ });
288
+ describe("beforeChange / afterChange", ()=>{
289
+ it("should run beforeChange pipeline in order, transforming value", ()=>{
290
+ const form = createForm({
291
+ fields: (fields)=>({
292
+ path: fields.text().label("Path").beforeChange((value)=>String(value).trim()).beforeChange((value)=>String(value).toLowerCase())
293
+ })
294
+ });
295
+ form.field("path").setValue(" Hello World ");
296
+ expect(form.field("path").getValue()).toBe("hello world");
297
+ });
298
+ it("should run afterChange after value is stored", ()=>{
299
+ const received = [];
300
+ const form = createForm({
301
+ fields: (fields)=>({
302
+ title: fields.text().label("Title").afterChange((value)=>{
303
+ received.push(value);
304
+ })
305
+ })
306
+ });
307
+ form.field("title").setValue("Hello");
308
+ expect(received).toEqual([
309
+ "Hello"
310
+ ]);
311
+ });
312
+ it("should pass transformed value to afterChange", ()=>{
313
+ const received = [];
314
+ const form = createForm({
315
+ fields: (fields)=>({
316
+ path: fields.text().label("Path").beforeChange((value)=>String(value).toLowerCase()).afterChange((value)=>{
317
+ received.push(value);
318
+ })
319
+ })
320
+ });
321
+ form.field("path").setValue("HELLO");
322
+ expect(form.field("path").getValue()).toBe("hello");
323
+ expect(received).toEqual([
324
+ "hello"
325
+ ]);
326
+ });
327
+ it("should not fire afterChange when value does not change (recursion guard)", ()=>{
328
+ const calls = [];
329
+ const form = createForm({
330
+ fields: (fields)=>({
331
+ title: fields.text().label("Title").beforeChange(()=>"constant").afterChange(()=>{
332
+ calls.push("afterChange");
333
+ })
334
+ })
335
+ });
336
+ form.field("title").setValue("anything");
337
+ expect(calls).toEqual([
338
+ "afterChange"
339
+ ]);
340
+ expect(form.field("title").getValue()).toBe("constant");
341
+ form.field("title").setValue("something else");
342
+ expect(calls).toEqual([
343
+ "afterChange"
344
+ ]);
345
+ });
346
+ it("should not trigger beforeChange or afterChange on setData", ()=>{
347
+ const calls = [];
348
+ const form = createForm({
349
+ fields: (fields)=>({
350
+ title: fields.text().label("Title").beforeChange((value)=>{
351
+ calls.push("before");
352
+ return value;
353
+ }).afterChange(()=>{
354
+ calls.push("after");
355
+ })
356
+ })
357
+ });
358
+ form.setData({
359
+ title: "Loaded"
360
+ });
361
+ expect(calls).toEqual([]);
362
+ expect(form.field("title").getValue()).toBe("Loaded");
363
+ });
364
+ it("should support cross-field afterChange triggering target field pipeline", ()=>{
365
+ const form = createForm({
366
+ fields: (fields)=>({
367
+ title: fields.text().label("Title").afterChange((value, { form })=>{
368
+ const path = "/" + String(value).toLowerCase().replace(/\s+/g, "-");
369
+ form.field("path").setValue(path);
370
+ }),
371
+ path: fields.text().label("Path").beforeChange((value)=>{
372
+ const str = String(value);
373
+ return str.startsWith("/") ? str : "/" + str;
374
+ })
375
+ })
376
+ });
377
+ form.field("title").setValue("Hello World");
378
+ expect(form.field("path").getValue()).toBe("/hello-world");
379
+ });
380
+ it("should allow appending callbacks to existing fields at runtime", ()=>{
381
+ const form = createForm({
382
+ fields: (fields)=>({
383
+ title: fields.text().label("Title")
384
+ })
385
+ });
386
+ const field = form.field("title");
387
+ field.addBeforeChange((value)=>String(value).toUpperCase());
388
+ field.setValue("hello");
389
+ expect(field.getValue()).toBe("HELLO");
390
+ });
391
+ it("should chain builder callbacks with runtime-appended callbacks", ()=>{
392
+ const form = createForm({
393
+ fields: (fields)=>({
394
+ path: fields.text().label("Path").beforeChange((value)=>String(value).trim())
395
+ })
396
+ });
397
+ form.field("path").addBeforeChange((value)=>String(value).toLowerCase());
398
+ form.field("path").setValue(" HELLO ");
399
+ expect(form.field("path").getValue()).toBe("hello");
400
+ });
401
+ it("should demonstrate title→path with path-dirty tracking", ()=>{
402
+ const form = createForm({
403
+ fields: (fields)=>({
404
+ title: fields.text().label("Title").required("Title is required").afterChange((value, { form })=>{
405
+ if (form.field("path").getValue()) return;
406
+ const slug = String(value).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
407
+ form.field("path").setValue("/" + slug);
408
+ }),
409
+ path: fields.text().label("Path").required("Path is required").beforeChange((value)=>{
410
+ const str = String(value);
411
+ return "/" + str.replace(/^\//, "").toLowerCase().replace(/[^a-z0-9/-]+/g, "-").replace(/^-|-$/g, "");
412
+ })
413
+ }),
414
+ layout: (layout)=>[
415
+ layout.row("title"),
416
+ layout.row("path")
417
+ ]
418
+ });
419
+ form.field("title").setValue("Hello World");
420
+ expect(form.field("path").getValue()).toBe("/hello-world");
421
+ form.field("path").setValue("/custom-path");
422
+ expect(form.field("path").getValue()).toBe("/custom-path");
423
+ form.field("title").setValue("New Title");
424
+ expect(form.field("path").getValue()).toBe("/custom-path");
425
+ });
426
+ });
427
+ describe("field with options", ()=>{
428
+ it("should resolve static options in field VM", ()=>{
429
+ const form = createForm({
430
+ fields: (fields)=>({
431
+ lang: fields.text().label("Language").options([
432
+ {
433
+ label: "English",
434
+ value: "en"
435
+ },
436
+ {
437
+ label: "German",
438
+ value: "de"
439
+ }
440
+ ])
441
+ })
442
+ });
443
+ const fieldVM = asRow(form.vm.layout[0]).fields[0];
444
+ expect(fieldVM.options).toEqual([
445
+ {
446
+ label: "English",
447
+ value: "en"
448
+ },
449
+ {
450
+ label: "German",
451
+ value: "de"
452
+ }
453
+ ]);
454
+ });
455
+ it("should resolve reactive options function in field VM", ()=>{
456
+ const form = createForm({
457
+ fields: (fields)=>({
458
+ lang: fields.text().label("Language").options(()=>[
459
+ {
460
+ label: "Dynamic",
461
+ value: "dynamic"
462
+ }
463
+ ])
464
+ })
465
+ });
466
+ const fieldVM = asRow(form.vm.layout[0]).fields[0];
467
+ expect(fieldVM.options).toEqual([
468
+ {
469
+ label: "Dynamic",
470
+ value: "dynamic"
471
+ }
472
+ ]);
473
+ });
474
+ });
475
+ describe("modifiers (Phase 3)", ()=>{
476
+ describe("form.fields() — add / replace / remove", ()=>{
477
+ it("should add a new field via form.fields()", ()=>{
478
+ const form = createBasicForm();
479
+ form.fields((fields)=>({
480
+ language: fields.text().label("Language").options([
481
+ {
482
+ label: "English",
483
+ value: "en"
484
+ },
485
+ {
486
+ label: "German",
487
+ value: "de"
488
+ }
489
+ ])
490
+ }));
491
+ expect(form.field("language")).toBeDefined();
492
+ expect(form.field("language").type).toBe("text");
493
+ expect(form.getData()).toHaveProperty("language");
494
+ });
495
+ it("should add a field that appears in getData but not layout until positioned", ()=>{
496
+ const form = createForm({
497
+ fields: (fields)=>({
498
+ title: fields.text().label("Title")
499
+ })
500
+ });
501
+ form.fields((fields)=>({
502
+ description: fields.text().label("Description")
503
+ }));
504
+ expect(form.getData()).toHaveProperty("description");
505
+ const fieldNames = form.vm.layout.map((row)=>asRow(row).fields[0].name);
506
+ expect(fieldNames).not.toContain("description");
507
+ form.layout((layout)=>[
508
+ layout.row("description").after("title")
509
+ ]);
510
+ const updatedNames = form.vm.layout.map((row)=>asRow(row).fields[0].name);
511
+ expect(updatedNames).toEqual([
512
+ "title",
513
+ "description"
514
+ ]);
515
+ });
516
+ it("should replace an existing field when key matches", ()=>{
517
+ const form = createBasicForm();
518
+ form.field("title").setValue("Old Value");
519
+ form.fields((fields)=>({
520
+ title: fields.text().label("Replaced Title").placeholder("New placeholder")
521
+ }));
522
+ expect(form.field("title").config.label).toBe("Replaced Title");
523
+ expect(form.field("title").config.placeholder).toBe("New placeholder");
524
+ expect(form.field("title").getValue()).toBeNull();
525
+ });
526
+ it("should remove a field via undefined", ()=>{
527
+ const form = createBasicForm();
528
+ form.fields(()=>({
529
+ path: void 0
530
+ }));
531
+ expect(()=>form.field("path")).toThrow('Field "path" not found.');
532
+ expect(form.getData()).not.toHaveProperty("path");
533
+ });
534
+ it("should remove a field via field.remove()", ()=>{
535
+ const form = createBasicForm();
536
+ form.field("path").remove();
537
+ expect(()=>form.field("path")).toThrow('Field "path" not found.');
538
+ expect(form.getData()).not.toHaveProperty("path");
539
+ });
540
+ it("should remove field from layout when removed via field.remove()", ()=>{
541
+ const form = createBasicForm();
542
+ expect(form.vm.layout).toHaveLength(2);
543
+ form.field("path").remove();
544
+ expect(form.vm.layout).toHaveLength(1);
545
+ expect(asRow(form.vm.layout[0]).fields[0].name).toBe("title");
546
+ });
547
+ it("should handle add + remove in the same fields() call", ()=>{
548
+ const form = createBasicForm();
549
+ form.fields((fields)=>({
550
+ path: void 0,
551
+ slug: fields.text().label("Slug")
552
+ }));
553
+ expect(()=>form.field("path")).toThrow();
554
+ expect(form.field("slug")).toBeDefined();
555
+ });
556
+ });
557
+ describe("form.field().setDisabled()", ()=>{
558
+ it("should disable a field via setDisabled(true)", ()=>{
559
+ const form = createBasicForm();
560
+ form.field("title").setDisabled(true);
561
+ expect(form.field("title").vm.disabled).toBe(true);
562
+ });
563
+ it("should re-enable a field via setDisabled(false)", ()=>{
564
+ const form = createBasicForm();
565
+ form.field("title").setDisabled(true);
566
+ form.field("title").setDisabled(false);
567
+ expect(form.field("title").vm.disabled).toBe(false);
568
+ });
569
+ });
570
+ describe("form.field().as() — type narrowing", ()=>{
571
+ it("should return the field when type matches", ()=>{
572
+ const form = createForm({
573
+ fields: (fields)=>({
574
+ lang: fields.text().label("Language").options([
575
+ {
576
+ label: "English",
577
+ value: "en"
578
+ }
579
+ ])
580
+ })
581
+ });
582
+ const textField = form.field("lang").as("text");
583
+ expect(textField).toBe(form.field("lang"));
584
+ });
585
+ it("should throw when type does not match", ()=>{
586
+ const form = createBasicForm();
587
+ expect(()=>form.field("title").as("boolean")).toThrow('Field "title" is type "text", not "boolean".');
588
+ });
589
+ });
590
+ describe("modifier appends callbacks to existing fields", ()=>{
591
+ it("should append beforeChange to an existing field", ()=>{
592
+ const form = createForm({
593
+ fields: (fields)=>({
594
+ path: fields.text().label("Path").beforeChange((value)=>String(value).trim())
595
+ })
596
+ });
597
+ form.field("path").addBeforeChange((value)=>String(value).toLowerCase());
598
+ form.field("path").setValue(" HELLO ");
599
+ expect(form.field("path").getValue()).toBe("hello");
600
+ });
601
+ it("should append afterChange to an existing field", ()=>{
602
+ const received = [];
603
+ const form = createForm({
604
+ fields: (fields)=>({
605
+ title: fields.text().label("Title"),
606
+ path: fields.text().label("Path")
607
+ })
608
+ });
609
+ form.field("title").addAfterChange((value, { form })=>{
610
+ received.push(value);
611
+ form.field("path").setValue("/" + String(value).toLowerCase());
612
+ });
613
+ form.field("title").setValue("Hello");
614
+ expect(received).toEqual([
615
+ "Hello"
616
+ ]);
617
+ expect(form.field("path").getValue()).toBe("/hello");
618
+ });
619
+ });
620
+ describe("layout positional modifiers", ()=>{
621
+ function createFormWithLayout() {
622
+ return createForm({
623
+ fields: (fields)=>({
624
+ title: fields.text().label("Title"),
625
+ path: fields.text().label("Path"),
626
+ description: fields.text().label("Description")
627
+ }),
628
+ layout: (layout)=>[
629
+ layout.row("title"),
630
+ layout.row("path"),
631
+ layout.row("description")
632
+ ]
633
+ });
634
+ }
635
+ it("should insert a row before a target", ()=>{
636
+ const form = createFormWithLayout();
637
+ form.fields((fields)=>({
638
+ language: fields.text().label("Language").options([])
639
+ }));
640
+ form.layout((layout)=>[
641
+ layout.row("language").before("path")
642
+ ]);
643
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
644
+ expect(names).toEqual([
645
+ "title",
646
+ "language",
647
+ "path",
648
+ "description"
649
+ ]);
650
+ });
651
+ it("should insert a row after a target", ()=>{
652
+ const form = createFormWithLayout();
653
+ form.fields((fields)=>({
654
+ language: fields.text().label("Language").options([])
655
+ }));
656
+ form.layout((layout)=>[
657
+ layout.row("language").after("path")
658
+ ]);
659
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
660
+ expect(names).toEqual([
661
+ "title",
662
+ "path",
663
+ "language",
664
+ "description"
665
+ ]);
666
+ });
667
+ it("should replace a target row", ()=>{
668
+ const form = createFormWithLayout();
669
+ form.fields((fields)=>({
670
+ slug: fields.text().label("Slug")
671
+ }));
672
+ form.layout((layout)=>[
673
+ layout.row("slug").replace("path")
674
+ ]);
675
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
676
+ expect(names).toEqual([
677
+ "title",
678
+ "slug",
679
+ "description"
680
+ ]);
681
+ });
682
+ it("should remove a field from layout", ()=>{
683
+ const form = createFormWithLayout();
684
+ form.layout((layout)=>{
685
+ layout.remove("path");
686
+ return [];
687
+ });
688
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
689
+ expect(names).toEqual([
690
+ "title",
691
+ "description"
692
+ ]);
693
+ });
694
+ it("should append when no position is specified", ()=>{
695
+ const form = createFormWithLayout();
696
+ form.fields((fields)=>({
697
+ language: fields.text().label("Language").options([])
698
+ }));
699
+ form.layout((layout)=>[
700
+ layout.row("language")
701
+ ]);
702
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
703
+ expect(names).toEqual([
704
+ "title",
705
+ "path",
706
+ "description",
707
+ "language"
708
+ ]);
709
+ });
710
+ it("should append when target is not found", ()=>{
711
+ const form = createFormWithLayout();
712
+ form.fields((fields)=>({
713
+ language: fields.text().label("Language").options([])
714
+ }));
715
+ form.layout((layout)=>[
716
+ layout.row("language").after("nonexistent")
717
+ ]);
718
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
719
+ expect(names).toEqual([
720
+ "title",
721
+ "path",
722
+ "description",
723
+ "language"
724
+ ]);
725
+ });
726
+ });
727
+ describe("IFormModifier integration", ()=>{
728
+ it("should support a full modifier workflow: add field + position in layout + append callbacks", ()=>{
729
+ const form = createForm({
730
+ fields: (fields)=>({
731
+ title: fields.text().label("Title").required("Title is required"),
732
+ path: fields.text().label("Path").required("Path is required").beforeChange((value)=>{
733
+ const str = String(value);
734
+ return "/" + str.replace(/^\//, "").toLowerCase().replace(/[^a-z0-9/-]+/g, "-").replace(/^-|-$/g, "");
735
+ })
736
+ }),
737
+ layout: (layout)=>[
738
+ layout.row("title"),
739
+ layout.row("path")
740
+ ]
741
+ });
742
+ const modifier = {
743
+ modify (form) {
744
+ form.fields((fields)=>({
745
+ language: fields.text().label("Language").options([
746
+ {
747
+ label: "English",
748
+ value: "en"
749
+ },
750
+ {
751
+ label: "German",
752
+ value: "de"
753
+ }
754
+ ]).afterChange((value, { form })=>{
755
+ const current = String(form.field("path").getValue() || "");
756
+ const stripped = current.replace(/^\/[a-z]{2}\//, "/");
757
+ if (value && "en" !== value) form.field("path").setValue("/" + value + stripped);
758
+ else form.field("path").setValue(stripped);
759
+ })
760
+ }));
761
+ form.layout((layout)=>[
762
+ layout.row("language").after("path")
763
+ ]);
764
+ }
765
+ };
766
+ modifier.modify(form);
767
+ const names = form.vm.layout.map((row)=>asRow(row).fields[0].name);
768
+ expect(names).toEqual([
769
+ "title",
770
+ "path",
771
+ "language"
772
+ ]);
773
+ form.field("path").setValue("/demo");
774
+ form.field("language").setValue("de");
775
+ expect(form.field("path").getValue()).toBe("/de/demo");
776
+ const data = form.getData();
777
+ expect(data.language).toBe("de");
778
+ });
779
+ });
780
+ });
781
+ describe("layout system expansion (Phase 5)", ()=>{
782
+ describe("separator", ()=>{
783
+ it("should include separator nodes in the resolved layout", ()=>{
784
+ const form = createForm({
785
+ fields: (fields)=>({
786
+ title: fields.text().label("Title"),
787
+ description: fields.text().label("Description")
788
+ }),
789
+ layout: (layout)=>[
790
+ layout.row("title"),
791
+ layout.separator(),
792
+ layout.row("description")
793
+ ]
794
+ });
795
+ const vm = form.vm;
796
+ expect(vm.layout).toHaveLength(3);
797
+ expect(vm.layout[0].type).toBe("row");
798
+ expect(vm.layout[1].type).toBe("separator");
799
+ expect(vm.layout[2].type).toBe("row");
800
+ });
801
+ it("should support separator via modifier layout API", ()=>{
802
+ const form = createForm({
803
+ fields: (fields)=>({
804
+ title: fields.text().label("Title"),
805
+ description: fields.text().label("Description")
806
+ }),
807
+ layout: (layout)=>[
808
+ layout.row("title"),
809
+ layout.row("description")
810
+ ]
811
+ });
812
+ form.layout((layout)=>[
813
+ layout.separator().after("title")
814
+ ]);
815
+ expect(form.vm.layout).toHaveLength(3);
816
+ expect(form.vm.layout[1].type).toBe("separator");
817
+ });
818
+ });
819
+ describe("tabs", ()=>{
820
+ function createFormWithTabs() {
821
+ return createForm({
822
+ fields: (fields)=>({
823
+ title: fields.text().label("Title"),
824
+ slug: fields.text().label("Slug"),
825
+ description: fields.text().label("Description"),
826
+ metaTitle: fields.text().label("Meta Title"),
827
+ metaDescription: fields.text().label("Meta Description")
828
+ }),
829
+ layout: (layout)=>[
830
+ layout.row("title", "slug"),
831
+ layout.tabs("settings").tab("general", (tab)=>{
832
+ tab.label("General").layout((layout)=>[
833
+ layout.row("description")
834
+ ]);
835
+ }).tab("seo", (tab)=>{
836
+ tab.label("SEO").description("Optimize how this page appears in search").layout((layout)=>[
837
+ layout.row("metaTitle"),
838
+ layout.row("metaDescription")
839
+ ]);
840
+ })
841
+ ]
842
+ });
843
+ }
844
+ it("should resolve tabs layout node with tab definitions", ()=>{
845
+ const form = createFormWithTabs();
846
+ const vm = form.vm;
847
+ expect(vm.layout).toHaveLength(2);
848
+ expect(vm.layout[0].type).toBe("row");
849
+ expect(vm.layout[1].type).toBe("tabs");
850
+ const tabsNode = vm.layout[1];
851
+ expect(tabsNode.id).toBe("settings");
852
+ expect(tabsNode.tabs).toHaveLength(2);
853
+ expect(tabsNode.tabs[0].id).toBe("general");
854
+ expect(tabsNode.tabs[0].label).toBe("General");
855
+ expect(tabsNode.tabs[1].id).toBe("seo");
856
+ expect(tabsNode.tabs[1].label).toBe("SEO");
857
+ expect(tabsNode.tabs[1].description).toBe("Optimize how this page appears in search");
858
+ });
859
+ it("should resolve fields inside tab layouts", ()=>{
860
+ const form = createFormWithTabs();
861
+ const tabsNode = form.vm.layout[1];
862
+ const generalTab = tabsNode.tabs[0];
863
+ expect(generalTab.layout).toHaveLength(1);
864
+ expect(generalTab.layout[0].type).toBe("row");
865
+ const generalRow = generalTab.layout[0];
866
+ expect(generalRow.fields[0].name).toBe("description");
867
+ const seoTab = tabsNode.tabs[1];
868
+ expect(seoTab.layout).toHaveLength(2);
869
+ });
870
+ it("should default activeTabId to the first tab", ()=>{
871
+ const form = createFormWithTabs();
872
+ const tabsNode = form.vm.layout[1];
873
+ expect(tabsNode.activeTabId).toBe("general");
874
+ });
875
+ it("should switch active tab via setActiveTab", ()=>{
876
+ const form = createFormWithTabs();
877
+ let tabsNode = form.vm.layout[1];
878
+ tabsNode.setActiveTab("seo");
879
+ tabsNode = form.vm.layout[1];
880
+ expect(tabsNode.activeTabId).toBe("seo");
881
+ });
882
+ it("should fall back to first tab when active tab ID is invalid", ()=>{
883
+ const form = createFormWithTabs();
884
+ let tabsNode = form.vm.layout[1];
885
+ tabsNode.setActiveTab("nonexistent");
886
+ tabsNode = form.vm.layout[1];
887
+ expect(tabsNode.activeTabId).toBe("general");
888
+ });
889
+ it("should compute hasErrors for tabs based on referenced fields", async ()=>{
890
+ const form = createForm({
891
+ fields: (fields)=>({
892
+ title: fields.text().label("Title").required("Title is required"),
893
+ metaTitle: fields.text().label("Meta Title").required("Required")
894
+ }),
895
+ layout: (layout)=>[
896
+ layout.tabs("settings").tab("general", (tab)=>{
897
+ tab.label("General").layout((layout)=>[
898
+ layout.row("title")
899
+ ]);
900
+ }).tab("seo", (tab)=>{
901
+ tab.label("SEO").layout((layout)=>[
902
+ layout.row("metaTitle")
903
+ ]);
904
+ })
905
+ ]
906
+ });
907
+ let tabsNode = form.vm.layout[0];
908
+ expect(tabsNode.tabs[0].hasErrors).toBe(false);
909
+ expect(tabsNode.tabs[1].hasErrors).toBe(false);
910
+ form.field("title").setValue("Hello");
911
+ await form.validate();
912
+ tabsNode = form.vm.layout[0];
913
+ expect(tabsNode.tabs[0].hasErrors).toBe(false);
914
+ expect(tabsNode.tabs[1].hasErrors).toBe(true);
915
+ });
916
+ it("should not warn about fields inside tabs as orphans", ()=>{
917
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(()=>{});
918
+ createForm({
919
+ fields: (fields)=>({
920
+ title: fields.text().label("Title"),
921
+ description: fields.text().label("Description")
922
+ }),
923
+ layout: (layout)=>[
924
+ layout.row("title"),
925
+ layout.tabs("settings").tab("general", (tab)=>{
926
+ tab.label("General").layout((layout)=>[
927
+ layout.row("description")
928
+ ]);
929
+ })
930
+ ]
931
+ });
932
+ expect(warnSpy).not.toHaveBeenCalled();
933
+ warnSpy.mockRestore();
934
+ });
935
+ it("should return null for tabs with empty tabs array", ()=>{
936
+ const form = createForm({
937
+ fields: (fields)=>({
938
+ title: fields.text().label("Title")
939
+ }),
940
+ layout: (layout)=>[
941
+ layout.row("title"),
942
+ layout.tabs("empty")
943
+ ]
944
+ });
945
+ expect(form.vm.layout).toHaveLength(1);
946
+ expect(form.vm.layout[0].type).toBe("row");
947
+ });
948
+ });
949
+ describe("element", ()=>{
950
+ it("should include element nodes in the resolved layout", ()=>{
951
+ const form = createForm({
952
+ fields: (fields)=>({
953
+ title: fields.text().label("Title")
954
+ }),
955
+ layout: (layout)=>[
956
+ layout.row("title"),
957
+ layout.element("usage-stats", {
958
+ plan: "enterprise"
959
+ })
960
+ ]
961
+ });
962
+ const vm = form.vm;
963
+ expect(vm.layout).toHaveLength(2);
964
+ expect(vm.layout[1].type).toBe("element");
965
+ const elementNode = vm.layout[1];
966
+ expect(elementNode.renderer).toBe("usage-stats");
967
+ expect(elementNode.props).toEqual({
968
+ plan: "enterprise"
969
+ });
970
+ });
971
+ it("should support element without props", ()=>{
972
+ const form = createForm({
973
+ fields: (fields)=>({
974
+ title: fields.text().label("Title")
975
+ }),
976
+ layout: (layout)=>[
977
+ layout.row("title"),
978
+ layout.element("divider")
979
+ ]
980
+ });
981
+ const elementNode = form.vm.layout[1];
982
+ expect(elementNode.renderer).toBe("divider");
983
+ expect(elementNode.props).toBeUndefined();
984
+ });
985
+ });
986
+ describe("named layout node access — form.layout(nodeId)", ()=>{
987
+ function createFormWithTabs() {
988
+ return createForm({
989
+ fields: (fields)=>({
990
+ title: fields.text().label("Title"),
991
+ description: fields.text().label("Description"),
992
+ metaTitle: fields.text().label("Meta Title")
993
+ }),
994
+ layout: (layout)=>[
995
+ layout.row("title"),
996
+ layout.tabs("settings").tab("general", (tab)=>{
997
+ tab.label("General").layout((layout)=>[
998
+ layout.row("description")
999
+ ]);
1000
+ }).tab("seo", (tab)=>{
1001
+ tab.label("SEO").layout((layout)=>[
1002
+ layout.row("metaTitle")
1003
+ ]);
1004
+ })
1005
+ ]
1006
+ });
1007
+ }
1008
+ it("should access a tabs node by ID and add a new tab", ()=>{
1009
+ const form = createFormWithTabs();
1010
+ form.fields((fields)=>({
1011
+ trackingId: fields.text().label("Tracking ID")
1012
+ }));
1013
+ form.layout("settings").as("tabs").tab("analytics", (tab)=>{
1014
+ tab.label("Analytics").layout((layout)=>[
1015
+ layout.row("trackingId")
1016
+ ]);
1017
+ }).after("seo");
1018
+ const tabsNode = form.vm.layout[1];
1019
+ expect(tabsNode.tabs).toHaveLength(3);
1020
+ expect(tabsNode.tabs[2].id).toBe("analytics");
1021
+ expect(tabsNode.tabs[2].label).toBe("Analytics");
1022
+ });
1023
+ it("should add a tab before an existing tab", ()=>{
1024
+ const form = createFormWithTabs();
1025
+ form.fields((fields)=>({
1026
+ trackingId: fields.text().label("Tracking ID")
1027
+ }));
1028
+ form.layout("settings").as("tabs").tab("analytics", (tab)=>{
1029
+ tab.label("Analytics").layout((layout)=>[
1030
+ layout.row("trackingId")
1031
+ ]);
1032
+ }).before("seo");
1033
+ const tabsNode = form.vm.layout[1];
1034
+ expect(tabsNode.tabs).toHaveLength(3);
1035
+ expect(tabsNode.tabs[0].id).toBe("general");
1036
+ expect(tabsNode.tabs[1].id).toBe("analytics");
1037
+ expect(tabsNode.tabs[2].id).toBe("seo");
1038
+ });
1039
+ it("should throw when accessing a non-existent node ID", ()=>{
1040
+ const form = createFormWithTabs();
1041
+ expect(()=>form.layout("nonexistent").as("tabs")).toThrow('Layout node "nonexistent" not found.');
1042
+ });
1043
+ });
1044
+ describe("positional modifiers targeting tabs/element nodes", ()=>{
1045
+ it("should insert a row before a tabs node by ID", ()=>{
1046
+ const form = createForm({
1047
+ fields: (fields)=>({
1048
+ title: fields.text().label("Title"),
1049
+ subtitle: fields.text().label("Subtitle"),
1050
+ description: fields.text().label("Description")
1051
+ }),
1052
+ layout: (layout)=>[
1053
+ layout.row("title"),
1054
+ layout.tabs("settings").tab("general", (tab)=>{
1055
+ tab.label("General").layout((layout)=>[
1056
+ layout.row("description")
1057
+ ]);
1058
+ })
1059
+ ]
1060
+ });
1061
+ form.layout((layout)=>[
1062
+ layout.row("subtitle").before("settings")
1063
+ ]);
1064
+ expect(form.vm.layout).toHaveLength(3);
1065
+ expect(form.vm.layout[0].type).toBe("row");
1066
+ expect(form.vm.layout[1].type).toBe("row");
1067
+ expect(form.vm.layout[2].type).toBe("tabs");
1068
+ const row = form.vm.layout[1];
1069
+ expect(row.fields[0].name).toBe("subtitle");
1070
+ });
1071
+ it("should remove a tabs node by ID", ()=>{
1072
+ const form = createForm({
1073
+ fields: (fields)=>({
1074
+ title: fields.text().label("Title"),
1075
+ description: fields.text().label("Description")
1076
+ }),
1077
+ layout: (layout)=>[
1078
+ layout.row("title"),
1079
+ layout.tabs("settings").tab("general", (tab)=>{
1080
+ tab.label("General").layout((layout)=>[
1081
+ layout.row("description")
1082
+ ]);
1083
+ })
1084
+ ]
1085
+ });
1086
+ form.layout((layout)=>{
1087
+ layout.remove("settings");
1088
+ return [];
1089
+ });
1090
+ expect(form.vm.layout).toHaveLength(1);
1091
+ expect(form.vm.layout[0].type).toBe("row");
1092
+ });
1093
+ it("should replace a tabs node by ID", ()=>{
1094
+ const form = createForm({
1095
+ fields: (fields)=>({
1096
+ title: fields.text().label("Title"),
1097
+ description: fields.text().label("Description"),
1098
+ metaTitle: fields.text().label("Meta Title")
1099
+ }),
1100
+ layout: (layout)=>[
1101
+ layout.row("title"),
1102
+ layout.tabs("settings").tab("general", (tab)=>{
1103
+ tab.label("General").layout((layout)=>[
1104
+ layout.row("description")
1105
+ ]);
1106
+ })
1107
+ ]
1108
+ });
1109
+ form.layout((layout)=>[
1110
+ layout.row("metaTitle").replace("settings")
1111
+ ]);
1112
+ expect(form.vm.layout).toHaveLength(2);
1113
+ expect(form.vm.layout[0].type).toBe("row");
1114
+ expect(form.vm.layout[1].type).toBe("row");
1115
+ const row = form.vm.layout[1];
1116
+ expect(row.fields[0].name).toBe("metaTitle");
1117
+ });
1118
+ });
1119
+ describe("modifier integration with tabs", ()=>{
1120
+ it("should support a full modifier workflow: base form with tabs + modifier adds tab + modifier appends to existing tab", ()=>{
1121
+ const form = createForm({
1122
+ fields: (fields)=>({
1123
+ title: fields.text().label("Title"),
1124
+ description: fields.text().label("Description"),
1125
+ metaTitle: fields.text().label("Meta Title")
1126
+ }),
1127
+ layout: (layout)=>[
1128
+ layout.row("title"),
1129
+ layout.separator(),
1130
+ layout.tabs("settings").tab("general", (tab)=>{
1131
+ tab.label("General").layout((layout)=>[
1132
+ layout.row("description")
1133
+ ]);
1134
+ }).tab("seo", (tab)=>{
1135
+ tab.label("SEO").layout((layout)=>[
1136
+ layout.row("metaTitle")
1137
+ ]);
1138
+ })
1139
+ ]
1140
+ });
1141
+ form.fields((fields)=>({
1142
+ trackingId: fields.text().label("Tracking ID")
1143
+ }));
1144
+ form.layout("settings").as("tabs").tab("analytics", (tab)=>{
1145
+ tab.label("Analytics").layout((layout)=>[
1146
+ layout.row("trackingId")
1147
+ ]);
1148
+ }).after("seo");
1149
+ const vm = form.vm;
1150
+ expect(vm.layout).toHaveLength(3);
1151
+ expect(vm.layout[0].type).toBe("row");
1152
+ expect(vm.layout[1].type).toBe("separator");
1153
+ expect(vm.layout[2].type).toBe("tabs");
1154
+ const tabsNode = vm.layout[2];
1155
+ expect(tabsNode.tabs).toHaveLength(3);
1156
+ expect(tabsNode.tabs[0].id).toBe("general");
1157
+ expect(tabsNode.tabs[1].id).toBe("seo");
1158
+ expect(tabsNode.tabs[2].id).toBe("analytics");
1159
+ const seoTab = tabsNode.tabs[1];
1160
+ expect(seoTab.layout).toHaveLength(1);
1161
+ const data = form.getData();
1162
+ expect(data).toHaveProperty("trackingId");
1163
+ });
1164
+ });
1165
+ });
1166
+ describe("object fields (Phase 6)", ()=>{
1167
+ describe("non-list object field", ()=>{
1168
+ function createFormWithObject() {
1169
+ return createForm({
1170
+ fields: (fields)=>({
1171
+ title: fields.text().label("Title"),
1172
+ address: fields.object().label("Address").fields((f)=>({
1173
+ street: f.text().label("Street").required("Street is required"),
1174
+ city: f.text().label("City").required("City is required")
1175
+ }))
1176
+ }),
1177
+ layout: (layout)=>[
1178
+ layout.row("title"),
1179
+ layout.row("address")
1180
+ ]
1181
+ });
1182
+ }
1183
+ it("should create an object field with children", ()=>{
1184
+ const form = createFormWithObject();
1185
+ const field = form.field("address");
1186
+ expect(field).toBeDefined();
1187
+ expect(field.type).toBe("object");
1188
+ });
1189
+ it("should access child fields via dot-notation", ()=>{
1190
+ const form = createFormWithObject();
1191
+ const street = form.field("address.street");
1192
+ expect(street).toBeDefined();
1193
+ expect(street.type).toBe("text");
1194
+ });
1195
+ it("should throw on invalid dot-notation", ()=>{
1196
+ const form = createFormWithObject();
1197
+ expect(()=>form.field("address.zipcode")).toThrow('Field "address.zipcode" not found.');
1198
+ });
1199
+ it("should return nested object from getData", ()=>{
1200
+ const form = createFormWithObject();
1201
+ form.field("address.street").setValue("123 Main St");
1202
+ form.field("address.city").setValue("Springfield");
1203
+ const data = form.getData();
1204
+ expect(data.address).toEqual({
1205
+ street: "123 Main St",
1206
+ city: "Springfield"
1207
+ });
1208
+ });
1209
+ it("should hydrate children from setData", ()=>{
1210
+ const form = createFormWithObject();
1211
+ form.setData({
1212
+ title: "Home",
1213
+ address: {
1214
+ street: "456 Oak Ave",
1215
+ city: "Portland"
1216
+ }
1217
+ });
1218
+ expect(form.field("address.street").getValue()).toBe("456 Oak Ave");
1219
+ expect(form.field("address.city").getValue()).toBe("Portland");
1220
+ });
1221
+ it("should not be dirty after setData", ()=>{
1222
+ const form = createFormWithObject();
1223
+ form.setData({
1224
+ title: "Home",
1225
+ address: {
1226
+ street: "456 Oak Ave",
1227
+ city: "Portland"
1228
+ }
1229
+ });
1230
+ expect(form.isDirty).toBe(false);
1231
+ });
1232
+ it("should be dirty after changing a child field", ()=>{
1233
+ const form = createFormWithObject();
1234
+ form.setData({
1235
+ title: "Home",
1236
+ address: {
1237
+ street: "456 Oak Ave",
1238
+ city: "Portland"
1239
+ }
1240
+ });
1241
+ form.field("address.street").setValue("789 Pine Rd");
1242
+ expect(form.isDirty).toBe(true);
1243
+ });
1244
+ it("should validate children recursively", async ()=>{
1245
+ const form = createFormWithObject();
1246
+ const valid = await form.validate();
1247
+ expect(valid).toBe(false);
1248
+ expect(form.errors.length).toBeGreaterThan(0);
1249
+ expect(form.errors.some((e)=>"address" === e.path)).toBe(false);
1250
+ expect(form.errors.some((e)=>"address.street" === e.path)).toBe(true);
1251
+ expect(form.errors.some((e)=>"address.city" === e.path)).toBe(true);
1252
+ });
1253
+ it("should pass validation when children are valid", async ()=>{
1254
+ const form = createFormWithObject();
1255
+ form.field("title").setValue("Home");
1256
+ form.field("address.street").setValue("123 Main St");
1257
+ form.field("address.city").setValue("Springfield");
1258
+ const valid = await form.validate();
1259
+ expect(valid).toBe(true);
1260
+ });
1261
+ it("should expose IObjectFieldVM from field.vm", ()=>{
1262
+ const form = createFormWithObject();
1263
+ form.field("address.street").setValue("123 Main St");
1264
+ form.field("address.city").setValue("Springfield");
1265
+ const vm = form.field("address").vm;
1266
+ expect(vm.type).toBe("object");
1267
+ expect(vm.isList).toBe(false);
1268
+ expect(vm.fields).toHaveLength(2);
1269
+ expect(vm.fields[0].name).toBe("street");
1270
+ expect(vm.fields[0].value).toBe("123 Main St");
1271
+ expect(vm.fields[1].name).toBe("city");
1272
+ expect(vm.items).toHaveLength(0);
1273
+ });
1274
+ it("should render object field in a row via default layout", ()=>{
1275
+ const form = createForm({
1276
+ fields: (fields)=>({
1277
+ address: fields.object().label("Address").fields((f)=>({
1278
+ street: f.text().label("Street"),
1279
+ city: f.text().label("City")
1280
+ }))
1281
+ })
1282
+ });
1283
+ const vm = form.vm;
1284
+ expect(vm.layout).toHaveLength(1);
1285
+ expect(vm.layout[0].type).toBe("row");
1286
+ const row = asRow(vm.layout[0]);
1287
+ expect(row.fields[0].type).toBe("object");
1288
+ expect(row.fields[0].name).toBe("address");
1289
+ });
1290
+ it("should reset to baseline values", ()=>{
1291
+ const form = createFormWithObject();
1292
+ form.setData({
1293
+ title: "Home",
1294
+ address: {
1295
+ street: "Original St",
1296
+ city: "Original City"
1297
+ }
1298
+ });
1299
+ form.field("address.street").setValue("Changed St");
1300
+ expect(form.isDirty).toBe(true);
1301
+ form.reset();
1302
+ expect(form.field("address.street").getValue()).toBe("Original St");
1303
+ expect(form.isDirty).toBe(false);
1304
+ });
1305
+ it("should submit nested data when valid", async ()=>{
1306
+ const form = createFormWithObject();
1307
+ form.field("title").setValue("Home");
1308
+ form.field("address.street").setValue("123 Main St");
1309
+ form.field("address.city").setValue("Springfield");
1310
+ const result = await form.submit();
1311
+ expect(result).toEqual({
1312
+ title: "Home",
1313
+ address: {
1314
+ street: "123 Main St",
1315
+ city: "Springfield"
1316
+ }
1317
+ });
1318
+ });
1319
+ });
1320
+ describe("list object field", ()=>{
1321
+ function createFormWithList() {
1322
+ return createForm({
1323
+ fields: (fields)=>({
1324
+ presets: fields.object().label("Presets").fields((f)=>({
1325
+ name: f.text().label("Name").required("Name is required"),
1326
+ model: f.text().label("Model").required("Model is required")
1327
+ })).list()
1328
+ }),
1329
+ layout: (layout)=>[
1330
+ layout.row("presets")
1331
+ ]
1332
+ });
1333
+ }
1334
+ it("should create a list object field", ()=>{
1335
+ const form = createFormWithList();
1336
+ const field = form.field("presets");
1337
+ expect(field.type).toBe("object");
1338
+ });
1339
+ it("should return empty array from getData initially", ()=>{
1340
+ const form = createFormWithList();
1341
+ expect(form.getData().presets).toEqual([]);
1342
+ });
1343
+ it("should add items via the field VM", ()=>{
1344
+ const form = createFormWithList();
1345
+ const vm = form.field("presets").vm;
1346
+ expect(vm.isList).toBe(true);
1347
+ expect(vm.items).toHaveLength(0);
1348
+ vm.addItem();
1349
+ const updatedVm = form.field("presets").vm;
1350
+ expect(updatedVm.items).toHaveLength(1);
1351
+ expect(updatedVm.items[0].fields).toHaveLength(2);
1352
+ expect(updatedVm.items[0].fields[0].name).toBe("name");
1353
+ });
1354
+ it("should hydrate list from setData", ()=>{
1355
+ const form = createFormWithList();
1356
+ form.setData({
1357
+ presets: [
1358
+ {
1359
+ name: "Default",
1360
+ model: "claude-sonnet"
1361
+ },
1362
+ {
1363
+ name: "Fast",
1364
+ model: "claude-haiku"
1365
+ }
1366
+ ]
1367
+ });
1368
+ const data = form.getData();
1369
+ expect(data.presets).toEqual([
1370
+ {
1371
+ name: "Default",
1372
+ model: "claude-sonnet"
1373
+ },
1374
+ {
1375
+ name: "Fast",
1376
+ model: "claude-haiku"
1377
+ }
1378
+ ]);
1379
+ });
1380
+ it("should expose items via IObjectFieldVM", ()=>{
1381
+ const form = createFormWithList();
1382
+ form.setData({
1383
+ presets: [
1384
+ {
1385
+ name: "Default",
1386
+ model: "claude-sonnet"
1387
+ },
1388
+ {
1389
+ name: "Fast",
1390
+ model: "claude-haiku"
1391
+ }
1392
+ ]
1393
+ });
1394
+ const vm = form.field("presets").vm;
1395
+ expect(vm.items).toHaveLength(2);
1396
+ expect(vm.items[0].fields[0].value).toBe("Default");
1397
+ expect(vm.items[1].fields[1].value).toBe("claude-haiku");
1398
+ });
1399
+ it("should remove items via item.remove()", ()=>{
1400
+ const form = createFormWithList();
1401
+ form.setData({
1402
+ presets: [
1403
+ {
1404
+ name: "Default",
1405
+ model: "claude-sonnet"
1406
+ },
1407
+ {
1408
+ name: "Fast",
1409
+ model: "claude-haiku"
1410
+ }
1411
+ ]
1412
+ });
1413
+ const vm = form.field("presets").vm;
1414
+ vm.items[0].remove();
1415
+ expect(form.getData().presets).toEqual([
1416
+ {
1417
+ name: "Fast",
1418
+ model: "claude-haiku"
1419
+ }
1420
+ ]);
1421
+ });
1422
+ it("should remove items via removeItem()", ()=>{
1423
+ const form = createFormWithList();
1424
+ form.setData({
1425
+ presets: [
1426
+ {
1427
+ name: "A",
1428
+ model: "a"
1429
+ },
1430
+ {
1431
+ name: "B",
1432
+ model: "b"
1433
+ },
1434
+ {
1435
+ name: "C",
1436
+ model: "c"
1437
+ }
1438
+ ]
1439
+ });
1440
+ const vm = form.field("presets").vm;
1441
+ vm.removeItem(1);
1442
+ expect(form.getData().presets).toEqual([
1443
+ {
1444
+ name: "A",
1445
+ model: "a"
1446
+ },
1447
+ {
1448
+ name: "C",
1449
+ model: "c"
1450
+ }
1451
+ ]);
1452
+ });
1453
+ it("should validate all items", async ()=>{
1454
+ const form = createFormWithList();
1455
+ form.setData({
1456
+ presets: [
1457
+ {
1458
+ name: "Default",
1459
+ model: "claude-sonnet"
1460
+ },
1461
+ {
1462
+ name: "",
1463
+ model: ""
1464
+ }
1465
+ ]
1466
+ });
1467
+ const valid = await form.validate();
1468
+ expect(valid).toBe(false);
1469
+ });
1470
+ it("should pass validation when all items are valid", async ()=>{
1471
+ const form = createFormWithList();
1472
+ form.setData({
1473
+ presets: [
1474
+ {
1475
+ name: "Default",
1476
+ model: "claude-sonnet"
1477
+ },
1478
+ {
1479
+ name: "Fast",
1480
+ model: "claude-haiku"
1481
+ }
1482
+ ]
1483
+ });
1484
+ const valid = await form.validate();
1485
+ expect(valid).toBe(true);
1486
+ });
1487
+ it("should validate with listSchema", async ()=>{
1488
+ const form = createForm({
1489
+ fields: (fields)=>({
1490
+ presets: fields.object().label("Presets").fields((f)=>({
1491
+ name: f.text().label("Name")
1492
+ })).list().listSchema(z.array(z.any()).min(2, "At least 2 presets are required"))
1493
+ })
1494
+ });
1495
+ form.setData({
1496
+ presets: [
1497
+ {
1498
+ name: "Only one"
1499
+ }
1500
+ ]
1501
+ });
1502
+ const valid = await form.validate();
1503
+ expect(valid).toBe(false);
1504
+ expect(form.errors[0].message).toBe("At least 2 presets are required");
1505
+ });
1506
+ it("should be dirty after adding an item", ()=>{
1507
+ const form = createFormWithList();
1508
+ form.setData({
1509
+ presets: []
1510
+ });
1511
+ expect(form.isDirty).toBe(false);
1512
+ const vm = form.field("presets").vm;
1513
+ vm.addItem();
1514
+ expect(form.isDirty).toBe(true);
1515
+ });
1516
+ it("should have stable keys across re-renders", ()=>{
1517
+ const form = createFormWithList();
1518
+ form.setData({
1519
+ presets: [
1520
+ {
1521
+ name: "A",
1522
+ model: "a"
1523
+ },
1524
+ {
1525
+ name: "B",
1526
+ model: "b"
1527
+ }
1528
+ ]
1529
+ });
1530
+ const vm1 = form.field("presets").vm;
1531
+ const key0 = vm1.items[0].key;
1532
+ const key1 = vm1.items[1].key;
1533
+ const vm2 = form.field("presets").vm;
1534
+ expect(vm2.items[0].key).toBe(key0);
1535
+ expect(vm2.items[1].key).toBe(key1);
1536
+ });
1537
+ it("should pass empty list validation when not required", async ()=>{
1538
+ const form = createFormWithList();
1539
+ const valid = await form.validate();
1540
+ expect(valid).toBe(true);
1541
+ });
1542
+ it("should modify item field values via VM onChange", ()=>{
1543
+ const form = createFormWithList();
1544
+ form.setData({
1545
+ presets: [
1546
+ {
1547
+ name: "Default",
1548
+ model: "claude-sonnet"
1549
+ }
1550
+ ]
1551
+ });
1552
+ const vm = form.field("presets").vm;
1553
+ vm.items[0].fields[0].onChange("Updated");
1554
+ expect(form.getData().presets[0].name).toBe("Updated");
1555
+ });
1556
+ });
1557
+ describe("hasErrors rollup through tabs", ()=>{
1558
+ it("should report hasErrors in tabs containing object fields", async ()=>{
1559
+ const form = createForm({
1560
+ fields: (fields)=>({
1561
+ title: fields.text().label("Title"),
1562
+ address: fields.object().label("Address").fields((f)=>({
1563
+ street: f.text().label("Street").required("Required")
1564
+ }))
1565
+ }),
1566
+ layout: (layout)=>[
1567
+ layout.tabs("settings").tab("general", (tab)=>{
1568
+ tab.label("General").layout((layout)=>[
1569
+ layout.row("title")
1570
+ ]);
1571
+ }).tab("details", (tab)=>{
1572
+ tab.label("Details").layout((layout)=>[
1573
+ layout.row("address")
1574
+ ]);
1575
+ })
1576
+ ]
1577
+ });
1578
+ form.field("title").setValue("Hello");
1579
+ await form.validate();
1580
+ const tabsNode = form.vm.layout[0];
1581
+ expect(tabsNode.tabs[0].hasErrors).toBe(false);
1582
+ expect(tabsNode.tabs[1].hasErrors).toBe(true);
1583
+ });
1584
+ });
1585
+ });
1586
+ describe("templated object fields (Phase 8a)", ()=>{
1587
+ function createFormWithTemplatedObject() {
1588
+ return createForm({
1589
+ fields: (fields)=>({
1590
+ content: fields.object().label("Content").template("hero", (t)=>{
1591
+ t.label("Hero Banner").fields((f)=>({
1592
+ heading: f.text().label("Heading").required("Required"),
1593
+ image: f.text().label("Image")
1594
+ }));
1595
+ }).template("text", (t)=>{
1596
+ t.label("Rich Text").fields((f)=>({
1597
+ body: f.text().label("Body").required("Required")
1598
+ }));
1599
+ })
1600
+ })
1601
+ });
1602
+ }
1603
+ describe("shape", ()=>{
1604
+ it("starts with no active template and empty children", ()=>{
1605
+ const form = createFormWithTemplatedObject();
1606
+ const field = form.field("content");
1607
+ expect(field.isTemplated).toBe(true);
1608
+ expect(field.activeTemplateId).toBeNull();
1609
+ expect(field.children.size).toBe(0);
1610
+ });
1611
+ it("exposes available templates via VM", ()=>{
1612
+ const form = createFormWithTemplatedObject();
1613
+ const vm = form.field("content").vm;
1614
+ expect(vm.isTemplated).toBe(true);
1615
+ expect(vm.availableTemplates).toEqual([
1616
+ {
1617
+ id: "hero",
1618
+ label: "Hero Banner"
1619
+ },
1620
+ {
1621
+ id: "text",
1622
+ label: "Rich Text"
1623
+ }
1624
+ ]);
1625
+ expect(vm.activeTemplateId).toBeNull();
1626
+ expect(vm.fields).toEqual([]);
1627
+ });
1628
+ it("rejects .fields() alongside .template() at build time", ()=>{
1629
+ expect(()=>createForm({
1630
+ fields: (fields)=>({
1631
+ content: fields.object().fields((f)=>({
1632
+ x: f.text()
1633
+ })).template("a", (t)=>{
1634
+ t.label("A").fields((f)=>({
1635
+ y: f.text()
1636
+ }));
1637
+ })
1638
+ })
1639
+ })).toThrow(/both .fields\(\) and .template\(\)/);
1640
+ });
1641
+ it("rejects duplicate template ids", ()=>{
1642
+ expect(()=>createForm({
1643
+ fields: (fields)=>({
1644
+ content: fields.object().template("a", (t)=>{
1645
+ t.label("A1").fields((f)=>({
1646
+ x: f.text()
1647
+ }));
1648
+ }).template("a", (t)=>{
1649
+ t.label("A2").fields((f)=>({
1650
+ y: f.text()
1651
+ }));
1652
+ })
1653
+ })
1654
+ })).toThrow(/Duplicate template id "a"/);
1655
+ });
1656
+ it("rejects reserved _templateId as template id", ()=>{
1657
+ expect(()=>createForm({
1658
+ fields: (fields)=>({
1659
+ content: fields.object().template("_templateId", (t)=>{
1660
+ t.label("X").fields((f)=>({
1661
+ x: f.text()
1662
+ }));
1663
+ })
1664
+ })
1665
+ })).toThrow(/reserved/);
1666
+ });
1667
+ it("rejects _templateId as a child field name in a template", ()=>{
1668
+ expect(()=>createForm({
1669
+ fields: (fields)=>({
1670
+ content: fields.object().template("hero", (t)=>{
1671
+ t.label("Hero").fields((f)=>({
1672
+ _templateId: f.text()
1673
+ }));
1674
+ })
1675
+ })
1676
+ })).toThrow(/reserved field "_templateId"/);
1677
+ });
1678
+ it("allows combining .list() with .template() (Phase 8b)", ()=>{
1679
+ expect(()=>createForm({
1680
+ fields: (fields)=>({
1681
+ content: fields.object().list().template("a", (t)=>{
1682
+ t.label("A").fields((f)=>({
1683
+ x: f.text()
1684
+ }));
1685
+ })
1686
+ })
1687
+ })).not.toThrow();
1688
+ });
1689
+ });
1690
+ describe("setTemplate / switching", ()=>{
1691
+ it("builds children when a template is selected", ()=>{
1692
+ const form = createFormWithTemplatedObject();
1693
+ const field = form.field("content");
1694
+ field.setTemplate("hero");
1695
+ expect(field.activeTemplateId).toBe("hero");
1696
+ expect(field.children.size).toBe(2);
1697
+ expect(form.field("content.heading").type).toBe("text");
1698
+ expect(form.field("content.image").type).toBe("text");
1699
+ });
1700
+ it("discards data when switching to a different template", ()=>{
1701
+ const form = createFormWithTemplatedObject();
1702
+ const field = form.field("content");
1703
+ field.setTemplate("hero");
1704
+ form.field("content.heading").setValue("Hello");
1705
+ field.setTemplate("text");
1706
+ expect(field.activeTemplateId).toBe("text");
1707
+ expect(form.field("content.body")).toBeDefined();
1708
+ expect(()=>form.field("content.heading")).toThrow();
1709
+ });
1710
+ it("is a no-op when setting the currently active template", ()=>{
1711
+ const form = createFormWithTemplatedObject();
1712
+ const field = form.field("content");
1713
+ field.setTemplate("hero");
1714
+ form.field("content.heading").setValue("Preserved");
1715
+ field.setTemplate("hero");
1716
+ expect(form.field("content.heading").getValue()).toBe("Preserved");
1717
+ });
1718
+ it("throws when setting an unknown template id", ()=>{
1719
+ const form = createFormWithTemplatedObject();
1720
+ const field = form.field("content");
1721
+ expect(()=>field.setTemplate("missing")).toThrow(/Template "missing" not found/);
1722
+ });
1723
+ it("wires the form reference on newly created children", ()=>{
1724
+ const form = createFormWithTemplatedObject();
1725
+ const field = form.field("content");
1726
+ field.setTemplate("hero");
1727
+ expect(()=>form.field("content.heading").setValue("OK")).not.toThrow();
1728
+ });
1729
+ });
1730
+ describe("getData / setData", ()=>{
1731
+ it("returns null when no template is active", ()=>{
1732
+ const form = createFormWithTemplatedObject();
1733
+ expect(form.getData().content).toBeNull();
1734
+ });
1735
+ it("includes _templateId and child values when active", ()=>{
1736
+ const form = createFormWithTemplatedObject();
1737
+ const field = form.field("content");
1738
+ field.setTemplate("hero");
1739
+ form.field("content.heading").setValue("Welcome");
1740
+ form.field("content.image").setValue("cover.jpg");
1741
+ expect(form.getData().content).toEqual({
1742
+ _templateId: "hero",
1743
+ heading: "Welcome",
1744
+ image: "cover.jpg"
1745
+ });
1746
+ });
1747
+ it("hydrates via setData by reading _templateId", ()=>{
1748
+ const form = createFormWithTemplatedObject();
1749
+ form.setData({
1750
+ content: {
1751
+ _templateId: "text",
1752
+ body: "Lorem ipsum"
1753
+ }
1754
+ });
1755
+ const field = form.field("content");
1756
+ expect(field.activeTemplateId).toBe("text");
1757
+ expect(form.field("content.body").getValue()).toBe("Lorem ipsum");
1758
+ });
1759
+ it("setData with null clears the active template", ()=>{
1760
+ const form = createFormWithTemplatedObject();
1761
+ const field = form.field("content");
1762
+ field.setTemplate("hero");
1763
+ form.field("content.heading").setValue("X");
1764
+ form.setData({
1765
+ content: null
1766
+ });
1767
+ expect(field.activeTemplateId).toBeNull();
1768
+ expect(field.children.size).toBe(0);
1769
+ });
1770
+ it("setData ignores unknown template id silently", ()=>{
1771
+ const form = createFormWithTemplatedObject();
1772
+ form.setData({
1773
+ content: {
1774
+ _templateId: "nope",
1775
+ foo: "bar"
1776
+ }
1777
+ });
1778
+ const field = form.field("content");
1779
+ expect(field.activeTemplateId).toBeNull();
1780
+ });
1781
+ });
1782
+ describe("validation", ()=>{
1783
+ it("required templated object fails validation when no template active", async ()=>{
1784
+ const form = createForm({
1785
+ fields: (fields)=>({
1786
+ content: fields.object().required("Pick a template").template("hero", (t)=>{
1787
+ t.label("Hero").fields((f)=>({
1788
+ heading: f.text()
1789
+ }));
1790
+ })
1791
+ })
1792
+ });
1793
+ const valid = await form.validate();
1794
+ expect(valid).toBe(false);
1795
+ expect(form.errors.some((e)=>"content" === e.path)).toBe(true);
1796
+ });
1797
+ it("required templated object passes when template active with valid children", async ()=>{
1798
+ const form = createForm({
1799
+ fields: (fields)=>({
1800
+ content: fields.object().required("Pick a template").template("hero", (t)=>{
1801
+ t.label("Hero").fields((f)=>({
1802
+ heading: f.text().required("Required")
1803
+ }));
1804
+ })
1805
+ })
1806
+ });
1807
+ const field = form.field("content");
1808
+ field.setTemplate("hero");
1809
+ form.field("content.heading").setValue("Hi");
1810
+ const valid = await form.validate();
1811
+ expect(valid).toBe(true);
1812
+ });
1813
+ it("validates child fields inside active template", async ()=>{
1814
+ const form = createFormWithTemplatedObject();
1815
+ const field = form.field("content");
1816
+ field.setTemplate("hero");
1817
+ const valid = await form.validate();
1818
+ expect(valid).toBe(false);
1819
+ });
1820
+ it("passes validation when object is optional and no template selected", async ()=>{
1821
+ const form = createFormWithTemplatedObject();
1822
+ const valid = await form.validate();
1823
+ expect(valid).toBe(true);
1824
+ });
1825
+ });
1826
+ describe("template visibility", ()=>{
1827
+ it("filters availableTemplates by reactive visible callback", ()=>{
1828
+ const form = createForm({
1829
+ fields: (fields)=>({
1830
+ plan: fields.text().defaultValue("free"),
1831
+ content: fields.object().template("basic", (t)=>{
1832
+ t.label("Basic").fields((f)=>({
1833
+ x: f.text()
1834
+ }));
1835
+ }).template("premium", (t)=>{
1836
+ t.label("Premium").visible((f)=>"enterprise" === f.field("plan").getValue()).fields((f)=>({
1837
+ y: f.text()
1838
+ }));
1839
+ })
1840
+ })
1841
+ });
1842
+ const vm1 = form.field("content").vm;
1843
+ expect(vm1.availableTemplates.map((t)=>t.id)).toEqual([
1844
+ "basic"
1845
+ ]);
1846
+ form.field("plan").setValue("enterprise");
1847
+ const vm2 = form.field("content").vm;
1848
+ expect(vm2.availableTemplates.map((t)=>t.id)).toEqual([
1849
+ "basic",
1850
+ "premium"
1851
+ ]);
1852
+ });
1853
+ it("hiding a template does not clear an already-active selection", ()=>{
1854
+ const form = createForm({
1855
+ fields: (fields)=>({
1856
+ plan: fields.text().defaultValue("enterprise"),
1857
+ content: fields.object().template("premium", (t)=>{
1858
+ t.label("Premium").visible((f)=>"enterprise" === f.field("plan").getValue()).fields((f)=>({
1859
+ y: f.text()
1860
+ }));
1861
+ })
1862
+ })
1863
+ });
1864
+ const field = form.field("content");
1865
+ field.setTemplate("premium");
1866
+ form.field("content.y").setValue("set");
1867
+ form.field("plan").setValue("free");
1868
+ const vm = form.field("content").vm;
1869
+ expect(vm.availableTemplates).toEqual([]);
1870
+ expect(vm.activeTemplateId).toBe("premium");
1871
+ expect(form.field("content.y").getValue()).toBe("set");
1872
+ });
1873
+ });
1874
+ describe("isDirty", ()=>{
1875
+ it("is not dirty after setData with template", ()=>{
1876
+ const form = createFormWithTemplatedObject();
1877
+ form.setData({
1878
+ content: {
1879
+ _templateId: "hero",
1880
+ heading: "Hello",
1881
+ image: ""
1882
+ }
1883
+ });
1884
+ expect(form.isDirty).toBe(false);
1885
+ });
1886
+ it("becomes dirty after switching template", ()=>{
1887
+ const form = createFormWithTemplatedObject();
1888
+ form.setData({
1889
+ content: {
1890
+ _templateId: "hero",
1891
+ heading: "Hello",
1892
+ image: ""
1893
+ }
1894
+ });
1895
+ form.field("content").setTemplate("text");
1896
+ expect(form.isDirty).toBe(true);
1897
+ });
1898
+ });
1899
+ });
1900
+ describe("templated list fields (Phase 8b)", ()=>{
1901
+ function createFormWithTemplatedList() {
1902
+ return createForm({
1903
+ fields: (fields)=>({
1904
+ sections: fields.object().label("Sections").list().template("hero", (t)=>{
1905
+ t.label("Hero").fields((f)=>({
1906
+ heading: f.text().required("Required"),
1907
+ image: f.text()
1908
+ }));
1909
+ }).template("text", (t)=>{
1910
+ t.label("Text").fields((f)=>({
1911
+ body: f.text().required("Required")
1912
+ }));
1913
+ })
1914
+ })
1915
+ });
1916
+ }
1917
+ describe("addItem / templateId", ()=>{
1918
+ it("requires a template id when adding to a templated list", ()=>{
1919
+ const form = createFormWithTemplatedList();
1920
+ const field = form.field("sections");
1921
+ expect(()=>field.addItem()).toThrow(/require a template id/);
1922
+ });
1923
+ it("rejects unknown template ids", ()=>{
1924
+ const form = createFormWithTemplatedList();
1925
+ const field = form.field("sections");
1926
+ expect(()=>field.addItem("missing")).toThrow(/Template "missing" not found/);
1927
+ });
1928
+ it("adds an item with the picked template's children", ()=>{
1929
+ const form = createFormWithTemplatedList();
1930
+ const field = form.field("sections");
1931
+ field.addItem("hero");
1932
+ expect(field.items.length).toBe(1);
1933
+ expect(field.items[0].templateId).toBe("hero");
1934
+ expect(field.items[0].children.has("heading")).toBe(true);
1935
+ expect(field.items[0].children.has("image")).toBe(true);
1936
+ });
1937
+ it("allows mixing different templates across items", ()=>{
1938
+ const form = createFormWithTemplatedList();
1939
+ const field = form.field("sections");
1940
+ field.addItem("hero");
1941
+ field.addItem("text");
1942
+ field.addItem("hero");
1943
+ expect(field.items.map((i)=>i.templateId)).toEqual([
1944
+ "hero",
1945
+ "text",
1946
+ "hero"
1947
+ ]);
1948
+ });
1949
+ });
1950
+ describe("getData", ()=>{
1951
+ it("includes _templateId per item", ()=>{
1952
+ const form = createFormWithTemplatedList();
1953
+ const field = form.field("sections");
1954
+ field.addItem("hero");
1955
+ field.items[0].children.get("heading").setValue("Welcome");
1956
+ field.addItem("text");
1957
+ field.items[1].children.get("body").setValue("Lorem");
1958
+ expect(form.getData().sections).toEqual([
1959
+ {
1960
+ _templateId: "hero",
1961
+ heading: "Welcome",
1962
+ image: null
1963
+ },
1964
+ {
1965
+ _templateId: "text",
1966
+ body: "Lorem"
1967
+ }
1968
+ ]);
1969
+ });
1970
+ });
1971
+ describe("setData", ()=>{
1972
+ it("hydrates items by reading each item's _templateId", ()=>{
1973
+ const form = createFormWithTemplatedList();
1974
+ form.setData({
1975
+ sections: [
1976
+ {
1977
+ _templateId: "hero",
1978
+ heading: "H1",
1979
+ image: "img.jpg"
1980
+ },
1981
+ {
1982
+ _templateId: "text",
1983
+ body: "Body copy"
1984
+ }
1985
+ ]
1986
+ });
1987
+ const field = form.field("sections");
1988
+ expect(field.items.length).toBe(2);
1989
+ expect(field.items[0].templateId).toBe("hero");
1990
+ expect(field.items[0].children.get("heading").getValue()).toBe("H1");
1991
+ expect(field.items[1].templateId).toBe("text");
1992
+ expect(field.items[1].children.get("body").getValue()).toBe("Body copy");
1993
+ });
1994
+ it("silently drops items with invalid or missing _templateId", ()=>{
1995
+ const form = createFormWithTemplatedList();
1996
+ form.setData({
1997
+ sections: [
1998
+ {
1999
+ _templateId: "hero",
2000
+ heading: "Keep"
2001
+ },
2002
+ {
2003
+ _templateId: "nope",
2004
+ x: 1
2005
+ },
2006
+ {
2007
+ heading: "no-id"
2008
+ },
2009
+ null,
2010
+ {
2011
+ _templateId: "text",
2012
+ body: "Also keep"
2013
+ }
2014
+ ]
2015
+ });
2016
+ const field = form.field("sections");
2017
+ expect(field.items.length).toBe(2);
2018
+ expect(field.items.map((i)=>i.templateId)).toEqual([
2019
+ "hero",
2020
+ "text"
2021
+ ]);
2022
+ });
2023
+ });
2024
+ describe("duplicate / move / remove", ()=>{
2025
+ it("duplicates an item preserving templateId and values", ()=>{
2026
+ const form = createFormWithTemplatedList();
2027
+ const field = form.field("sections");
2028
+ field.addItem("hero");
2029
+ field.items[0].children.get("heading").setValue("Original");
2030
+ field.items[0].children.get("image").setValue("pic.jpg");
2031
+ field.duplicateItem(0);
2032
+ expect(field.items.length).toBe(2);
2033
+ expect(field.items[1].templateId).toBe("hero");
2034
+ expect(field.items[1].children.get("heading").getValue()).toBe("Original");
2035
+ expect(field.items[1].children.get("image").getValue()).toBe("pic.jpg");
2036
+ expect(field.items[0].key).not.toBe(field.items[1].key);
2037
+ });
2038
+ it("moves items while preserving templateId", ()=>{
2039
+ const form = createFormWithTemplatedList();
2040
+ const field = form.field("sections");
2041
+ field.addItem("hero");
2042
+ field.addItem("text");
2043
+ field.moveItem(0, 1);
2044
+ expect(field.items.map((i)=>i.templateId)).toEqual([
2045
+ "text",
2046
+ "hero"
2047
+ ]);
2048
+ });
2049
+ it("removes items by index", ()=>{
2050
+ const form = createFormWithTemplatedList();
2051
+ const field = form.field("sections");
2052
+ field.addItem("hero");
2053
+ field.addItem("text");
2054
+ field.removeItem(0);
2055
+ expect(field.items.length).toBe(1);
2056
+ expect(field.items[0].templateId).toBe("text");
2057
+ });
2058
+ });
2059
+ describe("VM", ()=>{
2060
+ it("exposes templateId and duplicate on each item VM", ()=>{
2061
+ const form = createFormWithTemplatedList();
2062
+ const field = form.field("sections");
2063
+ field.addItem("hero");
2064
+ const vm = form.field("sections").vm;
2065
+ expect(vm.items.length).toBe(1);
2066
+ expect(vm.items[0].templateId).toBe("hero");
2067
+ expect(typeof vm.items[0].duplicate).toBe("function");
2068
+ });
2069
+ it("VM addItem(templateId) appends an item", ()=>{
2070
+ const form = createFormWithTemplatedList();
2071
+ const vm = form.field("sections").vm;
2072
+ vm.addItem("hero");
2073
+ vm.addItem("text");
2074
+ const field = form.field("sections");
2075
+ expect(field.items.map((i)=>i.templateId)).toEqual([
2076
+ "hero",
2077
+ "text"
2078
+ ]);
2079
+ });
2080
+ it("availableTemplates respects reactive visible() on templated lists", ()=>{
2081
+ const form = createForm({
2082
+ fields: (fields)=>({
2083
+ plan: fields.text().defaultValue("free"),
2084
+ sections: fields.object().list().template("basic", (t)=>{
2085
+ t.label("Basic").fields((f)=>({
2086
+ x: f.text()
2087
+ }));
2088
+ }).template("premium", (t)=>{
2089
+ t.label("Premium").visible((f)=>"enterprise" === f.field("plan").getValue()).fields((f)=>({
2090
+ y: f.text()
2091
+ }));
2092
+ })
2093
+ })
2094
+ });
2095
+ const vm1 = form.field("sections").vm;
2096
+ expect(vm1.availableTemplates.map((t)=>t.id)).toEqual([
2097
+ "basic"
2098
+ ]);
2099
+ form.field("plan").setValue("enterprise");
2100
+ const vm2 = form.field("sections").vm;
2101
+ expect(vm2.availableTemplates.map((t)=>t.id)).toEqual([
2102
+ "basic",
2103
+ "premium"
2104
+ ]);
2105
+ });
2106
+ });
2107
+ describe("validation", ()=>{
2108
+ it("validates each item's children under its template", async ()=>{
2109
+ const form = createFormWithTemplatedList();
2110
+ const field = form.field("sections");
2111
+ field.addItem("hero");
2112
+ field.addItem("text");
2113
+ field.items[1].children.get("body").setValue("ok");
2114
+ const valid = await form.validate();
2115
+ expect(valid).toBe(false);
2116
+ expect(form.errors.some((e)=>e.path.startsWith("sections"))).toBe(true);
2117
+ });
2118
+ it("passes when every item's required fields are filled", async ()=>{
2119
+ const form = createFormWithTemplatedList();
2120
+ const field = form.field("sections");
2121
+ field.addItem("hero");
2122
+ field.items[0].children.get("heading").setValue("H");
2123
+ field.addItem("text");
2124
+ field.items[1].children.get("body").setValue("B");
2125
+ const valid = await form.validate();
2126
+ expect(valid).toBe(true);
2127
+ });
2128
+ });
2129
+ describe("isDirty", ()=>{
2130
+ it("is not dirty after setData with templated list", ()=>{
2131
+ const form = createFormWithTemplatedList();
2132
+ form.setData({
2133
+ sections: [
2134
+ {
2135
+ _templateId: "hero",
2136
+ heading: "H",
2137
+ image: ""
2138
+ },
2139
+ {
2140
+ _templateId: "text",
2141
+ body: "B"
2142
+ }
2143
+ ]
2144
+ });
2145
+ expect(form.isDirty).toBe(false);
2146
+ });
2147
+ it("becomes dirty after adding an item", ()=>{
2148
+ const form = createFormWithTemplatedList();
2149
+ form.setData({
2150
+ sections: [
2151
+ {
2152
+ _templateId: "hero",
2153
+ heading: "H",
2154
+ image: ""
2155
+ }
2156
+ ]
2157
+ });
2158
+ form.field("sections").addItem("text");
2159
+ expect(form.isDirty).toBe(true);
2160
+ });
2161
+ });
2162
+ });
2163
+ describe("per-template / inner object layouts (Phase 8c)", ()=>{
2164
+ describe("non-templated single object", ()=>{
2165
+ it("defaults to one row per visible child when no layout.object() is registered", ()=>{
2166
+ const form = createForm({
2167
+ fields: (fields)=>({
2168
+ meta: fields.object().fields((f)=>({
2169
+ a: f.text().label("A"),
2170
+ b: f.text().label("B")
2171
+ }))
2172
+ })
2173
+ });
2174
+ const vm = form.field("meta").vm;
2175
+ expect(vm.layout.length).toBe(2);
2176
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2177
+ "a"
2178
+ ]);
2179
+ expect(asRow(vm.layout[1]).fields.map((f)=>f.name)).toEqual([
2180
+ "b"
2181
+ ]);
2182
+ });
2183
+ it("resolves the registered inner layout against the children", ()=>{
2184
+ const form = createForm({
2185
+ fields: (fields)=>({
2186
+ meta: fields.object().fields((f)=>({
2187
+ a: f.text().label("A"),
2188
+ b: f.text().label("B")
2189
+ }))
2190
+ }),
2191
+ layout: (layout)=>[
2192
+ layout.object("meta", (l)=>[
2193
+ l.row("a", "b")
2194
+ ])
2195
+ ]
2196
+ });
2197
+ const vm = form.field("meta").vm;
2198
+ expect(vm.layout.length).toBe(1);
2199
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2200
+ "a",
2201
+ "b"
2202
+ ]);
2203
+ });
2204
+ it("throws when a per-template map is passed to a non-templated field", ()=>{
2205
+ expect(()=>createForm({
2206
+ fields: (fields)=>({
2207
+ meta: fields.object().fields((f)=>({
2208
+ a: f.text()
2209
+ }))
2210
+ }),
2211
+ layout: (layout)=>[
2212
+ layout.object("meta", {
2213
+ tplA: (l)=>[
2214
+ l.row("a")
2215
+ ]
2216
+ })
2217
+ ]
2218
+ })).toThrow(/not templated/);
2219
+ });
2220
+ });
2221
+ describe("non-templated list", ()=>{
2222
+ it("applies the inner layout to every list item", ()=>{
2223
+ const form = createForm({
2224
+ fields: (fields)=>({
2225
+ rows: fields.object().list().fields((f)=>({
2226
+ a: f.text(),
2227
+ b: f.text()
2228
+ }))
2229
+ }),
2230
+ layout: (layout)=>[
2231
+ layout.object("rows", (l)=>[
2232
+ l.row("a", "b")
2233
+ ])
2234
+ ]
2235
+ });
2236
+ const field = form.field("rows");
2237
+ field.addItem();
2238
+ field.addItem();
2239
+ const vm = field.vm;
2240
+ expect(vm.items.length).toBe(2);
2241
+ for (const item of vm.items){
2242
+ expect(item.layout.length).toBe(1);
2243
+ expect(asRow(item.layout[0]).fields.map((f)=>f.name)).toEqual([
2244
+ "a",
2245
+ "b"
2246
+ ]);
2247
+ }
2248
+ });
2249
+ });
2250
+ describe("templated single object", ()=>{
2251
+ function buildTemplatedForm(layoutFactory) {
2252
+ return createForm({
2253
+ fields: (fields)=>({
2254
+ content: fields.object().template("hero", (t)=>{
2255
+ t.label("Hero").fields((f)=>({
2256
+ heading: f.text().label("Heading"),
2257
+ subheading: f.text().label("Subheading")
2258
+ }));
2259
+ }).template("cta", (t)=>{
2260
+ t.label("CTA").fields((f)=>({
2261
+ text: f.text().label("Text"),
2262
+ url: f.text().label("URL")
2263
+ }));
2264
+ })
2265
+ }),
2266
+ layout: layoutFactory
2267
+ });
2268
+ }
2269
+ it("uses the active template's per-template layout", ()=>{
2270
+ const form = buildTemplatedForm((layout)=>[
2271
+ layout.object("content", {
2272
+ hero: (l)=>[
2273
+ l.row("heading", "subheading")
2274
+ ],
2275
+ cta: (l)=>[
2276
+ l.row("text"),
2277
+ l.row("url")
2278
+ ]
2279
+ })
2280
+ ]);
2281
+ const field = form.field("content");
2282
+ field.setTemplate("hero");
2283
+ let vm = form.field("content").vm;
2284
+ expect(vm.layout.length).toBe(1);
2285
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2286
+ "heading",
2287
+ "subheading"
2288
+ ]);
2289
+ field.setTemplate("cta");
2290
+ vm = form.field("content").vm;
2291
+ expect(vm.layout.length).toBe(2);
2292
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2293
+ "text"
2294
+ ]);
2295
+ expect(asRow(vm.layout[1]).fields.map((f)=>f.name)).toEqual([
2296
+ "url"
2297
+ ]);
2298
+ });
2299
+ it("falls back to default one-row-per-child when active template has no entry", ()=>{
2300
+ const form = buildTemplatedForm((layout)=>[
2301
+ layout.object("content", {
2302
+ hero: (l)=>[
2303
+ l.row("heading", "subheading")
2304
+ ]
2305
+ })
2306
+ ]);
2307
+ const field = form.field("content");
2308
+ field.setTemplate("cta");
2309
+ const vm = form.field("content").vm;
2310
+ expect(vm.layout.length).toBe(2);
2311
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2312
+ "text"
2313
+ ]);
2314
+ expect(asRow(vm.layout[1]).fields.map((f)=>f.name)).toEqual([
2315
+ "url"
2316
+ ]);
2317
+ });
2318
+ it("returns an empty layout when no template is active", ()=>{
2319
+ const form = buildTemplatedForm((layout)=>[
2320
+ layout.object("content", {
2321
+ hero: (l)=>[
2322
+ l.row("heading", "subheading")
2323
+ ]
2324
+ })
2325
+ ]);
2326
+ const vm = form.field("content").vm;
2327
+ expect(vm.activeTemplateId).toBeNull();
2328
+ expect(vm.layout).toEqual([]);
2329
+ });
2330
+ it("silently ignores an unknown template id in the layout map", ()=>{
2331
+ const form = buildTemplatedForm((layout)=>[
2332
+ layout.object("content", {
2333
+ hero: (l)=>[
2334
+ l.row("heading", "subheading")
2335
+ ],
2336
+ unknown: (l)=>[
2337
+ l.row("xxx")
2338
+ ]
2339
+ })
2340
+ ]);
2341
+ const field = form.field("content");
2342
+ field.setTemplate("hero");
2343
+ const vm = form.field("content").vm;
2344
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2345
+ "heading",
2346
+ "subheading"
2347
+ ]);
2348
+ });
2349
+ it("throws when a single LayoutNode[] is passed to a templated field", ()=>{
2350
+ expect(()=>buildTemplatedForm((layout)=>[
2351
+ layout.object("content", (l)=>[
2352
+ l.row("x")
2353
+ ])
2354
+ ])).toThrow(/is templated/);
2355
+ });
2356
+ it("falls back to default when no layout.object() is registered", ()=>{
2357
+ const form = buildTemplatedForm();
2358
+ const field = form.field("content");
2359
+ field.setTemplate("hero");
2360
+ const vm = form.field("content").vm;
2361
+ expect(vm.layout.length).toBe(2);
2362
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2363
+ "heading"
2364
+ ]);
2365
+ expect(asRow(vm.layout[1]).fields.map((f)=>f.name)).toEqual([
2366
+ "subheading"
2367
+ ]);
2368
+ });
2369
+ });
2370
+ describe("templated list", ()=>{
2371
+ function buildTemplatedListForm() {
2372
+ return createForm({
2373
+ fields: (fields)=>({
2374
+ sections: fields.object().list().template("hero", (t)=>{
2375
+ t.label("Hero").fields((f)=>({
2376
+ heading: f.text().label("Heading"),
2377
+ subheading: f.text().label("Subheading")
2378
+ }));
2379
+ }).template("cta", (t)=>{
2380
+ t.label("CTA").fields((f)=>({
2381
+ text: f.text().label("Text"),
2382
+ url: f.text().label("URL")
2383
+ }));
2384
+ })
2385
+ }),
2386
+ layout: (layout)=>[
2387
+ layout.object("sections", {
2388
+ hero: (l)=>[
2389
+ l.row("heading", "subheading")
2390
+ ],
2391
+ cta: (l)=>[
2392
+ l.row("text"),
2393
+ l.row("url")
2394
+ ]
2395
+ })
2396
+ ]
2397
+ });
2398
+ }
2399
+ it("each item resolves layout against its own template", ()=>{
2400
+ const form = buildTemplatedListForm();
2401
+ const field = form.field("sections");
2402
+ field.addItem("hero");
2403
+ field.addItem("cta");
2404
+ const vm = form.field("sections").vm;
2405
+ expect(vm.items.length).toBe(2);
2406
+ expect(asRow(vm.items[0].layout[0]).fields.map((f)=>f.name)).toEqual([
2407
+ "heading",
2408
+ "subheading"
2409
+ ]);
2410
+ expect(asRow(vm.items[1].layout[0]).fields.map((f)=>f.name)).toEqual([
2411
+ "text"
2412
+ ]);
2413
+ expect(asRow(vm.items[1].layout[1]).fields.map((f)=>f.name)).toEqual([
2414
+ "url"
2415
+ ]);
2416
+ });
2417
+ it("hides hidden child fields from the resolved layout row", ()=>{
2418
+ const form = createForm({
2419
+ fields: (fields)=>({
2420
+ content: fields.object().template("hero", (t)=>{
2421
+ t.label("Hero").fields((f)=>({
2422
+ heading: f.text(),
2423
+ secret: f.text().hidden()
2424
+ }));
2425
+ })
2426
+ }),
2427
+ layout: (layout)=>[
2428
+ layout.object("content", {
2429
+ hero: (l)=>[
2430
+ l.row("heading", "secret")
2431
+ ]
2432
+ })
2433
+ ]
2434
+ });
2435
+ const field = form.field("content");
2436
+ field.setTemplate("hero");
2437
+ const vm = form.field("content").vm;
2438
+ expect(asRow(vm.layout[0]).fields.map((f)=>f.name)).toEqual([
2439
+ "heading"
2440
+ ]);
2441
+ });
2442
+ });
2443
+ describe("interaction with form.vm.layout", ()=>{
2444
+ it("the form layout exposes a single-field row for the object", ()=>{
2445
+ const form = createForm({
2446
+ fields: (fields)=>({
2447
+ content: fields.object().template("hero", (t)=>{
2448
+ t.label("Hero").fields((f)=>({
2449
+ heading: f.text()
2450
+ }));
2451
+ })
2452
+ }),
2453
+ layout: (layout)=>[
2454
+ layout.object("content", {
2455
+ hero: (l)=>[
2456
+ l.row("heading")
2457
+ ]
2458
+ })
2459
+ ]
2460
+ });
2461
+ const layout = form.vm.layout;
2462
+ expect(layout.length).toBe(1);
2463
+ const row = asRow(layout[0]);
2464
+ expect(row.fields.map((f)=>f.name)).toEqual([
2465
+ "content"
2466
+ ]);
2467
+ });
2468
+ it("hides the object node from form.vm.layout when the field is not visible", ()=>{
2469
+ const form = createForm({
2470
+ fields: (fields)=>({
2471
+ content: fields.object().hidden().template("hero", (t)=>{
2472
+ t.label("Hero").fields((f)=>({
2473
+ heading: f.text()
2474
+ }));
2475
+ })
2476
+ }),
2477
+ layout: (layout)=>[
2478
+ layout.object("content", {
2479
+ hero: (l)=>[
2480
+ l.row("heading")
2481
+ ]
2482
+ })
2483
+ ]
2484
+ });
2485
+ expect(form.vm.layout).toEqual([]);
2486
+ });
2487
+ });
2488
+ });
2489
+ describe("nested object layouts (Phase 8c.1)", ()=>{
2490
+ it("registers layout.object() nested inside another object's inner layout (non-templated)", ()=>{
2491
+ const form = createForm({
2492
+ fields: (fields)=>({
2493
+ page: fields.object().fields((f)=>({
2494
+ title: f.text(),
2495
+ seo: f.object().fields((g)=>({
2496
+ metaTitle: g.text(),
2497
+ metaDescription: g.text()
2498
+ }))
2499
+ }))
2500
+ }),
2501
+ layout: (layout)=>[
2502
+ layout.object("page", (l)=>[
2503
+ l.row("title"),
2504
+ l.object("seo", (inner)=>[
2505
+ inner.row("metaTitle", "metaDescription")
2506
+ ])
2507
+ ])
2508
+ ]
2509
+ });
2510
+ const pageVm = form.field("page").vm;
2511
+ const seoRow = asRow(pageVm.layout[1]);
2512
+ const seoVm = seoRow.fields[0];
2513
+ expect(seoVm.layout.length).toBe(1);
2514
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2515
+ "metaTitle",
2516
+ "metaDescription"
2517
+ ]);
2518
+ });
2519
+ it("supports three levels of nesting", ()=>{
2520
+ const form = createForm({
2521
+ fields: (fields)=>({
2522
+ a: fields.object().fields((f)=>({
2523
+ b: f.object().fields((g)=>({
2524
+ c: g.object().fields((h)=>({
2525
+ x: h.text(),
2526
+ y: h.text()
2527
+ }))
2528
+ }))
2529
+ }))
2530
+ }),
2531
+ layout: (layout)=>[
2532
+ layout.object("a", (l1)=>[
2533
+ l1.object("b", (l2)=>[
2534
+ l2.object("c", (l3)=>[
2535
+ l3.row("x", "y")
2536
+ ])
2537
+ ])
2538
+ ])
2539
+ ]
2540
+ });
2541
+ const aVm = form.field("a").vm;
2542
+ const bVm = asRow(aVm.layout[0]).fields[0];
2543
+ const cVm = asRow(bVm.layout[0]).fields[0];
2544
+ expect(cVm.layout.length).toBe(1);
2545
+ expect(asRow(cVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2546
+ "x",
2547
+ "y"
2548
+ ]);
2549
+ });
2550
+ it("registers nested layouts on a templated single object when its template activates", ()=>{
2551
+ const form = createForm({
2552
+ fields: (fields)=>({
2553
+ block: fields.object().template("hero", (t)=>{
2554
+ t.label("Hero").fields((f)=>({
2555
+ heading: f.text(),
2556
+ seo: f.object().fields((g)=>({
2557
+ metaTitle: g.text(),
2558
+ metaDescription: g.text()
2559
+ }))
2560
+ }));
2561
+ })
2562
+ }),
2563
+ layout: (layout)=>[
2564
+ layout.object("block", {
2565
+ hero: (l)=>[
2566
+ l.row("heading"),
2567
+ l.object("seo", (inner)=>[
2568
+ inner.row("metaTitle", "metaDescription")
2569
+ ])
2570
+ ]
2571
+ })
2572
+ ]
2573
+ });
2574
+ const field = form.field("block");
2575
+ field.setTemplate("hero");
2576
+ const vm = form.field("block").vm;
2577
+ const seoRow = asRow(vm.layout[1]);
2578
+ const seoVm = seoRow.fields[0];
2579
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2580
+ "metaTitle",
2581
+ "metaDescription"
2582
+ ]);
2583
+ });
2584
+ it("registers nested layouts on a templated list — each item gets its own", ()=>{
2585
+ const form = createForm({
2586
+ fields: (fields)=>({
2587
+ sections: fields.object().list().template("hero", (t)=>{
2588
+ t.label("Hero").fields((f)=>({
2589
+ heading: f.text(),
2590
+ seo: f.object().fields((g)=>({
2591
+ metaTitle: g.text(),
2592
+ metaDescription: g.text()
2593
+ }))
2594
+ }));
2595
+ })
2596
+ }),
2597
+ layout: (layout)=>[
2598
+ layout.object("sections", {
2599
+ hero: (l)=>[
2600
+ l.row("heading"),
2601
+ l.object("seo", (inner)=>[
2602
+ inner.row("metaTitle", "metaDescription")
2603
+ ])
2604
+ ]
2605
+ })
2606
+ ]
2607
+ });
2608
+ const field = form.field("sections");
2609
+ field.addItem("hero");
2610
+ field.addItem("hero");
2611
+ const vm = form.field("sections").vm;
2612
+ expect(vm.items.length).toBe(2);
2613
+ for (const item of vm.items){
2614
+ const seoVm = asRow(item.layout[1]).fields[0];
2615
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2616
+ "metaTitle",
2617
+ "metaDescription"
2618
+ ]);
2619
+ }
2620
+ });
2621
+ it("registers nested layouts on a non-templated list item upon creation", ()=>{
2622
+ const form = createForm({
2623
+ fields: (fields)=>({
2624
+ rows: fields.object().list().fields((f)=>({
2625
+ label: f.text(),
2626
+ seo: f.object().fields((g)=>({
2627
+ metaTitle: g.text(),
2628
+ metaDescription: g.text()
2629
+ }))
2630
+ }))
2631
+ }),
2632
+ layout: (layout)=>[
2633
+ layout.object("rows", (l)=>[
2634
+ l.row("label"),
2635
+ l.object("seo", (inner)=>[
2636
+ inner.row("metaTitle", "metaDescription")
2637
+ ])
2638
+ ])
2639
+ ]
2640
+ });
2641
+ const field = form.field("rows");
2642
+ field.addItem();
2643
+ const vm = form.field("rows").vm;
2644
+ const seoVm = asRow(vm.items[0].layout[1]).fields[0];
2645
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2646
+ "metaTitle",
2647
+ "metaDescription"
2648
+ ]);
2649
+ });
2650
+ it("registers nested layouts on children added via field.as('object').fields() at runtime", ()=>{
2651
+ const form = createForm({
2652
+ fields: (fields)=>({
2653
+ page: fields.object().fields((f)=>({
2654
+ title: f.text()
2655
+ }))
2656
+ }),
2657
+ layout: (layout)=>[
2658
+ layout.object("page", (l)=>[
2659
+ l.row("title"),
2660
+ l.object("seo", (inner)=>[
2661
+ inner.row("metaTitle", "metaDescription")
2662
+ ])
2663
+ ])
2664
+ ]
2665
+ });
2666
+ form.field("page").as("object").fields((f)=>({
2667
+ seo: f.object().fields((g)=>({
2668
+ metaTitle: g.text(),
2669
+ metaDescription: g.text()
2670
+ }))
2671
+ }));
2672
+ const pageVm = form.field("page").vm;
2673
+ const seoRow = asRow(pageVm.layout[1]);
2674
+ const seoVm = seoRow.fields[0];
2675
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2676
+ "metaTitle",
2677
+ "metaDescription"
2678
+ ]);
2679
+ });
2680
+ it("recurses through tabs nested inside an inner layout", ()=>{
2681
+ const form = createForm({
2682
+ fields: (fields)=>({
2683
+ page: fields.object().fields((f)=>({
2684
+ title: f.text(),
2685
+ seo: f.object().fields((g)=>({
2686
+ metaTitle: g.text(),
2687
+ metaDescription: g.text()
2688
+ }))
2689
+ }))
2690
+ }),
2691
+ layout: (layout)=>[
2692
+ layout.object("page", (l)=>[
2693
+ l.tabs().tab("main", (tab)=>{
2694
+ tab.label("Main").layout((l)=>[
2695
+ l.row("title")
2696
+ ]);
2697
+ }).tab("seoTab", (tab)=>{
2698
+ tab.label("SEO").layout((l)=>[
2699
+ l.object("seo", (inner)=>[
2700
+ inner.row("metaTitle", "metaDescription")
2701
+ ])
2702
+ ]);
2703
+ })
2704
+ ])
2705
+ ]
2706
+ });
2707
+ const seoVm = form.field("page.seo").vm;
2708
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2709
+ "metaTitle",
2710
+ "metaDescription"
2711
+ ]);
2712
+ });
2713
+ it("resolves tabs inside an inner layout against the children scope", ()=>{
2714
+ const form = createForm({
2715
+ fields: (fields)=>({
2716
+ page: fields.object().fields((f)=>({
2717
+ title: f.text(),
2718
+ body: f.text(),
2719
+ seo: f.object().fields((g)=>({
2720
+ metaTitle: g.text(),
2721
+ metaDescription: g.text()
2722
+ }))
2723
+ }))
2724
+ }),
2725
+ layout: (layout)=>[
2726
+ layout.object("page", (l)=>[
2727
+ l.tabs("pageTabs").tab("general", (tab)=>{
2728
+ tab.label("General").layout((l)=>[
2729
+ l.row("title"),
2730
+ l.row("body")
2731
+ ]);
2732
+ }).tab("seo", (tab)=>{
2733
+ tab.label("SEO").layout((l)=>[
2734
+ l.object("seo", (inner)=>[
2735
+ inner.row("metaTitle", "metaDescription")
2736
+ ])
2737
+ ]);
2738
+ })
2739
+ ])
2740
+ ]
2741
+ });
2742
+ const pageVm = form.field("page").vm;
2743
+ expect(pageVm.layout.length).toBe(1);
2744
+ const tabs = pageVm.layout[0];
2745
+ expect(tabs.type).toBe("tabs");
2746
+ expect(tabs.tabs.map((t)=>t.id)).toEqual([
2747
+ "general",
2748
+ "seo"
2749
+ ]);
2750
+ const generalTab = tabs.tabs[0];
2751
+ expect(asRow(generalTab.layout[0]).fields.map((f)=>f.name)).toEqual([
2752
+ "title"
2753
+ ]);
2754
+ expect(asRow(generalTab.layout[1]).fields.map((f)=>f.name)).toEqual([
2755
+ "body"
2756
+ ]);
2757
+ const seoTab = tabs.tabs[1];
2758
+ const seoVm = asRow(seoTab.layout[0]).fields[0];
2759
+ expect(asRow(seoVm.layout[0]).fields.map((f)=>f.name)).toEqual([
2760
+ "metaTitle",
2761
+ "metaDescription"
2762
+ ]);
2763
+ });
2764
+ });
2765
+ describe("runtime template modification (Phase 8d)", ()=>{
2766
+ function createSingleTemplatedForm() {
2767
+ return createForm({
2768
+ fields: (fields)=>({
2769
+ content: fields.object().template("hero", (t)=>{
2770
+ t.label("Hero").fields((f)=>({
2771
+ heading: f.text()
2772
+ }));
2773
+ })
2774
+ })
2775
+ });
2776
+ }
2777
+ function createListTemplatedForm() {
2778
+ return createForm({
2779
+ fields: (fields)=>({
2780
+ blocks: fields.object().list().template("hero", (t)=>{
2781
+ t.label("Hero").fields((f)=>({
2782
+ heading: f.text()
2783
+ }));
2784
+ }).template("text", (t)=>{
2785
+ t.label("Text").fields((f)=>({
2786
+ body: f.text()
2787
+ }));
2788
+ })
2789
+ })
2790
+ });
2791
+ }
2792
+ it("templates.add appends a template and the picker lists it", ()=>{
2793
+ const form = createSingleTemplatedForm();
2794
+ const field = form.field("content").as("object");
2795
+ field.templates.add("text", (t)=>{
2796
+ t.label("Text").fields((f)=>({
2797
+ body: f.text()
2798
+ }));
2799
+ });
2800
+ const vm = form.field("content").vm;
2801
+ expect(vm.availableTemplates.map((t)=>t.id)).toEqual([
2802
+ "hero",
2803
+ "text"
2804
+ ]);
2805
+ });
2806
+ it("templates.add throws on duplicate id", ()=>{
2807
+ const form = createSingleTemplatedForm();
2808
+ const field = form.field("content").as("object");
2809
+ expect(()=>field.templates.add("hero", (t)=>{
2810
+ t.label("Other").fields((f)=>({
2811
+ x: f.text()
2812
+ }));
2813
+ })).toThrow(/Duplicate template id "hero"/);
2814
+ });
2815
+ it("templates.add throws on reserved _templateId", ()=>{
2816
+ const form = createSingleTemplatedForm();
2817
+ const field = form.field("content").as("object");
2818
+ expect(()=>field.templates.add("_templateId", (t)=>{
2819
+ t.label("Reserved").fields((f)=>({
2820
+ x: f.text()
2821
+ }));
2822
+ })).toThrow(/reserved/);
2823
+ });
2824
+ it("templates.add throws when the template defines a reserved _templateId field", ()=>{
2825
+ const form = createSingleTemplatedForm();
2826
+ const field = form.field("content").as("object");
2827
+ expect(()=>field.templates.add("bad", (t)=>{
2828
+ t.label("Bad").fields((f)=>({
2829
+ _templateId: f.text()
2830
+ }));
2831
+ })).toThrow(/reserved field "_templateId"/);
2832
+ });
2833
+ it("templates.remove removes the template from the picker", ()=>{
2834
+ const form = createListTemplatedForm();
2835
+ const field = form.field("blocks").as("object");
2836
+ field.templates.remove("text");
2837
+ const vm = form.field("blocks").vm;
2838
+ expect(vm.availableTemplates.map((t)=>t.id)).toEqual([
2839
+ "hero"
2840
+ ]);
2841
+ });
2842
+ it("templates.remove silently no-ops on unknown id", ()=>{
2843
+ const form = createListTemplatedForm();
2844
+ const field = form.field("blocks").as("object");
2845
+ const before = form.field("blocks").vm.availableTemplates.length;
2846
+ expect(()=>field.templates.remove("nonExistent")).not.toThrow();
2847
+ const after = form.field("blocks").vm.availableTemplates.length;
2848
+ expect(after).toBe(before);
2849
+ });
2850
+ it("templates.remove clears active template on a single-object field via onChange(null) semantics", ()=>{
2851
+ const form = createSingleTemplatedForm();
2852
+ const field = form.field("content").as("object");
2853
+ field.setTemplate("hero");
2854
+ expect(field.activeTemplateId).toBe("hero");
2855
+ field.templates.remove("hero");
2856
+ expect(field.activeTemplateId).toBeNull();
2857
+ expect(field.children.size).toBe(0);
2858
+ expect(form.field("content").getValue()).toBeNull();
2859
+ });
2860
+ it("templates.remove drops list items whose _templateId matches", ()=>{
2861
+ const form = createListTemplatedForm();
2862
+ const field = form.field("blocks").as("object");
2863
+ field.addItem("hero", {
2864
+ heading: "H1"
2865
+ });
2866
+ field.addItem("text", {
2867
+ body: "B1"
2868
+ });
2869
+ field.addItem("hero", {
2870
+ heading: "H2"
2871
+ });
2872
+ expect(field.items.length).toBe(3);
2873
+ field.templates.remove("hero");
2874
+ expect(field.items.length).toBe(1);
2875
+ expect(field.items[0].templateId).toBe("text");
2876
+ });
2877
+ it("templates.add throws when called on a non-templated object field", ()=>{
2878
+ const form = createForm({
2879
+ fields: (fields)=>({
2880
+ plain: fields.object().fields((f)=>({
2881
+ x: f.text()
2882
+ }))
2883
+ })
2884
+ });
2885
+ const field = form.field("plain").as("object");
2886
+ expect(()=>field.templates.add("x", (t)=>{
2887
+ t.label("X").fields((f)=>({
2888
+ y: f.text()
2889
+ }));
2890
+ })).toThrow(/not templated/);
2891
+ });
2892
+ it("templates.remove throws when called on a non-templated object field", ()=>{
2893
+ const form = createForm({
2894
+ fields: (fields)=>({
2895
+ plain: fields.object().fields((f)=>({
2896
+ x: f.text()
2897
+ }))
2898
+ })
2899
+ });
2900
+ const field = form.field("plain").as("object");
2901
+ expect(()=>field.templates.remove("anything")).toThrow(/not templated/);
2902
+ });
2903
+ it("orphan layout entry persists silently and is reused when the same template id is re-added", ()=>{
2904
+ const form = createForm({
2905
+ fields: (fields)=>({
2906
+ content: fields.object().template("hero", (t)=>{
2907
+ t.label("Hero").fields((f)=>({
2908
+ heading: f.text(),
2909
+ subheading: f.text()
2910
+ }));
2911
+ })
2912
+ }),
2913
+ layout: (layout)=>[
2914
+ layout.object("content", {
2915
+ hero: (l)=>[
2916
+ l.row("heading", "subheading")
2917
+ ]
2918
+ })
2919
+ ]
2920
+ });
2921
+ const field = form.field("content").as("object");
2922
+ field.setTemplate("hero");
2923
+ const vmBefore = form.field("content").vm;
2924
+ const rowBefore = asRow(vmBefore.layout[0]);
2925
+ expect(rowBefore.fields.map((f)=>f.name)).toEqual([
2926
+ "heading",
2927
+ "subheading"
2928
+ ]);
2929
+ field.templates.remove("hero");
2930
+ field.templates.add("hero", (t)=>{
2931
+ t.label("Hero v2").fields((f)=>({
2932
+ heading: f.text(),
2933
+ subheading: f.text()
2934
+ }));
2935
+ });
2936
+ field.setTemplate("hero");
2937
+ const vmAfter = form.field("content").vm;
2938
+ const rowAfter = asRow(vmAfter.layout[0]);
2939
+ expect(rowAfter.fields.map((f)=>f.name)).toEqual([
2940
+ "heading",
2941
+ "subheading"
2942
+ ]);
2943
+ });
2944
+ it("removing all templates does not emit dev warnings (orphan suppression)", ()=>{
2945
+ const warn = vi.spyOn(console, "warn").mockImplementation(()=>{});
2946
+ const form = createSingleTemplatedForm();
2947
+ const field = form.field("content").as("object");
2948
+ field.templates.remove("hero");
2949
+ const vm = form.field("content").vm;
2950
+ expect(vm.availableTemplates).toEqual([]);
2951
+ expect(warn).not.toHaveBeenCalled();
2952
+ warn.mockRestore();
2953
+ });
2954
+ });
2955
+ describe("requiredWhen (Phase 11)", ()=>{
2956
+ it("makes a field required when the callback returns true", async ()=>{
2957
+ const form = createForm({
2958
+ fields: (fields)=>({
2959
+ plan: fields.text().defaultValue("free"),
2960
+ seats: fields.text().requiredWhen(({ form })=>"pro" === form.field("plan").getValue(), "Seats required")
2961
+ })
2962
+ });
2963
+ expect(form.field("seats").vm.required).toBe(false);
2964
+ expect(await form.validate()).toBe(true);
2965
+ form.field("plan").setValue("pro");
2966
+ expect(form.field("seats").vm.required).toBe(true);
2967
+ expect(await form.validate()).toBe(false);
2968
+ expect(form.field("seats").vm.validation.message).toBe("Seats required");
2969
+ });
2970
+ it("chains requiredWhen callbacks — first truthy wins", async ()=>{
2971
+ const form = createForm({
2972
+ fields: (fields)=>({
2973
+ plan: fields.text().defaultValue("free"),
2974
+ flag: fields.text().defaultValue("off"),
2975
+ seats: fields.text().requiredWhen(({ form })=>"pro" === form.field("plan").getValue(), "Pro requires it").requiredWhen(({ form })=>"on" === form.field("flag").getValue(), "Flag requires it")
2976
+ })
2977
+ });
2978
+ form.field("flag").setValue("on");
2979
+ await form.validate();
2980
+ expect(form.field("seats").vm.validation.message).toBe("Flag requires it");
2981
+ form.field("plan").setValue("pro");
2982
+ await form.validate();
2983
+ expect(form.field("seats").vm.validation.message).toBe("Pro requires it");
2984
+ });
2985
+ it("hard .required() always wins over requiredWhen messages", async ()=>{
2986
+ const form = createForm({
2987
+ fields: (fields)=>({
2988
+ seats: fields.text().required("Always required").requiredWhen(()=>true, "Conditional message")
2989
+ })
2990
+ });
2991
+ await form.validate();
2992
+ expect(form.field("seats").vm.required).toBe(true);
2993
+ expect(form.field("seats").vm.validation.message).toBe("Always required");
2994
+ });
2995
+ it("modifier-added requiredWhen chains with builder-defined ones", async ()=>{
2996
+ const form = createForm({
2997
+ fields: (fields)=>({
2998
+ plan: fields.text().defaultValue("free"),
2999
+ other: fields.text().defaultValue("off"),
3000
+ seats: fields.text().requiredWhen(({ form })=>"pro" === form.field("plan").getValue(), "Pro required")
3001
+ })
3002
+ });
3003
+ form.field("seats").addRequiredWhen(({ form })=>"on" === form.field("other").getValue(), "Other required");
3004
+ expect(form.field("seats").vm.required).toBe(false);
3005
+ form.field("other").setValue("on");
3006
+ await form.validate();
3007
+ expect(form.field("seats").vm.validation.message).toBe("Other required");
3008
+ });
3009
+ });
3010
+ describe("computed / computedUntilDirty (Phase 11)", ()=>{
3011
+ it("computed field exposes derived value reactively", ()=>{
3012
+ const form = createForm({
3013
+ fields: (fields)=>({
3014
+ first: fields.text().defaultValue("Ada"),
3015
+ last: fields.text().defaultValue("Lovelace"),
3016
+ full: fields.text().computed(({ form })=>`${form.field("first").getValue()} ${form.field("last").getValue()}`)
3017
+ })
3018
+ });
3019
+ expect(form.field("full").getValue()).toBe("Ada Lovelace");
3020
+ form.field("first").setValue("Grace");
3021
+ expect(form.field("full").getValue()).toBe("Grace Lovelace");
3022
+ });
3023
+ it("computed field stays editable but value remains derived", ()=>{
3024
+ const form = createForm({
3025
+ fields: (fields)=>({
3026
+ src: fields.text().defaultValue("A"),
3027
+ derived: fields.text().computed(({ form })=>form.field("src").getValue())
3028
+ })
3029
+ });
3030
+ expect(form.field("derived").vm.disabled).toBe(false);
3031
+ form.field("derived").vm.onChange("manual override");
3032
+ expect(form.field("derived").getValue()).toBe("A");
3033
+ });
3034
+ it("computedUntilDirty switches to manual after first UI edit", ()=>{
3035
+ const form = createForm({
3036
+ fields: (fields)=>({
3037
+ src: fields.text().defaultValue("A"),
3038
+ derived: fields.text().computedUntilDirty(({ form })=>`derived-${form.field("src").getValue()}`)
3039
+ })
3040
+ });
3041
+ expect(form.field("derived").getValue()).toBe("derived-A");
3042
+ form.field("derived").vm.onChange("manual");
3043
+ expect(form.field("derived").getValue()).toBe("manual");
3044
+ form.field("src").setValue("B");
3045
+ expect(form.field("derived").getValue()).toBe("manual");
3046
+ });
3047
+ it("computed field still participates in validation", async ()=>{
3048
+ const form = createForm({
3049
+ fields: (fields)=>({
3050
+ src: fields.text().defaultValue(""),
3051
+ derived: fields.text().required("Derived must not be empty").computed(({ form })=>form.field("src").getValue())
3052
+ })
3053
+ });
3054
+ const valid = await form.validate();
3055
+ expect(valid).toBe(false);
3056
+ expect(form.field("derived").vm.validation.message).toBe("Derived must not be empty");
3057
+ form.field("src").setValue("hello");
3058
+ expect(await form.validate()).toBe(true);
3059
+ });
3060
+ it("computedUntilDirty can access nested fields inside object via dot notation", ()=>{
3061
+ const form = createForm({
3062
+ fields: (fields)=>({
3063
+ group: fields.object().renderer("passthrough").fields((f)=>({
3064
+ label: f.text().defaultValue("Hello World"),
3065
+ fieldId: f.text().computedUntilDirty(({ form })=>String(form.field("group.label").getValue() || "").toLowerCase().replace(/\s+/g, "-"))
3066
+ }))
3067
+ })
3068
+ });
3069
+ expect(form.field("group.fieldId").getValue()).toBe("hello-world");
3070
+ form.field("group.label").setValue("New Title");
3071
+ expect(form.field("group.fieldId").getValue()).toBe("new-title");
3072
+ form.field("group.fieldId").vm.onChange("custom-id");
3073
+ expect(form.field("group.fieldId").getValue()).toBe("custom-id");
3074
+ form.field("group.label").setValue("Another");
3075
+ expect(form.field("group.fieldId").getValue()).toBe("custom-id");
3076
+ });
3077
+ it("computedUntilDirty works after setData for nested object fields", ()=>{
3078
+ const form = createForm({
3079
+ fields: (fields)=>({
3080
+ general: fields.object().renderer("passthrough").fields((f)=>({
3081
+ label: f.text(),
3082
+ fieldId: f.text().computedUntilDirty(({ form })=>String(form.field("general.label").getValue() || "").toLowerCase().replace(/\s+/g, "-"))
3083
+ }))
3084
+ })
3085
+ });
3086
+ expect(form.field("general.fieldId").getValue()).toBe("");
3087
+ form.setData({
3088
+ general: {
3089
+ label: "My Field"
3090
+ }
3091
+ });
3092
+ expect(form.field("general.fieldId").getValue()).toBe("my-field");
3093
+ form.field("general.label").setValue("Updated Label");
3094
+ expect(form.field("general.fieldId").getValue()).toBe("updated-label");
3095
+ form.field("general.fieldId").vm.onChange("custom");
3096
+ expect(form.field("general.fieldId").getValue()).toBe("custom");
3097
+ form.field("general.label").setValue("Ignored");
3098
+ expect(form.field("general.fieldId").getValue()).toBe("custom");
3099
+ });
3100
+ it("field.parent().field() resolves sibling fields relative to the parent object", ()=>{
3101
+ const form = createForm({
3102
+ fields: (fields)=>({
3103
+ group: fields.object().renderer("passthrough").fields((f)=>({
3104
+ label: f.text().defaultValue("Hello"),
3105
+ slug: f.text().computedUntilDirty(({ field })=>String(field.parent().field("label").getValue() || "").toLowerCase().replace(/\s+/g, "-"))
3106
+ }))
3107
+ })
3108
+ });
3109
+ expect(form.field("group.slug").getValue()).toBe("hello");
3110
+ form.field("group.label").setValue("New Title");
3111
+ expect(form.field("group.slug").getValue()).toBe("new-title");
3112
+ });
3113
+ it("field.parent().field() can traverse into sibling objects", ()=>{
3114
+ const form = createForm({
3115
+ fields: (fields)=>({
3116
+ wrapper: fields.object().renderer("passthrough").fields((f)=>({
3117
+ message: f.text().defaultValue("default").computedUntilDirty(({ field })=>{
3118
+ const preset = field.parent().field("settings.preset").getValue();
3119
+ return "custom" === preset ? "Custom message" : `Preset: ${preset}`;
3120
+ }),
3121
+ settings: f.object().renderer("passthrough").fields((inner)=>({
3122
+ preset: inner.text().defaultValue("custom")
3123
+ }))
3124
+ }))
3125
+ })
3126
+ });
3127
+ expect(form.field("wrapper.message").getValue()).toBe("Custom message");
3128
+ form.field("wrapper.settings.preset").setValue("email");
3129
+ expect(form.field("wrapper.message").getValue()).toBe("Preset: email");
3130
+ });
3131
+ it("modifier setComputed converts a regular field into a computed one", ()=>{
3132
+ const form = createForm({
3133
+ fields: (fields)=>({
3134
+ src: fields.text().defaultValue("X"),
3135
+ derived: fields.text().defaultValue("initial")
3136
+ })
3137
+ });
3138
+ form.field("derived").setComputed(({ form })=>`from-${form.field("src").getValue()}`);
3139
+ expect(form.field("derived").getValue()).toBe("from-X");
3140
+ form.field("src").setValue("Y");
3141
+ expect(form.field("derived").getValue()).toBe("from-Y");
3142
+ });
3143
+ });
3144
+ describe('field("...").as("object").fields() (Phase 11)', ()=>{
3145
+ it("adds new children to an existing object field at runtime", ()=>{
3146
+ const form = createForm({
3147
+ fields: (fields)=>({
3148
+ profile: fields.object().fields((f)=>({
3149
+ firstName: f.text().label("First")
3150
+ }))
3151
+ })
3152
+ });
3153
+ form.field("profile").as("object").fields((f)=>({
3154
+ lastName: f.text().label("Last")
3155
+ }));
3156
+ form.field("profile.firstName").setValue("Ada");
3157
+ form.field("profile.lastName").setValue("Lovelace");
3158
+ expect(form.getData()).toEqual({
3159
+ profile: {
3160
+ firstName: "Ada",
3161
+ lastName: "Lovelace"
3162
+ }
3163
+ });
3164
+ });
3165
+ it("replaces existing children when keys collide", ()=>{
3166
+ const form = createForm({
3167
+ fields: (fields)=>({
3168
+ profile: fields.object().fields((f)=>({
3169
+ firstName: f.text().label("Old")
3170
+ }))
3171
+ })
3172
+ });
3173
+ form.field("profile").as("object").fields((f)=>({
3174
+ firstName: f.text().label("New")
3175
+ }));
3176
+ const profile = form.field("profile").as("object");
3177
+ expect(profile.children.get("firstName")?.config.label).toBe("New");
3178
+ });
3179
+ it("removes children when factory returns undefined", ()=>{
3180
+ const form = createForm({
3181
+ fields: (fields)=>({
3182
+ profile: fields.object().fields((f)=>({
3183
+ firstName: f.text(),
3184
+ lastName: f.text()
3185
+ }))
3186
+ })
3187
+ });
3188
+ form.field("profile").as("object").fields(()=>({
3189
+ lastName: void 0
3190
+ }));
3191
+ const profile = form.field("profile").as("object");
3192
+ expect(profile.children.has("lastName")).toBe(false);
3193
+ expect(profile.children.has("firstName")).toBe(true);
3194
+ });
3195
+ it("propagates added children to existing list items", ()=>{
3196
+ const form = createForm({
3197
+ fields: (fields)=>({
3198
+ contacts: fields.object().list().fields((f)=>({
3199
+ name: f.text()
3200
+ }))
3201
+ })
3202
+ });
3203
+ const contacts = form.field("contacts").as("object");
3204
+ contacts.addItem({
3205
+ name: "Ada"
3206
+ });
3207
+ contacts.addItem({
3208
+ name: "Grace"
3209
+ });
3210
+ contacts.fields((f)=>({
3211
+ email: f.text()
3212
+ }));
3213
+ expect(contacts.items[0].children.has("email")).toBe(true);
3214
+ expect(contacts.items[1].children.has("email")).toBe(true);
3215
+ contacts.addItem({
3216
+ name: "Linus",
3217
+ email: "linus@example.com"
3218
+ });
3219
+ expect(contacts.items[2].children.get("email")?.getValue()).toBe("linus@example.com");
3220
+ });
3221
+ it("throws when called on a templated object field", ()=>{
3222
+ const form = createForm({
3223
+ fields: (fields)=>({
3224
+ block: fields.object().template("a", (t)=>{
3225
+ t.label("A").fields((f)=>({
3226
+ x: f.text()
3227
+ }));
3228
+ })
3229
+ })
3230
+ });
3231
+ expect(()=>{
3232
+ form.field("block").as("object").fields((f)=>({
3233
+ y: f.text()
3234
+ }));
3235
+ }).toThrow(/templated/);
3236
+ });
3237
+ });
3238
+ describe("form.addRule() (Phase 11)", ()=>{
3239
+ it("runs a Zod schema against getData() and surfaces issues", async ()=>{
3240
+ const form = createForm({
3241
+ fields: (fields)=>({
3242
+ password: fields.text().defaultValue("a"),
3243
+ confirm: fields.text().defaultValue("b")
3244
+ })
3245
+ });
3246
+ form.addRule(z.object({
3247
+ password: z.string(),
3248
+ confirm: z.string()
3249
+ }).refine((d)=>d.password === d.confirm, {
3250
+ message: "Passwords must match",
3251
+ path: [
3252
+ "confirm"
3253
+ ]
3254
+ }));
3255
+ const valid = await form.validate();
3256
+ expect(valid).toBe(false);
3257
+ expect(form.errors.some((e)=>"Passwords must match" === e.message)).toBe(true);
3258
+ expect(form.field("confirm").vm.validation.isValid).toBe(false);
3259
+ expect(form.field("confirm").vm.validation.message).toBe("Passwords must match");
3260
+ });
3261
+ it("runs an imperative function and merges returned errors", async ()=>{
3262
+ const form = createForm({
3263
+ fields: (fields)=>({
3264
+ age: fields.text().defaultValue("17")
3265
+ })
3266
+ });
3267
+ form.addRule((f)=>{
3268
+ if (Number(f.field("age").getValue()) < 18) return [
3269
+ {
3270
+ path: "age",
3271
+ message: "Must be 18+"
3272
+ }
3273
+ ];
3274
+ return [];
3275
+ });
3276
+ expect(await form.validate()).toBe(false);
3277
+ expect(form.field("age").vm.validation.message).toBe("Must be 18+");
3278
+ form.field("age").setValue("21");
3279
+ expect(await form.validate()).toBe(true);
3280
+ });
3281
+ it("supports async imperative rules", async ()=>{
3282
+ const form = createForm({
3283
+ fields: (fields)=>({
3284
+ name: fields.text().defaultValue("taken")
3285
+ })
3286
+ });
3287
+ form.addRule(async (f)=>{
3288
+ await Promise.resolve();
3289
+ if ("taken" === f.field("name").getValue()) return [
3290
+ {
3291
+ path: "name",
3292
+ message: "Already taken"
3293
+ }
3294
+ ];
3295
+ return [];
3296
+ });
3297
+ expect(await form.validate()).toBe(false);
3298
+ expect(form.field("name").vm.validation.message).toBe("Already taken");
3299
+ });
3300
+ });
3301
+ describe("form.setLayout() (Phase 11)", ()=>{
3302
+ it("replaces the layout entirely", ()=>{
3303
+ const form = createForm({
3304
+ fields: (fields)=>({
3305
+ a: fields.text(),
3306
+ b: fields.text(),
3307
+ c: fields.text()
3308
+ }),
3309
+ layout: (layout)=>[
3310
+ layout.row("a"),
3311
+ layout.row("b"),
3312
+ layout.row("c")
3313
+ ]
3314
+ });
3315
+ form.setLayout((layout)=>[
3316
+ layout.row("c", "a")
3317
+ ]);
3318
+ const layout = form.vm.layout;
3319
+ expect(layout).toHaveLength(1);
3320
+ const row = asRow(layout[0]);
3321
+ expect(row.fields.map((f)=>f.name)).toEqual([
3322
+ "c",
3323
+ "a"
3324
+ ]);
3325
+ });
3326
+ it("emits orphan warnings for fields not in the new layout", ()=>{
3327
+ const warn = vi.spyOn(console, "warn").mockImplementation(()=>{});
3328
+ const form = createForm({
3329
+ fields: (fields)=>({
3330
+ a: fields.text(),
3331
+ b: fields.text()
3332
+ })
3333
+ });
3334
+ warn.mockClear();
3335
+ form.setLayout((layout)=>[
3336
+ layout.row("a")
3337
+ ]);
3338
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('Field "b" is not in the layout'));
3339
+ warn.mockRestore();
3340
+ });
3341
+ });
3342
+ describe("Phase 10: Advanced Validation", ()=>{
3343
+ describe("field.vm.validating", ()=>{
3344
+ it("should be false initially", ()=>{
3345
+ const form = createBasicForm();
3346
+ expect(form.field("title").vm.validating).toBe(false);
3347
+ });
3348
+ it("should be true while async schema validates", async ()=>{
3349
+ let resolveValidation;
3350
+ const form = createForm({
3351
+ fields: (fields)=>({
3352
+ email: fields.text().schema(z.string().refine(async ()=>{
3353
+ await new Promise((r)=>{
3354
+ resolveValidation = r;
3355
+ });
3356
+ return true;
3357
+ }))
3358
+ })
3359
+ });
3360
+ form.field("email").setValue("test@test.com");
3361
+ const promise = form.validate();
3362
+ await new Promise((r)=>setTimeout(r, 0));
3363
+ expect(form.field("email").vm.validating).toBe(true);
3364
+ resolveValidation();
3365
+ await promise;
3366
+ expect(form.field("email").vm.validating).toBe(false);
3367
+ });
3368
+ it("should be false after sync-only validation", async ()=>{
3369
+ const form = createForm({
3370
+ fields: (fields)=>({
3371
+ name: fields.text().required()
3372
+ })
3373
+ });
3374
+ form.field("name").setValue("hello");
3375
+ await form.validate();
3376
+ expect(form.field("name").vm.validating).toBe(false);
3377
+ });
3378
+ });
3379
+ describe("form.submitted", ()=>{
3380
+ it("should be false initially", ()=>{
3381
+ const form = createBasicForm();
3382
+ expect(form.submitted).toBe(false);
3383
+ });
3384
+ it("should be true after validate()", async ()=>{
3385
+ const form = createBasicForm();
3386
+ form.field("title").setValue("t");
3387
+ form.field("path").setValue("/p");
3388
+ await form.validate();
3389
+ expect(form.submitted).toBe(true);
3390
+ });
3391
+ it("should be true after failed validate()", async ()=>{
3392
+ const form = createBasicForm();
3393
+ await form.validate();
3394
+ expect(form.submitted).toBe(true);
3395
+ });
3396
+ it("should reset to false on setData()", async ()=>{
3397
+ const form = createBasicForm();
3398
+ form.field("title").setValue("t");
3399
+ form.field("path").setValue("/p");
3400
+ await form.validate();
3401
+ expect(form.submitted).toBe(true);
3402
+ form.setData({
3403
+ title: "new",
3404
+ path: "/new"
3405
+ });
3406
+ expect(form.submitted).toBe(false);
3407
+ });
3408
+ it("should reset to false on reset()", async ()=>{
3409
+ const form = createBasicForm();
3410
+ form.field("title").setValue("t");
3411
+ form.field("path").setValue("/p");
3412
+ await form.validate();
3413
+ expect(form.submitted).toBe(true);
3414
+ form.reset();
3415
+ expect(form.submitted).toBe(false);
3416
+ });
3417
+ });
3418
+ describe("validate-on-blur after submit", ()=>{
3419
+ it("should not validate on blur before first submit", async ()=>{
3420
+ const form = createForm({
3421
+ fields: (fields)=>({
3422
+ email: fields.text().required("Required")
3423
+ })
3424
+ });
3425
+ form.field("email").vm.onBlur();
3426
+ await new Promise((r)=>setTimeout(r, 0));
3427
+ expect(form.field("email").vm.validation.isValid).toBeNull();
3428
+ });
3429
+ it("should validate on blur after first submit", async ()=>{
3430
+ const form = createForm({
3431
+ fields: (fields)=>({
3432
+ email: fields.text().required("Required").schema(z.string().email("Invalid email"))
3433
+ })
3434
+ });
3435
+ form.field("email").setValue("bad");
3436
+ await form.submit();
3437
+ expect(form.field("email").vm.validation.isValid).toBe(false);
3438
+ form.field("email").setValue("valid@email.com");
3439
+ form.field("email").vm.onBlur();
3440
+ await new Promise((r)=>setTimeout(r, 0));
3441
+ expect(form.field("email").vm.validation.isValid).toBe(true);
3442
+ });
3443
+ it("should show error on blur for invalid value after submit", async ()=>{
3444
+ const form = createForm({
3445
+ fields: (fields)=>({
3446
+ name: fields.text().required("Name is required")
3447
+ })
3448
+ });
3449
+ form.field("name").setValue("hello");
3450
+ await form.submit();
3451
+ expect(form.field("name").vm.validation.isValid).toBe(true);
3452
+ form.field("name").setValue("");
3453
+ form.field("name").vm.onBlur();
3454
+ await new Promise((r)=>setTimeout(r, 0));
3455
+ expect(form.field("name").vm.validation.isValid).toBe(false);
3456
+ expect(form.field("name").vm.validation.message).toBe("Name is required");
3457
+ });
3458
+ });
3459
+ describe("validation memoization", ()=>{
3460
+ it("should not re-run schema on blur when value unchanged", async ()=>{
3461
+ const schemaSpy = vi.fn().mockReturnValue(true);
3462
+ const form = createForm({
3463
+ fields: (fields)=>({
3464
+ slug: fields.text().schema(z.string().refine(schemaSpy, "fail"))
3465
+ })
3466
+ });
3467
+ form.field("slug").setValue("hello");
3468
+ await form.submit();
3469
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
3470
+ form.field("slug").vm.onBlur();
3471
+ await new Promise((r)=>setTimeout(r, 0));
3472
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
3473
+ });
3474
+ it("should re-run schema on blur when value changed", async ()=>{
3475
+ const schemaSpy = vi.fn().mockReturnValue(true);
3476
+ const form = createForm({
3477
+ fields: (fields)=>({
3478
+ slug: fields.text().schema(z.string().refine(schemaSpy, "fail"))
3479
+ })
3480
+ });
3481
+ form.field("slug").setValue("hello");
3482
+ await form.submit();
3483
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
3484
+ form.field("slug").setValue("world");
3485
+ form.field("slug").vm.onBlur();
3486
+ await new Promise((r)=>setTimeout(r, 0));
3487
+ expect(schemaSpy).toHaveBeenCalledTimes(2);
3488
+ });
3489
+ it("should always re-run schema on form.validate()", async ()=>{
3490
+ const schemaSpy = vi.fn().mockReturnValue(true);
3491
+ const form = createForm({
3492
+ fields: (fields)=>({
3493
+ slug: fields.text().schema(z.string().refine(schemaSpy, "fail"))
3494
+ })
3495
+ });
3496
+ form.field("slug").setValue("hello");
3497
+ await form.validate();
3498
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
3499
+ await form.validate();
3500
+ expect(schemaSpy).toHaveBeenCalledTimes(2);
3501
+ });
3502
+ it("should clear cache on resetValidation()", async ()=>{
3503
+ const schemaSpy = vi.fn().mockReturnValue(true);
3504
+ const form = createForm({
3505
+ fields: (fields)=>({
3506
+ slug: fields.text().schema(z.string().refine(schemaSpy, "fail"))
3507
+ })
3508
+ });
3509
+ form.field("slug").setValue("hello");
3510
+ await form.submit();
3511
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
3512
+ form.field("slug").resetValidation();
3513
+ form.field("slug").vm.onBlur();
3514
+ await new Promise((r)=>setTimeout(r, 0));
3515
+ expect(schemaSpy).toHaveBeenCalledTimes(2);
3516
+ });
3517
+ });
3518
+ describe("async validation with z.refine", ()=>{
3519
+ it("should validate async refine on submit", async ()=>{
3520
+ const form = createForm({
3521
+ fields: (fields)=>({
3522
+ slug: fields.text().schema(z.string().refine(async (value)=>"taken" !== value, "This slug is already taken"))
3523
+ })
3524
+ });
3525
+ form.field("slug").setValue("taken");
3526
+ const result = await form.submit();
3527
+ expect(result).toBe(false);
3528
+ expect(form.field("slug").vm.validation.isValid).toBe(false);
3529
+ expect(form.field("slug").vm.validation.message).toBe("This slug is already taken");
3530
+ });
3531
+ it("should pass async refine with valid value", async ()=>{
3532
+ const form = createForm({
3533
+ fields: (fields)=>({
3534
+ slug: fields.text().schema(z.string().refine(async (value)=>"taken" !== value, "This slug is already taken"))
3535
+ })
3536
+ });
3537
+ form.field("slug").setValue("available");
3538
+ const result = await form.submit();
3539
+ expect(result).toEqual({
3540
+ slug: "available"
3541
+ });
3542
+ expect(form.field("slug").vm.validation.isValid).toBe(true);
3543
+ });
3544
+ });
3545
+ });
3546
+ describe("normalizeValue", ()=>{
3547
+ it("should coerce string to number on setValue for number fields", ()=>{
3548
+ const form = createForm({
3549
+ fields: (fields)=>({
3550
+ count: fields.number().label("Count")
3551
+ })
3552
+ });
3553
+ form.field("count").setValue("42");
3554
+ expect(form.field("count").getValue()).toBe(42);
3555
+ });
3556
+ it("should normalize invalid values to null for number fields", ()=>{
3557
+ const form = createForm({
3558
+ fields: (fields)=>({
3559
+ count: fields.number().label("Count")
3560
+ })
3561
+ });
3562
+ form.field("count").setValue("");
3563
+ expect(form.field("count").getValue()).toBe(null);
3564
+ form.field("count").setValue(null);
3565
+ expect(form.field("count").getValue()).toBe(null);
3566
+ form.field("count").setValue("abc");
3567
+ expect(form.field("count").getValue()).toBe(null);
3568
+ });
3569
+ it("should store number for number field with options", ()=>{
3570
+ const form = createForm({
3571
+ fields: (fields)=>({
3572
+ tier: fields.number().label("Tier").options([
3573
+ {
3574
+ label: "Tier 1",
3575
+ value: 100
3576
+ },
3577
+ {
3578
+ label: "Tier 2",
3579
+ value: 200
3580
+ }
3581
+ ])
3582
+ })
3583
+ });
3584
+ form.field("tier").setValue("100");
3585
+ expect(form.field("tier").getValue()).toBe(100);
3586
+ expect(typeof form.field("tier").getValue()).toBe("number");
3587
+ });
3588
+ it("should coerce to boolean on setValue for boolean fields", ()=>{
3589
+ const form = createForm({
3590
+ fields: (fields)=>({
3591
+ active: fields.boolean().label("Active")
3592
+ })
3593
+ });
3594
+ form.field("active").setValue(1);
3595
+ expect(form.field("active").getValue()).toBe(true);
3596
+ form.field("active").setValue(0);
3597
+ expect(form.field("active").getValue()).toBe(false);
3598
+ });
3599
+ it("should apply normalizeValue on setData (via setValueSilent)", ()=>{
3600
+ const form = createForm({
3601
+ fields: (fields)=>({
3602
+ count: fields.number().label("Count")
3603
+ })
3604
+ });
3605
+ form.setData({
3606
+ count: "42"
3607
+ });
3608
+ expect(form.field("count").getValue()).toBe(42);
3609
+ expect(typeof form.field("count").getValue()).toBe("number");
3610
+ });
3611
+ it("should not alter text field values", ()=>{
3612
+ const form = createForm({
3613
+ fields: (fields)=>({
3614
+ name: fields.text().label("Name")
3615
+ })
3616
+ });
3617
+ form.field("name").setValue("hello");
3618
+ expect(form.field("name").getValue()).toBe("hello");
3619
+ form.field("name").setValue(42);
3620
+ expect(form.field("name").getValue()).toBe(42);
3621
+ });
3622
+ it("should run normalizeValue before beforeChange", ()=>{
3623
+ const log = [];
3624
+ const form = createForm({
3625
+ fields: (fields)=>({
3626
+ count: fields.number().label("Count").beforeChange((value)=>{
3627
+ log.push(value);
3628
+ return value;
3629
+ })
3630
+ })
3631
+ });
3632
+ form.field("count").setValue("7");
3633
+ expect(log).toEqual([
3634
+ 7
3635
+ ]);
3636
+ });
3637
+ });
3638
+ describe("focusField", ()=>{
3639
+ it("should set focusRequested on the target field", ()=>{
3640
+ const form = createForm({
3641
+ fields: (fields)=>({
3642
+ title: fields.text().label("Title"),
3643
+ path: fields.text().label("Path")
3644
+ })
3645
+ });
3646
+ form.focusField("title");
3647
+ expect(form.field("title").vm.focusRequested).toBe(true);
3648
+ expect(form.field("path").vm.focusRequested).toBe(false);
3649
+ });
3650
+ it("should activate the correct tab", ()=>{
3651
+ const form = createForm({
3652
+ fields: (fields)=>({
3653
+ title: fields.text().label("Title"),
3654
+ slug: fields.text().label("Slug")
3655
+ }),
3656
+ layout: (layout)=>[
3657
+ layout.tabs("mainTabs").tab("general", (tab)=>{
3658
+ tab.label("General").layout((l)=>[
3659
+ l.row("title")
3660
+ ]);
3661
+ }).tab("seo", (tab)=>{
3662
+ tab.label("SEO").layout((l)=>[
3663
+ l.row("slug")
3664
+ ]);
3665
+ })
3666
+ ]
3667
+ });
3668
+ expect(form.vm.layout[0].activeTabId).toBe("general");
3669
+ form.focusField("slug");
3670
+ expect(form.field("slug").vm.focusRequested).toBe(true);
3671
+ expect(form.vm.layout[0].activeTabId).toBe("seo");
3672
+ });
3673
+ it("should activate nested tabs inside object fields", ()=>{
3674
+ const form = createForm({
3675
+ fields: (fields)=>({
3676
+ page: fields.object().fields((f)=>({
3677
+ title: f.text().label("Title"),
3678
+ metaTitle: f.text().label("Meta Title")
3679
+ }))
3680
+ }),
3681
+ layout: (layout)=>[
3682
+ layout.object("page", (l)=>[
3683
+ l.tabs("pageTabs").tab("general", (tab)=>{
3684
+ tab.label("General").layout((l)=>[
3685
+ l.row("title")
3686
+ ]);
3687
+ }).tab("seo", (tab)=>{
3688
+ tab.label("SEO").layout((l)=>[
3689
+ l.row("metaTitle")
3690
+ ]);
3691
+ })
3692
+ ])
3693
+ ]
3694
+ });
3695
+ form.focusField("page.metaTitle");
3696
+ expect(form.field("page.metaTitle").vm.focusRequested).toBe(true);
3697
+ });
3698
+ it("should clear previous focus when focusing a new field", ()=>{
3699
+ const form = createForm({
3700
+ fields: (fields)=>({
3701
+ title: fields.text().label("Title"),
3702
+ path: fields.text().label("Path")
3703
+ })
3704
+ });
3705
+ form.focusField("title");
3706
+ expect(form.field("title").vm.focusRequested).toBe(true);
3707
+ form.focusField("path");
3708
+ expect(form.field("title").vm.focusRequested).toBe(false);
3709
+ expect(form.field("path").vm.focusRequested).toBe(true);
3710
+ });
3711
+ it("should allow renderer to clear focus via clearFocusRequest", ()=>{
3712
+ const form = createForm({
3713
+ fields: (fields)=>({
3714
+ title: fields.text().label("Title")
3715
+ })
3716
+ });
3717
+ form.focusField("title");
3718
+ expect(form.field("title").vm.focusRequested).toBe(true);
3719
+ form.field("title").vm.clearFocusRequest();
3720
+ expect(form.field("title").vm.focusRequested).toBe(false);
3721
+ });
3722
+ it("should not throw on unknown field", ()=>{
3723
+ const form = createForm({
3724
+ fields: (fields)=>({
3725
+ title: fields.text().label("Title")
3726
+ })
3727
+ });
3728
+ expect(()=>form.focusField("nonexistent")).not.toThrow();
3729
+ });
3730
+ it("should propagate qualifiedName through nested objects", ()=>{
3731
+ const form = createForm({
3732
+ fields: (fields)=>({
3733
+ page: fields.object().fields((f)=>({
3734
+ seo: f.object().fields((g)=>({
3735
+ metaTitle: g.text().label("Meta Title")
3736
+ }))
3737
+ }))
3738
+ })
3739
+ });
3740
+ const meta = form.field("page.seo.metaTitle");
3741
+ expect(meta.qualifiedName).toBe("page.seo.metaTitle");
3742
+ });
3743
+ it("field.focus() should delegate to form.focusField", ()=>{
3744
+ const form = createForm({
3745
+ fields: (fields)=>({
3746
+ title: fields.text().label("Title"),
3747
+ path: fields.text().label("Path")
3748
+ }),
3749
+ layout: (layout)=>[
3750
+ layout.tabs("tabs").tab("t1", (tab)=>{
3751
+ tab.label("T1").layout((l)=>[
3752
+ l.row("title")
3753
+ ]);
3754
+ }).tab("t2", (tab)=>{
3755
+ tab.label("T2").layout((l)=>[
3756
+ l.row("path")
3757
+ ]);
3758
+ })
3759
+ ]
3760
+ });
3761
+ form.field("path").focus();
3762
+ expect(form.field("path").vm.focusRequested).toBe(true);
3763
+ expect(form.vm.layout[0].activeTabId).toBe("t2");
3764
+ });
3765
+ });
3766
+ describe("primitive list addItem / removeItem", ()=>{
3767
+ it("addItem appends to empty list", ()=>{
3768
+ const form = createForm({
3769
+ fields: (f)=>({
3770
+ tags: f.text().list()
3771
+ }),
3772
+ layout: (l)=>[
3773
+ l.row("tags")
3774
+ ]
3775
+ });
3776
+ const vm = form.field("tags").vm;
3777
+ expect(vm.value).toEqual([]);
3778
+ vm.addItem("hello");
3779
+ expect(form.field("tags").vm.value).toEqual([
3780
+ "hello"
3781
+ ]);
3782
+ });
3783
+ it("addItem appends with default null when no value given", ()=>{
3784
+ const form = createForm({
3785
+ fields: (f)=>({
3786
+ tags: f.text().list()
3787
+ }),
3788
+ layout: (l)=>[
3789
+ l.row("tags")
3790
+ ]
3791
+ });
3792
+ form.field("tags").vm.addItem();
3793
+ expect(form.field("tags").vm.value).toEqual([
3794
+ null
3795
+ ]);
3796
+ });
3797
+ it("addItem appends to existing values", ()=>{
3798
+ const form = createForm({
3799
+ fields: (f)=>({
3800
+ tags: f.text().list().defaultValue([
3801
+ "a",
3802
+ "b"
3803
+ ])
3804
+ }),
3805
+ layout: (l)=>[
3806
+ l.row("tags")
3807
+ ]
3808
+ });
3809
+ form.field("tags").vm.addItem("c");
3810
+ expect(form.field("tags").vm.value).toEqual([
3811
+ "a",
3812
+ "b",
3813
+ "c"
3814
+ ]);
3815
+ });
3816
+ it("removeItem removes at index", ()=>{
3817
+ const form = createForm({
3818
+ fields: (f)=>({
3819
+ tags: f.text().list().defaultValue([
3820
+ "a",
3821
+ "b",
3822
+ "c"
3823
+ ])
3824
+ }),
3825
+ layout: (l)=>[
3826
+ l.row("tags")
3827
+ ]
3828
+ });
3829
+ form.field("tags").vm.removeItem(1);
3830
+ expect(form.field("tags").vm.value).toEqual([
3831
+ "a",
3832
+ "c"
3833
+ ]);
3834
+ });
3835
+ it("removeItem from beginning preserves order", ()=>{
3836
+ const form = createForm({
3837
+ fields: (f)=>({
3838
+ tags: f.text().list().defaultValue([
3839
+ "a",
3840
+ "b",
3841
+ "c"
3842
+ ])
3843
+ }),
3844
+ layout: (l)=>[
3845
+ l.row("tags")
3846
+ ]
3847
+ });
3848
+ form.field("tags").vm.removeItem(0);
3849
+ expect(form.field("tags").vm.value).toEqual([
3850
+ "b",
3851
+ "c"
3852
+ ]);
3853
+ });
3854
+ it("operations go through beforeChange pipeline", ()=>{
3855
+ const log = [];
3856
+ const form = createForm({
3857
+ fields: (f)=>({
3858
+ tags: f.text().list().defaultValue([
3859
+ "a"
3860
+ ]).beforeChange((value, _params)=>{
3861
+ log.push(value);
3862
+ return value;
3863
+ })
3864
+ }),
3865
+ layout: (l)=>[
3866
+ l.row("tags")
3867
+ ]
3868
+ });
3869
+ form.field("tags").vm.addItem("b");
3870
+ form.field("tags").vm.removeItem(0);
3871
+ expect(log).toEqual([
3872
+ [
3873
+ "a",
3874
+ "b"
3875
+ ],
3876
+ [
3877
+ "b"
3878
+ ]
3879
+ ]);
3880
+ });
3881
+ });
3882
+ describe("field context", ()=>{
3883
+ it("should expose context derived from sibling fields via form param", ()=>{
3884
+ const form = createForm({
3885
+ fields: (fields)=>({
3886
+ title: fields.text().defaultValue("My Article"),
3887
+ description: fields.text().defaultValue("A great article"),
3888
+ media: fields.file().context(({ form })=>({
3889
+ title: form.field("title").getValue(),
3890
+ description: form.field("description").getValue()
3891
+ }))
3892
+ })
3893
+ });
3894
+ expect(form.field("media").vm.context).toEqual({
3895
+ title: "My Article",
3896
+ description: "A great article"
3897
+ });
3898
+ });
3899
+ it("should access root-level siblings via field.parent().field()", ()=>{
3900
+ const form = createForm({
3901
+ fields: (fields)=>({
3902
+ title: fields.text().defaultValue("Root Sibling"),
3903
+ media: fields.file().context(({ field })=>({
3904
+ title: field.parent().field("title").getValue()
3905
+ }))
3906
+ })
3907
+ });
3908
+ expect(form.field("media").vm.context).toEqual({
3909
+ title: "Root Sibling"
3910
+ });
3911
+ });
3912
+ it("should reactively update context when source fields change", ()=>{
3913
+ const form = createForm({
3914
+ fields: (fields)=>({
3915
+ title: fields.text().defaultValue("Original"),
3916
+ media: fields.file().context(({ form })=>({
3917
+ title: form.field("title").getValue()
3918
+ }))
3919
+ })
3920
+ });
3921
+ expect(form.field("media").vm.context).toEqual({
3922
+ title: "Original"
3923
+ });
3924
+ form.field("title").setValue("Updated");
3925
+ expect(form.field("media").vm.context).toEqual({
3926
+ title: "Updated"
3927
+ });
3928
+ });
3929
+ it("should default to empty object when no context callback is set", ()=>{
3930
+ const form = createForm({
3931
+ fields: (fields)=>({
3932
+ title: fields.text()
3933
+ })
3934
+ });
3935
+ expect(form.field("title").vm.context).toEqual({});
3936
+ });
3937
+ it("should access root fields via form param from nested object", ()=>{
3938
+ const form = createForm({
3939
+ fields: (fields)=>({
3940
+ title: fields.text().defaultValue("Page Title"),
3941
+ settings: fields.object().fields((f)=>({
3942
+ media: f.file().context(({ form })=>({
3943
+ title: form.field("title").getValue()
3944
+ }))
3945
+ }))
3946
+ }),
3947
+ layout: (l)=>[
3948
+ l.row("title"),
3949
+ l.row("settings")
3950
+ ]
3951
+ });
3952
+ expect(form.field("settings.media").vm.context).toEqual({
3953
+ title: "Page Title"
3954
+ });
3955
+ form.field("title").setValue("New Title");
3956
+ expect(form.field("settings.media").vm.context).toEqual({
3957
+ title: "New Title"
3958
+ });
3959
+ });
3960
+ it("should navigate to siblings via field.parent().field()", ()=>{
3961
+ const form = createForm({
3962
+ fields: (fields)=>({
3963
+ wrapper: fields.object().fields((f)=>({
3964
+ title: f.text().defaultValue("Nested Title"),
3965
+ media: f.file().context(({ field })=>({
3966
+ title: field.parent().field("title").getValue()
3967
+ }))
3968
+ }))
3969
+ }),
3970
+ layout: (l)=>[
3971
+ l.row("wrapper")
3972
+ ]
3973
+ });
3974
+ expect(form.field("wrapper.media").vm.context).toEqual({
3975
+ title: "Nested Title"
3976
+ });
3977
+ });
3978
+ it("should navigate multiple levels up via chained parent()", ()=>{
3979
+ const form = createForm({
3980
+ fields: (fields)=>({
3981
+ title: fields.text().defaultValue("Root Title"),
3982
+ settings: fields.object().fields((f)=>({
3983
+ nested: f.object().fields((inner)=>({
3984
+ media: inner.file().context(({ field })=>({
3985
+ title: field.parent().parent().parent().field("title").getValue()
3986
+ }))
3987
+ }))
3988
+ }))
3989
+ }),
3990
+ layout: (l)=>[
3991
+ l.row("title"),
3992
+ l.row("settings")
3993
+ ]
3994
+ });
3995
+ expect(form.field("settings.nested.media").vm.context).toEqual({
3996
+ title: "Root Title"
3997
+ });
3998
+ form.field("title").setValue("Updated Root");
3999
+ expect(form.field("settings.nested.media").vm.context).toEqual({
4000
+ title: "Updated Root"
4001
+ });
4002
+ });
4003
+ it("should navigate past parent to grandparent scope", ()=>{
4004
+ const form = createForm({
4005
+ fields: (fields)=>({
4006
+ settings: fields.object().fields((f)=>({
4007
+ label: f.text().defaultValue("Settings Label"),
4008
+ nested: f.object().fields((inner)=>({
4009
+ media: inner.file().context(({ field })=>({
4010
+ label: field.parent().parent().field("label").getValue()
4011
+ }))
4012
+ }))
4013
+ }))
4014
+ }),
4015
+ layout: (l)=>[
4016
+ l.row("settings")
4017
+ ]
4018
+ });
4019
+ expect(form.field("settings.nested.media").vm.context).toEqual({
4020
+ label: "Settings Label"
4021
+ });
4022
+ });
4023
+ it("should throw when navigating above root level", ()=>{
4024
+ const form = createForm({
4025
+ fields: (fields)=>({
4026
+ media: fields.file().context(({ field })=>({
4027
+ bad: field.parent().parent().field("x").getValue()
4028
+ }))
4029
+ })
4030
+ });
4031
+ expect(()=>form.field("media").vm.context).toThrow("Cannot navigate above root level.");
4032
+ });
4033
+ it("should use both field navigator and form in the same callback", ()=>{
4034
+ const form = createForm({
4035
+ fields: (fields)=>({
4036
+ slug: fields.text().defaultValue("my-slug"),
4037
+ settings: fields.object().fields((f)=>({
4038
+ label: f.text().defaultValue("Settings Label"),
4039
+ media: f.file().context(({ field, form })=>({
4040
+ label: field.parent().field("label").getValue(),
4041
+ slug: form.field("slug").getValue()
4042
+ }))
4043
+ }))
4044
+ }),
4045
+ layout: (l)=>[
4046
+ l.row("slug"),
4047
+ l.row("settings")
4048
+ ]
4049
+ });
4050
+ expect(form.field("settings.media").vm.context).toEqual({
4051
+ label: "Settings Label",
4052
+ slug: "my-slug"
4053
+ });
4054
+ });
4055
+ });
4056
+ describe("$. static references in rules", ()=>{
4057
+ it("$. resolves rule targets relative to the parent object", ()=>{
4058
+ const form = createForm({
4059
+ fields: (fields)=>({
4060
+ wrapper: fields.object().renderer("passthrough").fields((f)=>({
4061
+ status: f.text().defaultValue("draft"),
4062
+ details: f.text().rules([
4063
+ {
4064
+ type: "condition",
4065
+ target: "$.status",
4066
+ operator: "eq",
4067
+ value: "draft",
4068
+ action: "hide"
4069
+ }
4070
+ ])
4071
+ }))
4072
+ }),
4073
+ layout: (l)=>[
4074
+ l.row("wrapper")
4075
+ ]
4076
+ });
4077
+ expect(form.field("wrapper.details").visible).toBe(false);
4078
+ form.field("wrapper.status").setValue("published");
4079
+ expect(form.field("wrapper.details").visible).toBe(true);
4080
+ });
4081
+ it("$. in rules with disable action", ()=>{
4082
+ const form = createForm({
4083
+ fields: (fields)=>({
4084
+ wrapper: fields.object().renderer("passthrough").fields((f)=>({
4085
+ locked: f.text().defaultValue("yes"),
4086
+ editable: f.text().rules([
4087
+ {
4088
+ type: "condition",
4089
+ target: "$.locked",
4090
+ operator: "eq",
4091
+ value: "yes",
4092
+ action: "disable"
4093
+ }
4094
+ ])
4095
+ }))
4096
+ }),
4097
+ layout: (l)=>[
4098
+ l.row("wrapper")
4099
+ ]
4100
+ });
4101
+ expect(form.field("wrapper.editable").disabled).toBe(true);
4102
+ form.field("wrapper.locked").setValue("no");
4103
+ expect(form.field("wrapper.editable").disabled).toBe(false);
4104
+ });
4105
+ });
4106
+ });
4107
+
4108
+ //# sourceMappingURL=FormModel.test.js.map