@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,44 @@
|
|
|
1
|
+
import { isPresent } from "@manta-eu/lib/present";
|
|
2
|
+
import { SlidersHorizontal } from "lucide-react";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { Button } from "#components/button/index";
|
|
5
|
+
import { PlanLimitsDialog } from "#components/plan-limits/index";
|
|
6
|
+
import { buildPlanLimitsModel } from "#components/plan-limits/plan-limits-model";
|
|
7
|
+
import { usePlanLimits } from "#hooks/usePlanLimits";
|
|
8
|
+
|
|
9
|
+
export type PlanLimitsActionProps = {
|
|
10
|
+
planGraphIri: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/** The "Edit limits" button and its dialog, fed by the plan's own rules; nothing for a plan with no value to edit. */
|
|
14
|
+
export function PlanLimitsAction(props: PlanLimitsActionProps) {
|
|
15
|
+
const { planGraphIri } = props;
|
|
16
|
+
const [open, setOpen] = useState(false);
|
|
17
|
+
const limits = usePlanLimits({ planGraphIri });
|
|
18
|
+
const hasValues = useMemo(() => isPresent(buildPlanLimitsModel(limits.rules).rows), [limits.rules]);
|
|
19
|
+
|
|
20
|
+
if (limits.isLoading || (!isPresent(limits.error) && !hasValues)) return null;
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<>
|
|
24
|
+
<Button
|
|
25
|
+
variant="secondary"
|
|
26
|
+
size="sm"
|
|
27
|
+
icon={SlidersHorizontal}
|
|
28
|
+
label="Edit limits"
|
|
29
|
+
rounded="md"
|
|
30
|
+
className="text-nowrap"
|
|
31
|
+
onClick={() => setOpen(true)}
|
|
32
|
+
/>
|
|
33
|
+
<PlanLimitsDialog
|
|
34
|
+
open={open}
|
|
35
|
+
onOpenChange={setOpen}
|
|
36
|
+
rules={limits.rules}
|
|
37
|
+
isSaving={limits.isSaving}
|
|
38
|
+
error={limits.error}
|
|
39
|
+
omittedRules={limits.omittedRules}
|
|
40
|
+
onSave={limits.save}
|
|
41
|
+
/>
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -21,7 +21,8 @@ const sliderVariants = tv({
|
|
|
21
21
|
],
|
|
22
22
|
range: ["absolute bg-primary", "data-[orientation=horizontal]:h-full", "data-[orientation=vertical]:w-full"],
|
|
23
23
|
thumb: [
|
|
24
|
-
"block size-4 shrink-0 rounded-full bg-secondary shadow-sm transition-[box-shadow,background-color]",
|
|
24
|
+
"block size-4 shrink-0 cursor-grab rounded-full bg-secondary shadow-sm transition-[box-shadow,background-color]",
|
|
25
|
+
"active:cursor-grabbing",
|
|
25
26
|
"hover:ring-4 hover:ring-active-border/25",
|
|
26
27
|
"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-active-border/25",
|
|
27
28
|
"group-data-[disabled]:pointer-events-none group-data-[disabled]:bg-disabled",
|
|
@@ -47,23 +47,29 @@ const operatorUnprovisionedNote = "No datastore yet - add one from Datastores.";
|
|
|
47
47
|
const removedDatastoreNote = "This datastore has been removed.";
|
|
48
48
|
const aliasedDatastoreNote = "This datastore is already listed above.";
|
|
49
49
|
|
|
50
|
+
export function datastoreOfTreeNode(node: DatastoreTreeNode) {
|
|
51
|
+
const { id, name, depth, datastoreId, removed } = node;
|
|
52
|
+
|
|
53
|
+
return { id: datastoreId ?? id, name, depth, selectable: isPresent(datastoreId) && !removed };
|
|
54
|
+
}
|
|
55
|
+
|
|
50
56
|
function operatorCandidate(node: DatastoreTreeNode, currentDatastoreId?: string): Candidate {
|
|
51
|
-
const datastoreId = node
|
|
52
|
-
|
|
53
|
-
const
|
|
57
|
+
const { id: headingId, datastoreId, removed } = node;
|
|
58
|
+
|
|
59
|
+
const { id, name, depth, selectable } = datastoreOfTreeNode(node);
|
|
54
60
|
|
|
55
61
|
return {
|
|
56
62
|
selectable,
|
|
57
|
-
headingId
|
|
63
|
+
headingId,
|
|
58
64
|
item: {
|
|
59
|
-
id
|
|
60
|
-
name
|
|
61
|
-
depth: pickerDepth(
|
|
62
|
-
treeDepth:
|
|
63
|
-
active: selectable &&
|
|
65
|
+
id,
|
|
66
|
+
name,
|
|
67
|
+
depth: pickerDepth(depth),
|
|
68
|
+
treeDepth: depth ?? 0,
|
|
69
|
+
active: selectable && id === currentDatastoreId,
|
|
64
70
|
heading: !selectable,
|
|
65
|
-
...(
|
|
66
|
-
...(
|
|
71
|
+
...(!isPresent(datastoreId) && { note: operatorUnprovisionedNote }),
|
|
72
|
+
...(removed && { note: removedDatastoreNote }),
|
|
67
73
|
},
|
|
68
74
|
};
|
|
69
75
|
}
|
|
@@ -85,22 +91,32 @@ function userCandidate(datastore: Datastore, currentDatastoreId?: string): Candi
|
|
|
85
91
|
};
|
|
86
92
|
}
|
|
87
93
|
|
|
94
|
+
function rowsUnderGroup<T>(entries: readonly T[], index: number, depthOf: (entry: T) => number): T[] {
|
|
95
|
+
const head = entries[index];
|
|
96
|
+
|
|
97
|
+
if (head === undefined) return [];
|
|
98
|
+
|
|
99
|
+
const headDepth = depthOf(head);
|
|
100
|
+
const end = entries.findIndex((entry, at) => at > index && depthOf(entry) <= headDepth);
|
|
101
|
+
|
|
102
|
+
return entries.slice(index + 1, end === -1 ? entries.length : end);
|
|
103
|
+
}
|
|
104
|
+
|
|
88
105
|
function headsGroupWhere<T>(
|
|
89
106
|
entries: readonly T[],
|
|
90
107
|
index: number,
|
|
91
108
|
depthOf: (entry: T) => number,
|
|
92
109
|
predicate: (entry: T) => boolean,
|
|
93
110
|
): boolean {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
111
|
+
return rowsUnderGroup(entries, index, depthOf).some(predicate);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function groupMembers(datastores: readonly Datastore[], groupId: string): Datastore[] {
|
|
115
|
+
const groupIndex = datastores.findIndex(({ id }) => id === groupId);
|
|
97
116
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (predicate(entry)) return true;
|
|
102
|
-
}
|
|
103
|
-
return false;
|
|
117
|
+
return rowsUnderGroup(datastores, groupIndex, ({ depth }) => depth ?? 0).filter(
|
|
118
|
+
({ selectable }) => selectable !== false,
|
|
119
|
+
);
|
|
104
120
|
}
|
|
105
121
|
|
|
106
122
|
const candidateDepth = (candidate: Candidate) => candidate.item.treeDepth ?? 0;
|
|
@@ -5,6 +5,7 @@ import type { QueryContext } from "ldkit";
|
|
|
5
5
|
import type { RDF } from "ldkit/rdf";
|
|
6
6
|
import { DataFactory } from "ldkit/rdf";
|
|
7
7
|
import { SELECT, sparql } from "ldkit/sparql";
|
|
8
|
+
import pLimit from "p-limit";
|
|
8
9
|
import { clamp, splitEvery } from "ramda";
|
|
9
10
|
import { match, P } from "ts-pattern";
|
|
10
11
|
import {
|
|
@@ -69,6 +70,7 @@ const defaultLimit = 10;
|
|
|
69
70
|
const maxLimit = 50;
|
|
70
71
|
const detailTripleLimit = 1000;
|
|
71
72
|
const detailGraphBatchSize = 6;
|
|
73
|
+
const detailBatchConcurrency = 3;
|
|
72
74
|
const actionPlanStates: readonly ActionPlanDetailState[] = ["DRAFT", "RUNNING", "COMPLETED", "FAILED", "TIMED_OUT"];
|
|
73
75
|
|
|
74
76
|
function clampLimit(value: number | null | undefined): number {
|
|
@@ -501,21 +503,27 @@ async function fetchPageBindings(
|
|
|
501
503
|
});
|
|
502
504
|
}
|
|
503
505
|
|
|
504
|
-
async function fetchDetailsForPage(
|
|
505
|
-
engine: ReturnType<typeof useSparqlEngine>,
|
|
506
|
+
export async function fetchDetailsForPage(
|
|
507
|
+
engine: Pick<ReturnType<typeof useSparqlEngine>, "queryBindings">,
|
|
506
508
|
context: QueryContext,
|
|
507
|
-
pageBindings: PageBinding[],
|
|
509
|
+
pageBindings: Pick<PageBinding, "graph">[],
|
|
508
510
|
): Promise<Map<string, RdfGraph>> {
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
const bindingGroups
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
511
|
+
const limit = pLimit(detailBatchConcurrency);
|
|
512
|
+
|
|
513
|
+
const bindingGroups = await Promise.all(
|
|
514
|
+
splitEvery(detailGraphBatchSize, pageBindings).map((batch) =>
|
|
515
|
+
limit(async () => {
|
|
516
|
+
const stream = await engine.queryBindings(
|
|
517
|
+
buildDetailBatchQuery(batch.map((binding) => binding.graph)),
|
|
518
|
+
context,
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
return collectBindings(stream);
|
|
522
|
+
}),
|
|
523
|
+
),
|
|
524
|
+
);
|
|
516
525
|
|
|
517
|
-
|
|
518
|
-
return groupDetailBindings(bindings);
|
|
526
|
+
return groupDetailBindings(bindingGroups.flat());
|
|
519
527
|
}
|
|
520
528
|
|
|
521
529
|
export const actionPlansListQueryKeyRoot = ["ldo-ui", "action-plans-list"] as const;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { humanCount } from "@manta-eu/lib/humanize";
|
|
2
2
|
import { prependMissingSparqlPrefixes, prov } from "@manta-eu/rdf-lib/namespaces";
|
|
3
|
-
import { keepPreviousData, useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { keepPreviousData, useQuery, type UseQueryResult } from "@tanstack/react-query";
|
|
4
4
|
import type { RDF } from "ldkit/rdf";
|
|
5
5
|
import { SELECT } from "ldkit/sparql";
|
|
6
6
|
import { match } from "ts-pattern";
|
|
@@ -232,28 +232,44 @@ export function processActivityFeedBindings(bindings: RDF.Bindings[], pageSize:
|
|
|
232
232
|
});
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
-
|
|
236
|
-
|
|
235
|
+
async function countActivities(
|
|
236
|
+
engine: ReturnType<typeof useSparqlEngine>,
|
|
237
|
+
context: ReturnType<typeof optionsToContext>,
|
|
238
|
+
filters: ActivityFeedFilters | undefined,
|
|
239
|
+
): Promise<number> {
|
|
240
|
+
const [countBinding] = await collectBindings(
|
|
241
|
+
await engine.queryBindings(buildActivityFeedCountQuery(filters), context),
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
return countBinding ? (bindingCount(countBinding, "count") ?? 0) : 0;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function useActivityFeed(
|
|
248
|
+
config?: UseActivityFeedOptions & { includeTotal?: true },
|
|
249
|
+
): UseQueryResult<ActivityFeedResult>;
|
|
250
|
+
export function useActivityFeed(
|
|
251
|
+
config: UseActivityFeedOptions & { includeTotal: false },
|
|
252
|
+
): UseQueryResult<Pick<ActivityFeedResult, "activities">>;
|
|
253
|
+
export function useActivityFeed(
|
|
254
|
+
config: UseActivityFeedOptions & { includeTotal?: boolean },
|
|
255
|
+
): UseQueryResult<Pick<ActivityFeedResult, "activities"> & Partial<Pick<ActivityFeedResult, "totalCount">>>;
|
|
256
|
+
export function useActivityFeed(config: UseActivityFeedOptions & { includeTotal?: boolean } = {}) {
|
|
257
|
+
const { page = 1, pageSize = 10, enabled = true, filters, includeTotal = true } = config;
|
|
258
|
+
|
|
237
259
|
const engine = useSparqlEngine();
|
|
238
260
|
const options = useSparqlOptions();
|
|
239
261
|
const offset = Math.max(0, (page - 1) * pageSize);
|
|
240
262
|
|
|
241
|
-
return useQuery<ActivityFeedResult
|
|
242
|
-
queryKey: ["ldo-ui", "activity-feed", page, pageSize, filters, engine, options],
|
|
263
|
+
return useQuery<ActivityFeedResult | Pick<ActivityFeedResult, "activities">>({
|
|
264
|
+
queryKey: ["ldo-ui", "activity-feed", page, pageSize, filters, includeTotal, engine, options],
|
|
243
265
|
queryFn: async () => {
|
|
244
266
|
const context = optionsToContext(options);
|
|
245
|
-
const [
|
|
246
|
-
engine.queryBindings(buildActivityFeedQuery(pageSize, offset, filters), context),
|
|
247
|
-
engine
|
|
248
|
-
]);
|
|
249
|
-
const [pageBindings, countBindings] = await Promise.all([
|
|
250
|
-
collectBindings(pageStream),
|
|
251
|
-
collectBindings(countStream),
|
|
267
|
+
const [pageBindings, totalCount] = await Promise.all([
|
|
268
|
+
engine.queryBindings(buildActivityFeedQuery(pageSize, offset, filters), context).then(collectBindings),
|
|
269
|
+
includeTotal ? countActivities(engine, context, filters) : undefined,
|
|
252
270
|
]);
|
|
253
271
|
|
|
254
272
|
const activities = processActivityFeedBindings(pageBindings, pageSize);
|
|
255
|
-
const countBinding = countBindings[0];
|
|
256
|
-
const totalCount = countBinding ? (bindingCount(countBinding, "count") ?? 0) : 0;
|
|
257
273
|
|
|
258
274
|
return { activities, totalCount };
|
|
259
275
|
},
|
package/src/hooks/use-entity.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isQueryableTermIri } from "@manta-eu/datalog-parser";
|
|
2
2
|
import { isPresent } from "@manta-eu/lib/present";
|
|
3
3
|
import { useQuery, type UseQueryResult } from "@tanstack/react-query";
|
|
4
|
-
import { createLens, type Options, type Schema, type SchemaInterface } from "ldkit";
|
|
4
|
+
import { createLens, type Lens, type Options, type Schema, type SchemaInterface } from "ldkit";
|
|
5
5
|
import { useSparqlOptions } from "./use-sparql-options";
|
|
6
6
|
|
|
7
7
|
type Batch = { iris: Set<string>; result: Promise<Map<string, unknown>> };
|
|
@@ -73,7 +73,8 @@ export function loadEntities<S extends Schema>(schema: S, iris: readonly string[
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
export const entityQueryKey = <S extends Schema>(iri: string, schema: S) => ["ldo-ui", "entity", iri, schema] as const;
|
|
76
|
-
export const entitiesQueryKey = <S extends Schema>(schema: S
|
|
76
|
+
export const entitiesQueryKey = <S extends Schema>(schema: S, page: EntitiesPage) =>
|
|
77
|
+
["ldo-ui", "entities", schema, page] as const;
|
|
77
78
|
export const entitiesByIrisQueryKey = <S extends Schema>(iris: readonly string[], schema: S) =>
|
|
78
79
|
["ldo-ui", "entities-by-iris", iris, schema] as const;
|
|
79
80
|
|
|
@@ -122,7 +123,9 @@ export function useEntitiesByIris<S extends Schema>(config: UseEntitiesByIrisOpt
|
|
|
122
123
|
});
|
|
123
124
|
}
|
|
124
125
|
|
|
125
|
-
export type
|
|
126
|
+
export type EntitiesPage = Pick<NonNullable<Parameters<Lens<Schema>["find"]>[0]>, "take" | "skip">;
|
|
127
|
+
|
|
128
|
+
export type UseEntitiesOptions<S extends Schema> = EntitiesPage & {
|
|
126
129
|
schema: S;
|
|
127
130
|
enabled?: boolean;
|
|
128
131
|
};
|
|
@@ -134,14 +137,16 @@ export type Entity<T> = T extends Record<string, unknown> ? { [Key in keyof T]:
|
|
|
134
137
|
export function useEntities<S extends Schema>(
|
|
135
138
|
config: UseEntitiesOptions<S>,
|
|
136
139
|
): UseQueryResult<Entity<SchemaInterface<S>>[], Error> {
|
|
137
|
-
const { schema, enabled = true } = config;
|
|
140
|
+
const { schema, enabled = true, take, skip } = config;
|
|
141
|
+
|
|
138
142
|
const options = useSparqlOptions();
|
|
139
143
|
|
|
140
144
|
return useQuery({
|
|
141
|
-
queryKey: entitiesQueryKey(schema),
|
|
145
|
+
queryKey: entitiesQueryKey(schema, { take, skip }),
|
|
142
146
|
queryFn: async () => {
|
|
143
147
|
const lens = createLens(schema, options);
|
|
144
|
-
|
|
148
|
+
|
|
149
|
+
return lens.find({ ...(take !== undefined && { take }), ...(skip !== undefined && { skip }) });
|
|
145
150
|
},
|
|
146
151
|
staleTime: entityStaleTime,
|
|
147
152
|
enabled,
|
|
@@ -127,27 +127,32 @@ export function useInvalidateManualActions() {
|
|
|
127
127
|
return (planGraphIri: string) => queryClient.invalidateQueries({ queryKey: manualActionsQueryKey(planGraphIri) });
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
export type UseManualActionsForPlansOptions = {
|
|
130
|
+
export type UseManualActionsForPlansOptions = ManualActionReadOptions & {
|
|
131
131
|
planGraphIris: string[];
|
|
132
132
|
enabled?: boolean;
|
|
133
133
|
refetchIntervalMs?: number | false;
|
|
134
134
|
};
|
|
135
135
|
|
|
136
|
-
async function findManualActionsForPlans(
|
|
136
|
+
async function findManualActionsForPlans(
|
|
137
|
+
options: Options,
|
|
138
|
+
planGraphIris: string[],
|
|
139
|
+
readOptions: ManualActionReadOptions,
|
|
140
|
+
) {
|
|
137
141
|
const perGraph = await Promise.all(
|
|
138
|
-
planGraphIris.map(async (iri) => [iri, await findManualActionsInGraph(options, iri)] as const),
|
|
142
|
+
planGraphIris.map(async (iri) => [iri, await findManualActionsInGraph(options, iri, readOptions)] as const),
|
|
139
143
|
);
|
|
140
144
|
return new Map(perGraph.filter(([, actions]) => isPresent(actions)));
|
|
141
145
|
}
|
|
142
146
|
|
|
143
147
|
export function useManualActionsForPlans(config: UseManualActionsForPlansOptions) {
|
|
144
|
-
const { planGraphIris, enabled = true, refetchIntervalMs = false } = config;
|
|
148
|
+
const { planGraphIris, enabled = true, refetchIntervalMs = false, includeUnstarted = false } = config;
|
|
149
|
+
|
|
145
150
|
const options = useSparqlOptions();
|
|
146
151
|
const sortedIris = [...planGraphIris].sort();
|
|
147
152
|
|
|
148
153
|
return useQuery<Map<string, ManualAction[]>>({
|
|
149
|
-
queryKey: ["ldo-ui", "manual-actions-for-plans", sortedIris, options],
|
|
150
|
-
queryFn: () => findManualActionsForPlans(options, sortedIris),
|
|
154
|
+
queryKey: ["ldo-ui", "manual-actions-for-plans", sortedIris, options, { includeUnstarted }],
|
|
155
|
+
queryFn: () => findManualActionsForPlans(options, sortedIris, { includeUnstarted }),
|
|
151
156
|
enabled: enabled && isPresent(sortedIris),
|
|
152
157
|
refetchInterval: refetchIntervalMs,
|
|
153
158
|
refetchIntervalInBackground: true,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
export function useUnsavedChangesWarning(active: boolean) {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
if (!active) return;
|
|
6
|
+
function warn(event: BeforeUnloadEvent) {
|
|
7
|
+
event.preventDefault();
|
|
8
|
+
}
|
|
9
|
+
window.addEventListener("beforeunload", warn);
|
|
10
|
+
return () => window.removeEventListener("beforeunload", warn);
|
|
11
|
+
}, [active]);
|
|
12
|
+
}
|
package/src/hooks/useAuth.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SessionContextDocument } from "@manta-eu/client";
|
|
2
|
-
import { loginStatusPollMs } from "@manta-eu/client/shared/constants";
|
|
2
|
+
import { loginStatusPollMs, mantaGQLPath } from "@manta-eu/client/shared/constants";
|
|
3
3
|
import { datastoreHeader } from "@manta-eu/client/shared/datastore-path";
|
|
4
4
|
import { createHttpError, isHttpError } from "@manta-eu/client/shared/error-utils";
|
|
5
|
+
import { signedOutLoginStatus } from "@manta-eu/client/shared/login-status";
|
|
5
6
|
import { isValidModelId, type MantaModelId } from "@manta-eu/client/shared/model";
|
|
6
7
|
import type { OrgRoleDefinition } from "@manta-eu/client/shared/org-roles";
|
|
7
8
|
import { isCapability } from "@manta-eu/client/shared/permissions";
|
|
@@ -133,9 +134,10 @@ function sessionDatastore(datastore: z.infer<typeof datastoreSchema> | null | un
|
|
|
133
134
|
async function tokenLoginStatus(getAccessToken: () => Promise<string>): Promise<z.infer<typeof loginStatusSchema>> {
|
|
134
135
|
try {
|
|
135
136
|
await getAccessToken();
|
|
137
|
+
|
|
136
138
|
return { valid: true, canSwitchDatastore: true, allowedModels: [] };
|
|
137
139
|
} catch {
|
|
138
|
-
return
|
|
140
|
+
return signedOutLoginStatus;
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
143
|
|
|
@@ -204,7 +206,7 @@ export function useAuth(): UseAuthResult {
|
|
|
204
206
|
} = useQuery({
|
|
205
207
|
queryKey: [...userContextQueryKey, datastoreId],
|
|
206
208
|
queryFn: async ({ signal }) => {
|
|
207
|
-
const res = await authorizedFetch(new URL(
|
|
209
|
+
const res = await authorizedFetch(new URL(mantaGQLPath, mantaBaseUrl), {
|
|
208
210
|
method: "POST",
|
|
209
211
|
headers: {
|
|
210
212
|
...datastoreHeader(datastoreId),
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { buildPlanIri } from "@manta-eu/client/shared/agent-mode";
|
|
2
2
|
import { ChatContextKind, isDraftChatContext, type ChatContext } from "@manta-eu/client/shared/agent-types";
|
|
3
|
-
import { expandPrefix } from "@manta-eu/client/shared/rdf-namespaces";
|
|
4
3
|
import { isPresent } from "@manta-eu/lib/present";
|
|
5
4
|
import { equals } from "ramda";
|
|
6
5
|
import { useEffect, useMemo, useRef } from "react";
|
|
@@ -9,7 +8,7 @@ import { toast } from "sonner";
|
|
|
9
8
|
import { useChatManagerConnection } from "../providers/ChatManagerProvider";
|
|
10
9
|
import { useChatPanel } from "../providers/ChatPanelContext";
|
|
11
10
|
import { useActionPlanRouteState } from "../routes/plans/index";
|
|
12
|
-
import {
|
|
11
|
+
import { ruleIriFromRouteName } from "../routes/rules/components/rules.utils";
|
|
13
12
|
import { computePlanSplitSidebarSync } from "./plan-split-sidebar-sync";
|
|
14
13
|
import { useSidebar } from "#components/sidebar/index";
|
|
15
14
|
|
|
@@ -27,7 +26,7 @@ function routeChatContext(planName?: string, ruleName?: string): ChatContext | u
|
|
|
27
26
|
if (isPresent(ruleName)) {
|
|
28
27
|
return {
|
|
29
28
|
kind: ChatContextKind.RuleEdit,
|
|
30
|
-
ruleIri:
|
|
29
|
+
ruleIri: ruleIriFromRouteName(ruleName),
|
|
31
30
|
};
|
|
32
31
|
}
|
|
33
32
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { switchDatastoreRoutePath } from "@manta-eu/client/shared/constants";
|
|
1
2
|
import { isPresent } from "@manta-eu/lib/present";
|
|
2
3
|
import { useQueryClient } from "@tanstack/react-query";
|
|
3
4
|
import { useCallback, useState } from "react";
|
|
4
5
|
import { useLocation } from "react-router";
|
|
5
6
|
import { toast } from "sonner";
|
|
6
7
|
import { datastoreSwitchFallbackPath } from "../lib/datastore-route-paths";
|
|
7
|
-
import { useActiveDatastore, useMantaClient } from "../providers/index";
|
|
8
|
+
import { useActiveDatastore, useLeaveConfirmation, useMantaClient } from "../providers/index";
|
|
8
9
|
|
|
9
10
|
const switchDatastoreToastId = "switch-datastore" as const;
|
|
10
11
|
|
|
@@ -43,6 +44,7 @@ export function useDatastoreSelection(args: UseDatastoreSelectionArgs = {}) {
|
|
|
43
44
|
const { mantaBaseUrl, getAccessToken } = useMantaClient();
|
|
44
45
|
const queryClient = useQueryClient();
|
|
45
46
|
const { datastoreId: activeDatastoreId, enterDatastore } = useActiveDatastore();
|
|
47
|
+
const { confirmLeave, bypass } = useLeaveConfirmation();
|
|
46
48
|
const { pathname, search, hash } = useLocation();
|
|
47
49
|
const [isSwitching, setIsSwitching] = useState(false);
|
|
48
50
|
|
|
@@ -56,13 +58,15 @@ export function useDatastoreSelection(args: UseDatastoreSelectionArgs = {}) {
|
|
|
56
58
|
toast.error(`No ${kind} selected.`);
|
|
57
59
|
return false;
|
|
58
60
|
}
|
|
61
|
+
// The switch moves the session itself, so unsaved work is settled first rather than when the route changes.
|
|
62
|
+
if (!(await confirmLeave())) return false;
|
|
59
63
|
|
|
60
64
|
setIsSwitching(true);
|
|
61
65
|
toast.loading(`Switching ${kind}...`, { id: switchDatastoreToastId });
|
|
62
66
|
|
|
63
67
|
try {
|
|
64
68
|
if (!getAccessToken) {
|
|
65
|
-
const response = await fetch(new URL(
|
|
69
|
+
const response = await fetch(new URL(switchDatastoreRoutePath, mantaBaseUrl), {
|
|
66
70
|
method: "POST",
|
|
67
71
|
headers: { "Content-Type": "application/json" },
|
|
68
72
|
body: JSON.stringify({ datastoreId }),
|
|
@@ -81,10 +85,10 @@ export function useDatastoreSelection(args: UseDatastoreSelectionArgs = {}) {
|
|
|
81
85
|
if (activeDatastoreId) {
|
|
82
86
|
const fallback = datastoreSwitchFallbackPath(pathname);
|
|
83
87
|
|
|
84
|
-
enterDatastore(datastoreId, { path: fallback ?? `${pathname}${search}${hash}`, replace: true });
|
|
88
|
+
bypass(() => enterDatastore(datastoreId, { path: fallback ?? `${pathname}${search}${hash}`, replace: true }));
|
|
85
89
|
} else if (getAccessToken) {
|
|
86
90
|
// A token host has no session datastore to switch, so the route is the only place the choice lives.
|
|
87
|
-
enterDatastore(datastoreId);
|
|
91
|
+
bypass(() => enterDatastore(datastoreId));
|
|
88
92
|
} else {
|
|
89
93
|
// Entering rotates the QueryClient; on the global tree nothing rotates, so the cache has to go.
|
|
90
94
|
await queryClient.invalidateQueries();
|
|
@@ -103,7 +107,9 @@ export function useDatastoreSelection(args: UseDatastoreSelectionArgs = {}) {
|
|
|
103
107
|
},
|
|
104
108
|
[
|
|
105
109
|
activeDatastoreId,
|
|
110
|
+
bypass,
|
|
106
111
|
canSwitchDatastore,
|
|
112
|
+
confirmLeave,
|
|
107
113
|
enterDatastore,
|
|
108
114
|
getAccessToken,
|
|
109
115
|
hash,
|
|
@@ -11,6 +11,8 @@ import { actionDocumentIssue, buildActionDocument, type ExecuteActionTarget } fr
|
|
|
11
11
|
import { useMantaClient } from "#providers/MantaClientProvider";
|
|
12
12
|
import { invalidateActionPlanQueries } from "#shared/query-keys";
|
|
13
13
|
|
|
14
|
+
export type { ExecuteActionTarget };
|
|
15
|
+
|
|
14
16
|
export type ExecuteActionResult =
|
|
15
17
|
| { success: true; workflowId: string; namedGraphIri: string }
|
|
16
18
|
| { success: false; error: string; code: GQLExecuteActionErrorCode };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { UseAuthResult } from "./useAuth";
|
|
2
|
+
import { authErrorParam } from "@manta-eu/client/shared/constants";
|
|
3
|
+
import { isPresent } from "@manta-eu/lib/present";
|
|
4
|
+
import { useMantaClient } from "#providers/MantaClientProvider";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
|
+
|
|
7
|
+
function redirectTarget(mantaBaseUrl: URL): string | null {
|
|
8
|
+
const { origin, pathname, search, href } = window.location;
|
|
9
|
+
|
|
10
|
+
const requested = new URLSearchParams(search).get("redirect");
|
|
11
|
+
|
|
12
|
+
if (isPresent(requested)) return requested;
|
|
13
|
+
|
|
14
|
+
if (pathname === "/") return null;
|
|
15
|
+
|
|
16
|
+
return origin === mantaBaseUrl.origin ? `${pathname}${search}` : href;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function buildLoginUrl(mantaBaseUrl: URL): string {
|
|
20
|
+
const loginUrl = new URL("/login", mantaBaseUrl);
|
|
21
|
+
|
|
22
|
+
const redirect = redirectTarget(mantaBaseUrl);
|
|
23
|
+
|
|
24
|
+
if (isPresent(redirect)) loginUrl.searchParams.set("redirect", redirect);
|
|
25
|
+
|
|
26
|
+
return loginUrl.toString();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function useLoginRedirect(auth: UseAuthResult) {
|
|
30
|
+
const { isLoading, error, isSessionValid, contextFailed, user, isOperator, datastore, refetchLoginStatus } = auth;
|
|
31
|
+
|
|
32
|
+
const { mantaBaseUrl } = useMantaClient();
|
|
33
|
+
|
|
34
|
+
const [authError] = useState(() => {
|
|
35
|
+
const returned = new URLSearchParams(window.location.search).get(authErrorParam);
|
|
36
|
+
|
|
37
|
+
return isPresent(returned) ? returned : null;
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (isPresent(authError)) window.history.replaceState({}, "", window.location.pathname);
|
|
42
|
+
}, [authError]);
|
|
43
|
+
|
|
44
|
+
const isMissingContext = !isPresent(user) || (!isOperator && !isPresent(datastore));
|
|
45
|
+
const needsRedirect =
|
|
46
|
+
!isLoading && !isPresent(error) && !isPresent(authError) && !isSessionValid && !contextFailed && isMissingContext;
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!needsRedirect) return;
|
|
50
|
+
|
|
51
|
+
const checkAndRedirect = () => {
|
|
52
|
+
if (document.visibilityState !== "visible") return;
|
|
53
|
+
|
|
54
|
+
void refetchLoginStatus().then(({ isSessionValid: stillValid }) => {
|
|
55
|
+
if (!stillValid) window.location.replace(buildLoginUrl(mantaBaseUrl));
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
checkAndRedirect();
|
|
60
|
+
document.addEventListener("visibilitychange", checkAndRedirect);
|
|
61
|
+
|
|
62
|
+
return () => document.removeEventListener("visibilitychange", checkAndRedirect);
|
|
63
|
+
}, [needsRedirect, mantaBaseUrl, refetchLoginStatus]);
|
|
64
|
+
|
|
65
|
+
return { authError };
|
|
66
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useActionPlanRulesQuery,
|
|
3
|
+
useClearStagedRulesMutation,
|
|
4
|
+
useCommitStagedRulesMutation,
|
|
5
|
+
useStageRuleOperationMutation,
|
|
6
|
+
useValidateStagedRulesMutation,
|
|
7
|
+
} from "@manta-eu/client";
|
|
8
|
+
import { humanCount } from "@manta-eu/lib/humanize";
|
|
9
|
+
import { isPresent } from "@manta-eu/lib/present";
|
|
10
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
11
|
+
import { useCallback, useMemo } from "react";
|
|
12
|
+
import { toast } from "sonner";
|
|
13
|
+
import { planLimitRuleOf, planLimitsSaveClient } from "#components/plan-limits/plan-limits-client";
|
|
14
|
+
import type { PlanLimitChange, PlanLimitRule } from "#components/plan-limits/plan-limits-model";
|
|
15
|
+
import { messageOf, type PlanLimitsSaveResult, savePlanLimits } from "#components/plan-limits/plan-limits-save";
|
|
16
|
+
import { useMantaClient } from "#providers/MantaClientProvider";
|
|
17
|
+
import { invalidateGraphDerivedQueries } from "#shared/graph-derived-queries";
|
|
18
|
+
import { invalidateActionPlanQueries } from "#shared/query-keys";
|
|
19
|
+
|
|
20
|
+
/** The most rules read for one plan; a plan with more shows the first page and says so. */
|
|
21
|
+
export const planLimitsRuleLimit = 100;
|
|
22
|
+
|
|
23
|
+
export type UsePlanLimitsOptions = {
|
|
24
|
+
planGraphIri: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type PlanLimitsHandle = {
|
|
28
|
+
rules: PlanLimitRule[];
|
|
29
|
+
/** Rules beyond the first page, left out of the dialog. */
|
|
30
|
+
omittedRules: number;
|
|
31
|
+
isLoading: boolean;
|
|
32
|
+
error: string | null;
|
|
33
|
+
save: (changes: readonly PlanLimitChange[]) => Promise<PlanLimitsSaveResult>;
|
|
34
|
+
isSaving: boolean;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export function usePlanLimits(options: UsePlanLimitsOptions): PlanLimitsHandle {
|
|
38
|
+
const { planGraphIri } = options;
|
|
39
|
+
const { mantaClient } = useMantaClient();
|
|
40
|
+
const queryClient = useQueryClient();
|
|
41
|
+
|
|
42
|
+
const query = useActionPlanRulesQuery(
|
|
43
|
+
mantaClient,
|
|
44
|
+
{ namedGraph: planGraphIri ?? "", limit: planLimitsRuleLimit, offset: 0 },
|
|
45
|
+
{ enabled: isPresent(planGraphIri) },
|
|
46
|
+
);
|
|
47
|
+
const stageMutation = useStageRuleOperationMutation(mantaClient);
|
|
48
|
+
const validateMutation = useValidateStagedRulesMutation(mantaClient);
|
|
49
|
+
const commitMutation = useCommitStagedRulesMutation(mantaClient);
|
|
50
|
+
const clearMutation = useClearStagedRulesMutation(mantaClient);
|
|
51
|
+
|
|
52
|
+
const rules = useMemo(() => (query.data?.rules.rules ?? []).map(planLimitRuleOf), [query.data]);
|
|
53
|
+
const totalCount = query.data?.rules.count ?? 0;
|
|
54
|
+
const { refetch } = query;
|
|
55
|
+
const error =
|
|
56
|
+
query.data?.rules.error ?? (query.error ? messageOf(query.error, "Failed to load the plan's rules") : null);
|
|
57
|
+
|
|
58
|
+
const save = useCallback(
|
|
59
|
+
async (changes: readonly PlanLimitChange[]): Promise<PlanLimitsSaveResult> => {
|
|
60
|
+
const result = await savePlanLimits(
|
|
61
|
+
planLimitsSaveClient(
|
|
62
|
+
{
|
|
63
|
+
stage: stageMutation.mutateAsync,
|
|
64
|
+
validate: validateMutation.mutateAsync,
|
|
65
|
+
commit: commitMutation.mutateAsync,
|
|
66
|
+
clear: clearMutation.mutateAsync,
|
|
67
|
+
},
|
|
68
|
+
planGraphIri,
|
|
69
|
+
),
|
|
70
|
+
changes,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
if (result.ok) {
|
|
74
|
+
toast.success("Limits saved", {
|
|
75
|
+
description: `${humanCount(result.rulesUpdated, "rule")} updated. Recommended changes refresh now; Manta acts on them at the plan's next run.`,
|
|
76
|
+
});
|
|
77
|
+
await invalidateGraphDerivedQueries(queryClient);
|
|
78
|
+
await invalidateActionPlanQueries(queryClient, planGraphIri);
|
|
79
|
+
} else {
|
|
80
|
+
toast.error("Limits not saved", { description: result.error });
|
|
81
|
+
await refetch();
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
},
|
|
85
|
+
[stageMutation, validateMutation, commitMutation, clearMutation, planGraphIri, queryClient, refetch],
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
rules,
|
|
90
|
+
omittedRules: Math.max(0, totalCount - rules.length),
|
|
91
|
+
isLoading: query.isLoading,
|
|
92
|
+
error,
|
|
93
|
+
save,
|
|
94
|
+
isSaving:
|
|
95
|
+
stageMutation.isPending || validateMutation.isPending || commitMutation.isPending || clearMutation.isPending,
|
|
96
|
+
};
|
|
97
|
+
}
|