@object-ui/app-shell 6.2.3 → 7.1.0

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 (486) hide show
  1. package/CHANGELOG.md +1229 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +184 -39
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +747 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +28 -0
  27. package/dist/console/ai/LiveCanvas.js +80 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +137 -4
  90. package/dist/hooks/useChatConversation.js +316 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +564 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +18 -8
  110. package/dist/index.js +17 -5
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +34 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +391 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +242 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/layout/agentPicker.d.ts +56 -0
  140. package/dist/layout/agentPicker.js +40 -0
  141. package/dist/observability/index.d.ts +1 -0
  142. package/dist/observability/index.js +1 -0
  143. package/dist/observability/settleSignal.d.ts +64 -0
  144. package/dist/observability/settleSignal.js +131 -0
  145. package/dist/preview/CommitTimeline.d.ts +15 -0
  146. package/dist/preview/CommitTimeline.js +82 -0
  147. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  148. package/dist/preview/DraftChangesPanel.js +114 -0
  149. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  150. package/dist/preview/DraftPreviewBar.js +86 -0
  151. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  152. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  153. package/dist/preview/PreviewModeContext.d.ts +57 -0
  154. package/dist/preview/PreviewModeContext.js +99 -0
  155. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  156. package/dist/preview/UnpublishedAppBar.js +83 -0
  157. package/dist/preview/commitHistory.d.ts +28 -0
  158. package/dist/preview/commitHistory.js +48 -0
  159. package/dist/preview/draftStatus.d.ts +20 -0
  160. package/dist/preview/draftStatus.js +27 -0
  161. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  162. package/dist/preview/usePublishAllDrafts.js +106 -0
  163. package/dist/providers/AdapterProvider.d.ts +1 -1
  164. package/dist/providers/AdapterProvider.js +6 -1
  165. package/dist/providers/ExpressionProvider.d.ts +1 -1
  166. package/dist/providers/MetadataProvider.d.ts +17 -2
  167. package/dist/providers/MetadataProvider.js +192 -12
  168. package/dist/runtime-config.d.ts +46 -2
  169. package/dist/runtime-config.js +39 -2
  170. package/dist/services/builtinComponents.js +68 -59
  171. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  172. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  173. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  174. package/dist/utils/appRoute.d.ts +21 -0
  175. package/dist/utils/appRoute.js +25 -0
  176. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  177. package/dist/utils/deriveRelatedLists.js +91 -0
  178. package/dist/utils/index.d.ts +4 -0
  179. package/dist/utils/index.js +3 -0
  180. package/dist/utils/managedByEmptyState.d.ts +8 -1
  181. package/dist/utils/managedByEmptyState.js +13 -7
  182. package/dist/utils/preferLocal.d.ts +18 -0
  183. package/dist/utils/preferLocal.js +24 -0
  184. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  185. package/dist/views/ActionConfirmDialog.js +3 -1
  186. package/dist/views/ActionParamDialog.d.ts +6 -1
  187. package/dist/views/ActionParamDialog.js +9 -3
  188. package/dist/views/ActionResultDialog.d.ts +13 -0
  189. package/dist/views/ActionResultDialog.js +134 -0
  190. package/dist/views/ComponentNavView.d.ts +14 -1
  191. package/dist/views/CreateViewDialog.d.ts +1 -1
  192. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  193. package/dist/views/DashboardConfigPanel.js +81 -0
  194. package/dist/views/DashboardView.d.ts +4 -3
  195. package/dist/views/DashboardView.js +38 -239
  196. package/dist/views/FlowRunner.d.ts +31 -0
  197. package/dist/views/FlowRunner.js +121 -0
  198. package/dist/views/InterfaceListPage.d.ts +49 -0
  199. package/dist/views/InterfaceListPage.js +347 -0
  200. package/dist/views/MetadataInspector.d.ts +2 -2
  201. package/dist/views/ObjectView.d.ts +1 -1
  202. package/dist/views/ObjectView.js +209 -532
  203. package/dist/views/PageView.d.ts +8 -3
  204. package/dist/views/PageView.js +45 -32
  205. package/dist/views/RecordDetailView.d.ts +1 -1
  206. package/dist/views/RecordDetailView.js +363 -148
  207. package/dist/views/RecordFormPage.d.ts +1 -1
  208. package/dist/views/RecordFormPage.js +26 -1
  209. package/dist/views/ReportConfigPanel.d.ts +37 -0
  210. package/dist/views/ReportConfigPanel.js +85 -0
  211. package/dist/views/ReportView.d.ts +1 -1
  212. package/dist/views/ReportView.js +116 -7
  213. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  214. package/dist/views/RuntimeDraftBar.js +112 -0
  215. package/dist/views/ScreenView.d.ts +70 -0
  216. package/dist/views/ScreenView.js +73 -0
  217. package/dist/views/SearchResultsPage.d.ts +1 -1
  218. package/dist/views/SearchResultsPage.js +8 -18
  219. package/dist/views/ViewConfigPanel.d.ts +24 -17
  220. package/dist/views/ViewConfigPanel.js +121 -77
  221. package/dist/views/index.d.ts +1 -1
  222. package/dist/views/index.js +1 -1
  223. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  224. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  225. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  226. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  227. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  228. package/dist/views/metadata-admin/DirectoryPage.js +101 -24
  229. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  230. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  231. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  232. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  233. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
  234. package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
  235. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  236. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  237. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  238. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  239. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  240. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  241. package/dist/views/metadata-admin/PackagesPage.js +403 -0
  242. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  243. package/dist/views/metadata-admin/PageShell.js +9 -4
  244. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  245. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  246. package/dist/views/metadata-admin/QuickFind.js +6 -3
  247. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  248. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  249. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  250. package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
  251. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  252. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  253. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  254. package/dist/views/metadata-admin/ResourceListPage.js +258 -30
  255. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  256. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  257. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  258. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  259. package/dist/views/metadata-admin/StudioHomePage.js +205 -0
  260. package/dist/views/metadata-admin/anchors.js +255 -24
  261. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  262. package/dist/views/metadata-admin/clientValidation.js +169 -0
  263. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  264. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  265. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  266. package/dist/views/metadata-admin/createDerive.js +179 -0
  267. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  268. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  269. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  270. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  271. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  272. package/dist/views/metadata-admin/datasource/register.js +24 -0
  273. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  274. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  275. package/dist/views/metadata-admin/default-schemas.js +115 -10
  276. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  277. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  278. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  279. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  280. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  281. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  282. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  283. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  284. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  285. package/dist/views/metadata-admin/external/api.js +124 -0
  286. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  287. package/dist/views/metadata-admin/i18n.js +1252 -2
  288. package/dist/views/metadata-admin/index.d.ts +8 -5
  289. package/dist/views/metadata-admin/index.js +12 -2
  290. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  291. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  292. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  293. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  294. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  295. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  296. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  297. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  298. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  299. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  300. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  301. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  302. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  303. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
  304. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  305. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
  306. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  307. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  308. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  309. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  310. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  311. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  312. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  313. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
  314. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  315. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  316. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  317. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  318. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  319. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  320. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  321. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  322. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  323. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
  324. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  325. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
  326. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  327. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  328. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  329. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
  330. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  331. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  332. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  333. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  334. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  335. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  336. package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
  337. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  338. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
  339. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
  340. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  341. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  342. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  343. package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
  344. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  345. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  346. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  347. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  348. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  349. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  350. package/dist/views/metadata-admin/issuePath.d.ts +22 -0
  351. package/dist/views/metadata-admin/issuePath.js +65 -0
  352. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  353. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  354. package/dist/views/metadata-admin/package-scope.d.ts +26 -0
  355. package/dist/views/metadata-admin/package-scope.js +43 -0
  356. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  357. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  358. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  359. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  360. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  361. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  362. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  363. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  364. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  365. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  366. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  367. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  368. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  369. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  370. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  371. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  372. package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
  373. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  374. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  375. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  376. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  378. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  379. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  380. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
  381. package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
  382. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  383. package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
  384. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  385. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  386. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  387. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
  388. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  389. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  390. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  391. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  392. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  393. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  394. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  395. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  396. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  397. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  398. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  399. package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
  400. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  402. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  403. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  404. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  405. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  406. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  407. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  408. package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
  409. package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
  410. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  411. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  412. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  413. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  414. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  415. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  416. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  417. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  418. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  419. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  420. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  421. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  422. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  423. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  424. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  425. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  426. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  427. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  428. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
  429. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
  430. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
  431. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
  432. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  433. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  434. package/dist/views/metadata-admin/previews/index.js +43 -0
  435. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  436. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  437. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
  438. package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
  439. package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
  440. package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
  441. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
  442. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  443. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
  444. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
  445. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
  446. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
  447. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  448. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  449. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  450. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  451. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  452. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  453. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  454. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  455. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  456. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  457. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  458. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  459. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  460. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  461. package/dist/views/metadata-admin/registry.d.ts +140 -19
  462. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  463. package/dist/views/metadata-admin/report-schema.js +121 -0
  464. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  465. package/dist/views/metadata-admin/useMetadata.js +155 -4
  466. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  467. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  468. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  469. package/dist/views/metadata-admin/view-schema.js +107 -0
  470. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  471. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  472. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  473. package/dist/views/metadata-admin/widgets.js +491 -17
  474. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  475. package/dist/views/runtime-metadata-persistence.js +89 -0
  476. package/dist/views/useOpenRecordList.d.ts +18 -0
  477. package/dist/views/useOpenRecordList.js +36 -0
  478. package/dist/views/userFilterUrlState.d.ts +15 -0
  479. package/dist/views/userFilterUrlState.js +53 -0
  480. package/dist/views/view-config-adapter.d.ts +38 -0
  481. package/dist/views/view-config-adapter.js +80 -0
  482. package/package.json +52 -34
  483. package/dist/views/DesignDrawer.d.ts +0 -28
  484. package/dist/views/DesignDrawer.js +0 -51
  485. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  486. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,171 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /** Set of types the designer can edit losslessly. Keep in sync with FieldDesigner. */
3
+ const DESIGNER_TYPES = new Set([
4
+ 'text',
5
+ 'textarea',
6
+ 'number',
7
+ 'boolean',
8
+ 'date',
9
+ 'datetime',
10
+ 'time',
11
+ 'select',
12
+ 'email',
13
+ 'phone',
14
+ 'url',
15
+ 'password',
16
+ 'currency',
17
+ 'percent',
18
+ 'lookup',
19
+ 'formula',
20
+ 'autonumber',
21
+ 'file',
22
+ 'image',
23
+ 'markdown',
24
+ 'html',
25
+ 'color',
26
+ 'code',
27
+ 'location',
28
+ 'address',
29
+ 'rating',
30
+ 'slider',
31
+ ]);
32
+ /** Try to map a framework field type to a designer type; null if unsupported. */
33
+ function mapFrameworkToDesignerType(t) {
34
+ if (!t)
35
+ return null;
36
+ if (DESIGNER_TYPES.has(t))
37
+ return t;
38
+ // Best-effort fallbacks for the most common "close cousin" types.
39
+ switch (t) {
40
+ case 'richtext':
41
+ return 'html';
42
+ case 'toggle':
43
+ return 'boolean';
44
+ case 'multiselect':
45
+ case 'checkboxes':
46
+ case 'radio':
47
+ return 'select';
48
+ case 'master_detail':
49
+ case 'tree':
50
+ return 'lookup';
51
+ default:
52
+ return null;
53
+ }
54
+ }
55
+ export function bridgeFromDraft(fieldsInput) {
56
+ const preserved = new Map();
57
+ const designerFields = [];
58
+ const originalOrder = [];
59
+ if (!fieldsInput || typeof fieldsInput !== 'object') {
60
+ return { designerFields, preserved, inputShape: 'record', originalOrder };
61
+ }
62
+ const isArray = Array.isArray(fieldsInput);
63
+ const inputShape = isArray ? 'array' : 'record';
64
+ const entries = isArray
65
+ ? fieldsInput.map((def, i) => [
66
+ String(def?.name ?? `field_${i + 1}`),
67
+ def,
68
+ ])
69
+ : Object.entries(fieldsInput);
70
+ for (const [name, def] of entries) {
71
+ originalOrder.push(name);
72
+ const mapped = mapFrameworkToDesignerType(def?.type);
73
+ if (mapped === null) {
74
+ // Quarantine — preserve as-is, do not surface in the designer.
75
+ preserved.set(name, def);
76
+ continue;
77
+ }
78
+ designerFields.push({
79
+ id: name, // FieldDesigner uses id as React key; using `name` is stable across edits.
80
+ name,
81
+ label: String(def?.label ?? name),
82
+ type: mapped,
83
+ required: !!def?.required,
84
+ unique: !!def?.unique,
85
+ readonly: !!def?.readonly,
86
+ hidden: !!def?.hidden,
87
+ description: typeof def?.description === 'string' ? def.description : undefined,
88
+ defaultValue: def?.default,
89
+ placeholder: typeof def?.placeholder === 'string' ? def.placeholder : undefined,
90
+ group: typeof def?.group === 'string' ? def.group : undefined,
91
+ options: Array.isArray(def?.options)
92
+ ? def.options.map((o) => ({
93
+ label: String(o.label ?? o.value),
94
+ value: String(o.value),
95
+ color: o.color,
96
+ }))
97
+ : undefined,
98
+ referenceTo: typeof def?.reference === 'string' ? def.reference : undefined,
99
+ formula: typeof def?.formula === 'string' ? def.formula : undefined,
100
+ });
101
+ }
102
+ return { designerFields, preserved, inputShape, originalOrder };
103
+ }
104
+ /**
105
+ * Reassemble the framework-shape fields record from designer output.
106
+ * Preserved fields are spliced back in their original order. Newly
107
+ * added fields land at the end.
108
+ */
109
+ export function commitToDraft(designerFields, prev) {
110
+ const designerByName = new Map();
111
+ for (const f of designerFields)
112
+ designerByName.set(f.name, f);
113
+ const writeName = (name, target) => {
114
+ const preserved = prev.preserved.get(name);
115
+ if (preserved) {
116
+ target[name] = preserved;
117
+ return;
118
+ }
119
+ const f = designerByName.get(name);
120
+ if (f) {
121
+ target[name] = serializeDesignerField(f);
122
+ }
123
+ };
124
+ const result = {};
125
+ // First emit fields in their original order to preserve user-visible
126
+ // ordering and keep diff noise low for unchanged drafts.
127
+ for (const name of prev.originalOrder) {
128
+ if (designerByName.has(name) || prev.preserved.has(name)) {
129
+ writeName(name, result);
130
+ }
131
+ }
132
+ // Then append any newly added designer fields (not in originalOrder).
133
+ for (const f of designerFields) {
134
+ if (!prev.originalOrder.includes(f.name)) {
135
+ result[f.name] = serializeDesignerField(f);
136
+ }
137
+ }
138
+ if (prev.inputShape === 'array') {
139
+ return Object.entries(result).map(([name, def]) => ({ name, ...def }));
140
+ }
141
+ return result;
142
+ }
143
+ function serializeDesignerField(f) {
144
+ const out = {
145
+ type: f.type,
146
+ label: f.label,
147
+ };
148
+ if (f.required)
149
+ out.required = true;
150
+ if (f.unique)
151
+ out.unique = true;
152
+ if (f.readonly)
153
+ out.readonly = true;
154
+ if (f.hidden)
155
+ out.hidden = true;
156
+ if (f.description)
157
+ out.description = f.description;
158
+ if (f.defaultValue !== undefined)
159
+ out.default = f.defaultValue;
160
+ if (f.placeholder)
161
+ out.placeholder = f.placeholder;
162
+ if (f.group)
163
+ out.group = f.group;
164
+ if (f.options && f.options.length > 0)
165
+ out.options = f.options;
166
+ if (f.referenceTo)
167
+ out.reference = f.referenceTo;
168
+ if (f.formula)
169
+ out.formula = f.formula;
170
+ return out;
171
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Field-IO helpers for the form-designer canvas + inspector.
3
+ *
4
+ * `draft.fields` can be either an array `[{name, ...def}, …]` (the
5
+ * legacy / objectql shape) or a record `{name: def, …}` (the spec
6
+ * shape used in `*.object.ts`). This module reads/writes both shapes
7
+ * transparently and preserves arbitrary unknown properties on each
8
+ * field — the inspector only edits the keys it knows about.
9
+ *
10
+ * Field reorders / inserts / removes are performed on a normalized
11
+ * ordered list and serialized back to the input shape, so round-trips
12
+ * are non-destructive.
13
+ */
14
+ import type { FieldTypeId } from './field-types';
15
+ export type Shape = 'array' | 'record';
16
+ export interface FieldEntry {
17
+ /** Canonical snake_case key. */
18
+ name: string;
19
+ /** Raw framework field definition (label, type, options, …). */
20
+ def: Record<string, unknown>;
21
+ }
22
+ export interface FieldsView {
23
+ shape: Shape;
24
+ entries: FieldEntry[];
25
+ }
26
+ /** Read draft.fields into a normalized ordered list. */
27
+ export declare function readFields(fieldsInput: unknown): FieldsView;
28
+ /** Serialize the ordered list back to the original shape. */
29
+ export declare function writeFields(view: FieldsView): Record<string, unknown> | Array<Record<string, unknown>>;
30
+ /** Find the index of a field by name. Returns -1 if not found. */
31
+ export declare function indexOfField(view: FieldsView, name: string): number;
32
+ /** Build a fresh field definition for the given type. */
33
+ export declare function newField(name: string, type: FieldTypeId, label?: string): FieldEntry;
34
+ /** Convert a snake_case name to a human-friendly Title Case label. */
35
+ export declare function toLabel(name: string): string;
36
+ /** Normalize an arbitrary string into a valid snake_case field name. */
37
+ export declare function toFieldName(raw: string): string;
38
+ /**
39
+ * Prefix-stable variant of {@link toFieldName} for *live keystroke* input.
40
+ *
41
+ * The strict `toFieldName` trims a trailing `_`, which makes it impossible
42
+ * to TYPE a multi-word identifier into a controlled input: the field's
43
+ * `onChange` re-normalizes on every keystroke, so the instant the user
44
+ * presses `_` the value is `"repair_"` -> trimmed to `"repair"` -> the
45
+ * underscore vanishes before the next letter arrives, yielding
46
+ * `"repairticket"` instead of `"repair_ticket"`. (Authors of non-Latin
47
+ * locales hit this hardest: their label cannot derive a Latin slug, so
48
+ * they MUST type the identifier by hand.)
49
+ *
50
+ * This variant keeps a single trailing `_` so typing can continue, and
51
+ * returns `''` (not the `'field'` placeholder) on empty input so clearing
52
+ * the box actually clears it. A trailing `_` is itself a valid identifier
53
+ * per the spec ("starts with a letter, may contain letters/digits/`_`"),
54
+ * so no separate commit-time trim is required for correctness; callers
55
+ * that need a canonical form for a *complete* string (label->name
56
+ * derivation, group keys) should keep using strict `toFieldName`.
57
+ */
58
+ export declare function toFieldNameLoose(raw: string): string;
59
+ /**
60
+ * A declared field group (a.k.a. "section"). Lives at the object's
61
+ * top level as `draft.fieldGroups`; individual fields opt into a group
62
+ * via `Field.group === FieldGroup.key`.
63
+ */
64
+ export interface FieldGroup {
65
+ key: string;
66
+ label: string;
67
+ }
68
+ /** Read `draft.fieldGroups` into a normalized, well-typed list. */
69
+ export declare function readGroups(fieldGroupsInput: unknown): FieldGroup[];
70
+ /**
71
+ * Derive a unique snake_case group key from a human label, avoiding
72
+ * collisions with `existing` keys. Falls back to `group` / `group_N`.
73
+ */
74
+ export declare function genGroupKey(label: string, existing: string[]): string;
75
+ /** Append a new group with a unique key derived from `label`. */
76
+ export declare function addGroup(groups: FieldGroup[], label: string): FieldGroup[];
77
+ /** Rename a group's label in place (key is stable). */
78
+ export declare function renameGroup(groups: FieldGroup[], key: string, label: string): FieldGroup[];
79
+ /** Remove a group declaration (callers should also clear members' `group`). */
80
+ export declare function removeGroup(groups: FieldGroup[], key: string): FieldGroup[];
81
+ /** Move a group one slot up (-1) or down (+1), clamped to bounds. */
82
+ export declare function moveGroup(groups: FieldGroup[], key: string, dir: -1 | 1): FieldGroup[];
83
+ /** Strip `group === key` from every field (used after removing a group). */
84
+ export declare function clearFieldGroup(view: FieldsView, key: string): FieldsView;
85
+ /** Generic immutable array move helper (also used by group reorder). */
86
+ export declare function moveArray<T>(arr: T[], from: number, to: number): T[];
87
+ /**
88
+ * Group entries by their `group` property, in `fieldGroups[]` order.
89
+ * Fields with no group (or a group not declared in fieldGroups) land
90
+ * in a trailing "Ungrouped" bucket.
91
+ *
92
+ * By default empty *declared* groups are dropped to avoid chrome noise
93
+ * (read-only / preview). Pass `includeEmptyDeclared` while editing so a
94
+ * freshly-added, still-empty section stays visible as a drop target.
95
+ */
96
+ export interface GroupedEntries {
97
+ key: string | null;
98
+ label: string;
99
+ entries: FieldEntry[];
100
+ }
101
+ export declare function groupEntries(view: FieldsView, fieldGroups: Array<{
102
+ key?: string;
103
+ label?: string;
104
+ }> | undefined, opts?: {
105
+ includeEmptyDeclared?: boolean;
106
+ }): GroupedEntries[];
107
+ export type FieldDiffStatus = 'added' | 'removed' | 'changed' | 'unchanged';
108
+ export interface FieldDiffEntry {
109
+ name: string;
110
+ status: FieldDiffStatus;
111
+ /** Sorted def keys that differ (only for `changed`). */
112
+ changedKeys: string[];
113
+ }
114
+ export interface FieldsDiff {
115
+ /** Per current-field status, keyed by field name. */
116
+ byName: Record<string, FieldDiffEntry>;
117
+ /** Baseline fields absent from the current draft (rendered as ghosts). */
118
+ removed: FieldEntry[];
119
+ counts: {
120
+ added: number;
121
+ changed: number;
122
+ removed: number;
123
+ };
124
+ }
125
+ /**
126
+ * Diff the current `fields` against a `baseline` (e.g. the last published
127
+ * version). Drives the canvas review mode: added / changed / removed
128
+ * per field. Shape-agnostic — both inputs are read via {@link readFields}.
129
+ */
130
+ export declare function diffFields(baselineInput: unknown, currentInput: unknown): FieldsDiff;
@@ -0,0 +1,243 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /** Read draft.fields into a normalized ordered list. */
3
+ export function readFields(fieldsInput) {
4
+ if (Array.isArray(fieldsInput)) {
5
+ return {
6
+ shape: 'array',
7
+ entries: fieldsInput.map((raw, i) => {
8
+ const { name, ...rest } = raw ?? {};
9
+ return {
10
+ name: typeof name === 'string' && name ? name : `field_${i + 1}`,
11
+ def: rest,
12
+ };
13
+ }),
14
+ };
15
+ }
16
+ if (fieldsInput && typeof fieldsInput === 'object') {
17
+ return {
18
+ shape: 'record',
19
+ entries: Object.entries(fieldsInput).map(([name, def]) => ({ name, def: { ...(def ?? {}) } })),
20
+ };
21
+ }
22
+ return { shape: 'record', entries: [] };
23
+ }
24
+ /** Serialize the ordered list back to the original shape. */
25
+ export function writeFields(view) {
26
+ if (view.shape === 'array') {
27
+ return view.entries.map((e) => ({ name: e.name, ...e.def }));
28
+ }
29
+ const out = {};
30
+ for (const e of view.entries)
31
+ out[e.name] = e.def;
32
+ return out;
33
+ }
34
+ /** Find the index of a field by name. Returns -1 if not found. */
35
+ export function indexOfField(view, name) {
36
+ return view.entries.findIndex((e) => e.name === name);
37
+ }
38
+ /** Build a fresh field definition for the given type. */
39
+ export function newField(name, type, label) {
40
+ const def = { type, label: label ?? toLabel(name) };
41
+ // Picklist-style fields start with no options; the OptionsEditor shows a
42
+ // blank input row locally and only persists rows once they have a value, so
43
+ // an unfilled row never trips the spec's identifier validation.
44
+ if (type === 'select' || type === 'multiselect' || type === 'radio' || type === 'checkboxes') {
45
+ def.options = [];
46
+ }
47
+ return { name, def };
48
+ }
49
+ /** Convert a snake_case name to a human-friendly Title Case label. */
50
+ export function toLabel(name) {
51
+ if (!name)
52
+ return '';
53
+ return name
54
+ .split('_')
55
+ .filter(Boolean)
56
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
57
+ .join(' ');
58
+ }
59
+ /** Normalize an arbitrary string into a valid snake_case field name. */
60
+ export function toFieldName(raw) {
61
+ const lower = raw.trim().toLowerCase();
62
+ const sanitized = lower
63
+ .replace(/[^a-z0-9]+/g, '_')
64
+ .replace(/^_+|_+$/g, '')
65
+ .replace(/_{2,}/g, '_');
66
+ if (!sanitized)
67
+ return 'field';
68
+ if (!/^[a-z_]/.test(sanitized))
69
+ return `f_${sanitized}`;
70
+ return sanitized;
71
+ }
72
+ /**
73
+ * Prefix-stable variant of {@link toFieldName} for *live keystroke* input.
74
+ *
75
+ * The strict `toFieldName` trims a trailing `_`, which makes it impossible
76
+ * to TYPE a multi-word identifier into a controlled input: the field's
77
+ * `onChange` re-normalizes on every keystroke, so the instant the user
78
+ * presses `_` the value is `"repair_"` -> trimmed to `"repair"` -> the
79
+ * underscore vanishes before the next letter arrives, yielding
80
+ * `"repairticket"` instead of `"repair_ticket"`. (Authors of non-Latin
81
+ * locales hit this hardest: their label cannot derive a Latin slug, so
82
+ * they MUST type the identifier by hand.)
83
+ *
84
+ * This variant keeps a single trailing `_` so typing can continue, and
85
+ * returns `''` (not the `'field'` placeholder) on empty input so clearing
86
+ * the box actually clears it. A trailing `_` is itself a valid identifier
87
+ * per the spec ("starts with a letter, may contain letters/digits/`_`"),
88
+ * so no separate commit-time trim is required for correctness; callers
89
+ * that need a canonical form for a *complete* string (label->name
90
+ * derivation, group keys) should keep using strict `toFieldName`.
91
+ */
92
+ export function toFieldNameLoose(raw) {
93
+ const sanitized = raw
94
+ .trim()
95
+ .toLowerCase()
96
+ .replace(/[^a-z0-9]+/g, '_')
97
+ .replace(/^_+/g, '') // trim leading only -- a trailing `_` must survive
98
+ .replace(/_{2,}/g, '_');
99
+ if (!sanitized)
100
+ return '';
101
+ if (!/^[a-z_]/.test(sanitized))
102
+ return `f_${sanitized}`;
103
+ return sanitized;
104
+ }
105
+ /** Read `draft.fieldGroups` into a normalized, well-typed list. */
106
+ export function readGroups(fieldGroupsInput) {
107
+ if (!Array.isArray(fieldGroupsInput))
108
+ return [];
109
+ return fieldGroupsInput
110
+ .filter((g) => !!g && typeof g === 'object')
111
+ .map((g) => ({
112
+ key: typeof g.key === 'string' ? g.key : '',
113
+ label: typeof g.label === 'string' ? g.label : '',
114
+ }))
115
+ .filter((g) => g.key);
116
+ }
117
+ /**
118
+ * Derive a unique snake_case group key from a human label, avoiding
119
+ * collisions with `existing` keys. Falls back to `group` / `group_N`.
120
+ */
121
+ export function genGroupKey(label, existing) {
122
+ // toFieldName() bottoms out at "field"; for a *group* key prefer
123
+ // "group" when the label carries no usable alphanumerics.
124
+ const base = /[a-z0-9]/i.test(label) ? toFieldName(label) : 'group';
125
+ if (!existing.includes(base))
126
+ return base;
127
+ let i = 2;
128
+ while (existing.includes(`${base}_${i}`))
129
+ i += 1;
130
+ return `${base}_${i}`;
131
+ }
132
+ /** Append a new group with a unique key derived from `label`. */
133
+ export function addGroup(groups, label) {
134
+ const clean = label.trim() || 'New section';
135
+ const key = genGroupKey(clean, groups.map((g) => g.key));
136
+ return [...groups, { key, label: clean }];
137
+ }
138
+ /** Rename a group's label in place (key is stable). */
139
+ export function renameGroup(groups, key, label) {
140
+ const clean = label.trim();
141
+ if (!clean)
142
+ return groups;
143
+ return groups.map((g) => (g.key === key ? { ...g, label: clean } : g));
144
+ }
145
+ /** Remove a group declaration (callers should also clear members' `group`). */
146
+ export function removeGroup(groups, key) {
147
+ return groups.filter((g) => g.key !== key);
148
+ }
149
+ /** Move a group one slot up (-1) or down (+1), clamped to bounds. */
150
+ export function moveGroup(groups, key, dir) {
151
+ const idx = groups.findIndex((g) => g.key === key);
152
+ if (idx < 0)
153
+ return groups;
154
+ const to = idx + dir;
155
+ if (to < 0 || to >= groups.length)
156
+ return groups;
157
+ return moveArray(groups, idx, to);
158
+ }
159
+ /** Strip `group === key` from every field (used after removing a group). */
160
+ export function clearFieldGroup(view, key) {
161
+ return {
162
+ shape: view.shape,
163
+ entries: view.entries.map((e) => e.def.group === key ? { name: e.name, def: { ...e.def, group: undefined } } : e),
164
+ };
165
+ }
166
+ /** Generic immutable array move helper (also used by group reorder). */
167
+ export function moveArray(arr, from, to) {
168
+ const next = arr.slice();
169
+ const [item] = next.splice(from, 1);
170
+ next.splice(to, 0, item);
171
+ return next;
172
+ }
173
+ export function groupEntries(view, fieldGroups, opts) {
174
+ const declared = Array.isArray(fieldGroups) ? fieldGroups.filter((g) => typeof g?.key === 'string') : [];
175
+ const buckets = new Map();
176
+ for (const g of declared) {
177
+ buckets.set(g.key, { key: g.key, label: String(g.label ?? g.key), entries: [] });
178
+ }
179
+ const declaredKeys = new Set(declared.map((g) => g.key));
180
+ for (const e of view.entries) {
181
+ const g = typeof e.def.group === 'string' ? e.def.group : null;
182
+ if (g && declaredKeys.has(g)) {
183
+ buckets.get(g).entries.push(e);
184
+ }
185
+ else {
186
+ if (!buckets.has(null))
187
+ buckets.set(null, { key: null, label: 'Ungrouped', entries: [] });
188
+ buckets.get(null).entries.push(e);
189
+ }
190
+ }
191
+ const includeEmpty = !!opts?.includeEmptyDeclared;
192
+ // Drop empty declared buckets unless asked to keep them (edit mode).
193
+ // The implicit "Ungrouped" bucket is only created when populated, so
194
+ // it never shows empty.
195
+ return Array.from(buckets.values()).filter((b) => b.entries.length > 0 || (includeEmpty && b.key !== null));
196
+ }
197
+ /** Stable equality for field-def values (small JSON — order-sensitive is fine). */
198
+ function valueEqual(a, b) {
199
+ if (a === b)
200
+ return true;
201
+ return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
202
+ }
203
+ /** Def keys whose values differ between two field definitions, sorted. */
204
+ function changedDefKeys(a, b) {
205
+ const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
206
+ const out = [];
207
+ for (const k of keys)
208
+ if (!valueEqual(a[k], b[k]))
209
+ out.push(k);
210
+ return out.sort();
211
+ }
212
+ /**
213
+ * Diff the current `fields` against a `baseline` (e.g. the last published
214
+ * version). Drives the canvas review mode: added / changed / removed
215
+ * per field. Shape-agnostic — both inputs are read via {@link readFields}.
216
+ */
217
+ export function diffFields(baselineInput, currentInput) {
218
+ const base = readFields(baselineInput);
219
+ const cur = readFields(currentInput);
220
+ const baseByName = new Map(base.entries.map((e) => [e.name, e]));
221
+ const curNames = new Set(cur.entries.map((e) => e.name));
222
+ const byName = {};
223
+ let added = 0;
224
+ let changed = 0;
225
+ for (const e of cur.entries) {
226
+ const b = baseByName.get(e.name);
227
+ if (!b) {
228
+ byName[e.name] = { name: e.name, status: 'added', changedKeys: [] };
229
+ added += 1;
230
+ continue;
231
+ }
232
+ const keys = changedDefKeys(b.def, e.def);
233
+ if (keys.length) {
234
+ byName[e.name] = { name: e.name, status: 'changed', changedKeys: keys };
235
+ changed += 1;
236
+ }
237
+ else {
238
+ byName[e.name] = { name: e.name, status: 'unchanged', changedKeys: [] };
239
+ }
240
+ }
241
+ const removed = base.entries.filter((e) => !curNames.has(e.name));
242
+ return { byName, removed, counts: { added, changed, removed: removed.length } };
243
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * screen-spec — pure helpers that map a flow `screen` node's authored `config`
3
+ * onto the runtime `ScreenSpec` (the contract {@link ScreenView} renders), plus
4
+ * `{var}` interpolation for the title/description and `visibleWhen` field
5
+ * gating. Kept framework-free so {@link ScreenPreview} stays a thin component
6
+ * and these stay unit-testable.
7
+ */
8
+ import type { ScreenSpec } from '../../ScreenView';
9
+ /** Minimal node shape the preview needs (id + authored config). */
10
+ export interface ScreenPreviewNode {
11
+ id: string;
12
+ label?: string;
13
+ config?: Record<string, unknown>;
14
+ }
15
+ /**
16
+ * Interpolate `{var}` references, mirroring the simulator's `{var}` syntax
17
+ * (flow-simulator.ts). Known vars are substituted; unknown refs stay literal so
18
+ * the author still sees the dependency in the design preview.
19
+ */
20
+ export declare function interpolate(text: string | undefined, vars: Record<string, unknown> | undefined): string;
21
+ /**
22
+ * A field's `visibleWhen` gate, evaluated against the current variables using
23
+ * the SAME evaluator the simulator uses for edge conditions (so the preview
24
+ * agrees with the simulator). Real metadata mixes `{var}` and bare-var styles
25
+ * (e.g. `{createOpportunity} == true`, `stage == "review"`), so brace
26
+ * placeholders are normalised to bare identifiers first.
27
+ *
28
+ * Fail-OPEN: a missing condition, an unparseable one, or one that references a
29
+ * not-yet-set variable (the inspector has no run state) keeps the field
30
+ * visible — the design preview never hides a configured field just because it
31
+ * lacks the data to decide. With live run state (the simulator) it gates
32
+ * faithfully: `createOpportunity == false` hides the field.
33
+ */
34
+ export declare function isFieldVisibleWhen(visibleWhen: unknown, variables: Record<string, unknown> | undefined): boolean;
35
+ /** Count of authored field rows hidden by their `visibleWhen` against `variables`. */
36
+ export declare function hiddenFieldCount(node: ScreenPreviewNode, variables: Record<string, unknown> | undefined): number;
37
+ /**
38
+ * Map a screen node's authored `config` onto the runtime `ScreenSpec` — the
39
+ * same keys the engine's `screen` executor reads (title / description / fields
40
+ * / objectName / mode / defaults / idVariable). `fields` are gated by their
41
+ * `visibleWhen` against `variables` (omit `variables` to keep every field).
42
+ */
43
+ export declare function buildScreenSpec(node: ScreenPreviewNode, variables?: Record<string, unknown>): ScreenSpec;