@object-ui/app-shell 6.2.3 → 7.0.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 (468) hide show
  1. package/CHANGELOG.md +948 -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 +170 -37
  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 +743 -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 +22 -0
  27. package/dist/console/ai/LiveCanvas.js +78 -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 +107 -4
  90. package/dist/hooks/useChatConversation.js +253 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +560 -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 +16 -7
  110. package/dist/index.js +12 -4
  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 +32 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +374 -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 +218 -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/observability/index.d.ts +1 -0
  140. package/dist/observability/index.js +1 -0
  141. package/dist/observability/settleSignal.d.ts +64 -0
  142. package/dist/observability/settleSignal.js +131 -0
  143. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  144. package/dist/preview/DraftChangesPanel.js +114 -0
  145. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  146. package/dist/preview/DraftPreviewBar.js +86 -0
  147. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  148. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  149. package/dist/preview/PreviewModeContext.d.ts +57 -0
  150. package/dist/preview/PreviewModeContext.js +99 -0
  151. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  152. package/dist/preview/UnpublishedAppBar.js +79 -0
  153. package/dist/preview/draftStatus.d.ts +20 -0
  154. package/dist/preview/draftStatus.js +27 -0
  155. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  156. package/dist/preview/usePublishAllDrafts.js +106 -0
  157. package/dist/providers/AdapterProvider.d.ts +1 -1
  158. package/dist/providers/AdapterProvider.js +6 -1
  159. package/dist/providers/ExpressionProvider.d.ts +1 -1
  160. package/dist/providers/MetadataProvider.d.ts +17 -2
  161. package/dist/providers/MetadataProvider.js +183 -12
  162. package/dist/runtime-config.d.ts +46 -2
  163. package/dist/runtime-config.js +39 -2
  164. package/dist/services/builtinComponents.js +68 -59
  165. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  166. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  167. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  168. package/dist/utils/appRoute.d.ts +21 -0
  169. package/dist/utils/appRoute.js +25 -0
  170. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  171. package/dist/utils/deriveRelatedLists.js +91 -0
  172. package/dist/utils/index.d.ts +4 -0
  173. package/dist/utils/index.js +3 -0
  174. package/dist/utils/managedByEmptyState.d.ts +8 -1
  175. package/dist/utils/managedByEmptyState.js +13 -7
  176. package/dist/utils/preferLocal.d.ts +18 -0
  177. package/dist/utils/preferLocal.js +24 -0
  178. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  179. package/dist/views/ActionConfirmDialog.js +3 -1
  180. package/dist/views/ActionParamDialog.d.ts +6 -1
  181. package/dist/views/ActionParamDialog.js +9 -3
  182. package/dist/views/ActionResultDialog.d.ts +13 -0
  183. package/dist/views/ActionResultDialog.js +134 -0
  184. package/dist/views/ComponentNavView.d.ts +14 -1
  185. package/dist/views/CreateViewDialog.d.ts +1 -1
  186. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  187. package/dist/views/DashboardConfigPanel.js +81 -0
  188. package/dist/views/DashboardView.d.ts +4 -3
  189. package/dist/views/DashboardView.js +38 -239
  190. package/dist/views/FlowRunner.d.ts +59 -0
  191. package/dist/views/FlowRunner.js +153 -0
  192. package/dist/views/InterfaceListPage.d.ts +49 -0
  193. package/dist/views/InterfaceListPage.js +347 -0
  194. package/dist/views/MetadataInspector.d.ts +2 -2
  195. package/dist/views/ObjectView.d.ts +1 -1
  196. package/dist/views/ObjectView.js +209 -532
  197. package/dist/views/PageView.d.ts +8 -3
  198. package/dist/views/PageView.js +45 -32
  199. package/dist/views/RecordDetailView.d.ts +1 -1
  200. package/dist/views/RecordDetailView.js +363 -148
  201. package/dist/views/RecordFormPage.d.ts +1 -1
  202. package/dist/views/RecordFormPage.js +26 -1
  203. package/dist/views/ReportConfigPanel.d.ts +37 -0
  204. package/dist/views/ReportConfigPanel.js +85 -0
  205. package/dist/views/ReportView.d.ts +1 -1
  206. package/dist/views/ReportView.js +116 -7
  207. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  208. package/dist/views/RuntimeDraftBar.js +112 -0
  209. package/dist/views/SearchResultsPage.d.ts +1 -1
  210. package/dist/views/SearchResultsPage.js +8 -18
  211. package/dist/views/ViewConfigPanel.d.ts +24 -17
  212. package/dist/views/ViewConfigPanel.js +121 -77
  213. package/dist/views/index.d.ts +1 -1
  214. package/dist/views/index.js +1 -1
  215. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  216. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  217. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  218. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  219. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  220. package/dist/views/metadata-admin/DirectoryPage.js +113 -24
  221. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  222. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  223. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  224. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  225. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
  226. package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
  227. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  228. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  229. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  230. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  231. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  232. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  233. package/dist/views/metadata-admin/PackagesPage.js +395 -0
  234. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  235. package/dist/views/metadata-admin/PageShell.js +9 -4
  236. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  237. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  238. package/dist/views/metadata-admin/QuickFind.js +6 -3
  239. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  240. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  241. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  242. package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
  243. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  244. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  245. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  246. package/dist/views/metadata-admin/ResourceListPage.js +266 -30
  247. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  248. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  249. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  250. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  251. package/dist/views/metadata-admin/StudioHomePage.js +213 -0
  252. package/dist/views/metadata-admin/anchors.js +237 -24
  253. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  254. package/dist/views/metadata-admin/clientValidation.js +169 -0
  255. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  256. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  257. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  258. package/dist/views/metadata-admin/createDerive.js +179 -0
  259. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  260. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  261. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  262. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  263. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  264. package/dist/views/metadata-admin/datasource/register.js +24 -0
  265. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  266. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  267. package/dist/views/metadata-admin/default-schemas.js +115 -10
  268. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  269. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  270. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  271. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  272. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  273. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  274. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  275. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  276. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  277. package/dist/views/metadata-admin/external/api.js +124 -0
  278. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  279. package/dist/views/metadata-admin/i18n.js +1166 -2
  280. package/dist/views/metadata-admin/index.d.ts +8 -5
  281. package/dist/views/metadata-admin/index.js +12 -2
  282. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  283. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  284. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  285. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  286. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  287. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  288. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  289. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  290. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  291. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  292. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  293. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  294. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  295. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
  296. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  297. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
  298. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  299. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  300. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  301. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  302. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  303. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  304. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  305. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
  306. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  307. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  308. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  309. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  310. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  311. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  312. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  313. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  314. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  315. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
  316. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  317. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
  318. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  319. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  320. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  321. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
  322. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  323. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  324. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  325. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  326. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  327. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  328. package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
  329. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  330. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  331. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  332. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  333. package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
  334. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  335. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  336. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  337. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  338. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  339. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  340. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  341. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  342. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  343. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  344. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  345. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  346. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  347. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  348. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  349. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  350. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  351. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  352. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  353. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  354. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  355. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  356. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  357. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  358. package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
  359. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  360. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  361. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  362. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  363. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  364. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  365. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  366. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
  367. package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
  368. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  369. package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
  370. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  371. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  372. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  373. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
  374. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  375. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  376. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  378. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  379. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  380. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  381. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  382. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  383. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  384. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  385. package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
  386. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  387. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  388. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  389. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  390. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  391. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  392. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  393. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  394. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  395. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  396. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  397. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  398. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  399. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  400. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  402. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  403. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  404. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  405. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  406. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  407. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  408. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  409. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  410. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  411. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  412. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
  413. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
  414. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
  415. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
  416. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  417. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  418. package/dist/views/metadata-admin/previews/index.js +43 -0
  419. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  420. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  421. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
  422. package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
  423. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
  424. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  425. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
  426. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
  427. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
  428. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
  429. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  430. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  431. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  432. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  433. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  434. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  435. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  436. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  437. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  438. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  439. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  440. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  441. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  442. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  443. package/dist/views/metadata-admin/registry.d.ts +140 -19
  444. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  445. package/dist/views/metadata-admin/report-schema.js +121 -0
  446. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  447. package/dist/views/metadata-admin/useMetadata.js +155 -4
  448. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  449. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  450. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  451. package/dist/views/metadata-admin/view-schema.js +107 -0
  452. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  453. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  454. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  455. package/dist/views/metadata-admin/widgets.js +491 -17
  456. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  457. package/dist/views/runtime-metadata-persistence.js +89 -0
  458. package/dist/views/useOpenRecordList.d.ts +18 -0
  459. package/dist/views/useOpenRecordList.js +36 -0
  460. package/dist/views/userFilterUrlState.d.ts +15 -0
  461. package/dist/views/userFilterUrlState.js +53 -0
  462. package/dist/views/view-config-adapter.d.ts +38 -0
  463. package/dist/views/view-config-adapter.js +80 -0
  464. package/package.json +52 -34
  465. package/dist/views/DesignDrawer.d.ts +0 -28
  466. package/dist/views/DesignDrawer.js +0 -51
  467. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  468. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -2,21 +2,29 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * Dashboard View Component
4
4
  * Renders a dashboard based on the dashboardName parameter.
5
- * Edit mode shows an inline config panel (DashboardConfigPanel / WidgetConfigPanel)
6
- * on the right side, following the same pattern as ListView.
5
+ * Edit mode shows a single inline config panel (DashboardConfigPanel) on the
6
+ * right side that hosts the studio's dashboard / widget inspectors, following
7
+ * the same pattern as ReportView.
7
8
  */
8
9
  import { useState, useEffect, useCallback, useMemo } from 'react';
9
10
  import { useParams } from 'react-router-dom';
10
- import { DashboardRenderer, DashboardConfigPanel, WidgetConfigPanel, } from '@object-ui/plugin-dashboard';
11
+ import { DashboardRenderer } from '@object-ui/plugin-dashboard';
12
+ import { DrillNavigationProvider } from '@object-ui/react';
13
+ import { useOpenRecordList } from './useOpenRecordList';
11
14
  import { ModalForm } from '@object-ui/plugin-form';
15
+ import { DashboardConfigPanel } from './DashboardConfigPanel';
16
+ import { useAuth } from '@object-ui/auth';
12
17
  import { toast } from 'sonner';
13
18
  import { Empty, EmptyTitle, EmptyDescription, Button, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@object-ui/components';
14
- import { LayoutDashboard, Pencil, TrendingUp, BarChart3, LineChart, PieChart, Table2, LayoutGrid, Plus, Trash2, } from 'lucide-react';
19
+ import { LayoutDashboard, Pencil, TrendingUp, BarChart3, LineChart, PieChart, Table2, LayoutGrid, Plus, } from 'lucide-react';
15
20
  import { MetadataPanel, useMetadataInspector } from './MetadataInspector';
16
21
  import { SkeletonDashboard } from '../skeletons';
17
22
  import { useMetadata } from '../providers/MetadataProvider';
18
- import { resolveI18nLabel } from '../utils';
23
+ import { useExpressionContext } from '../providers/ExpressionProvider';
24
+ import { resolveI18nLabel, preferLocal } from '../utils';
19
25
  import { useAdapter } from '../providers/AdapterProvider';
26
+ import { useMetadataClient } from './metadata-admin/useMetadata';
27
+ import { persistRuntimeMetadata } from './runtime-metadata-persistence';
20
28
  import { useObjectTranslation, useObjectLabel } from '@object-ui/i18n';
21
29
  // ---------------------------------------------------------------------------
22
30
  // Widget type palette for the add-widget toolbar
@@ -55,127 +63,25 @@ function defaultWidgetTitle(type) {
55
63
  return entry ? `New ${entry.label}` : 'New Widget';
56
64
  }
57
65
  // ---------------------------------------------------------------------------
58
- // Helpers: flatten / unflatten widget config for WidgetConfigPanel
59
- // ---------------------------------------------------------------------------
60
- // Top-level widget schema keys that the config panel exposes as flat fields.
61
- // Anything outside this set (e.g. pivot rowField/columnField, table searchable,
62
- // chart xAxisField/yAxisFields, list itemTemplate, custom component) is stored
63
- // under `widget.options` per the spec and round-tripped via spread.
64
- const TOP_LEVEL_WIDGET_KEYS = new Set([
65
- 'title',
66
- 'description',
67
- 'type',
68
- 'object',
69
- 'categoryField',
70
- 'valueField',
71
- 'aggregate',
72
- 'colorVariant',
73
- 'actionUrl',
74
- 'layoutW',
75
- 'layoutH',
76
- 'id',
77
- // Spec-declared top-level fields that the renderer reads directly off the
78
- // widget (not from options). Keeping them here ensures the unflatten path
79
- // does not silently drop them into options where the renderer ignores them.
80
- 'searchable',
81
- 'pagination',
82
- // Drill-down virtual flat keys are handled explicitly below — listing them
83
- // here keeps the generic options-collector from duplicating them.
84
- 'drillDownEnabled',
85
- 'drillDownTarget',
86
- ]);
87
- function flattenWidgetConfig(widget) {
88
- // Spread options first so explicit top-level widget fields take precedence
89
- // on collision. This surfaces type-specific options (pivot/table/chart axes,
90
- // list itemTemplate, etc.) so they appear pre-filled in the config panel.
91
- const options = (widget.options ?? {});
92
- const drillDown = (options.drillDown ?? {});
93
- return {
94
- ...options,
95
- title: widget.title ?? '',
96
- description: widget.description ?? '',
97
- type: widget.type ?? 'metric',
98
- object: widget.object ?? '',
99
- categoryField: widget.categoryField ?? options.categoryField ?? '',
100
- valueField: widget.valueField ?? options.valueField ?? '',
101
- aggregate: widget.aggregate ?? options.aggregate ?? 'count',
102
- layoutW: widget.layout?.w ?? 1,
103
- layoutH: widget.layout?.h ?? 1,
104
- colorVariant: widget.colorVariant ?? options.colorVariant ?? 'default',
105
- actionUrl: widget.actionUrl ?? options.actionUrl ?? '',
106
- searchable: widget.searchable ?? options.searchable ?? false,
107
- pagination: widget.pagination ?? options.pagination ?? false,
108
- // Surface drill-down nested shape as flat switches for the panel
109
- drillDownEnabled: drillDown.enabled ?? false,
110
- drillDownTarget: drillDown.target ?? 'drawer',
111
- };
112
- }
113
- function unflattenWidgetConfig(config, base) {
114
- // Collect any unknown keys (pivot/table/chart-specific) into options so the
115
- // serialized widget keeps the spec-compliant nested shape.
116
- const baseOptions = (base.options ?? {});
117
- const newOptions = { ...baseOptions };
118
- for (const [key, value] of Object.entries(config)) {
119
- if (TOP_LEVEL_WIDGET_KEYS.has(key))
120
- continue;
121
- if (value === undefined)
122
- continue;
123
- newOptions[key] = value;
124
- }
125
- // Re-nest drill-down flat keys back under options.drillDown so the renderer
126
- // (which reads `options.drillDown`) picks them up.
127
- const drillDownEnabled = config.drillDownEnabled;
128
- const drillDownTarget = config.drillDownTarget;
129
- if (drillDownEnabled !== undefined || drillDownTarget !== undefined) {
130
- newOptions.drillDown = {
131
- ...(baseOptions.drillDown || {}),
132
- ...(drillDownEnabled !== undefined ? { enabled: !!drillDownEnabled } : {}),
133
- ...(drillDownTarget !== undefined ? { target: drillDownTarget } : {}),
134
- };
135
- }
136
- return {
137
- title: config.title,
138
- description: config.description,
139
- type: config.type,
140
- object: config.object,
141
- categoryField: config.categoryField,
142
- valueField: config.valueField,
143
- aggregate: config.aggregate,
144
- layout: { ...(base.layout || {}), w: config.layoutW, h: config.layoutH },
145
- colorVariant: config.colorVariant,
146
- actionUrl: config.actionUrl,
147
- ...(config.searchable !== undefined ? { searchable: !!config.searchable } : {}),
148
- ...(config.pagination !== undefined ? { pagination: !!config.pagination } : {}),
149
- ...(Object.keys(newOptions).length > 0 ? { options: newOptions } : {}),
150
- };
151
- }
152
- function extractDashboardConfig(schema) {
153
- const s = (schema ?? {});
154
- return {
155
- columns: s.columns ?? 3,
156
- gap: s.gap ?? 4,
157
- rowHeight: String(s.rowHeight ?? '120'),
158
- refreshInterval: String(s.refreshInterval ?? '0'),
159
- title: s.title ?? '',
160
- description: s.description ?? '',
161
- showDescription: s.showDescription ?? true,
162
- theme: s.theme ?? 'auto',
163
- };
164
- }
165
- // ---------------------------------------------------------------------------
166
66
  // Component
167
67
  // ---------------------------------------------------------------------------
168
68
  export function DashboardView({ dataSource }) {
69
+ // Drill "escape hatch": lets the drill drawers open an object's full list page.
70
+ const openRecordList = useOpenRecordList();
169
71
  const { dashboardName } = useParams();
170
72
  const { showDebug } = useMetadataInspector();
171
73
  const adapter = useAdapter();
74
+ // ADR-0034: dashboard edits persist via the metadata draft/publish model.
75
+ const metadataClient = useMetadataClient();
172
76
  const { t } = useObjectTranslation();
173
77
  const { dashboardLabel, dashboardDescription } = useObjectLabel();
78
+ // Editing a dashboard mutates the SHARED definition, so it is an admin-only
79
+ // quick-edit affordance (mirrors ObjectView's view-config gate).
80
+ const { user } = useAuth();
81
+ const isAdmin = user?.role === 'admin';
174
82
  const [isLoading, setIsLoading] = useState(true);
175
83
  const [configPanelOpen, setConfigPanelOpen] = useState(false);
176
84
  const [selectedWidgetId, setSelectedWidgetId] = useState(null);
177
- // Version counter — incremented on save to refresh the stable config reference
178
- const [configVersion, setConfigVersion] = useState(0);
179
85
  // Modal state for header action buttons that request a modal (e.g. New Opportunity)
180
86
  const [modalState, setModalState] = useState(null);
181
87
  const closeModal = useCallback((result) => {
@@ -235,7 +141,9 @@ export function DashboardView({ dataSource }) {
235
141
  queueMicrotask(() => setIsLoading(false));
236
142
  }, [dashboardName]);
237
143
  const { dashboards, objects: metadataObjects, refresh } = useMetadata();
238
- const dashboard = dashboards?.find((d) => d.name === dashboardName);
144
+ // ADR-0048 Phase 2 — prefer the dashboard owned by the current app's package.
145
+ const { app: activeApp } = useExpressionContext();
146
+ const dashboard = preferLocal(dashboards, dashboardName, activeApp?._packageId);
239
147
  // Local schema state for live preview — initialized from metadata
240
148
  const [editSchema, setEditSchema] = useState(null);
241
149
  // When metadata refreshes (dashboard reference changes), discard stale
@@ -249,12 +157,12 @@ export function DashboardView({ dataSource }) {
249
157
  // ---- Save helper --------------------------------------------------------
250
158
  const saveSchema = useCallback(async (schema) => {
251
159
  try {
252
- if (adapter && adapter.updateDashboard) {
253
- await adapter.updateDashboard(dashboardName, schema);
254
- }
255
- else if (adapter) {
256
- // Fallback for adapters that don't expose updateDashboard
257
- await adapter.update('sys_dashboard', dashboardName, schema);
160
+ if (metadataClient) {
161
+ // ADR-0034: save stages a per-item draft; an explicit Publish
162
+ // promotes it (RuntimeDraftBar). `sys_dashboard` is retired.
163
+ await persistRuntimeMetadata('dashboard', dashboardName, schema, {
164
+ metadataClient,
165
+ });
258
166
  }
259
167
  // Refresh metadata cache so closing the config panel shows saved data
260
168
  refresh().catch(() => { });
@@ -267,12 +175,11 @@ export function DashboardView({ dataSource }) {
267
175
  console.warn('[DashboardView] Auto-save failed:', err);
268
176
  toast.error(`Failed to save dashboard: ${message}`);
269
177
  }
270
- }, [adapter, dashboardName, refresh]);
178
+ }, [metadataClient, dashboardName, refresh]);
271
179
  // ---- Open / close config panel ------------------------------------------
272
180
  const handleOpenConfigPanel = useCallback(() => {
273
181
  setEditSchema(ensureWidgetIds(dashboard));
274
182
  setConfigPanelOpen(true);
275
- setConfigVersion((v) => v + 1);
276
183
  }, [dashboard]);
277
184
  const handleCloseConfigPanel = useCallback(() => {
278
185
  setConfigPanelOpen(false);
@@ -298,7 +205,6 @@ export function DashboardView({ dataSource }) {
298
205
  setEditSchema(newSchema);
299
206
  saveSchema(newSchema);
300
207
  setSelectedWidgetId(id);
301
- setConfigVersion((v) => v + 1);
302
208
  }, [editSchema, saveSchema]);
303
209
  const removeWidget = useCallback((widgetId) => {
304
210
  if (!editSchema)
@@ -325,119 +231,12 @@ export function DashboardView({ dataSource }) {
325
231
  setEditSchema(newSchema);
326
232
  saveSchema(newSchema);
327
233
  }, [editSchema, dashboard, saveSchema]);
328
- // ---- Dashboard config panel handlers ------------------------------------
329
- // Stabilize config reference: only recompute after explicit actions (panel
330
- // open, save, widget add). configVersion is incremented on those actions.
331
- // This prevents useConfigDraft from resetting the draft on every live field
332
- // change (same pattern as ViewConfigPanel's stableActiveView).
333
- const dashboardConfig = useMemo(() => extractDashboardConfig(editSchema || dashboard),
334
- // eslint-disable-next-line react-hooks/exhaustive-deps
335
- [configVersion]);
336
- const handleDashboardConfigSave = useCallback((config) => {
337
- if (!editSchema)
338
- return;
339
- const toNum = (v, fallback) => {
340
- const n = Number(v);
341
- return Number.isFinite(n) ? n : fallback;
342
- };
343
- const newSchema = {
344
- ...editSchema,
345
- columns: toNum(config.columns, editSchema.columns),
346
- gap: toNum(config.gap, editSchema.gap),
347
- rowHeight: toNum(config.rowHeight, editSchema.rowHeight),
348
- refreshInterval: toNum(config.refreshInterval, 0) ?? 0,
349
- title: config.title,
350
- description: config.description,
351
- showDescription: config.showDescription,
352
- theme: config.theme,
353
- };
354
- setEditSchema(newSchema);
355
- saveSchema(newSchema);
356
- setConfigVersion((v) => v + 1);
357
- }, [editSchema, saveSchema]);
358
- const handleDashboardFieldChange = useCallback((field, value) => {
359
- if (!editSchema)
360
- return;
361
- // Map config field keys to proper DashboardSchema updates for live preview.
362
- // Coerce numeric layout fields so previews/save payloads stay typed.
363
- setEditSchema((prev) => {
364
- if (!prev)
365
- return prev;
366
- const numericFields = new Set(['columns', 'gap', 'rowHeight', 'refreshInterval']);
367
- if (numericFields.has(field)) {
368
- const n = Number(value);
369
- return { ...prev, [field]: Number.isFinite(n) ? n : prev[field] };
370
- }
371
- return { ...prev, [field]: value };
372
- });
373
- }, [editSchema]);
374
- // ---- Widget config panel handlers ---------------------------------------
375
- const selectedWidget = editSchema?.widgets?.find((w) => w.id === selectedWidgetId);
376
- // Stabilize widget config: only recompute after explicit actions (widget
377
- // switch, save, add). configVersion is incremented on save/add, and
378
- // selectedWidgetId changes on widget switch — this prevents useConfigDraft
379
- // from resetting the draft on every live field change.
380
- const widgetConfig = useMemo(() => (selectedWidget ? flattenWidgetConfig(selectedWidget) : {}),
381
- // eslint-disable-next-line react-hooks/exhaustive-deps
382
- [selectedWidgetId, configVersion]);
383
- const handleWidgetConfigSave = useCallback((config) => {
384
- if (!editSchema || !selectedWidgetId || !selectedWidget)
385
- return;
386
- const updates = unflattenWidgetConfig(config, selectedWidget);
387
- const newSchema = {
388
- ...editSchema,
389
- widgets: editSchema.widgets.map((w) => w.id === selectedWidgetId ? { ...w, ...updates } : w),
390
- };
391
- setEditSchema(newSchema);
392
- saveSchema(newSchema);
393
- setConfigVersion((v) => v + 1);
394
- }, [editSchema, selectedWidgetId, selectedWidget, saveSchema]);
395
- const handleWidgetFieldChange = useCallback((field, value) => {
396
- if (!selectedWidgetId)
397
- return;
398
- setEditSchema((prev) => {
399
- if (!prev)
400
- return prev;
401
- const widget = prev.widgets?.find((w) => w.id === selectedWidgetId);
402
- if (!widget)
403
- return prev;
404
- const flat = flattenWidgetConfig(widget);
405
- flat[field] = value;
406
- const updates = unflattenWidgetConfig(flat, widget);
407
- return {
408
- ...prev,
409
- widgets: prev.widgets.map((w) => w.id === selectedWidgetId ? { ...w, ...updates } : w),
410
- };
411
- });
412
- }, [selectedWidgetId]);
413
- // ---- Metadata-driven dropdown options -----------------------------------
414
- const availableObjects = useMemo(() => {
415
- if (!metadataObjects?.length)
416
- return undefined;
417
- return metadataObjects.map((obj) => ({
418
- value: obj.name,
419
- label: obj.label || obj.name,
420
- }));
421
- }, [metadataObjects]);
422
- const availableFields = useMemo(() => {
423
- const objectName = selectedWidget?.object;
424
- if (!objectName || !metadataObjects?.length)
425
- return undefined;
426
- const obj = metadataObjects.find((o) => o.name === objectName);
427
- if (!obj?.fields)
428
- return undefined;
429
- const fields = obj.fields;
430
- if (Array.isArray(fields)) {
431
- return fields
432
- .filter((f) => f.name)
433
- .map((f) => ({ value: f.name, label: f.label || f.name }));
434
- }
435
- // fields can be Record<string, FieldMetadata>
436
- return Object.entries(fields).map(([key, f]) => ({
437
- value: key,
438
- label: f.label || key,
439
- }));
440
- }, [selectedWidget?.object, metadataObjects]);
234
+ // ---- Live-edit schema for the config panel ------------------------------
235
+ // The single controlled config panel hosts the studio inspectors, which edit
236
+ // the FULL nested dashboard draft directly (dashboard-level via shallow patch,
237
+ // widget-level by addressing `widgets` by id). No flatten / unflatten / config
238
+ // extraction is required anymore.
239
+ const panelSchema = (editSchema || dashboard) ?? null;
441
240
  // ---- Runtime capability gate (must run before guards to respect Rules of Hooks)
442
241
  // Hide widgets whose `requiresObject` is not registered (mirrors
443
242
  // NavigationItem.requiresObject for nav entries). Defaults to widget.object
@@ -495,7 +294,7 @@ export function DashboardView({ dataSource }) {
495
294
  description: resolveI18nLabel(rawDesc, t),
496
295
  });
497
296
  return desc ? (_jsx("p", { className: "text-sm text-muted-foreground mt-1 line-clamp-2", children: desc })) : null;
498
- })()] }), _jsxs("div", { className: "shrink-0 flex items-center gap-1.5", children: [configPanelOpen && (_jsx("div", { className: "flex items-center gap-1 mr-2", role: "toolbar", "aria-label": "Add widgets", "data-testid": "dashboard-widget-toolbar", children: WIDGET_TYPES.map(({ type, label, Icon }) => (_jsxs("button", { type: "button", "data-testid": `dashboard-add-${type}`, onClick: () => addWidget(type), className: "inline-flex items-center gap-1 rounded-md border border-input bg-background px-2 py-1.5 text-[11px] font-medium text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", title: `Add ${label}`, "aria-label": `Add ${label} widget`, children: [_jsx(Plus, { className: "h-3 w-3" }), _jsx(Icon, { className: "h-3 w-3" })] }, type))) })), _jsxs("button", { type: "button", onClick: handleOpenConfigPanel, className: "inline-flex items-center gap-1.5 rounded-md border border-input bg-background px-2.5 py-1.5 text-xs font-medium text-muted-foreground shadow-sm hover:bg-accent hover:text-accent-foreground", "data-testid": "dashboard-edit-button", children: [_jsx(Pencil, { className: "h-3.5 w-3.5" }), t('common.edit', { defaultValue: 'Edit' })] })] })] }), _jsxs("div", { className: "flex-1 overflow-hidden flex flex-col sm:flex-row relative", children: [_jsx("div", { className: "flex-1 min-w-0 overflow-auto p-2 sm:p-4 md:p-6", children: _jsx(DashboardRenderer, { schema: previewSchema, dataSource: dataSource, designMode: configPanelOpen, selectedWidgetId: selectedWidgetId, onWidgetClick: setSelectedWidgetId, onWidgetsReorder: handleWidgetsReorder, modalHandler: modalHandler, scriptHandlers: scriptHandlers, hideHeaderText: true }) }), selectedWidget ? (_jsx(WidgetConfigPanel, { open: configPanelOpen, onClose: handleCloseConfigPanel, config: widgetConfig, onSave: handleWidgetConfigSave, onFieldChange: handleWidgetFieldChange, availableObjects: availableObjects, availableFields: availableFields, headerExtra: _jsx(Button, { size: "sm", variant: "ghost", onClick: () => removeWidget(selectedWidgetId), className: "h-7 w-7 p-0 text-destructive hover:text-destructive", "data-testid": "widget-delete-button", title: "Delete widget", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }, selectedWidgetId)) : (_jsx(DashboardConfigPanel, { open: configPanelOpen, onClose: handleCloseConfigPanel, config: dashboardConfig, onSave: handleDashboardConfigSave, onFieldChange: handleDashboardFieldChange })), _jsx(MetadataPanel, { open: showDebug, sections: [{ title: 'Dashboard Configuration', data: previewSchema }] })] }), modalState && modalState.schema?.objectName ? (_jsx(ModalForm, { schema: {
297
+ })()] }), _jsxs("div", { className: "shrink-0 flex items-center gap-1.5", children: [configPanelOpen && (_jsx("div", { className: "flex items-center gap-1 mr-2", role: "toolbar", "aria-label": "Add widgets", "data-testid": "dashboard-widget-toolbar", children: WIDGET_TYPES.map(({ type, label, Icon }) => (_jsxs("button", { type: "button", "data-testid": `dashboard-add-${type}`, onClick: () => addWidget(type), className: "inline-flex items-center gap-1 rounded-md border border-input bg-background px-2 py-1.5 text-[11px] font-medium text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", title: `Add ${label}`, "aria-label": `Add ${label} widget`, children: [_jsx(Plus, { className: "h-3 w-3" }), _jsx(Icon, { className: "h-3 w-3" })] }, type))) })), isAdmin && (_jsxs("button", { type: "button", onClick: handleOpenConfigPanel, className: "inline-flex items-center gap-1.5 rounded-md border border-input bg-background px-2.5 py-1.5 text-xs font-medium text-muted-foreground shadow-sm hover:bg-accent hover:text-accent-foreground", "data-testid": "dashboard-edit-button", children: [_jsx(Pencil, { className: "h-3.5 w-3.5" }), t('common.edit', { defaultValue: 'Edit' })] }))] })] }), _jsxs("div", { className: "flex-1 overflow-hidden flex flex-col sm:flex-row relative", children: [_jsx("div", { className: "flex-1 min-w-0 overflow-auto p-2 sm:p-4 md:p-6", children: _jsx(DrillNavigationProvider, { value: { openRecordList }, children: _jsx(DashboardRenderer, { schema: previewSchema, dataSource: dataSource, designMode: configPanelOpen, selectedWidgetId: selectedWidgetId, onWidgetClick: setSelectedWidgetId, onWidgetsReorder: handleWidgetsReorder, modalHandler: modalHandler, scriptHandlers: scriptHandlers, hideHeaderText: true }) }) }), _jsx(DashboardConfigPanel, { open: configPanelOpen && isAdmin, onClose: handleCloseConfigPanel, schema: panelSchema, selectedWidgetId: selectedWidgetId, onSelectWidget: setSelectedWidgetId, onSave: saveSchema, onChange: setEditSchema, onRemoveWidget: removeWidget, name: dashboardName, metadataClient: metadataClient, onAfterChange: () => refresh().catch(() => { }) }), _jsx(MetadataPanel, { open: showDebug, sections: [{ title: 'Dashboard Configuration', data: previewSchema }] })] }), modalState && modalState.schema?.objectName ? (_jsx(ModalForm, { schema: {
499
298
  type: 'object-form',
500
299
  formType: 'modal',
501
300
  objectName: modalState.schema.objectName,
@@ -0,0 +1,59 @@
1
+ export interface ScreenFieldSpec {
2
+ name: string;
3
+ label?: string;
4
+ type?: string;
5
+ required?: boolean;
6
+ options?: Array<{
7
+ value: unknown;
8
+ label: string;
9
+ }>;
10
+ defaultValue?: unknown;
11
+ placeholder?: string;
12
+ }
13
+ export interface ScreenSpec {
14
+ nodeId: string;
15
+ title?: string;
16
+ description?: string;
17
+ fields: ScreenFieldSpec[];
18
+ /**
19
+ * `'object-form'` renders the named object's FULL create/edit form — incl.
20
+ * inline master-detail child grids — as a wizard step (vs. the flat `fields`
21
+ * list). The form persists the record (and its children, atomically) itself,
22
+ * then resumes the run with the saved id bound to `idVariable`.
23
+ */
24
+ kind?: 'fields' | 'object-form';
25
+ objectName?: string;
26
+ mode?: 'create' | 'edit';
27
+ recordId?: string;
28
+ defaults?: Record<string, unknown>;
29
+ idVariable?: string;
30
+ }
31
+ export interface ScreenFlowState {
32
+ flowName: string;
33
+ runId: string;
34
+ screen: ScreenSpec;
35
+ }
36
+ export interface FlowRunnerProps {
37
+ /** The paused screen-flow to drive, or `null` when closed. */
38
+ state: ScreenFlowState | null;
39
+ /** Authenticated fetch (shared with the host view). */
40
+ authFetch: (url: string, init?: RequestInit) => Promise<Response>;
41
+ /** API base (e.g. `import.meta.env.VITE_SERVER_URL || ''`). */
42
+ baseUrl: string;
43
+ /** User dismissed the runner without completing. */
44
+ onClose: () => void;
45
+ /** The flow ran to completion — host should refresh. */
46
+ onComplete: () => void;
47
+ /**
48
+ * Data source — required to render `object-form` wizard steps. ObjectForm
49
+ * fetches the object schema and persists (incl. atomic master-detail batch)
50
+ * through this adapter.
51
+ */
52
+ dataSource?: any;
53
+ /**
54
+ * Object definitions — used to derive an `object-form` step's inline
55
+ * master-detail `subforms` (mirrors RecordFormPage's create form).
56
+ */
57
+ objects?: any[];
58
+ }
59
+ export declare function FlowRunner({ state, authFetch, baseUrl, onClose, onComplete, dataSource, objects }: FlowRunnerProps): import("react").JSX.Element | null;
@@ -0,0 +1,153 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * FlowRunner — renders the interactive `screen` of a paused screen-flow run
4
+ * (framework screen-flow runtime, ADR-0019) and resumes it with the collected
5
+ * input.
6
+ *
7
+ * A `type: 'flow'` action launches a flow; when the run pauses at a `screen`
8
+ * node the launch response carries `{ status: 'paused', runId, screen }`. The
9
+ * host view (ObjectView / RecordDetailView) opens this modal with that state.
10
+ * On submit it POSTs `/api/v1/automation/{flow}/runs/{runId}/resume` with the
11
+ * field values as `inputs`; a `paused` response renders the next screen
12
+ * (multi-screen wizards), a terminal response closes and refreshes the view.
13
+ */
14
+ import { useEffect, useState } from 'react';
15
+ import { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, Button, Input, Label, Textarea, Checkbox, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from '@object-ui/components';
16
+ import { ObjectForm } from '@object-ui/plugin-form';
17
+ import { toast } from 'sonner';
18
+ function initialValues(screen) {
19
+ const v = {};
20
+ for (const f of screen.fields)
21
+ if (f.defaultValue !== undefined)
22
+ v[f.name] = f.defaultValue;
23
+ return v;
24
+ }
25
+ export function FlowRunner({ state, authFetch, baseUrl, onClose, onComplete, dataSource, objects }) {
26
+ const [screen, setScreen] = useState(null);
27
+ const [runId, setRunId] = useState('');
28
+ const [flowName, setFlowName] = useState('');
29
+ const [values, setValues] = useState({});
30
+ const [submitting, setSubmitting] = useState(false);
31
+ useEffect(() => {
32
+ if (state) {
33
+ setScreen(state.screen);
34
+ setRunId(state.runId);
35
+ setFlowName(state.flowName);
36
+ setValues(initialValues(state.screen));
37
+ }
38
+ }, [state]);
39
+ if (!state || !screen)
40
+ return null;
41
+ const setVal = (name, v) => setValues((p) => ({ ...p, [name]: v }));
42
+ // Resume the paused run with `inputs` (applied as bare flow variables) and
43
+ // advance: render the next screen (multi-step wizard) or finish + refresh.
44
+ // Shared by the flat-field submit and the object-form save callback.
45
+ const resumeWith = async (inputs) => {
46
+ const res = await authFetch(`${baseUrl}/api/v1/automation/${encodeURIComponent(flowName)}/runs/${encodeURIComponent(runId)}/resume`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ inputs }) });
47
+ const json = await res.json().catch(() => null);
48
+ if (!res.ok || json?.success === false) {
49
+ // Transport / envelope failure — possibly transient (network, 5xx), so
50
+ // keep the dialog open and let the user retry the same run.
51
+ toast.error(json?.error || `Resume failed (HTTP ${res.status})`);
52
+ return;
53
+ }
54
+ const data = json?.data ?? {};
55
+ // The HTTP envelope is `{ success:true, data: AutomationResult }`; a flow
56
+ // that errored downstream surfaces as `data.success === false`. That is
57
+ // TERMINAL: the engine consumes the suspension before running downstream
58
+ // nodes (resume-once), so this run can never be resumed again — a retry
59
+ // would only hit "No suspended run". Close the runner instead of leaving
60
+ // a dead form open.
61
+ if (data.success === false || data.status === 'failed') {
62
+ // Prefer the flow's friendly `errorMessage`; fall back to the raw error.
63
+ toast.error(data.errorMessage || data.error || 'The flow failed to complete.');
64
+ onClose();
65
+ return;
66
+ }
67
+ if (data.status === 'paused' && data.screen) {
68
+ setScreen(data.screen);
69
+ setRunId(data.runId || runId);
70
+ setValues(initialValues(data.screen));
71
+ toast.success('Saved — next step');
72
+ }
73
+ else {
74
+ // Terminal success — show the flow's declared completion message.
75
+ toast.success(data.successMessage || 'Done');
76
+ onComplete();
77
+ }
78
+ };
79
+ const submit = async () => {
80
+ const missing = screen.fields.filter((f) => f.required && (values[f.name] === undefined || values[f.name] === '' || values[f.name] === null));
81
+ if (missing.length) {
82
+ toast.error(`Please fill: ${missing.map((f) => f.label || f.name).join(', ')}`);
83
+ return;
84
+ }
85
+ setSubmitting(true);
86
+ try {
87
+ await resumeWith(values);
88
+ }
89
+ catch (err) {
90
+ toast.error(err.message);
91
+ }
92
+ finally {
93
+ setSubmitting(false);
94
+ }
95
+ };
96
+ // Object-form step: ObjectForm has already persisted the record (and its
97
+ // children, atomically). Resume the run with the new record's id bound to the
98
+ // step's `idVariable` so later steps can reference it (e.g. the Opportunity
99
+ // form's `account` FK = the Customer step's new id).
100
+ const onObjectFormSaved = async (saved) => {
101
+ const id = saved?.id ?? saved?.data?.id ?? saved?.record?.id;
102
+ const inputs = screen.idVariable && id != null ? { [screen.idVariable]: id } : {};
103
+ setSubmitting(true);
104
+ try {
105
+ await resumeWith(inputs);
106
+ }
107
+ catch (err) {
108
+ toast.error(err.message);
109
+ }
110
+ finally {
111
+ setSubmitting(false);
112
+ }
113
+ };
114
+ const isObjectForm = screen.kind === 'object-form' && !!screen.objectName;
115
+ const objectDef = isObjectForm && Array.isArray(objects)
116
+ ? objects.find((o) => o?.name === screen.objectName)
117
+ : undefined;
118
+ const subforms = objectDef
119
+ ? (objectDef.form?.subforms ?? objectDef.formViews?.default?.subforms)
120
+ : undefined;
121
+ return (_jsx(Dialog, { open: true, onOpenChange: (o) => { if (!o && !submitting)
122
+ onClose(); }, children: _jsxs(DialogContent, { className: isObjectForm ? 'sm:max-w-3xl max-h-[90vh] overflow-y-auto' : 'sm:max-w-md', children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: screen.title || 'Input' }), screen.description && _jsx(DialogDescription, { children: screen.description })] }), isObjectForm ? (_jsx("div", { className: "py-2", children: dataSource ? (_jsx(ObjectForm, { schema: {
123
+ type: 'object-form',
124
+ formType: 'simple',
125
+ objectName: screen.objectName,
126
+ mode: screen.mode === 'edit' ? 'edit' : 'create',
127
+ recordId: screen.mode === 'edit' ? screen.recordId : undefined,
128
+ ...(screen.defaults ? { initialValues: screen.defaults } : {}),
129
+ layout: 'vertical',
130
+ subforms,
131
+ onSuccess: onObjectFormSaved,
132
+ onCancel: onClose,
133
+ showSubmit: true,
134
+ showCancel: true,
135
+ submitText: 'Save & Continue',
136
+ cancelText: 'Cancel',
137
+ }, dataSource: dataSource }, screen.nodeId)) : (_jsx("div", { className: "text-sm text-destructive py-4", children: "This step renders an object form but no data source is available." })) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "space-y-4 py-2", children: screen.fields.map((f) => (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: `ff-${f.name}`, className: "text-sm", children: [f.label || f.name, f.required && _jsx("span", { className: "text-destructive", children: " *" })] }), _jsx(FieldInput, { field: f, value: values[f.name], onChange: (v) => setVal(f.name, v) })] }, f.name))) }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: onClose, disabled: submitting, children: "Cancel" }), _jsx(Button, { onClick: submit, disabled: submitting, children: submitting ? 'Submitting…' : 'Submit' })] })] }))] }) }));
138
+ }
139
+ function FieldInput({ field, value, onChange }) {
140
+ const id = `ff-${field.name}`;
141
+ const t = (field.type || 'text').toLowerCase();
142
+ if (Array.isArray(field.options) && field.options.length > 0) {
143
+ return (_jsxs(Select, { value: value != null ? String(value) : undefined, onValueChange: (v) => onChange(v), children: [_jsx(SelectTrigger, { id: id, children: _jsx(SelectValue, { placeholder: field.placeholder || 'Select…' }) }), _jsx(SelectContent, { children: field.options.map((o, i) => (_jsx(SelectItem, { value: String(o.value), children: o.label }, i))) })] }));
144
+ }
145
+ if (t === 'boolean' || t === 'checkbox') {
146
+ return _jsx(Checkbox, { id: id, checked: value === true, onCheckedChange: (c) => onChange(c === true) });
147
+ }
148
+ if (t === 'textarea' || t === 'markdown') {
149
+ return _jsx(Textarea, { id: id, value: value ?? '', placeholder: field.placeholder, onChange: (e) => onChange(e.target.value) });
150
+ }
151
+ const htmlType = t === 'number' || t === 'currency' ? 'number' : t === 'email' ? 'email' : t === 'date' ? 'date' : 'text';
152
+ return (_jsx(Input, { id: id, type: htmlType, value: value ?? '', placeholder: field.placeholder, onChange: (e) => onChange(htmlType === 'number' ? (e.target.value === '' ? undefined : Number(e.target.value)) : e.target.value) }));
153
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Interface List Page — ADR-0047 interface mode.
3
+ *
4
+ * Renders a page whose `interfaceConfig` binds a single source view into an
5
+ * author-curated list surface. Where ObjectView (data mode) shows ALL of an
6
+ * object's list views as switcher tabs and lets users create views, this
7
+ * surface is deliberately closed:
8
+ *
9
+ * • the page REFERENCES one view (`interfaceConfig.sourceView`) — columns,
10
+ * base filter and sort are inherited, never restated (the iron rule);
11
+ * • end users get exactly the `userFilters` the author enabled;
12
+ * • the visualization comes from `appearance.allowedVisualizations`
13
+ * (a single entry renders no switcher);
14
+ * • `userActions` toggles map onto the toolbar — advanced filtering and
15
+ * view management are absent by default.
16
+ */
17
+ import * as React from 'react';
18
+ interface InterfaceListPageProps {
19
+ page: any;
20
+ className?: string;
21
+ /** Design-mode only: persist toolbar edits (sort, column order) back to the
22
+ * page's interfaceConfig metadata (Airtable parity — the toolbar IS the
23
+ * authoring surface). Receives a partial interfaceConfig patch. */
24
+ onConfigChange?: (patch: Record<string, unknown>) => void;
25
+ /** When the host overlays an edit-in-studio affordance at the page's
26
+ * top-right (PageView's pencil), reserve right padding on the header so the
27
+ * toolbar buttons don't sit under it. */
28
+ reserveEditAffordance?: boolean;
29
+ }
30
+ export declare function defaultKanbanFromObject(objectDef: any): {
31
+ groupField: string;
32
+ groupByField: string;
33
+ } | undefined;
34
+ export declare function defaultCalendarFromObject(objectDef: any): {
35
+ startDateField: string;
36
+ } | undefined;
37
+ export declare function defaultGalleryFromObject(objectDef: any): {
38
+ coverField: string;
39
+ } | undefined;
40
+ export declare function defaultGanttFromObject(objectDef: any): {
41
+ startDateField: string;
42
+ endDateField: string;
43
+ progressField?: string;
44
+ } | undefined;
45
+ export declare function defaultMapFromObject(objectDef: any): {
46
+ locationField: string;
47
+ } | undefined;
48
+ export declare function InterfaceListPage({ page, className, onConfigChange, reserveEditAffordance }: InterfaceListPageProps): React.JSX.Element;
49
+ export {};