@manta-eu/react 0.12.0 → 0.13.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.
- package/README.md +59 -0
- package/dist/components/AppErrorBoundary.d.ts.map +1 -1
- package/dist/components/AppErrorBoundary.js +14 -11
- package/dist/components/AppErrorBoundary.js.map +1 -1
- package/dist/components/app-gate/AppGate.d.ts +8 -0
- package/dist/components/app-gate/AppGate.d.ts.map +1 -0
- package/dist/components/app-gate/AppGate.js +68 -0
- package/dist/components/app-gate/AppGate.js.map +1 -0
- package/dist/components/app-gate/AwaitingDatastoreStatus.d.ts +7 -0
- package/dist/components/app-gate/AwaitingDatastoreStatus.d.ts.map +1 -0
- package/dist/components/app-gate/AwaitingDatastoreStatus.js +19 -0
- package/dist/components/app-gate/AwaitingDatastoreStatus.js.map +1 -0
- package/dist/components/app-gate/EnterDatastoreRoute.d.ts +2 -0
- package/dist/components/app-gate/EnterDatastoreRoute.d.ts.map +1 -0
- package/dist/components/app-gate/EnterDatastoreRoute.js +25 -0
- package/dist/components/app-gate/EnterDatastoreRoute.js.map +1 -0
- package/dist/components/app-gate/ErrorRoute.d.ts +2 -0
- package/dist/components/app-gate/ErrorRoute.d.ts.map +1 -0
- package/dist/components/app-gate/ErrorRoute.js +27 -0
- package/dist/components/app-gate/ErrorRoute.js.map +1 -0
- package/dist/components/app-gate/FailureAlert.d.ts +5 -0
- package/dist/components/app-gate/FailureAlert.d.ts.map +1 -0
- package/dist/components/app-gate/FailureAlert.js +9 -0
- package/dist/components/app-gate/FailureAlert.js.map +1 -0
- package/dist/components/app-gate/NoDatastoreAccess.d.ts +8 -0
- package/dist/components/app-gate/NoDatastoreAccess.d.ts.map +1 -0
- package/dist/components/app-gate/NoDatastoreAccess.js +9 -0
- package/dist/components/app-gate/NoDatastoreAccess.js.map +1 -0
- package/dist/components/app-gate/NotFoundRoute.d.ts +2 -0
- package/dist/components/app-gate/NotFoundRoute.d.ts.map +1 -0
- package/dist/components/app-gate/NotFoundRoute.js +9 -0
- package/dist/components/app-gate/NotFoundRoute.js.map +1 -0
- package/dist/components/app-gate/PendingInvitations.d.ts +5 -0
- package/dist/components/app-gate/PendingInvitations.d.ts.map +1 -0
- package/dist/components/app-gate/PendingInvitations.js +58 -0
- package/dist/components/app-gate/PendingInvitations.js.map +1 -0
- package/dist/components/app-gate/ServiceError.d.ts +8 -0
- package/dist/components/app-gate/ServiceError.d.ts.map +1 -0
- package/dist/components/app-gate/ServiceError.js +10 -0
- package/dist/components/app-gate/ServiceError.js.map +1 -0
- package/dist/components/app-gate/index.d.ts +3 -0
- package/dist/components/app-gate/index.d.ts.map +1 -0
- package/dist/components/app-gate/index.js +3 -0
- package/dist/components/app-gate/index.js.map +1 -0
- package/dist/components/app-gate/sdk-route-elements.d.ts +23 -0
- package/dist/components/app-gate/sdk-route-elements.d.ts.map +1 -0
- package/dist/components/app-gate/sdk-route-elements.js +35 -0
- package/dist/components/app-gate/sdk-route-elements.js.map +1 -0
- package/dist/components/app-shell/AppShell.d.ts +7 -0
- package/dist/components/app-shell/AppShell.d.ts.map +1 -0
- package/dist/components/app-shell/AppShell.js +10 -0
- package/dist/components/app-shell/AppShell.js.map +1 -0
- package/dist/components/app-shell/AppShellRoutes.d.ts +9 -0
- package/dist/components/app-shell/AppShellRoutes.d.ts.map +1 -0
- package/dist/components/app-shell/AppShellRoutes.js +20 -0
- package/dist/components/app-shell/AppShellRoutes.js.map +1 -0
- package/dist/components/app-shell/GroupDatastores.d.ts +8 -0
- package/dist/components/app-shell/GroupDatastores.d.ts.map +1 -0
- package/dist/components/app-shell/GroupDatastores.js +15 -0
- package/dist/components/app-shell/GroupDatastores.js.map +1 -0
- package/dist/components/app-shell/GroupRoute.d.ts +2 -0
- package/dist/components/app-shell/GroupRoute.d.ts.map +1 -0
- package/dist/components/app-shell/GroupRoute.js +22 -0
- package/dist/components/app-shell/GroupRoute.js.map +1 -0
- package/dist/components/app-shell/index.d.ts +3 -0
- package/dist/components/app-shell/index.d.ts.map +1 -0
- package/dist/components/app-shell/index.js +3 -0
- package/dist/components/app-shell/index.js.map +1 -0
- package/dist/components/authenticated-chat/index.d.ts +1 -2
- package/dist/components/authenticated-chat/index.d.ts.map +1 -1
- package/dist/components/authenticated-chat/index.js +1 -12
- package/dist/components/authenticated-chat/index.js.map +1 -1
- package/dist/components/chat-view/Chat.d.ts +2 -1
- package/dist/components/chat-view/Chat.d.ts.map +1 -1
- package/dist/components/chat-view/Chat.js +3 -2
- package/dist/components/chat-view/Chat.js.map +1 -1
- package/dist/components/chat-view/MessageItem.d.ts.map +1 -1
- package/dist/components/chat-view/MessageItem.js +4 -2
- package/dist/components/chat-view/MessageItem.js.map +1 -1
- package/dist/components/chat-view/tool-part-rendering.d.ts +1 -0
- package/dist/components/chat-view/tool-part-rendering.d.ts.map +1 -1
- package/dist/components/chat-view/tool-part-rendering.js +8 -1
- package/dist/components/chat-view/tool-part-rendering.js.map +1 -1
- package/dist/components/chip/index.d.ts +1 -0
- package/dist/components/chip/index.d.ts.map +1 -1
- package/dist/components/chip/index.js +2 -1
- package/dist/components/chip/index.js.map +1 -1
- package/dist/components/embedded-chat/index.d.ts +1 -1
- package/dist/components/embedded-chat/index.d.ts.map +1 -1
- package/dist/components/embedded-chat/index.js +1 -1
- package/dist/components/embedded-chat/index.js.map +1 -1
- package/dist/components/input/input-date-time.d.ts +6 -0
- package/dist/components/input/input-date-time.d.ts.map +1 -1
- package/dist/components/input/input-date-time.js +2 -1
- package/dist/components/input/input-date-time.js.map +1 -1
- package/dist/components/input/input-date.d.ts +22 -0
- package/dist/components/input/input-date.d.ts.map +1 -1
- package/dist/components/input/input-date.js +28 -14
- package/dist/components/input/input-date.js.map +1 -1
- package/dist/components/input/input-time.d.ts +9 -0
- package/dist/components/input/input-time.d.ts.map +1 -1
- package/dist/components/input/input-time.js +29 -18
- package/dist/components/input/input-time.js.map +1 -1
- package/dist/components/layouts/RouteLayout.d.ts +0 -9
- package/dist/components/layouts/RouteLayout.d.ts.map +1 -1
- package/dist/components/layouts/RouteLayout.js +7 -4
- package/dist/components/layouts/RouteLayout.js.map +1 -1
- package/dist/components/layouts/Sidebar.d.ts +1 -8
- package/dist/components/layouts/Sidebar.d.ts.map +1 -1
- package/dist/components/layouts/Sidebar.js +7 -14
- package/dist/components/layouts/Sidebar.js.map +1 -1
- package/dist/components/plan-limits/PlanLimitsDialog.d.ts +20 -0
- package/dist/components/plan-limits/PlanLimitsDialog.d.ts.map +1 -0
- package/dist/components/plan-limits/PlanLimitsDialog.js +109 -0
- package/dist/components/plan-limits/PlanLimitsDialog.js.map +1 -0
- package/dist/components/plan-limits/index.d.ts +4 -0
- package/dist/components/plan-limits/index.d.ts.map +1 -0
- package/dist/components/plan-limits/index.js +2 -0
- package/dist/components/plan-limits/index.js.map +1 -0
- package/dist/components/plan-limits/plan-limits-client.d.ts +15 -0
- package/dist/components/plan-limits/plan-limits-client.d.ts.map +1 -0
- package/dist/components/plan-limits/plan-limits-client.js +44 -0
- package/dist/components/plan-limits/plan-limits-client.js.map +1 -0
- package/dist/components/plan-limits/plan-limits-model.d.ts +66 -0
- package/dist/components/plan-limits/plan-limits-model.d.ts.map +1 -0
- package/dist/components/plan-limits/plan-limits-model.js +123 -0
- package/dist/components/plan-limits/plan-limits-model.js.map +1 -0
- package/dist/components/plan-limits/plan-limits-save.d.ts +31 -0
- package/dist/components/plan-limits/plan-limits-save.d.ts.map +1 -0
- package/dist/components/plan-limits/plan-limits-save.js +43 -0
- package/dist/components/plan-limits/plan-limits-save.js.map +1 -0
- package/dist/components/planning/PlanLimitsAction.d.ts +6 -0
- package/dist/components/planning/PlanLimitsAction.d.ts.map +1 -0
- package/dist/components/planning/PlanLimitsAction.js +19 -0
- package/dist/components/planning/PlanLimitsAction.js.map +1 -0
- package/dist/components/slider/index.d.ts.map +1 -1
- package/dist/components/slider/index.js +2 -1
- package/dist/components/slider/index.js.map +1 -1
- package/dist/datastore-picker/datastore-picker-rows.d.ts +7 -0
- package/dist/datastore-picker/datastore-picker-rows.d.ts.map +1 -1
- package/dist/datastore-picker/datastore-picker-rows.js +26 -22
- package/dist/datastore-picker/datastore-picker-rows.js.map +1 -1
- package/dist/globals.css +85 -2
- package/dist/hooks/use-action-plans-list.d.ts +3 -0
- package/dist/hooks/use-action-plans-list.d.ts.map +1 -1
- package/dist/hooks/use-action-plans-list.js +8 -9
- package/dist/hooks/use-action-plans-list.js.map +1 -1
- package/dist/hooks/use-activity-feed.d.ts +10 -1
- package/dist/hooks/use-activity-feed.d.ts.map +1 -1
- package/dist/hooks/use-activity-feed.js +9 -11
- package/dist/hooks/use-activity-feed.js.map +1 -1
- package/dist/hooks/use-entity.d.ts +4 -3
- package/dist/hooks/use-entity.d.ts.map +1 -1
- package/dist/hooks/use-entity.js +4 -4
- package/dist/hooks/use-entity.js.map +1 -1
- package/dist/hooks/use-manual-actions.d.ts +1 -1
- package/dist/hooks/use-manual-actions.d.ts.map +1 -1
- package/dist/hooks/use-manual-actions.js +5 -5
- package/dist/hooks/use-manual-actions.js.map +1 -1
- package/dist/hooks/use-unsaved-changes-warning.d.ts +2 -0
- package/dist/hooks/use-unsaved-changes-warning.d.ts.map +1 -0
- package/dist/hooks/use-unsaved-changes-warning.js +13 -0
- package/dist/hooks/use-unsaved-changes-warning.js.map +1 -0
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +4 -3
- package/dist/hooks/useAuth.js.map +1 -1
- package/dist/hooks/useChatPanelSync.d.ts.map +1 -1
- package/dist/hooks/useChatPanelSync.js +2 -3
- package/dist/hooks/useChatPanelSync.js.map +1 -1
- package/dist/hooks/useDatastoreSelection.d.ts.map +1 -1
- package/dist/hooks/useDatastoreSelection.js +11 -4
- package/dist/hooks/useDatastoreSelection.js.map +1 -1
- package/dist/hooks/useExecuteAction.d.ts +1 -0
- package/dist/hooks/useExecuteAction.d.ts.map +1 -1
- package/dist/hooks/useExecuteAction.js.map +1 -1
- package/dist/hooks/useLoginRedirect.d.ts +6 -0
- package/dist/hooks/useLoginRedirect.d.ts.map +1 -0
- package/dist/hooks/useLoginRedirect.js +51 -0
- package/dist/hooks/useLoginRedirect.js.map +1 -0
- package/dist/hooks/usePlanLimits.d.ts +18 -0
- package/dist/hooks/usePlanLimits.d.ts.map +1 -0
- package/dist/hooks/usePlanLimits.js +56 -0
- package/dist/hooks/usePlanLimits.js.map +1 -0
- package/dist/ldo-ui.d.ts +1 -1
- package/dist/ldo-ui.d.ts.map +1 -1
- package/dist/ldo-ui.js.map +1 -1
- package/dist/lib/app-tools.d.ts +18 -0
- package/dist/lib/app-tools.d.ts.map +1 -0
- package/dist/lib/app-tools.js +42 -0
- package/dist/lib/app-tools.js.map +1 -0
- package/dist/lib/chat-types.d.ts +3 -0
- package/dist/lib/chat-types.d.ts.map +1 -1
- package/dist/lib/chat-types.js.map +1 -1
- package/dist/lib/datastore-route-table.d.ts +3 -0
- package/dist/lib/datastore-route-table.d.ts.map +1 -1
- package/dist/lib/datastore-route-table.js +6 -0
- package/dist/lib/datastore-route-table.js.map +1 -1
- package/dist/lib/graphql-error.d.ts +2 -0
- package/dist/lib/graphql-error.d.ts.map +1 -0
- package/dist/lib/graphql-error.js +7 -0
- package/dist/lib/graphql-error.js.map +1 -0
- package/dist/lib/update-notice.d.ts +2 -1
- package/dist/lib/update-notice.d.ts.map +1 -1
- package/dist/lib/update-notice.js +8 -2
- package/dist/lib/update-notice.js.map +1 -1
- package/dist/providers/ActiveChatProvider.d.ts +2 -0
- package/dist/providers/ActiveChatProvider.d.ts.map +1 -1
- package/dist/providers/ActiveChatProvider.js +6 -3
- package/dist/providers/ActiveChatProvider.js.map +1 -1
- package/dist/providers/ActiveDatastoreProvider.d.ts +12 -0
- package/dist/providers/ActiveDatastoreProvider.d.ts.map +1 -1
- package/dist/providers/ActiveDatastoreProvider.js +114 -11
- package/dist/providers/ActiveDatastoreProvider.js.map +1 -1
- package/dist/providers/AuthContext.d.ts +1 -0
- package/dist/providers/AuthContext.d.ts.map +1 -1
- package/dist/providers/AuthContext.js.map +1 -1
- package/dist/providers/MantaClientProvider.d.ts.map +1 -1
- package/dist/providers/MantaClientProvider.js +3 -3
- package/dist/providers/MantaClientProvider.js.map +1 -1
- package/dist/providers/index.d.ts +3 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/routes/activity/detail/ActivityDetailRoute.d.ts.map +1 -1
- package/dist/routes/activity/detail/ActivityDetailRoute.js +1 -3
- package/dist/routes/activity/detail/ActivityDetailRoute.js.map +1 -1
- package/dist/routes/activity/index.d.ts.map +1 -1
- package/dist/routes/activity/index.js +1 -3
- package/dist/routes/activity/index.js.map +1 -1
- package/dist/routes/chat/index.d.ts +2 -21
- package/dist/routes/chat/index.d.ts.map +1 -1
- package/dist/routes/chat/index.js +4 -2
- package/dist/routes/chat/index.js.map +1 -1
- package/dist/routes/data-collection/index.d.ts.map +1 -1
- package/dist/routes/data-collection/index.js +1 -3
- package/dist/routes/data-collection/index.js.map +1 -1
- package/dist/routes/data-explorer/components/DataExplorerLayout.d.ts.map +1 -1
- package/dist/routes/data-explorer/components/DataExplorerLayout.js +1 -3
- package/dist/routes/data-explorer/components/DataExplorerLayout.js.map +1 -1
- package/dist/routes/data-explorer/components/class-detail/UsedByRules.js +2 -2
- package/dist/routes/data-explorer/components/class-detail/UsedByRules.js.map +1 -1
- package/dist/routes/datastores/index.d.ts.map +1 -1
- package/dist/routes/datastores/index.js +2 -2
- package/dist/routes/datastores/index.js.map +1 -1
- package/dist/routes/explain/index.d.ts.map +1 -1
- package/dist/routes/explain/index.js +1 -3
- package/dist/routes/explain/index.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/DashConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/DashConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/DashConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts +0 -1
- package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js +3 -2
- package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts +0 -1
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +4 -3
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js +0 -1
- package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js.map +1 -1
- package/dist/routes/integrations/types.d.ts +2 -1
- package/dist/routes/integrations/types.d.ts.map +1 -1
- package/dist/routes/integrations/types.js +16 -0
- package/dist/routes/integrations/types.js.map +1 -1
- package/dist/routes/memories/components/DateValueInput.d.ts +16 -0
- package/dist/routes/memories/components/DateValueInput.d.ts.map +1 -0
- package/dist/routes/memories/components/DateValueInput.js +35 -0
- package/dist/routes/memories/components/DateValueInput.js.map +1 -0
- package/dist/routes/memories/components/EntityValuePicker.d.ts +11 -0
- package/dist/routes/memories/components/EntityValuePicker.d.ts.map +1 -0
- package/dist/routes/memories/components/EntityValuePicker.js +61 -0
- package/dist/routes/memories/components/EntityValuePicker.js.map +1 -0
- package/dist/routes/memories/components/FieldLabel.d.ts +12 -0
- package/dist/routes/memories/components/FieldLabel.d.ts.map +1 -0
- package/dist/routes/memories/components/FieldLabel.js +12 -0
- package/dist/routes/memories/components/FieldLabel.js.map +1 -0
- package/dist/routes/memories/components/ImportanceSlider.d.ts +2 -0
- package/dist/routes/memories/components/ImportanceSlider.d.ts.map +1 -1
- package/dist/routes/memories/components/ImportanceSlider.js +4 -1
- package/dist/routes/memories/components/ImportanceSlider.js.map +1 -1
- package/dist/routes/memories/components/MemoriesFilters.d.ts +2 -2
- package/dist/routes/memories/components/MemoriesFilters.d.ts.map +1 -1
- package/dist/routes/memories/components/MemoriesFilters.js.map +1 -1
- package/dist/routes/memories/components/MemoriesPanel.d.ts.map +1 -1
- package/dist/routes/memories/components/MemoriesPanel.js +4 -0
- package/dist/routes/memories/components/MemoriesPanel.js.map +1 -1
- package/dist/routes/memories/components/MemoriesTabPanel.d.ts +2 -2
- package/dist/routes/memories/components/MemoriesTabPanel.d.ts.map +1 -1
- package/dist/routes/memories/components/MemoryActions.d.ts +2 -0
- package/dist/routes/memories/components/MemoryActions.d.ts.map +1 -1
- package/dist/routes/memories/components/MemoryActions.js +3 -3
- package/dist/routes/memories/components/MemoryActions.js.map +1 -1
- package/dist/routes/memories/components/MemoryFields.d.ts +15 -3
- package/dist/routes/memories/components/MemoryFields.d.ts.map +1 -1
- package/dist/routes/memories/components/MemoryFields.js +34 -5
- package/dist/routes/memories/components/MemoryFields.js.map +1 -1
- package/dist/routes/memories/components/MemoryFormDialog.d.ts +6 -3
- package/dist/routes/memories/components/MemoryFormDialog.d.ts.map +1 -1
- package/dist/routes/memories/components/MemoryFormDialog.js +105 -59
- package/dist/routes/memories/components/MemoryFormDialog.js.map +1 -1
- package/dist/routes/memories/components/MemoryPropertyFields.d.ts +10 -0
- package/dist/routes/memories/components/MemoryPropertyFields.d.ts.map +1 -0
- package/dist/routes/memories/components/MemoryPropertyFields.js +67 -0
- package/dist/routes/memories/components/MemoryPropertyFields.js.map +1 -0
- package/dist/routes/memories/components/RuleDraftDialog.d.ts +7 -0
- package/dist/routes/memories/components/RuleDraftDialog.d.ts.map +1 -0
- package/dist/routes/memories/components/RuleDraftDialog.js +20 -0
- package/dist/routes/memories/components/RuleDraftDialog.js.map +1 -0
- package/dist/routes/memories/components/SchemasTab.d.ts +17 -2
- package/dist/routes/memories/components/SchemasTab.d.ts.map +1 -1
- package/dist/routes/memories/components/SchemasTab.js +146 -28
- package/dist/routes/memories/components/SchemasTab.js.map +1 -1
- package/dist/routes/memories/components/badges.d.ts +7 -0
- package/dist/routes/memories/components/badges.d.ts.map +1 -1
- package/dist/routes/memories/components/badges.js +11 -3
- package/dist/routes/memories/components/badges.js.map +1 -1
- package/dist/routes/memories/hooks/useMemoryColumns.d.ts +4 -2
- package/dist/routes/memories/hooks/useMemoryColumns.d.ts.map +1 -1
- package/dist/routes/memories/hooks/useMemoryColumns.js +31 -15
- package/dist/routes/memories/hooks/useMemoryColumns.js.map +1 -1
- package/dist/routes/memories/index.d.ts +2 -1
- package/dist/routes/memories/index.d.ts.map +1 -1
- package/dist/routes/memories/index.js +72 -30
- package/dist/routes/memories/index.js.map +1 -1
- package/dist/routes/memories/memory-mutation-input.d.ts.map +1 -1
- package/dist/routes/memories/memory-mutation-input.js +5 -2
- package/dist/routes/memories/memory-mutation-input.js.map +1 -1
- package/dist/routes/memories/memory-property-values.d.ts +13 -0
- package/dist/routes/memories/memory-property-values.d.ts.map +1 -0
- package/dist/routes/memories/memory-property-values.js +40 -0
- package/dist/routes/memories/memory-property-values.js.map +1 -0
- package/dist/routes/memories/schemas/AllowedValuesField.d.ts +14 -0
- package/dist/routes/memories/schemas/AllowedValuesField.d.ts.map +1 -0
- package/dist/routes/memories/schemas/AllowedValuesField.js +64 -0
- package/dist/routes/memories/schemas/AllowedValuesField.js.map +1 -0
- package/dist/routes/memories/schemas/MemorySchemaPage.d.ts +127 -0
- package/dist/routes/memories/schemas/MemorySchemaPage.d.ts.map +1 -0
- package/dist/routes/memories/schemas/MemorySchemaPage.js +285 -0
- package/dist/routes/memories/schemas/MemorySchemaPage.js.map +1 -0
- package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts +20 -0
- package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts.map +1 -0
- package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js +54 -0
- package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js.map +1 -0
- package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts +15 -0
- package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts.map +1 -0
- package/dist/routes/memories/schemas/SchemaConfirmDialog.js +8 -0
- package/dist/routes/memories/schemas/SchemaConfirmDialog.js.map +1 -0
- package/dist/routes/memories/schemas/SchemaDetailPage.d.ts +15 -0
- package/dist/routes/memories/schemas/SchemaDetailPage.d.ts.map +1 -0
- package/dist/routes/memories/schemas/SchemaDetailPage.js +74 -0
- package/dist/routes/memories/schemas/SchemaDetailPage.js.map +1 -0
- package/dist/routes/memories/schemas/SchemaEditorForm.d.ts +10 -0
- package/dist/routes/memories/schemas/SchemaEditorForm.d.ts.map +1 -0
- package/dist/routes/memories/schemas/SchemaEditorForm.js +242 -0
- package/dist/routes/memories/schemas/SchemaEditorForm.js.map +1 -0
- package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts +13 -0
- package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts.map +1 -0
- package/dist/routes/memories/schemas/SchemaTemplatesDialog.js +13 -0
- package/dist/routes/memories/schemas/SchemaTemplatesDialog.js.map +1 -0
- package/dist/routes/memories/schemas/ValueTypeSelect.d.ts +12 -0
- package/dist/routes/memories/schemas/ValueTypeSelect.d.ts.map +1 -0
- package/dist/routes/memories/schemas/ValueTypeSelect.js +10 -0
- package/dist/routes/memories/schemas/ValueTypeSelect.js.map +1 -0
- package/dist/routes/memories/schemas/schema-form.d.ts +72 -0
- package/dist/routes/memories/schemas/schema-form.d.ts.map +1 -0
- package/dist/routes/memories/schemas/schema-form.js +279 -0
- package/dist/routes/memories/schemas/schema-form.js.map +1 -0
- package/dist/routes/memories/schemas/schema-impact.d.ts +13 -0
- package/dist/routes/memories/schemas/schema-impact.d.ts.map +1 -0
- package/dist/routes/memories/schemas/schema-impact.js +40 -0
- package/dist/routes/memories/schemas/schema-impact.js.map +1 -0
- package/dist/routes/memories/schemas/schema-route.d.ts +18 -0
- package/dist/routes/memories/schemas/schema-route.d.ts.map +1 -0
- package/dist/routes/memories/schemas/schema-route.js +21 -0
- package/dist/routes/memories/schemas/schema-route.js.map +1 -0
- package/dist/routes/memories/schemas/schema-rule-context.d.ts +17 -0
- package/dist/routes/memories/schemas/schema-rule-context.d.ts.map +1 -0
- package/dist/routes/memories/schemas/schema-rule-context.js +83 -0
- package/dist/routes/memories/schemas/schema-rule-context.js.map +1 -0
- package/dist/routes/memories/schemas/schema-table.d.ts +11 -0
- package/dist/routes/memories/schemas/schema-table.d.ts.map +1 -0
- package/dist/routes/memories/schemas/schema-table.js +34 -0
- package/dist/routes/memories/schemas/schema-table.js.map +1 -0
- package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts +32 -0
- package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts.map +1 -0
- package/dist/routes/memories/schemas/useMemorySchemaMutations.js +31 -0
- package/dist/routes/memories/schemas/useMemorySchemaMutations.js.map +1 -0
- package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts +51 -0
- package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts.map +1 -0
- package/dist/routes/memories/schemas/useSchemaChangeReview.js +175 -0
- package/dist/routes/memories/schemas/useSchemaChangeReview.js.map +1 -0
- package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts +46 -0
- package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts.map +1 -0
- package/dist/routes/memories/schemas/useSchemaLifecycle.js +93 -0
- package/dist/routes/memories/schemas/useSchemaLifecycle.js.map +1 -0
- package/dist/routes/memories/schemas/useSchemasTab.d.ts +18 -0
- package/dist/routes/memories/schemas/useSchemasTab.d.ts.map +1 -0
- package/dist/routes/memories/schemas/useSchemasTab.js +92 -0
- package/dist/routes/memories/schemas/useSchemasTab.js.map +1 -0
- package/dist/routes/plans/index.d.ts.map +1 -1
- package/dist/routes/plans/index.js +2 -2
- package/dist/routes/plans/index.js.map +1 -1
- package/dist/routes/rules/components/CreateRuleChatModal.d.ts +7 -1
- package/dist/routes/rules/components/CreateRuleChatModal.d.ts.map +1 -1
- package/dist/routes/rules/components/CreateRuleChatModal.js +9 -4
- package/dist/routes/rules/components/CreateRuleChatModal.js.map +1 -1
- package/dist/routes/rules/components/RuleValueControls.d.ts.map +1 -1
- package/dist/routes/rules/components/RuleValueControls.js +3 -24
- package/dist/routes/rules/components/RuleValueControls.js.map +1 -1
- package/dist/routes/rules/components/rule-value-input.d.ts +11 -0
- package/dist/routes/rules/components/rule-value-input.d.ts.map +1 -0
- package/dist/routes/rules/components/rule-value-input.js +24 -0
- package/dist/routes/rules/components/rule-value-input.js.map +1 -0
- package/dist/routes/rules/components/rules.utils.d.ts +5 -0
- package/dist/routes/rules/components/rules.utils.d.ts.map +1 -1
- package/dist/routes/rules/components/rules.utils.js +18 -3
- package/dist/routes/rules/components/rules.utils.js.map +1 -1
- package/dist/routes/rules/pages.d.ts +1 -1
- package/dist/routes/rules/pages.d.ts.map +1 -1
- package/dist/routes/rules/pages.js +1 -1
- package/dist/routes/rules/pages.js.map +1 -1
- package/dist/shared/graph-derived-queries.d.ts.map +1 -1
- package/dist/shared/graph-derived-queries.js +4 -1
- package/dist/shared/graph-derived-queries.js.map +1 -1
- package/dist/worker/index.d.ts +22 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +110 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/policy.d.ts +21 -0
- package/dist/worker/policy.d.ts.map +1 -0
- package/dist/worker/policy.js +42 -0
- package/dist/worker/policy.js.map +1 -0
- package/dist/worker/proxy.d.ts +14 -0
- package/dist/worker/proxy.d.ts.map +1 -0
- package/dist/worker/proxy.js +58 -0
- package/dist/worker/proxy.js.map +1 -0
- package/dist/worker/session.d.ts +24 -0
- package/dist/worker/session.d.ts.map +1 -0
- package/dist/worker/session.js +72 -0
- package/dist/worker/session.js.map +1 -0
- package/package.json +52 -7
- package/src/app-subpaths.json +9 -1
- package/src/components/AppErrorBoundary.tsx +14 -11
- package/src/components/app-gate/AppGate.tsx +122 -0
- package/src/components/app-gate/AwaitingDatastoreStatus.tsx +35 -0
- package/src/components/app-gate/EnterDatastoreRoute.tsx +30 -0
- package/src/components/app-gate/ErrorRoute.tsx +43 -0
- package/src/components/app-gate/FailureAlert.tsx +15 -0
- package/src/components/app-gate/NoDatastoreAccess.tsx +26 -0
- package/src/components/app-gate/NotFoundRoute.tsx +20 -0
- package/src/components/app-gate/PendingInvitations.tsx +134 -0
- package/src/components/app-gate/ServiceError.tsx +27 -0
- package/src/components/app-gate/index.ts +2 -0
- package/src/components/app-gate/sdk-route-elements.tsx +46 -0
- package/src/components/app-shell/AppShell.tsx +22 -0
- package/src/components/app-shell/AppShellRoutes.tsx +34 -0
- package/src/components/app-shell/GroupDatastores.tsx +28 -0
- package/src/components/app-shell/GroupRoute.tsx +34 -0
- package/src/components/app-shell/index.ts +2 -0
- package/src/components/authenticated-chat/index.tsx +1 -34
- package/src/components/chat-view/Chat.tsx +9 -3
- package/src/components/chat-view/MessageItem.tsx +10 -2
- package/src/components/chat-view/tool-part-rendering.ts +10 -1
- package/src/components/chip/index.tsx +8 -1
- package/src/components/embedded-chat/index.tsx +2 -1
- package/src/components/input/input-date-time.tsx +10 -3
- package/src/components/input/input-date.tsx +93 -21
- package/src/components/input/input-time.tsx +59 -26
- package/src/components/layouts/RouteLayout.tsx +11 -50
- package/src/components/layouts/Sidebar.tsx +21 -23
- package/src/components/plan-limits/PlanLimitsDialog.tsx +331 -0
- package/src/components/plan-limits/index.tsx +3 -0
- package/src/components/plan-limits/plan-limits-client.ts +71 -0
- package/src/components/plan-limits/plan-limits-model.ts +180 -0
- package/src/components/plan-limits/plan-limits-save.ts +68 -0
- package/src/components/planning/PlanLimitsAction.tsx +44 -0
- package/src/components/slider/index.tsx +2 -1
- package/src/datastore-picker/datastore-picker-rows.ts +36 -20
- package/src/hooks/use-action-plans-list.ts +20 -12
- package/src/hooks/use-activity-feed.ts +30 -14
- package/src/hooks/use-entity.ts +11 -6
- package/src/hooks/use-manual-actions.ts +11 -6
- package/src/hooks/use-unsaved-changes-warning.ts +12 -0
- package/src/hooks/useAuth.ts +5 -3
- package/src/hooks/useChatPanelSync.ts +2 -3
- package/src/hooks/useDatastoreSelection.ts +10 -4
- package/src/hooks/useExecuteAction.ts +2 -0
- package/src/hooks/useLoginRedirect.ts +66 -0
- package/src/hooks/usePlanLimits.ts +97 -0
- package/src/ldo-ui.ts +1 -0
- package/src/lib/app-tools.ts +63 -0
- package/src/lib/chat-types.ts +5 -0
- package/src/lib/datastore-route-table.ts +9 -0
- package/src/lib/graphql-error.ts +7 -0
- package/src/lib/update-notice.ts +12 -2
- package/src/providers/ActiveChatProvider.tsx +8 -3
- package/src/providers/ActiveDatastoreProvider.tsx +179 -9
- package/src/providers/AuthContext.ts +1 -0
- package/src/providers/MantaClientProvider.tsx +8 -3
- package/src/providers/index.tsx +7 -4
- package/src/routes/activity/detail/ActivityDetailRoute.tsx +1 -10
- package/src/routes/activity/index.tsx +1 -10
- package/src/routes/chat/index.tsx +11 -47
- package/src/routes/data-collection/index.tsx +1 -11
- package/src/routes/data-explorer/components/DataExplorerLayout.tsx +1 -11
- package/src/routes/data-explorer/components/class-detail/UsedByRules.tsx +2 -2
- package/src/routes/datastores/index.tsx +3 -9
- package/src/routes/explain/index.tsx +1 -11
- package/src/routes/integrations/components/connect-forms/DashConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/GoogleAdsConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/InferalCredentialConnectForm.tsx +5 -3
- package/src/routes/integrations/components/connect-forms/KlaviyoConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/OAuthSetupConnectForm.tsx +7 -7
- package/src/routes/integrations/components/connect-forms/TriplewhaleConnectForm.tsx +0 -1
- package/src/routes/integrations/components/connect-forms/WoocommerceConnectForm.tsx +0 -1
- package/src/routes/integrations/types.ts +22 -6
- package/src/routes/memories/components/DateValueInput.tsx +72 -0
- package/src/routes/memories/components/EntityValuePicker.tsx +132 -0
- package/src/routes/memories/components/FieldLabel.tsx +49 -0
- package/src/routes/memories/components/ImportanceSlider.tsx +5 -1
- package/src/routes/memories/components/MemoriesFilters.tsx +2 -2
- package/src/routes/memories/components/MemoriesPanel.tsx +7 -3
- package/src/routes/memories/components/MemoriesTabPanel.tsx +2 -2
- package/src/routes/memories/components/MemoryActions.tsx +26 -2
- package/src/routes/memories/components/MemoryFields.tsx +75 -12
- package/src/routes/memories/components/MemoryFormDialog.tsx +305 -199
- package/src/routes/memories/components/MemoryPropertyFields.tsx +288 -0
- package/src/routes/memories/components/RuleDraftDialog.tsx +35 -0
- package/src/routes/memories/components/SchemasTab.tsx +481 -118
- package/src/routes/memories/components/badges.tsx +16 -4
- package/src/routes/memories/hooks/useMemoryColumns.tsx +69 -35
- package/src/routes/memories/index.tsx +125 -51
- package/src/routes/memories/memory-mutation-input.ts +5 -2
- package/src/routes/memories/memory-property-values.ts +83 -0
- package/src/routes/memories/schemas/AllowedValuesField.tsx +188 -0
- package/src/routes/memories/schemas/MemorySchemaPage.tsx +476 -0
- package/src/routes/memories/schemas/SchemaChangeReviewDialog.tsx +290 -0
- package/src/routes/memories/schemas/SchemaConfirmDialog.tsx +62 -0
- package/src/routes/memories/schemas/SchemaDetailPage.tsx +373 -0
- package/src/routes/memories/schemas/SchemaEditorForm.tsx +990 -0
- package/src/routes/memories/schemas/SchemaTemplatesDialog.tsx +81 -0
- package/src/routes/memories/schemas/ValueTypeSelect.tsx +37 -0
- package/src/routes/memories/schemas/schema-form.ts +360 -0
- package/src/routes/memories/schemas/schema-impact.ts +66 -0
- package/src/routes/memories/schemas/schema-route.ts +30 -0
- package/src/routes/memories/schemas/schema-rule-context.ts +103 -0
- package/src/routes/memories/schemas/schema-table.ts +54 -0
- package/src/routes/memories/schemas/useMemorySchemaMutations.ts +49 -0
- package/src/routes/memories/schemas/useSchemaChangeReview.ts +238 -0
- package/src/routes/memories/schemas/useSchemaLifecycle.tsx +151 -0
- package/src/routes/memories/schemas/useSchemasTab.ts +119 -0
- package/src/routes/plans/index.tsx +3 -14
- package/src/routes/rules/components/CreateRuleChatModal.tsx +46 -22
- package/src/routes/rules/components/RuleValueControls.tsx +3 -35
- package/src/routes/rules/components/rule-value-input.ts +34 -0
- package/src/routes/rules/components/rules.utils.ts +25 -3
- package/src/routes/rules/pages.ts +5 -1
- package/src/shared/graph-derived-queries.ts +6 -0
- package/src/themes/manta-dark.css +4 -0
- package/src/worker/index.ts +175 -0
- package/src/worker/policy.ts +62 -0
- package/src/worker/proxy.ts +101 -0
- package/src/worker/session.ts +111 -0
|
@@ -0,0 +1,990 @@
|
|
|
1
|
+
import { GQLMemorySchemaValueType } from "@manta-eu/client";
|
|
2
|
+
import { isPresent } from "@manta-eu/lib/present";
|
|
3
|
+
import { ArrowDown, ArrowUp, Check, Ellipsis, GripVertical, Pencil, Plus, Trash2 } from "lucide-react";
|
|
4
|
+
import { useEffect, useRef, useState, type ReactNode } from "react";
|
|
5
|
+
import { DateValueInput } from "../components/DateValueInput";
|
|
6
|
+
import { FieldLabel } from "../components/FieldLabel";
|
|
7
|
+
import { importanceLabel, importanceSteps } from "../components/ImportanceSlider";
|
|
8
|
+
import { AllowedValuesField, escapeClearsTypedValue } from "./AllowedValuesField";
|
|
9
|
+
import {
|
|
10
|
+
emptyPropertyForm,
|
|
11
|
+
hasErrorsUnder,
|
|
12
|
+
kindLabels,
|
|
13
|
+
loadPatternCheck,
|
|
14
|
+
memorySchemaPropertyLimit,
|
|
15
|
+
moveItem,
|
|
16
|
+
propertyErrorPrefix,
|
|
17
|
+
propertyFormErrors,
|
|
18
|
+
propertySettings,
|
|
19
|
+
propertyTags,
|
|
20
|
+
withValueType,
|
|
21
|
+
scopeLabels,
|
|
22
|
+
volatilityLabels,
|
|
23
|
+
type SchemaForm,
|
|
24
|
+
type SchemaFormErrors,
|
|
25
|
+
type SchemaPropertyForm,
|
|
26
|
+
valueTypeLabels,
|
|
27
|
+
} from "./schema-form";
|
|
28
|
+
import { ValueTypeSelect } from "./ValueTypeSelect";
|
|
29
|
+
import { Banner } from "#components/banner/index";
|
|
30
|
+
import { Button } from "#components/button/index";
|
|
31
|
+
import { Dropdown, DropdownContent, DropdownItem, DropdownTrigger } from "#components/dropdown/index";
|
|
32
|
+
import { Input, Textarea } from "#components/input/index";
|
|
33
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "#components/select/index";
|
|
34
|
+
import {
|
|
35
|
+
Sheet,
|
|
36
|
+
SheetBody,
|
|
37
|
+
SheetContent,
|
|
38
|
+
SheetDescription,
|
|
39
|
+
SheetFooter,
|
|
40
|
+
SheetHeader,
|
|
41
|
+
SheetTitle,
|
|
42
|
+
} from "#components/sheet/index";
|
|
43
|
+
import { Switch } from "#components/switch/index";
|
|
44
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "#components/tooltip/index";
|
|
45
|
+
import { cn } from "#lib/utils";
|
|
46
|
+
|
|
47
|
+
const unsetValue = "unset";
|
|
48
|
+
|
|
49
|
+
type ChoiceSelectProps<T extends string> = {
|
|
50
|
+
id: string;
|
|
51
|
+
label: string;
|
|
52
|
+
hint?: string;
|
|
53
|
+
value: T | null;
|
|
54
|
+
choices: readonly { value: T; label: string }[];
|
|
55
|
+
onChange: (value: T | null) => void;
|
|
56
|
+
error?: string;
|
|
57
|
+
disabled?: boolean;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function ChoiceSelect<T extends string>(props: ChoiceSelectProps<T>) {
|
|
61
|
+
const { id, label, hint, value, choices, onChange, error, disabled } = props;
|
|
62
|
+
return (
|
|
63
|
+
<div className="flex flex-col gap-1.5">
|
|
64
|
+
{hint ? (
|
|
65
|
+
<FieldLabel label={label} hint={hint} htmlFor={id} />
|
|
66
|
+
) : (
|
|
67
|
+
<label htmlFor={id} className="typography-small">
|
|
68
|
+
{label}
|
|
69
|
+
</label>
|
|
70
|
+
)}
|
|
71
|
+
<Select
|
|
72
|
+
value={value ?? unsetValue}
|
|
73
|
+
disabled={disabled}
|
|
74
|
+
onValueChange={(next) =>
|
|
75
|
+
onChange(next === unsetValue ? null : (choices.find((c) => c.value === next)?.value ?? null))
|
|
76
|
+
}
|
|
77
|
+
>
|
|
78
|
+
<SelectTrigger label={label} id={id} hiddenLabel error={error}>
|
|
79
|
+
<SelectValue />
|
|
80
|
+
</SelectTrigger>
|
|
81
|
+
<SelectContent>
|
|
82
|
+
<SelectItem value={unsetValue}>Not set</SelectItem>
|
|
83
|
+
{choices.map((choice) => (
|
|
84
|
+
<SelectItem key={choice.value} value={choice.value}>
|
|
85
|
+
{choice.label}
|
|
86
|
+
</SelectItem>
|
|
87
|
+
))}
|
|
88
|
+
</SelectContent>
|
|
89
|
+
</Select>
|
|
90
|
+
{error && <p className="typography-small text-error-foreground">{error}</p>}
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function choicesOf<T extends string>(labels: Record<T, string>) {
|
|
96
|
+
return (Object.entries(labels) as [T, string][]).map(([value, label]) => ({ value, label }));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const kindChoices = choicesOf(kindLabels);
|
|
100
|
+
const volatilityChoices = choicesOf(volatilityLabels);
|
|
101
|
+
const scopeChoices = choicesOf(scopeLabels);
|
|
102
|
+
|
|
103
|
+
const importanceChoices = importanceSteps.map((step) => ({ value: String(step), label: importanceLabel(step) }));
|
|
104
|
+
|
|
105
|
+
type ActionTooltipProps = { label: string; children: ReactNode };
|
|
106
|
+
|
|
107
|
+
function ActionTooltip(props: ActionTooltipProps) {
|
|
108
|
+
const { label, children } = props;
|
|
109
|
+
return (
|
|
110
|
+
<TooltipProvider delayDuration={300}>
|
|
111
|
+
<Tooltip>
|
|
112
|
+
<TooltipTrigger asChild>{children}</TooltipTrigger>
|
|
113
|
+
<TooltipContent side="top" className="max-w-xs text-left typography-small">
|
|
114
|
+
{label}
|
|
115
|
+
</TooltipContent>
|
|
116
|
+
</Tooltip>
|
|
117
|
+
</TooltipProvider>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const propertyHints = {
|
|
122
|
+
label: "The name people and the agent see for this property.",
|
|
123
|
+
type: "What kind of value this property holds. It decides which constraints you can set. A linked record points to something already in your data, such as a campaign or an ad account, so rules can follow the link.",
|
|
124
|
+
key: "Names the property in the knowledge graph. It cannot change once saved.",
|
|
125
|
+
description: "Explains what to record here, for the people and the agent filling it in.",
|
|
126
|
+
required: "A memory of this schema cannot be saved without a value here.",
|
|
127
|
+
multiValued: "One memory can hold several values, such as several channels.",
|
|
128
|
+
keyProperty:
|
|
129
|
+
"A new memory replaces an old one when both have the same value here. Use it for what the memory is about, like a target's metric.",
|
|
130
|
+
computed: "A Datalog rule fills this in. Nobody writes it by hand, and chat extraction never sets it.",
|
|
131
|
+
options:
|
|
132
|
+
"Leave empty to accept any text. Add values to accept only those. Click a value to set how it is shown and what it means.",
|
|
133
|
+
minValue: "The smallest value accepted, inclusive.",
|
|
134
|
+
maxValue: "The largest value accepted, inclusive.",
|
|
135
|
+
unit: "Shown next to the value, such as EUR. It does not convert anything.",
|
|
136
|
+
maxLength: "The most characters a value can have.",
|
|
137
|
+
pattern: "A regular expression every value must match, such as ^[A-Z]{3}$.",
|
|
138
|
+
entityClass:
|
|
139
|
+
"The class IRI of the records that can be linked, such as a campaign class. Leave it empty to allow any record.",
|
|
140
|
+
defaultValue: "Used when a memory gives no value for this property.",
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const shownPropertyFields = [
|
|
144
|
+
"label",
|
|
145
|
+
"key",
|
|
146
|
+
"description",
|
|
147
|
+
"valueType",
|
|
148
|
+
"entityClass",
|
|
149
|
+
"required",
|
|
150
|
+
"keyProperty",
|
|
151
|
+
"minValue",
|
|
152
|
+
"maxValue",
|
|
153
|
+
"maxLength",
|
|
154
|
+
"pattern",
|
|
155
|
+
"defaultValue",
|
|
156
|
+
"unit",
|
|
157
|
+
"options",
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
function otherPropertyErrors(errors: SchemaFormErrors, prefix: string): string[] {
|
|
161
|
+
return [...errors.entries()]
|
|
162
|
+
.filter(([field]) => field.startsWith(`${prefix}.`))
|
|
163
|
+
.filter(([field]) => {
|
|
164
|
+
const rest = field.slice(prefix.length + 1);
|
|
165
|
+
return !shownPropertyFields.some((shown) => rest === shown || rest.startsWith("options."));
|
|
166
|
+
})
|
|
167
|
+
.map(([, message]) => message);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const dateTypes: readonly GQLMemorySchemaValueType[] = [
|
|
171
|
+
GQLMemorySchemaValueType.Date,
|
|
172
|
+
GQLMemorySchemaValueType.DateTime,
|
|
173
|
+
];
|
|
174
|
+
|
|
175
|
+
type ValueFieldProps = {
|
|
176
|
+
id: string;
|
|
177
|
+
label: string;
|
|
178
|
+
hint: string;
|
|
179
|
+
valueType: GQLMemorySchemaValueType;
|
|
180
|
+
value: string;
|
|
181
|
+
placeholder?: string;
|
|
182
|
+
error?: string;
|
|
183
|
+
disabled?: boolean;
|
|
184
|
+
onChange: (value: string) => void;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
function BoundOrDefaultField(props: ValueFieldProps) {
|
|
188
|
+
const { id, label, hint, valueType, value, placeholder, error, disabled, onChange } = props;
|
|
189
|
+
if (dateTypes.includes(valueType)) {
|
|
190
|
+
return (
|
|
191
|
+
<div className={cn("flex flex-col gap-1.5", valueType === GQLMemorySchemaValueType.DateTime && "sm:col-span-2")}>
|
|
192
|
+
<FieldLabel label={label} hint={hint} htmlFor={id} />
|
|
193
|
+
<DateValueInput
|
|
194
|
+
id={id}
|
|
195
|
+
label={label}
|
|
196
|
+
withTime={valueType === GQLMemorySchemaValueType.DateTime}
|
|
197
|
+
placeholder="Not set"
|
|
198
|
+
value={value}
|
|
199
|
+
error={error}
|
|
200
|
+
disabled={disabled}
|
|
201
|
+
onChange={onChange}
|
|
202
|
+
/>
|
|
203
|
+
</div>
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
const isNumber = valueType === GQLMemorySchemaValueType.Integer || valueType === GQLMemorySchemaValueType.Decimal;
|
|
207
|
+
return (
|
|
208
|
+
<Input
|
|
209
|
+
id={id}
|
|
210
|
+
label={label}
|
|
211
|
+
description={hint}
|
|
212
|
+
descriptionInLabelTooltip
|
|
213
|
+
type={isNumber ? "number" : "text"}
|
|
214
|
+
step={valueType === GQLMemorySchemaValueType.Decimal ? "any" : undefined}
|
|
215
|
+
placeholder={placeholder}
|
|
216
|
+
value={value}
|
|
217
|
+
disabled={disabled}
|
|
218
|
+
error={error}
|
|
219
|
+
onChange={(e) => onChange(e.target.value)}
|
|
220
|
+
/>
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function defaultValueChoices(property: SchemaPropertyForm): { value: string; label: string }[] | null {
|
|
225
|
+
const choices =
|
|
226
|
+
property.valueType === GQLMemorySchemaValueType.Boolean
|
|
227
|
+
? [
|
|
228
|
+
{ value: "true", label: "Yes" },
|
|
229
|
+
{ value: "false", label: "No" },
|
|
230
|
+
]
|
|
231
|
+
: propertySettings(property.valueType).options && isPresent(property.options)
|
|
232
|
+
? property.options
|
|
233
|
+
.map((option) => ({ value: option.value.trim(), label: option.label.trim() || option.value.trim() }))
|
|
234
|
+
.filter(
|
|
235
|
+
(choice, index, all) =>
|
|
236
|
+
isPresent(choice.value) && all.findIndex((c) => c.value === choice.value) === index,
|
|
237
|
+
)
|
|
238
|
+
: null;
|
|
239
|
+
if (choices === null) return null;
|
|
240
|
+
const current = property.defaultValue.trim();
|
|
241
|
+
return isPresent(current) && !choices.some((choice) => choice.value === current)
|
|
242
|
+
? [...choices, { value: current, label: `${current} (not allowed)` }]
|
|
243
|
+
: choices;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
type RuleChipProps = {
|
|
247
|
+
label: string;
|
|
248
|
+
hint: string;
|
|
249
|
+
pressed: boolean;
|
|
250
|
+
unavailable?: string | null;
|
|
251
|
+
disabled?: boolean;
|
|
252
|
+
onToggle: () => void;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
function RuleChip(props: RuleChipProps) {
|
|
256
|
+
const { label, hint, pressed, unavailable, disabled, onToggle } = props;
|
|
257
|
+
const blocked = isPresent(unavailable) || disabled === true;
|
|
258
|
+
return (
|
|
259
|
+
<ActionTooltip label={isPresent(unavailable) ? `${hint} ${unavailable}` : hint}>
|
|
260
|
+
<button
|
|
261
|
+
type="button"
|
|
262
|
+
aria-pressed={pressed}
|
|
263
|
+
aria-disabled={blocked ? true : undefined}
|
|
264
|
+
onClick={() => {
|
|
265
|
+
if (!blocked) onToggle();
|
|
266
|
+
}}
|
|
267
|
+
className={cn(
|
|
268
|
+
"inline-flex h-8 items-center gap-1.5 rounded-full px-3.5 typography-small transition-colors",
|
|
269
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-active-border/50",
|
|
270
|
+
pressed
|
|
271
|
+
? "bg-primary text-primary-foreground"
|
|
272
|
+
: "border border-input-border text-default-foreground hover:bg-faint",
|
|
273
|
+
blocked && !pressed && "cursor-not-allowed border-dashed text-muted-foreground hover:bg-transparent",
|
|
274
|
+
blocked && pressed && "cursor-not-allowed opacity-60",
|
|
275
|
+
)}
|
|
276
|
+
>
|
|
277
|
+
{pressed && <Check className="size-3.5" aria-hidden />}
|
|
278
|
+
{label}
|
|
279
|
+
</button>
|
|
280
|
+
</ActionTooltip>
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
type PropertyFieldsProps = {
|
|
285
|
+
property: SchemaPropertyForm;
|
|
286
|
+
prefix: string;
|
|
287
|
+
errors: SchemaFormErrors;
|
|
288
|
+
disabled?: boolean;
|
|
289
|
+
onChange: (property: SchemaPropertyForm) => void;
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
function PropertyFields(props: PropertyFieldsProps) {
|
|
293
|
+
const { property, prefix, errors, disabled, onChange } = props;
|
|
294
|
+
const settings = propertySettings(property.valueType);
|
|
295
|
+
function set(patch: Partial<SchemaPropertyForm>) {
|
|
296
|
+
onChange({ ...property, ...patch });
|
|
297
|
+
}
|
|
298
|
+
function fieldId(name: string) {
|
|
299
|
+
return `schema-property-${property.id}-${name}`;
|
|
300
|
+
}
|
|
301
|
+
const extraErrors = otherPropertyErrors(errors, prefix);
|
|
302
|
+
const defaultChoices = defaultValueChoices(property);
|
|
303
|
+
const ruleErrors = [errors.get(`${prefix}.required`), errors.get(`${prefix}.keyProperty`)].filter(isPresent);
|
|
304
|
+
const keyUnavailable = !settings.keyProperty
|
|
305
|
+
? "Long text cannot identify a memory."
|
|
306
|
+
: property.multiValued
|
|
307
|
+
? "A list of values cannot identify a memory."
|
|
308
|
+
: property.computed
|
|
309
|
+
? "A computed property cannot identify a memory."
|
|
310
|
+
: null;
|
|
311
|
+
|
|
312
|
+
return (
|
|
313
|
+
<div className="flex flex-col gap-5">
|
|
314
|
+
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
315
|
+
<Input
|
|
316
|
+
id={fieldId("label")}
|
|
317
|
+
label="Label"
|
|
318
|
+
description={propertyHints.label}
|
|
319
|
+
descriptionInLabelTooltip
|
|
320
|
+
placeholder="e.g. Channel"
|
|
321
|
+
value={property.label}
|
|
322
|
+
disabled={disabled}
|
|
323
|
+
error={errors.get(`${prefix}.label`)}
|
|
324
|
+
onChange={(e) => set({ label: e.target.value })}
|
|
325
|
+
/>
|
|
326
|
+
<div className="flex flex-col gap-1.5">
|
|
327
|
+
<FieldLabel label="Type" hint={propertyHints.type} htmlFor={fieldId("type")} />
|
|
328
|
+
<ValueTypeSelect
|
|
329
|
+
id={fieldId("type")}
|
|
330
|
+
label="Type"
|
|
331
|
+
value={property.valueType}
|
|
332
|
+
disabled={disabled}
|
|
333
|
+
error={errors.get(`${prefix}.valueType`)}
|
|
334
|
+
onChange={(valueType) => onChange(withValueType(property, valueType))}
|
|
335
|
+
/>
|
|
336
|
+
</div>
|
|
337
|
+
{settings.unit && (
|
|
338
|
+
<Input
|
|
339
|
+
id={fieldId("unit")}
|
|
340
|
+
label="Unit"
|
|
341
|
+
description={propertyHints.unit}
|
|
342
|
+
descriptionInLabelTooltip
|
|
343
|
+
placeholder="e.g. EUR"
|
|
344
|
+
value={property.unit}
|
|
345
|
+
disabled={disabled}
|
|
346
|
+
error={errors.get(`${prefix}.unit`)}
|
|
347
|
+
onChange={(e) => set({ unit: e.target.value })}
|
|
348
|
+
/>
|
|
349
|
+
)}
|
|
350
|
+
{settings.entityClass && (
|
|
351
|
+
<Input
|
|
352
|
+
id={fieldId("entity-class")}
|
|
353
|
+
label="Record type"
|
|
354
|
+
description={propertyHints.entityClass}
|
|
355
|
+
descriptionInLabelTooltip
|
|
356
|
+
placeholder="Any record"
|
|
357
|
+
containerClassName="sm:col-span-2"
|
|
358
|
+
value={property.entityClass}
|
|
359
|
+
disabled={disabled}
|
|
360
|
+
error={errors.get(`${prefix}.entityClass`)}
|
|
361
|
+
onChange={(e) => set({ entityClass: e.target.value })}
|
|
362
|
+
/>
|
|
363
|
+
)}
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
{property.path === null && (
|
|
367
|
+
<Input
|
|
368
|
+
id={fieldId("key")}
|
|
369
|
+
label="Key"
|
|
370
|
+
placeholder="Generated from the label"
|
|
371
|
+
description={propertyHints.key}
|
|
372
|
+
descriptionInLabelTooltip
|
|
373
|
+
value={property.key}
|
|
374
|
+
disabled={disabled}
|
|
375
|
+
error={errors.get(`${prefix}.key`)}
|
|
376
|
+
onChange={(e) => set({ key: e.target.value })}
|
|
377
|
+
/>
|
|
378
|
+
)}
|
|
379
|
+
|
|
380
|
+
<Textarea
|
|
381
|
+
id={fieldId("description")}
|
|
382
|
+
label="Description"
|
|
383
|
+
description={propertyHints.description}
|
|
384
|
+
descriptionInLabelTooltip
|
|
385
|
+
placeholder="What this property records (optional)"
|
|
386
|
+
value={property.description}
|
|
387
|
+
minRows={2}
|
|
388
|
+
maxRows={5}
|
|
389
|
+
disabled={disabled}
|
|
390
|
+
error={errors.get(`${prefix}.description`)}
|
|
391
|
+
onChange={(e) => set({ description: e.target.value })}
|
|
392
|
+
/>
|
|
393
|
+
|
|
394
|
+
<div className="flex flex-col gap-2">
|
|
395
|
+
<span id={fieldId("rules")} className="typography-small">
|
|
396
|
+
Rules
|
|
397
|
+
</span>
|
|
398
|
+
<div role="group" aria-labelledby={fieldId("rules")} className="flex flex-wrap gap-2">
|
|
399
|
+
<RuleChip
|
|
400
|
+
label="Required"
|
|
401
|
+
hint={propertyHints.required}
|
|
402
|
+
pressed={property.required && !property.computed}
|
|
403
|
+
unavailable={property.computed ? "A computed property is never required." : null}
|
|
404
|
+
disabled={disabled}
|
|
405
|
+
onToggle={() => set({ required: !property.required })}
|
|
406
|
+
/>
|
|
407
|
+
<RuleChip
|
|
408
|
+
label="List of values"
|
|
409
|
+
hint={propertyHints.multiValued}
|
|
410
|
+
pressed={property.multiValued}
|
|
411
|
+
disabled={disabled}
|
|
412
|
+
onToggle={() => set({ multiValued: !property.multiValued })}
|
|
413
|
+
/>
|
|
414
|
+
<RuleChip
|
|
415
|
+
label="Identifies the memory"
|
|
416
|
+
hint={propertyHints.keyProperty}
|
|
417
|
+
pressed={property.keyProperty && keyUnavailable === null}
|
|
418
|
+
unavailable={keyUnavailable}
|
|
419
|
+
disabled={disabled}
|
|
420
|
+
onToggle={() => set({ keyProperty: !property.keyProperty })}
|
|
421
|
+
/>
|
|
422
|
+
<RuleChip
|
|
423
|
+
label="Computed by a rule"
|
|
424
|
+
hint={propertyHints.computed}
|
|
425
|
+
pressed={property.computed}
|
|
426
|
+
disabled={disabled}
|
|
427
|
+
onToggle={() => set({ computed: !property.computed })}
|
|
428
|
+
/>
|
|
429
|
+
</div>
|
|
430
|
+
{ruleErrors.map((message) => (
|
|
431
|
+
<p key={message} className="typography-small text-error-foreground">
|
|
432
|
+
{message}
|
|
433
|
+
</p>
|
|
434
|
+
))}
|
|
435
|
+
</div>
|
|
436
|
+
|
|
437
|
+
{settings.options && (
|
|
438
|
+
<AllowedValuesField
|
|
439
|
+
id={fieldId("options")}
|
|
440
|
+
hint={propertyHints.options}
|
|
441
|
+
options={property.options}
|
|
442
|
+
prefix={prefix}
|
|
443
|
+
errors={errors}
|
|
444
|
+
disabled={disabled}
|
|
445
|
+
onChange={(options) => set({ options })}
|
|
446
|
+
/>
|
|
447
|
+
)}
|
|
448
|
+
|
|
449
|
+
{(settings.bounds || settings.maxLength || settings.pattern) && (
|
|
450
|
+
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
451
|
+
{settings.bounds && (
|
|
452
|
+
<>
|
|
453
|
+
<BoundOrDefaultField
|
|
454
|
+
id={fieldId("min")}
|
|
455
|
+
label="Minimum"
|
|
456
|
+
hint={propertyHints.minValue}
|
|
457
|
+
valueType={property.valueType}
|
|
458
|
+
placeholder="No minimum"
|
|
459
|
+
value={property.minValue}
|
|
460
|
+
disabled={disabled}
|
|
461
|
+
error={errors.get(`${prefix}.minValue`)}
|
|
462
|
+
onChange={(minValue) => set({ minValue })}
|
|
463
|
+
/>
|
|
464
|
+
<BoundOrDefaultField
|
|
465
|
+
id={fieldId("max")}
|
|
466
|
+
label="Maximum"
|
|
467
|
+
hint={propertyHints.maxValue}
|
|
468
|
+
valueType={property.valueType}
|
|
469
|
+
placeholder="No maximum"
|
|
470
|
+
value={property.maxValue}
|
|
471
|
+
disabled={disabled}
|
|
472
|
+
error={errors.get(`${prefix}.maxValue`)}
|
|
473
|
+
onChange={(maxValue) => set({ maxValue })}
|
|
474
|
+
/>
|
|
475
|
+
</>
|
|
476
|
+
)}
|
|
477
|
+
{settings.maxLength && (
|
|
478
|
+
<Input
|
|
479
|
+
id={fieldId("max-length")}
|
|
480
|
+
label="Maximum length"
|
|
481
|
+
description={propertyHints.maxLength}
|
|
482
|
+
descriptionInLabelTooltip
|
|
483
|
+
inputMode="numeric"
|
|
484
|
+
placeholder="No limit"
|
|
485
|
+
value={property.maxLength}
|
|
486
|
+
disabled={disabled}
|
|
487
|
+
error={errors.get(`${prefix}.maxLength`)}
|
|
488
|
+
onChange={(e) => set({ maxLength: e.target.value })}
|
|
489
|
+
/>
|
|
490
|
+
)}
|
|
491
|
+
{settings.pattern && (
|
|
492
|
+
<Input
|
|
493
|
+
id={fieldId("pattern")}
|
|
494
|
+
label="Pattern"
|
|
495
|
+
description={propertyHints.pattern}
|
|
496
|
+
descriptionInLabelTooltip
|
|
497
|
+
placeholder="Any"
|
|
498
|
+
value={property.pattern}
|
|
499
|
+
disabled={disabled}
|
|
500
|
+
error={errors.get(`${prefix}.pattern`)}
|
|
501
|
+
onChange={(e) => set({ pattern: e.target.value })}
|
|
502
|
+
/>
|
|
503
|
+
)}
|
|
504
|
+
</div>
|
|
505
|
+
)}
|
|
506
|
+
|
|
507
|
+
{!property.computed && defaultChoices !== null && (
|
|
508
|
+
<ChoiceSelect
|
|
509
|
+
id={fieldId("default")}
|
|
510
|
+
label="Default value"
|
|
511
|
+
hint={propertyHints.defaultValue}
|
|
512
|
+
value={isPresent(property.defaultValue.trim()) ? property.defaultValue.trim() : null}
|
|
513
|
+
choices={defaultChoices}
|
|
514
|
+
disabled={disabled}
|
|
515
|
+
error={errors.get(`${prefix}.defaultValue`)}
|
|
516
|
+
onChange={(defaultValue) => set({ defaultValue: defaultValue ?? "" })}
|
|
517
|
+
/>
|
|
518
|
+
)}
|
|
519
|
+
|
|
520
|
+
{!property.computed && defaultChoices === null && (
|
|
521
|
+
<BoundOrDefaultField
|
|
522
|
+
id={fieldId("default")}
|
|
523
|
+
label="Default value"
|
|
524
|
+
hint={propertyHints.defaultValue}
|
|
525
|
+
valueType={property.valueType}
|
|
526
|
+
placeholder="None"
|
|
527
|
+
value={property.defaultValue}
|
|
528
|
+
disabled={disabled}
|
|
529
|
+
error={errors.get(`${prefix}.defaultValue`)}
|
|
530
|
+
onChange={(defaultValue) => set({ defaultValue })}
|
|
531
|
+
/>
|
|
532
|
+
)}
|
|
533
|
+
|
|
534
|
+
{extraErrors.map((message) => (
|
|
535
|
+
<p key={message} className="typography-small text-error-foreground">
|
|
536
|
+
{message}
|
|
537
|
+
</p>
|
|
538
|
+
))}
|
|
539
|
+
</div>
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// A drag only ever moves a property row, so text dragged into an input still lands there.
|
|
544
|
+
type PropertyDrag = {
|
|
545
|
+
active: boolean;
|
|
546
|
+
isDragging: boolean;
|
|
547
|
+
isDropTarget: boolean;
|
|
548
|
+
onStart: () => void;
|
|
549
|
+
onOver: () => void;
|
|
550
|
+
onDrop: () => void;
|
|
551
|
+
onEnd: () => void;
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
type PropertyRowProps = {
|
|
555
|
+
property: SchemaPropertyForm;
|
|
556
|
+
index: number;
|
|
557
|
+
count: number;
|
|
558
|
+
hasErrors: boolean;
|
|
559
|
+
disabled?: boolean;
|
|
560
|
+
onEdit: () => void;
|
|
561
|
+
onRemove: () => void;
|
|
562
|
+
onMove: (to: number) => void;
|
|
563
|
+
drag: PropertyDrag;
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
function PropertyRow(props: PropertyRowProps) {
|
|
567
|
+
const { property, index, count, hasErrors, disabled, onEdit, onRemove, onMove, drag } = props;
|
|
568
|
+
const rowRef = useRef<HTMLDivElement>(null);
|
|
569
|
+
const name = property.label || `Property ${index + 1}`;
|
|
570
|
+
|
|
571
|
+
return (
|
|
572
|
+
<div
|
|
573
|
+
ref={rowRef}
|
|
574
|
+
role="group"
|
|
575
|
+
aria-label={name}
|
|
576
|
+
className={cn(
|
|
577
|
+
"relative flex items-center gap-3 border-b border-muted-border px-3 py-2.5 transition-colors last:border-0",
|
|
578
|
+
!disabled && "hover:bg-faint",
|
|
579
|
+
hasErrors && "bg-error/40",
|
|
580
|
+
drag.isDragging && "opacity-50",
|
|
581
|
+
drag.isDropTarget && "ring-2 ring-inset ring-active-border/50",
|
|
582
|
+
)}
|
|
583
|
+
onDragOver={(event) => {
|
|
584
|
+
if (!drag.active) return;
|
|
585
|
+
event.preventDefault();
|
|
586
|
+
drag.onOver();
|
|
587
|
+
}}
|
|
588
|
+
onDrop={(event) => {
|
|
589
|
+
if (!drag.active) return;
|
|
590
|
+
event.preventDefault();
|
|
591
|
+
drag.onDrop();
|
|
592
|
+
}}
|
|
593
|
+
>
|
|
594
|
+
<span
|
|
595
|
+
draggable={!disabled}
|
|
596
|
+
title="Drag to reorder"
|
|
597
|
+
className={cn("relative z-10 text-muted-foreground", disabled ? "cursor-not-allowed" : "cursor-grab")}
|
|
598
|
+
onDragStart={(event) => {
|
|
599
|
+
event.dataTransfer.effectAllowed = "move";
|
|
600
|
+
event.dataTransfer.setData("text/plain", property.id);
|
|
601
|
+
if (rowRef.current) event.dataTransfer.setDragImage(rowRef.current, 16, 16);
|
|
602
|
+
drag.onStart();
|
|
603
|
+
}}
|
|
604
|
+
onDragEnd={drag.onEnd}
|
|
605
|
+
>
|
|
606
|
+
<GripVertical className="size-4" aria-hidden />
|
|
607
|
+
</span>
|
|
608
|
+
<button
|
|
609
|
+
type="button"
|
|
610
|
+
aria-label={`Edit property ${name}`}
|
|
611
|
+
className={cn(
|
|
612
|
+
"flex min-w-0 flex-1 flex-col items-start gap-0.5 text-left focus-visible:outline-none",
|
|
613
|
+
"after:absolute after:inset-0 after:content-[''] focus-visible:after:ring-2 focus-visible:after:ring-inset focus-visible:after:ring-active-border/50",
|
|
614
|
+
!disabled && "cursor-pointer",
|
|
615
|
+
)}
|
|
616
|
+
disabled={disabled}
|
|
617
|
+
onClick={onEdit}
|
|
618
|
+
>
|
|
619
|
+
<span
|
|
620
|
+
className={cn(
|
|
621
|
+
"max-w-full truncate typography-small-medium",
|
|
622
|
+
property.label ? "text-default-foreground" : "text-muted-foreground",
|
|
623
|
+
)}
|
|
624
|
+
>
|
|
625
|
+
{name}
|
|
626
|
+
</span>
|
|
627
|
+
{hasErrors ? (
|
|
628
|
+
<span className="typography-tiny text-error-foreground">Needs attention</span>
|
|
629
|
+
) : (
|
|
630
|
+
property.description && (
|
|
631
|
+
<span className="max-w-full truncate typography-tiny text-muted-foreground">{property.description}</span>
|
|
632
|
+
)
|
|
633
|
+
)}
|
|
634
|
+
</button>
|
|
635
|
+
<span className="hidden shrink-0 typography-small text-muted-foreground sm:inline">
|
|
636
|
+
{valueTypeLabels[property.valueType]}
|
|
637
|
+
</span>
|
|
638
|
+
<div className="hidden shrink-0 flex-wrap justify-end gap-1 md:flex">
|
|
639
|
+
{propertyTags(property).map((tag) => (
|
|
640
|
+
<span key={tag} className="rounded-full bg-muted px-2 py-0.5 typography-tiny text-default-foreground">
|
|
641
|
+
{tag}
|
|
642
|
+
</span>
|
|
643
|
+
))}
|
|
644
|
+
</div>
|
|
645
|
+
<Dropdown>
|
|
646
|
+
<ActionTooltip label="More actions">
|
|
647
|
+
<DropdownTrigger asChild>
|
|
648
|
+
<Button
|
|
649
|
+
type="button"
|
|
650
|
+
variant="tertiary"
|
|
651
|
+
size="sm"
|
|
652
|
+
iconOnly
|
|
653
|
+
icon={Ellipsis}
|
|
654
|
+
aria-label={`More actions for ${name}`}
|
|
655
|
+
disabled={disabled}
|
|
656
|
+
className="relative z-10"
|
|
657
|
+
/>
|
|
658
|
+
</DropdownTrigger>
|
|
659
|
+
</ActionTooltip>
|
|
660
|
+
<DropdownContent align="end">
|
|
661
|
+
<DropdownItem icon={<Pencil className="size-4" />} onSelect={onEdit}>
|
|
662
|
+
Edit
|
|
663
|
+
</DropdownItem>
|
|
664
|
+
<DropdownItem icon={<ArrowUp className="size-4" />} disabled={index === 0} onSelect={() => onMove(index - 1)}>
|
|
665
|
+
Move up
|
|
666
|
+
</DropdownItem>
|
|
667
|
+
<DropdownItem
|
|
668
|
+
icon={<ArrowDown className="size-4" />}
|
|
669
|
+
disabled={index === count - 1}
|
|
670
|
+
onSelect={() => onMove(index + 1)}
|
|
671
|
+
>
|
|
672
|
+
Move down
|
|
673
|
+
</DropdownItem>
|
|
674
|
+
<DropdownItem icon={<Trash2 className="size-4" />} className="text-error-foreground" onSelect={onRemove}>
|
|
675
|
+
Remove
|
|
676
|
+
</DropdownItem>
|
|
677
|
+
</DropdownContent>
|
|
678
|
+
</Dropdown>
|
|
679
|
+
</div>
|
|
680
|
+
);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
type PropertyDraft = { index: number | null; property: SchemaPropertyForm; original: SchemaPropertyForm };
|
|
684
|
+
|
|
685
|
+
type PropertySheetProps = {
|
|
686
|
+
draft: PropertyDraft | null;
|
|
687
|
+
siblings: readonly SchemaPropertyForm[];
|
|
688
|
+
errors: SchemaFormErrors;
|
|
689
|
+
disabled?: boolean;
|
|
690
|
+
onChange: (property: SchemaPropertyForm) => void;
|
|
691
|
+
onDone: () => void;
|
|
692
|
+
onCancel: () => void;
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
function PropertySheet(props: PropertySheetProps) {
|
|
696
|
+
const { draft, siblings, errors, disabled, onChange, onDone, onCancel } = props;
|
|
697
|
+
const isNew = draft?.index === null;
|
|
698
|
+
const [confirmingDiscard, setConfirmingDiscard] = useState(false);
|
|
699
|
+
const [triedDone, setTriedDone] = useState(false);
|
|
700
|
+
const prefix = propertyErrorPrefix(draft?.index ?? -1);
|
|
701
|
+
const draftErrors = draft ? propertyFormErrors(draft.property, prefix, siblings) : new Map<string, string>();
|
|
702
|
+
const shownErrors = triedDone ? draftErrors : errors;
|
|
703
|
+
const isDirty = draft !== null && JSON.stringify(draft.property) !== JSON.stringify(draft.original);
|
|
704
|
+
|
|
705
|
+
function close(next: () => void) {
|
|
706
|
+
setConfirmingDiscard(false);
|
|
707
|
+
setTriedDone(false);
|
|
708
|
+
next();
|
|
709
|
+
}
|
|
710
|
+
function requestDone() {
|
|
711
|
+
if (draftErrors.size > 0) setTriedDone(true);
|
|
712
|
+
else close(onDone);
|
|
713
|
+
}
|
|
714
|
+
function requestCancel() {
|
|
715
|
+
if (isDirty && !disabled) setConfirmingDiscard(true);
|
|
716
|
+
else close(onCancel);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
return (
|
|
720
|
+
<Sheet open={draft !== null} onOpenChange={(open) => !open && requestCancel()}>
|
|
721
|
+
<SheetContent
|
|
722
|
+
side="right"
|
|
723
|
+
className="w-full sm:w-[560px]"
|
|
724
|
+
onEscapeKeyDown={(event) => {
|
|
725
|
+
if (escapeClearsTypedValue(event)) event.preventDefault();
|
|
726
|
+
}}
|
|
727
|
+
onOpenAutoFocus={(event) => {
|
|
728
|
+
if (!draft) return;
|
|
729
|
+
event.preventDefault();
|
|
730
|
+
document.getElementById(`schema-property-${draft.property.id}-label`)?.focus();
|
|
731
|
+
}}
|
|
732
|
+
>
|
|
733
|
+
<SheetHeader>
|
|
734
|
+
<SheetTitle text={isNew ? "Add property" : "Edit property"} />
|
|
735
|
+
<SheetDescription>
|
|
736
|
+
{isNew ? "Describe one field memories of this schema record." : "Changes apply when you save the schema."}
|
|
737
|
+
</SheetDescription>
|
|
738
|
+
</SheetHeader>
|
|
739
|
+
<SheetBody className="-mx-6 px-6">
|
|
740
|
+
{triedDone && draftErrors.size > 0 && (
|
|
741
|
+
<Banner label="Fix the highlighted fields to keep this property." className="mb-4" />
|
|
742
|
+
)}
|
|
743
|
+
{draft && (
|
|
744
|
+
<PropertyFields
|
|
745
|
+
property={draft.property}
|
|
746
|
+
prefix={prefix}
|
|
747
|
+
errors={shownErrors}
|
|
748
|
+
disabled={disabled}
|
|
749
|
+
onChange={onChange}
|
|
750
|
+
/>
|
|
751
|
+
)}
|
|
752
|
+
</SheetBody>
|
|
753
|
+
<SheetFooter>
|
|
754
|
+
{confirmingDiscard ? (
|
|
755
|
+
<>
|
|
756
|
+
<p className="mr-auto typography-small text-muted-foreground">Discard unsaved changes?</p>
|
|
757
|
+
<Button type="button" variant="tertiary" onClick={() => setConfirmingDiscard(false)}>
|
|
758
|
+
Keep editing
|
|
759
|
+
</Button>
|
|
760
|
+
<Button type="button" variant="destructive" onClick={() => close(onCancel)}>
|
|
761
|
+
Discard
|
|
762
|
+
</Button>
|
|
763
|
+
</>
|
|
764
|
+
) : (
|
|
765
|
+
<>
|
|
766
|
+
<Button type="button" variant="tertiary" onClick={requestCancel}>
|
|
767
|
+
Cancel
|
|
768
|
+
</Button>
|
|
769
|
+
<Button type="button" onClick={requestDone} disabled={disabled}>
|
|
770
|
+
{isNew ? "Add property" : "Done"}
|
|
771
|
+
</Button>
|
|
772
|
+
</>
|
|
773
|
+
)}
|
|
774
|
+
</SheetFooter>
|
|
775
|
+
</SheetContent>
|
|
776
|
+
</Sheet>
|
|
777
|
+
);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
export type SchemaEditorFormProps = {
|
|
781
|
+
form: SchemaForm;
|
|
782
|
+
errors: SchemaFormErrors;
|
|
783
|
+
isNew: boolean;
|
|
784
|
+
disabled?: boolean;
|
|
785
|
+
onChange: (form: SchemaForm) => void;
|
|
786
|
+
};
|
|
787
|
+
|
|
788
|
+
export function SchemaEditorForm(props: SchemaEditorFormProps) {
|
|
789
|
+
const { form, errors, isNew, disabled, onChange } = props;
|
|
790
|
+
function set(patch: Partial<SchemaForm>) {
|
|
791
|
+
onChange({ ...form, ...patch });
|
|
792
|
+
}
|
|
793
|
+
function setProperties(properties: SchemaPropertyForm[]) {
|
|
794
|
+
set({ properties });
|
|
795
|
+
}
|
|
796
|
+
const [draft, setDraft] = useState<PropertyDraft | null>(null);
|
|
797
|
+
const [dragged, setDragged] = useState<number | null>(null);
|
|
798
|
+
useEffect(() => {
|
|
799
|
+
loadPatternCheck().catch((error: unknown) => console.warn("The pattern check could not load", error));
|
|
800
|
+
}, []);
|
|
801
|
+
const [dragOver, setDragOver] = useState<number | null>(null);
|
|
802
|
+
function endDrag() {
|
|
803
|
+
setDragged(null);
|
|
804
|
+
setDragOver(null);
|
|
805
|
+
}
|
|
806
|
+
function commitDraft() {
|
|
807
|
+
if (!draft) return;
|
|
808
|
+
setProperties(
|
|
809
|
+
draft.index === null
|
|
810
|
+
? [...form.properties, draft.property]
|
|
811
|
+
: form.properties.map((p, i) => (i === draft.index ? draft.property : p)),
|
|
812
|
+
);
|
|
813
|
+
setDraft(null);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
return (
|
|
817
|
+
<div className="flex flex-col gap-6">
|
|
818
|
+
<section className="flex flex-col gap-3 rounded-xl border border-muted-border bg-card p-5">
|
|
819
|
+
<h3 className="typography-small-medium text-default-foreground">Schema</h3>
|
|
820
|
+
<Input
|
|
821
|
+
id="schema-label"
|
|
822
|
+
label="Name"
|
|
823
|
+
placeholder="e.g. Campaign brief"
|
|
824
|
+
value={form.label}
|
|
825
|
+
disabled={disabled}
|
|
826
|
+
error={errors.get("label")}
|
|
827
|
+
onChange={(e) => set({ label: e.target.value })}
|
|
828
|
+
/>
|
|
829
|
+
{isNew && (
|
|
830
|
+
<Input
|
|
831
|
+
id="schema-key"
|
|
832
|
+
label="Key"
|
|
833
|
+
placeholder="Generated from the name"
|
|
834
|
+
helperText="Names the schema in the knowledge graph. It cannot change once saved."
|
|
835
|
+
value={form.key}
|
|
836
|
+
disabled={disabled}
|
|
837
|
+
error={errors.get("key")}
|
|
838
|
+
onChange={(e) => set({ key: e.target.value })}
|
|
839
|
+
/>
|
|
840
|
+
)}
|
|
841
|
+
<Textarea
|
|
842
|
+
id="schema-description"
|
|
843
|
+
label="Description"
|
|
844
|
+
placeholder="What kind of memory this is"
|
|
845
|
+
value={form.description}
|
|
846
|
+
minRows={2}
|
|
847
|
+
maxRows={6}
|
|
848
|
+
disabled={disabled}
|
|
849
|
+
error={errors.get("description")}
|
|
850
|
+
onChange={(e) => set({ description: e.target.value })}
|
|
851
|
+
/>
|
|
852
|
+
</section>
|
|
853
|
+
|
|
854
|
+
<section className="flex flex-col gap-3 rounded-xl border border-muted-border bg-card p-5">
|
|
855
|
+
<div className="flex flex-col gap-0.5">
|
|
856
|
+
<h3 className="typography-small-medium text-default-foreground">Defaults for new memories</h3>
|
|
857
|
+
<p className="typography-small text-muted-foreground">
|
|
858
|
+
Applied to new memories of this schema that leave them unset; each memory can change them.
|
|
859
|
+
</p>
|
|
860
|
+
</div>
|
|
861
|
+
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
|
|
862
|
+
<ChoiceSelect
|
|
863
|
+
id="schema-default-kind"
|
|
864
|
+
label="Kind"
|
|
865
|
+
value={form.defaultMemoryKind}
|
|
866
|
+
choices={kindChoices}
|
|
867
|
+
disabled={disabled}
|
|
868
|
+
error={errors.get("defaultMemoryKind")}
|
|
869
|
+
onChange={(defaultMemoryKind) => set({ defaultMemoryKind })}
|
|
870
|
+
/>
|
|
871
|
+
<ChoiceSelect
|
|
872
|
+
id="schema-default-importance"
|
|
873
|
+
label="Importance"
|
|
874
|
+
value={form.defaultImportance != null ? String(form.defaultImportance) : null}
|
|
875
|
+
choices={importanceChoices}
|
|
876
|
+
disabled={disabled}
|
|
877
|
+
error={errors.get("defaultImportance")}
|
|
878
|
+
onChange={(value) => set({ defaultImportance: value != null ? Number(value) : null })}
|
|
879
|
+
/>
|
|
880
|
+
<ChoiceSelect
|
|
881
|
+
id="schema-default-volatility"
|
|
882
|
+
label="Volatility"
|
|
883
|
+
value={form.defaultVolatility}
|
|
884
|
+
choices={volatilityChoices}
|
|
885
|
+
disabled={disabled}
|
|
886
|
+
error={errors.get("defaultVolatility")}
|
|
887
|
+
onChange={(defaultVolatility) => set({ defaultVolatility })}
|
|
888
|
+
/>
|
|
889
|
+
<ChoiceSelect
|
|
890
|
+
id="schema-default-scope"
|
|
891
|
+
label="Scope"
|
|
892
|
+
value={form.defaultScope}
|
|
893
|
+
choices={scopeChoices}
|
|
894
|
+
disabled={disabled}
|
|
895
|
+
error={errors.get("defaultScope")}
|
|
896
|
+
onChange={(defaultScope) => set({ defaultScope })}
|
|
897
|
+
/>
|
|
898
|
+
</div>
|
|
899
|
+
</section>
|
|
900
|
+
|
|
901
|
+
<section className="flex flex-col gap-3 rounded-xl border border-muted-border bg-card p-5">
|
|
902
|
+
<Switch
|
|
903
|
+
id="schema-extraction"
|
|
904
|
+
label="Chat extraction can record memories of this type"
|
|
905
|
+
description="When off, only people and the agent's explicit tool calls give a memory this schema."
|
|
906
|
+
checked={form.extractionEnabled}
|
|
907
|
+
disabled={disabled}
|
|
908
|
+
containerClassName="w-full"
|
|
909
|
+
onCheckedChange={(extractionEnabled) => set({ extractionEnabled })}
|
|
910
|
+
/>
|
|
911
|
+
{form.extractionEnabled && (
|
|
912
|
+
<Textarea
|
|
913
|
+
id="schema-extraction-guidance"
|
|
914
|
+
label="When to use it"
|
|
915
|
+
placeholder="e.g. When the user states a cost-per-acquisition target for a channel"
|
|
916
|
+
value={form.extractionGuidance}
|
|
917
|
+
minRows={2}
|
|
918
|
+
maxRows={6}
|
|
919
|
+
disabled={disabled}
|
|
920
|
+
error={errors.get("extractionGuidance")}
|
|
921
|
+
onChange={(e) => set({ extractionGuidance: e.target.value })}
|
|
922
|
+
/>
|
|
923
|
+
)}
|
|
924
|
+
</section>
|
|
925
|
+
|
|
926
|
+
<section className="flex flex-col gap-3">
|
|
927
|
+
<div className="flex items-center justify-between gap-2">
|
|
928
|
+
<h3 className="typography-small-medium text-default-foreground">Properties</h3>
|
|
929
|
+
<span className="typography-tiny text-muted-foreground">
|
|
930
|
+
{form.properties.length} of {memorySchemaPropertyLimit}
|
|
931
|
+
</span>
|
|
932
|
+
</div>
|
|
933
|
+
{errors.get("properties") && (
|
|
934
|
+
<p className="typography-small text-error-foreground">{errors.get("properties")}</p>
|
|
935
|
+
)}
|
|
936
|
+
{isPresent(form.properties) && (
|
|
937
|
+
<div className="overflow-hidden rounded-xl border border-muted-border bg-card">
|
|
938
|
+
{form.properties.map((property, index) => (
|
|
939
|
+
<PropertyRow
|
|
940
|
+
key={property.id}
|
|
941
|
+
property={property}
|
|
942
|
+
index={index}
|
|
943
|
+
count={form.properties.length}
|
|
944
|
+
hasErrors={hasErrorsUnder(errors, propertyErrorPrefix(index))}
|
|
945
|
+
disabled={disabled}
|
|
946
|
+
onEdit={() => setDraft({ index, property, original: property })}
|
|
947
|
+
onRemove={() => setProperties(form.properties.filter((_, i) => i !== index))}
|
|
948
|
+
onMove={(to) => setProperties(moveItem(form.properties, index, to))}
|
|
949
|
+
drag={{
|
|
950
|
+
active: dragged !== null,
|
|
951
|
+
isDragging: dragged === index,
|
|
952
|
+
isDropTarget: dragged !== null && dragOver === index && dragOver !== dragged,
|
|
953
|
+
onStart: () => setDragged(index),
|
|
954
|
+
onOver: () => setDragOver(index),
|
|
955
|
+
onDrop: () => {
|
|
956
|
+
if (dragged !== null && dragged !== index) setProperties(moveItem(form.properties, dragged, index));
|
|
957
|
+
endDrag();
|
|
958
|
+
},
|
|
959
|
+
onEnd: endDrag,
|
|
960
|
+
}}
|
|
961
|
+
/>
|
|
962
|
+
))}
|
|
963
|
+
</div>
|
|
964
|
+
)}
|
|
965
|
+
<Button
|
|
966
|
+
type="button"
|
|
967
|
+
variant="secondary"
|
|
968
|
+
icon={Plus}
|
|
969
|
+
className="w-fit"
|
|
970
|
+
disabled={disabled || form.properties.length >= memorySchemaPropertyLimit}
|
|
971
|
+
onClick={() => {
|
|
972
|
+
const property = emptyPropertyForm();
|
|
973
|
+
setDraft({ index: null, property, original: property });
|
|
974
|
+
}}
|
|
975
|
+
>
|
|
976
|
+
Add property
|
|
977
|
+
</Button>
|
|
978
|
+
<PropertySheet
|
|
979
|
+
draft={draft}
|
|
980
|
+
siblings={form.properties}
|
|
981
|
+
errors={errors}
|
|
982
|
+
disabled={disabled}
|
|
983
|
+
onChange={(property) => setDraft((current) => (current ? { ...current, property } : current))}
|
|
984
|
+
onDone={commitDraft}
|
|
985
|
+
onCancel={() => setDraft(null)}
|
|
986
|
+
/>
|
|
987
|
+
</section>
|
|
988
|
+
</div>
|
|
989
|
+
);
|
|
990
|
+
}
|