@manta-eu/react 0.11.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.
Files changed (592) hide show
  1. package/README.md +59 -0
  2. package/dist/components/AppErrorBoundary.d.ts.map +1 -1
  3. package/dist/components/AppErrorBoundary.js +14 -11
  4. package/dist/components/AppErrorBoundary.js.map +1 -1
  5. package/dist/components/app-gate/AppGate.d.ts +8 -0
  6. package/dist/components/app-gate/AppGate.d.ts.map +1 -0
  7. package/dist/components/app-gate/AppGate.js +68 -0
  8. package/dist/components/app-gate/AppGate.js.map +1 -0
  9. package/dist/components/app-gate/AwaitingDatastoreStatus.d.ts +7 -0
  10. package/dist/components/app-gate/AwaitingDatastoreStatus.d.ts.map +1 -0
  11. package/dist/components/app-gate/AwaitingDatastoreStatus.js +19 -0
  12. package/dist/components/app-gate/AwaitingDatastoreStatus.js.map +1 -0
  13. package/dist/components/app-gate/EnterDatastoreRoute.d.ts +2 -0
  14. package/dist/components/app-gate/EnterDatastoreRoute.d.ts.map +1 -0
  15. package/dist/components/app-gate/EnterDatastoreRoute.js +25 -0
  16. package/dist/components/app-gate/EnterDatastoreRoute.js.map +1 -0
  17. package/dist/components/app-gate/ErrorRoute.d.ts +2 -0
  18. package/dist/components/app-gate/ErrorRoute.d.ts.map +1 -0
  19. package/dist/components/app-gate/ErrorRoute.js +27 -0
  20. package/dist/components/app-gate/ErrorRoute.js.map +1 -0
  21. package/dist/components/app-gate/FailureAlert.d.ts +5 -0
  22. package/dist/components/app-gate/FailureAlert.d.ts.map +1 -0
  23. package/dist/components/app-gate/FailureAlert.js +9 -0
  24. package/dist/components/app-gate/FailureAlert.js.map +1 -0
  25. package/dist/components/app-gate/NoDatastoreAccess.d.ts +8 -0
  26. package/dist/components/app-gate/NoDatastoreAccess.d.ts.map +1 -0
  27. package/dist/components/app-gate/NoDatastoreAccess.js +9 -0
  28. package/dist/components/app-gate/NoDatastoreAccess.js.map +1 -0
  29. package/dist/components/app-gate/NotFoundRoute.d.ts +2 -0
  30. package/dist/components/app-gate/NotFoundRoute.d.ts.map +1 -0
  31. package/dist/components/app-gate/NotFoundRoute.js +9 -0
  32. package/dist/components/app-gate/NotFoundRoute.js.map +1 -0
  33. package/dist/components/app-gate/PendingInvitations.d.ts +5 -0
  34. package/dist/components/app-gate/PendingInvitations.d.ts.map +1 -0
  35. package/dist/components/app-gate/PendingInvitations.js +58 -0
  36. package/dist/components/app-gate/PendingInvitations.js.map +1 -0
  37. package/dist/components/app-gate/ServiceError.d.ts +8 -0
  38. package/dist/components/app-gate/ServiceError.d.ts.map +1 -0
  39. package/dist/components/app-gate/ServiceError.js +10 -0
  40. package/dist/components/app-gate/ServiceError.js.map +1 -0
  41. package/dist/components/app-gate/index.d.ts +3 -0
  42. package/dist/components/app-gate/index.d.ts.map +1 -0
  43. package/dist/components/app-gate/index.js +3 -0
  44. package/dist/components/app-gate/index.js.map +1 -0
  45. package/dist/components/app-gate/sdk-route-elements.d.ts +23 -0
  46. package/dist/components/app-gate/sdk-route-elements.d.ts.map +1 -0
  47. package/dist/components/app-gate/sdk-route-elements.js +35 -0
  48. package/dist/components/app-gate/sdk-route-elements.js.map +1 -0
  49. package/dist/components/app-shell/AppShell.d.ts +7 -0
  50. package/dist/components/app-shell/AppShell.d.ts.map +1 -0
  51. package/dist/components/app-shell/AppShell.js +10 -0
  52. package/dist/components/app-shell/AppShell.js.map +1 -0
  53. package/dist/components/app-shell/AppShellRoutes.d.ts +9 -0
  54. package/dist/components/app-shell/AppShellRoutes.d.ts.map +1 -0
  55. package/dist/components/app-shell/AppShellRoutes.js +20 -0
  56. package/dist/components/app-shell/AppShellRoutes.js.map +1 -0
  57. package/dist/components/app-shell/GroupDatastores.d.ts +8 -0
  58. package/dist/components/app-shell/GroupDatastores.d.ts.map +1 -0
  59. package/dist/components/app-shell/GroupDatastores.js +15 -0
  60. package/dist/components/app-shell/GroupDatastores.js.map +1 -0
  61. package/dist/components/app-shell/GroupRoute.d.ts +2 -0
  62. package/dist/components/app-shell/GroupRoute.d.ts.map +1 -0
  63. package/dist/components/app-shell/GroupRoute.js +22 -0
  64. package/dist/components/app-shell/GroupRoute.js.map +1 -0
  65. package/dist/components/app-shell/index.d.ts +3 -0
  66. package/dist/components/app-shell/index.d.ts.map +1 -0
  67. package/dist/components/app-shell/index.js +3 -0
  68. package/dist/components/app-shell/index.js.map +1 -0
  69. package/dist/components/authenticated-chat/index.d.ts +1 -2
  70. package/dist/components/authenticated-chat/index.d.ts.map +1 -1
  71. package/dist/components/authenticated-chat/index.js +1 -12
  72. package/dist/components/authenticated-chat/index.js.map +1 -1
  73. package/dist/components/chat-view/Chat.d.ts +2 -1
  74. package/dist/components/chat-view/Chat.d.ts.map +1 -1
  75. package/dist/components/chat-view/Chat.js +3 -2
  76. package/dist/components/chat-view/Chat.js.map +1 -1
  77. package/dist/components/chat-view/MessageItem.d.ts.map +1 -1
  78. package/dist/components/chat-view/MessageItem.js +4 -2
  79. package/dist/components/chat-view/MessageItem.js.map +1 -1
  80. package/dist/components/chat-view/tool-part-rendering.d.ts +1 -0
  81. package/dist/components/chat-view/tool-part-rendering.d.ts.map +1 -1
  82. package/dist/components/chat-view/tool-part-rendering.js +8 -1
  83. package/dist/components/chat-view/tool-part-rendering.js.map +1 -1
  84. package/dist/components/chip/index.d.ts +1 -0
  85. package/dist/components/chip/index.d.ts.map +1 -1
  86. package/dist/components/chip/index.js +2 -1
  87. package/dist/components/chip/index.js.map +1 -1
  88. package/dist/components/embedded-chat/index.d.ts +1 -1
  89. package/dist/components/embedded-chat/index.d.ts.map +1 -1
  90. package/dist/components/embedded-chat/index.js +1 -1
  91. package/dist/components/embedded-chat/index.js.map +1 -1
  92. package/dist/components/input/input-date-time.d.ts +6 -0
  93. package/dist/components/input/input-date-time.d.ts.map +1 -1
  94. package/dist/components/input/input-date-time.js +2 -1
  95. package/dist/components/input/input-date-time.js.map +1 -1
  96. package/dist/components/input/input-date.d.ts +22 -0
  97. package/dist/components/input/input-date.d.ts.map +1 -1
  98. package/dist/components/input/input-date.js +28 -14
  99. package/dist/components/input/input-date.js.map +1 -1
  100. package/dist/components/input/input-time.d.ts +9 -0
  101. package/dist/components/input/input-time.d.ts.map +1 -1
  102. package/dist/components/input/input-time.js +29 -18
  103. package/dist/components/input/input-time.js.map +1 -1
  104. package/dist/components/layouts/RouteLayout.d.ts +0 -9
  105. package/dist/components/layouts/RouteLayout.d.ts.map +1 -1
  106. package/dist/components/layouts/RouteLayout.js +7 -4
  107. package/dist/components/layouts/RouteLayout.js.map +1 -1
  108. package/dist/components/layouts/Sidebar.d.ts +1 -8
  109. package/dist/components/layouts/Sidebar.d.ts.map +1 -1
  110. package/dist/components/layouts/Sidebar.js +7 -14
  111. package/dist/components/layouts/Sidebar.js.map +1 -1
  112. package/dist/components/plan-limits/PlanLimitsDialog.d.ts +20 -0
  113. package/dist/components/plan-limits/PlanLimitsDialog.d.ts.map +1 -0
  114. package/dist/components/plan-limits/PlanLimitsDialog.js +109 -0
  115. package/dist/components/plan-limits/PlanLimitsDialog.js.map +1 -0
  116. package/dist/components/plan-limits/index.d.ts +4 -0
  117. package/dist/components/plan-limits/index.d.ts.map +1 -0
  118. package/dist/components/plan-limits/index.js +2 -0
  119. package/dist/components/plan-limits/index.js.map +1 -0
  120. package/dist/components/plan-limits/plan-limits-client.d.ts +15 -0
  121. package/dist/components/plan-limits/plan-limits-client.d.ts.map +1 -0
  122. package/dist/components/plan-limits/plan-limits-client.js +44 -0
  123. package/dist/components/plan-limits/plan-limits-client.js.map +1 -0
  124. package/dist/components/plan-limits/plan-limits-model.d.ts +66 -0
  125. package/dist/components/plan-limits/plan-limits-model.d.ts.map +1 -0
  126. package/dist/components/plan-limits/plan-limits-model.js +123 -0
  127. package/dist/components/plan-limits/plan-limits-model.js.map +1 -0
  128. package/dist/components/plan-limits/plan-limits-save.d.ts +31 -0
  129. package/dist/components/plan-limits/plan-limits-save.d.ts.map +1 -0
  130. package/dist/components/plan-limits/plan-limits-save.js +43 -0
  131. package/dist/components/plan-limits/plan-limits-save.js.map +1 -0
  132. package/dist/components/planning/PlanLimitsAction.d.ts +6 -0
  133. package/dist/components/planning/PlanLimitsAction.d.ts.map +1 -0
  134. package/dist/components/planning/PlanLimitsAction.js +19 -0
  135. package/dist/components/planning/PlanLimitsAction.js.map +1 -0
  136. package/dist/components/slider/index.d.ts.map +1 -1
  137. package/dist/components/slider/index.js +2 -1
  138. package/dist/components/slider/index.js.map +1 -1
  139. package/dist/datastore-picker/datastore-picker-rows.d.ts +7 -0
  140. package/dist/datastore-picker/datastore-picker-rows.d.ts.map +1 -1
  141. package/dist/datastore-picker/datastore-picker-rows.js +26 -22
  142. package/dist/datastore-picker/datastore-picker-rows.js.map +1 -1
  143. package/dist/globals.css +85 -2
  144. package/dist/hooks/use-action-plans-list.d.ts +3 -0
  145. package/dist/hooks/use-action-plans-list.d.ts.map +1 -1
  146. package/dist/hooks/use-action-plans-list.js +8 -9
  147. package/dist/hooks/use-action-plans-list.js.map +1 -1
  148. package/dist/hooks/use-activity-feed.d.ts +10 -1
  149. package/dist/hooks/use-activity-feed.d.ts.map +1 -1
  150. package/dist/hooks/use-activity-feed.js +9 -11
  151. package/dist/hooks/use-activity-feed.js.map +1 -1
  152. package/dist/hooks/use-entity.d.ts +4 -3
  153. package/dist/hooks/use-entity.d.ts.map +1 -1
  154. package/dist/hooks/use-entity.js +4 -4
  155. package/dist/hooks/use-entity.js.map +1 -1
  156. package/dist/hooks/use-manual-actions.d.ts +1 -1
  157. package/dist/hooks/use-manual-actions.d.ts.map +1 -1
  158. package/dist/hooks/use-manual-actions.js +5 -5
  159. package/dist/hooks/use-manual-actions.js.map +1 -1
  160. package/dist/hooks/use-unsaved-changes-warning.d.ts +2 -0
  161. package/dist/hooks/use-unsaved-changes-warning.d.ts.map +1 -0
  162. package/dist/hooks/use-unsaved-changes-warning.js +13 -0
  163. package/dist/hooks/use-unsaved-changes-warning.js.map +1 -0
  164. package/dist/hooks/useAuth.d.ts.map +1 -1
  165. package/dist/hooks/useAuth.js +4 -3
  166. package/dist/hooks/useAuth.js.map +1 -1
  167. package/dist/hooks/useChatPanelSync.d.ts.map +1 -1
  168. package/dist/hooks/useChatPanelSync.js +2 -3
  169. package/dist/hooks/useChatPanelSync.js.map +1 -1
  170. package/dist/hooks/useDatastoreSelection.d.ts.map +1 -1
  171. package/dist/hooks/useDatastoreSelection.js +11 -4
  172. package/dist/hooks/useDatastoreSelection.js.map +1 -1
  173. package/dist/hooks/useExecuteAction.d.ts +1 -0
  174. package/dist/hooks/useExecuteAction.d.ts.map +1 -1
  175. package/dist/hooks/useExecuteAction.js.map +1 -1
  176. package/dist/hooks/useLoginRedirect.d.ts +6 -0
  177. package/dist/hooks/useLoginRedirect.d.ts.map +1 -0
  178. package/dist/hooks/useLoginRedirect.js +51 -0
  179. package/dist/hooks/useLoginRedirect.js.map +1 -0
  180. package/dist/hooks/usePlanLimits.d.ts +18 -0
  181. package/dist/hooks/usePlanLimits.d.ts.map +1 -0
  182. package/dist/hooks/usePlanLimits.js +56 -0
  183. package/dist/hooks/usePlanLimits.js.map +1 -0
  184. package/dist/ldo-ui.d.ts +1 -1
  185. package/dist/ldo-ui.d.ts.map +1 -1
  186. package/dist/ldo-ui.js.map +1 -1
  187. package/dist/lib/app-tools.d.ts +18 -0
  188. package/dist/lib/app-tools.d.ts.map +1 -0
  189. package/dist/lib/app-tools.js +42 -0
  190. package/dist/lib/app-tools.js.map +1 -0
  191. package/dist/lib/chat-types.d.ts +3 -0
  192. package/dist/lib/chat-types.d.ts.map +1 -1
  193. package/dist/lib/chat-types.js.map +1 -1
  194. package/dist/lib/datastore-route-table.d.ts +3 -0
  195. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  196. package/dist/lib/datastore-route-table.js +6 -0
  197. package/dist/lib/datastore-route-table.js.map +1 -1
  198. package/dist/lib/graphql-error.d.ts +2 -0
  199. package/dist/lib/graphql-error.d.ts.map +1 -0
  200. package/dist/lib/graphql-error.js +7 -0
  201. package/dist/lib/graphql-error.js.map +1 -0
  202. package/dist/lib/update-notice.d.ts +2 -1
  203. package/dist/lib/update-notice.d.ts.map +1 -1
  204. package/dist/lib/update-notice.js +8 -2
  205. package/dist/lib/update-notice.js.map +1 -1
  206. package/dist/providers/ActiveChatProvider.d.ts +2 -0
  207. package/dist/providers/ActiveChatProvider.d.ts.map +1 -1
  208. package/dist/providers/ActiveChatProvider.js +6 -3
  209. package/dist/providers/ActiveChatProvider.js.map +1 -1
  210. package/dist/providers/ActiveDatastoreProvider.d.ts +12 -0
  211. package/dist/providers/ActiveDatastoreProvider.d.ts.map +1 -1
  212. package/dist/providers/ActiveDatastoreProvider.js +114 -11
  213. package/dist/providers/ActiveDatastoreProvider.js.map +1 -1
  214. package/dist/providers/AuthContext.d.ts +1 -0
  215. package/dist/providers/AuthContext.d.ts.map +1 -1
  216. package/dist/providers/AuthContext.js.map +1 -1
  217. package/dist/providers/KnowledgeGraphStateContext.d.ts +2 -2
  218. package/dist/providers/KnowledgeGraphStateContext.d.ts.map +1 -1
  219. package/dist/providers/KnowledgeGraphStateProvider.d.ts.map +1 -1
  220. package/dist/providers/KnowledgeGraphStateProvider.js +8 -49
  221. package/dist/providers/KnowledgeGraphStateProvider.js.map +1 -1
  222. package/dist/providers/MantaClientProvider.d.ts.map +1 -1
  223. package/dist/providers/MantaClientProvider.js +3 -3
  224. package/dist/providers/MantaClientProvider.js.map +1 -1
  225. package/dist/providers/index.d.ts +3 -1
  226. package/dist/providers/index.d.ts.map +1 -1
  227. package/dist/providers/index.js +2 -2
  228. package/dist/providers/index.js.map +1 -1
  229. package/dist/routes/activity/detail/ActivityDetailRoute.d.ts.map +1 -1
  230. package/dist/routes/activity/detail/ActivityDetailRoute.js +1 -3
  231. package/dist/routes/activity/detail/ActivityDetailRoute.js.map +1 -1
  232. package/dist/routes/activity/index.d.ts.map +1 -1
  233. package/dist/routes/activity/index.js +1 -3
  234. package/dist/routes/activity/index.js.map +1 -1
  235. package/dist/routes/chat/index.d.ts +2 -21
  236. package/dist/routes/chat/index.d.ts.map +1 -1
  237. package/dist/routes/chat/index.js +4 -2
  238. package/dist/routes/chat/index.js.map +1 -1
  239. package/dist/routes/data-collection/index.d.ts.map +1 -1
  240. package/dist/routes/data-collection/index.js +1 -3
  241. package/dist/routes/data-collection/index.js.map +1 -1
  242. package/dist/routes/data-explorer/components/DataExplorerLayout.d.ts.map +1 -1
  243. package/dist/routes/data-explorer/components/DataExplorerLayout.js +1 -3
  244. package/dist/routes/data-explorer/components/DataExplorerLayout.js.map +1 -1
  245. package/dist/routes/data-explorer/components/class-detail/UsedByRules.js +2 -2
  246. package/dist/routes/data-explorer/components/class-detail/UsedByRules.js.map +1 -1
  247. package/dist/routes/datastores/index.d.ts.map +1 -1
  248. package/dist/routes/datastores/index.js +2 -2
  249. package/dist/routes/datastores/index.js.map +1 -1
  250. package/dist/routes/explain/index.d.ts.map +1 -1
  251. package/dist/routes/explain/index.js +1 -3
  252. package/dist/routes/explain/index.js.map +1 -1
  253. package/dist/routes/integrations/components/connect-forms/DashConnectForm.d.ts.map +1 -1
  254. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js +0 -1
  255. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js.map +1 -1
  256. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.d.ts.map +1 -1
  257. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js +0 -1
  258. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js.map +1 -1
  259. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.d.ts.map +1 -1
  260. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js +0 -1
  261. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js.map +1 -1
  262. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts.map +1 -1
  263. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js +0 -1
  264. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js.map +1 -1
  265. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts +0 -1
  266. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts.map +1 -1
  267. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js +3 -2
  268. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js.map +1 -1
  269. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.d.ts.map +1 -1
  270. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js +0 -1
  271. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js.map +1 -1
  272. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.d.ts.map +1 -1
  273. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js +0 -1
  274. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js.map +1 -1
  275. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts +0 -1
  276. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -1
  277. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +4 -3
  278. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js.map +1 -1
  279. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.d.ts.map +1 -1
  280. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js +0 -1
  281. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js.map +1 -1
  282. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.d.ts.map +1 -1
  283. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js +0 -1
  284. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js.map +1 -1
  285. package/dist/routes/integrations/types.d.ts +2 -1
  286. package/dist/routes/integrations/types.d.ts.map +1 -1
  287. package/dist/routes/integrations/types.js +16 -0
  288. package/dist/routes/integrations/types.js.map +1 -1
  289. package/dist/routes/memories/components/DateValueInput.d.ts +16 -0
  290. package/dist/routes/memories/components/DateValueInput.d.ts.map +1 -0
  291. package/dist/routes/memories/components/DateValueInput.js +35 -0
  292. package/dist/routes/memories/components/DateValueInput.js.map +1 -0
  293. package/dist/routes/memories/components/EntityValuePicker.d.ts +11 -0
  294. package/dist/routes/memories/components/EntityValuePicker.d.ts.map +1 -0
  295. package/dist/routes/memories/components/EntityValuePicker.js +61 -0
  296. package/dist/routes/memories/components/EntityValuePicker.js.map +1 -0
  297. package/dist/routes/memories/components/FieldLabel.d.ts +12 -0
  298. package/dist/routes/memories/components/FieldLabel.d.ts.map +1 -0
  299. package/dist/routes/memories/components/FieldLabel.js +12 -0
  300. package/dist/routes/memories/components/FieldLabel.js.map +1 -0
  301. package/dist/routes/memories/components/ImportanceSlider.d.ts +2 -0
  302. package/dist/routes/memories/components/ImportanceSlider.d.ts.map +1 -1
  303. package/dist/routes/memories/components/ImportanceSlider.js +4 -1
  304. package/dist/routes/memories/components/ImportanceSlider.js.map +1 -1
  305. package/dist/routes/memories/components/MemoriesFilters.d.ts +2 -2
  306. package/dist/routes/memories/components/MemoriesFilters.d.ts.map +1 -1
  307. package/dist/routes/memories/components/MemoriesFilters.js.map +1 -1
  308. package/dist/routes/memories/components/MemoriesPanel.d.ts.map +1 -1
  309. package/dist/routes/memories/components/MemoriesPanel.js +4 -0
  310. package/dist/routes/memories/components/MemoriesPanel.js.map +1 -1
  311. package/dist/routes/memories/components/MemoriesTabPanel.d.ts +2 -2
  312. package/dist/routes/memories/components/MemoriesTabPanel.d.ts.map +1 -1
  313. package/dist/routes/memories/components/MemoryActions.d.ts +2 -0
  314. package/dist/routes/memories/components/MemoryActions.d.ts.map +1 -1
  315. package/dist/routes/memories/components/MemoryActions.js +3 -3
  316. package/dist/routes/memories/components/MemoryActions.js.map +1 -1
  317. package/dist/routes/memories/components/MemoryFields.d.ts +15 -3
  318. package/dist/routes/memories/components/MemoryFields.d.ts.map +1 -1
  319. package/dist/routes/memories/components/MemoryFields.js +34 -5
  320. package/dist/routes/memories/components/MemoryFields.js.map +1 -1
  321. package/dist/routes/memories/components/MemoryFormDialog.d.ts +6 -3
  322. package/dist/routes/memories/components/MemoryFormDialog.d.ts.map +1 -1
  323. package/dist/routes/memories/components/MemoryFormDialog.js +105 -59
  324. package/dist/routes/memories/components/MemoryFormDialog.js.map +1 -1
  325. package/dist/routes/memories/components/MemoryPropertyFields.d.ts +10 -0
  326. package/dist/routes/memories/components/MemoryPropertyFields.d.ts.map +1 -0
  327. package/dist/routes/memories/components/MemoryPropertyFields.js +67 -0
  328. package/dist/routes/memories/components/MemoryPropertyFields.js.map +1 -0
  329. package/dist/routes/memories/components/RuleDraftDialog.d.ts +7 -0
  330. package/dist/routes/memories/components/RuleDraftDialog.d.ts.map +1 -0
  331. package/dist/routes/memories/components/RuleDraftDialog.js +20 -0
  332. package/dist/routes/memories/components/RuleDraftDialog.js.map +1 -0
  333. package/dist/routes/memories/components/SchemasTab.d.ts +17 -2
  334. package/dist/routes/memories/components/SchemasTab.d.ts.map +1 -1
  335. package/dist/routes/memories/components/SchemasTab.js +146 -28
  336. package/dist/routes/memories/components/SchemasTab.js.map +1 -1
  337. package/dist/routes/memories/components/badges.d.ts +7 -0
  338. package/dist/routes/memories/components/badges.d.ts.map +1 -1
  339. package/dist/routes/memories/components/badges.js +11 -3
  340. package/dist/routes/memories/components/badges.js.map +1 -1
  341. package/dist/routes/memories/hooks/useMemoryColumns.d.ts +4 -2
  342. package/dist/routes/memories/hooks/useMemoryColumns.d.ts.map +1 -1
  343. package/dist/routes/memories/hooks/useMemoryColumns.js +31 -15
  344. package/dist/routes/memories/hooks/useMemoryColumns.js.map +1 -1
  345. package/dist/routes/memories/index.d.ts +2 -1
  346. package/dist/routes/memories/index.d.ts.map +1 -1
  347. package/dist/routes/memories/index.js +72 -30
  348. package/dist/routes/memories/index.js.map +1 -1
  349. package/dist/routes/memories/memory-mutation-input.d.ts.map +1 -1
  350. package/dist/routes/memories/memory-mutation-input.js +5 -2
  351. package/dist/routes/memories/memory-mutation-input.js.map +1 -1
  352. package/dist/routes/memories/memory-property-values.d.ts +13 -0
  353. package/dist/routes/memories/memory-property-values.d.ts.map +1 -0
  354. package/dist/routes/memories/memory-property-values.js +40 -0
  355. package/dist/routes/memories/memory-property-values.js.map +1 -0
  356. package/dist/routes/memories/schemas/AllowedValuesField.d.ts +14 -0
  357. package/dist/routes/memories/schemas/AllowedValuesField.d.ts.map +1 -0
  358. package/dist/routes/memories/schemas/AllowedValuesField.js +64 -0
  359. package/dist/routes/memories/schemas/AllowedValuesField.js.map +1 -0
  360. package/dist/routes/memories/schemas/MemorySchemaPage.d.ts +127 -0
  361. package/dist/routes/memories/schemas/MemorySchemaPage.d.ts.map +1 -0
  362. package/dist/routes/memories/schemas/MemorySchemaPage.js +285 -0
  363. package/dist/routes/memories/schemas/MemorySchemaPage.js.map +1 -0
  364. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts +20 -0
  365. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts.map +1 -0
  366. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js +54 -0
  367. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js.map +1 -0
  368. package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts +15 -0
  369. package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts.map +1 -0
  370. package/dist/routes/memories/schemas/SchemaConfirmDialog.js +8 -0
  371. package/dist/routes/memories/schemas/SchemaConfirmDialog.js.map +1 -0
  372. package/dist/routes/memories/schemas/SchemaDetailPage.d.ts +15 -0
  373. package/dist/routes/memories/schemas/SchemaDetailPage.d.ts.map +1 -0
  374. package/dist/routes/memories/schemas/SchemaDetailPage.js +74 -0
  375. package/dist/routes/memories/schemas/SchemaDetailPage.js.map +1 -0
  376. package/dist/routes/memories/schemas/SchemaEditorForm.d.ts +10 -0
  377. package/dist/routes/memories/schemas/SchemaEditorForm.d.ts.map +1 -0
  378. package/dist/routes/memories/schemas/SchemaEditorForm.js +242 -0
  379. package/dist/routes/memories/schemas/SchemaEditorForm.js.map +1 -0
  380. package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts +13 -0
  381. package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts.map +1 -0
  382. package/dist/routes/memories/schemas/SchemaTemplatesDialog.js +13 -0
  383. package/dist/routes/memories/schemas/SchemaTemplatesDialog.js.map +1 -0
  384. package/dist/routes/memories/schemas/ValueTypeSelect.d.ts +12 -0
  385. package/dist/routes/memories/schemas/ValueTypeSelect.d.ts.map +1 -0
  386. package/dist/routes/memories/schemas/ValueTypeSelect.js +10 -0
  387. package/dist/routes/memories/schemas/ValueTypeSelect.js.map +1 -0
  388. package/dist/routes/memories/schemas/schema-form.d.ts +72 -0
  389. package/dist/routes/memories/schemas/schema-form.d.ts.map +1 -0
  390. package/dist/routes/memories/schemas/schema-form.js +279 -0
  391. package/dist/routes/memories/schemas/schema-form.js.map +1 -0
  392. package/dist/routes/memories/schemas/schema-impact.d.ts +13 -0
  393. package/dist/routes/memories/schemas/schema-impact.d.ts.map +1 -0
  394. package/dist/routes/memories/schemas/schema-impact.js +40 -0
  395. package/dist/routes/memories/schemas/schema-impact.js.map +1 -0
  396. package/dist/routes/memories/schemas/schema-route.d.ts +18 -0
  397. package/dist/routes/memories/schemas/schema-route.d.ts.map +1 -0
  398. package/dist/routes/memories/schemas/schema-route.js +21 -0
  399. package/dist/routes/memories/schemas/schema-route.js.map +1 -0
  400. package/dist/routes/memories/schemas/schema-rule-context.d.ts +17 -0
  401. package/dist/routes/memories/schemas/schema-rule-context.d.ts.map +1 -0
  402. package/dist/routes/memories/schemas/schema-rule-context.js +83 -0
  403. package/dist/routes/memories/schemas/schema-rule-context.js.map +1 -0
  404. package/dist/routes/memories/schemas/schema-table.d.ts +11 -0
  405. package/dist/routes/memories/schemas/schema-table.d.ts.map +1 -0
  406. package/dist/routes/memories/schemas/schema-table.js +34 -0
  407. package/dist/routes/memories/schemas/schema-table.js.map +1 -0
  408. package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts +32 -0
  409. package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts.map +1 -0
  410. package/dist/routes/memories/schemas/useMemorySchemaMutations.js +31 -0
  411. package/dist/routes/memories/schemas/useMemorySchemaMutations.js.map +1 -0
  412. package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts +51 -0
  413. package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts.map +1 -0
  414. package/dist/routes/memories/schemas/useSchemaChangeReview.js +175 -0
  415. package/dist/routes/memories/schemas/useSchemaChangeReview.js.map +1 -0
  416. package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts +46 -0
  417. package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts.map +1 -0
  418. package/dist/routes/memories/schemas/useSchemaLifecycle.js +93 -0
  419. package/dist/routes/memories/schemas/useSchemaLifecycle.js.map +1 -0
  420. package/dist/routes/memories/schemas/useSchemasTab.d.ts +18 -0
  421. package/dist/routes/memories/schemas/useSchemasTab.d.ts.map +1 -0
  422. package/dist/routes/memories/schemas/useSchemasTab.js +92 -0
  423. package/dist/routes/memories/schemas/useSchemasTab.js.map +1 -0
  424. package/dist/routes/plans/index.d.ts.map +1 -1
  425. package/dist/routes/plans/index.js +2 -2
  426. package/dist/routes/plans/index.js.map +1 -1
  427. package/dist/routes/rules/components/CreateRuleChatModal.d.ts +7 -1
  428. package/dist/routes/rules/components/CreateRuleChatModal.d.ts.map +1 -1
  429. package/dist/routes/rules/components/CreateRuleChatModal.js +9 -4
  430. package/dist/routes/rules/components/CreateRuleChatModal.js.map +1 -1
  431. package/dist/routes/rules/components/RuleValueControls.d.ts.map +1 -1
  432. package/dist/routes/rules/components/RuleValueControls.js +3 -24
  433. package/dist/routes/rules/components/RuleValueControls.js.map +1 -1
  434. package/dist/routes/rules/components/rule-value-input.d.ts +11 -0
  435. package/dist/routes/rules/components/rule-value-input.d.ts.map +1 -0
  436. package/dist/routes/rules/components/rule-value-input.js +24 -0
  437. package/dist/routes/rules/components/rule-value-input.js.map +1 -0
  438. package/dist/routes/rules/components/rules.utils.d.ts +5 -0
  439. package/dist/routes/rules/components/rules.utils.d.ts.map +1 -1
  440. package/dist/routes/rules/components/rules.utils.js +18 -3
  441. package/dist/routes/rules/components/rules.utils.js.map +1 -1
  442. package/dist/routes/rules/pages.d.ts +1 -1
  443. package/dist/routes/rules/pages.d.ts.map +1 -1
  444. package/dist/routes/rules/pages.js +1 -1
  445. package/dist/routes/rules/pages.js.map +1 -1
  446. package/dist/shared/graph-derived-queries.d.ts.map +1 -1
  447. package/dist/shared/graph-derived-queries.js +4 -1
  448. package/dist/shared/graph-derived-queries.js.map +1 -1
  449. package/dist/worker/index.d.ts +22 -0
  450. package/dist/worker/index.d.ts.map +1 -0
  451. package/dist/worker/index.js +110 -0
  452. package/dist/worker/index.js.map +1 -0
  453. package/dist/worker/policy.d.ts +21 -0
  454. package/dist/worker/policy.d.ts.map +1 -0
  455. package/dist/worker/policy.js +42 -0
  456. package/dist/worker/policy.js.map +1 -0
  457. package/dist/worker/proxy.d.ts +14 -0
  458. package/dist/worker/proxy.d.ts.map +1 -0
  459. package/dist/worker/proxy.js +58 -0
  460. package/dist/worker/proxy.js.map +1 -0
  461. package/dist/worker/session.d.ts +24 -0
  462. package/dist/worker/session.d.ts.map +1 -0
  463. package/dist/worker/session.js +72 -0
  464. package/dist/worker/session.js.map +1 -0
  465. package/package.json +52 -7
  466. package/src/app-subpaths.json +9 -1
  467. package/src/components/AppErrorBoundary.tsx +14 -11
  468. package/src/components/app-gate/AppGate.tsx +122 -0
  469. package/src/components/app-gate/AwaitingDatastoreStatus.tsx +35 -0
  470. package/src/components/app-gate/EnterDatastoreRoute.tsx +30 -0
  471. package/src/components/app-gate/ErrorRoute.tsx +43 -0
  472. package/src/components/app-gate/FailureAlert.tsx +15 -0
  473. package/src/components/app-gate/NoDatastoreAccess.tsx +26 -0
  474. package/src/components/app-gate/NotFoundRoute.tsx +20 -0
  475. package/src/components/app-gate/PendingInvitations.tsx +134 -0
  476. package/src/components/app-gate/ServiceError.tsx +27 -0
  477. package/src/components/app-gate/index.ts +2 -0
  478. package/src/components/app-gate/sdk-route-elements.tsx +46 -0
  479. package/src/components/app-shell/AppShell.tsx +22 -0
  480. package/src/components/app-shell/AppShellRoutes.tsx +34 -0
  481. package/src/components/app-shell/GroupDatastores.tsx +28 -0
  482. package/src/components/app-shell/GroupRoute.tsx +34 -0
  483. package/src/components/app-shell/index.ts +2 -0
  484. package/src/components/authenticated-chat/index.tsx +1 -34
  485. package/src/components/chat-view/Chat.tsx +9 -3
  486. package/src/components/chat-view/MessageItem.tsx +10 -2
  487. package/src/components/chat-view/tool-part-rendering.ts +10 -1
  488. package/src/components/chip/index.tsx +8 -1
  489. package/src/components/embedded-chat/index.tsx +2 -1
  490. package/src/components/input/input-date-time.tsx +10 -3
  491. package/src/components/input/input-date.tsx +93 -21
  492. package/src/components/input/input-time.tsx +59 -26
  493. package/src/components/layouts/RouteLayout.tsx +11 -50
  494. package/src/components/layouts/Sidebar.tsx +21 -23
  495. package/src/components/plan-limits/PlanLimitsDialog.tsx +331 -0
  496. package/src/components/plan-limits/index.tsx +3 -0
  497. package/src/components/plan-limits/plan-limits-client.ts +71 -0
  498. package/src/components/plan-limits/plan-limits-model.ts +180 -0
  499. package/src/components/plan-limits/plan-limits-save.ts +68 -0
  500. package/src/components/planning/PlanLimitsAction.tsx +44 -0
  501. package/src/components/slider/index.tsx +2 -1
  502. package/src/datastore-picker/datastore-picker-rows.ts +36 -20
  503. package/src/hooks/use-action-plans-list.ts +20 -12
  504. package/src/hooks/use-activity-feed.ts +30 -14
  505. package/src/hooks/use-entity.ts +11 -6
  506. package/src/hooks/use-manual-actions.ts +11 -6
  507. package/src/hooks/use-unsaved-changes-warning.ts +12 -0
  508. package/src/hooks/useAuth.ts +5 -3
  509. package/src/hooks/useChatPanelSync.ts +2 -3
  510. package/src/hooks/useDatastoreSelection.ts +10 -4
  511. package/src/hooks/useExecuteAction.ts +2 -0
  512. package/src/hooks/useLoginRedirect.ts +66 -0
  513. package/src/hooks/usePlanLimits.ts +97 -0
  514. package/src/ldo-ui.ts +1 -0
  515. package/src/lib/app-tools.ts +63 -0
  516. package/src/lib/chat-types.ts +5 -0
  517. package/src/lib/datastore-route-table.ts +9 -0
  518. package/src/lib/graphql-error.ts +7 -0
  519. package/src/lib/update-notice.ts +12 -2
  520. package/src/providers/ActiveChatProvider.tsx +8 -3
  521. package/src/providers/ActiveDatastoreProvider.tsx +179 -9
  522. package/src/providers/AuthContext.ts +1 -0
  523. package/src/providers/KnowledgeGraphStateContext.ts +2 -2
  524. package/src/providers/KnowledgeGraphStateProvider.tsx +13 -65
  525. package/src/providers/MantaClientProvider.tsx +8 -3
  526. package/src/providers/index.tsx +7 -4
  527. package/src/routes/activity/detail/ActivityDetailRoute.tsx +1 -10
  528. package/src/routes/activity/index.tsx +1 -10
  529. package/src/routes/chat/index.tsx +11 -47
  530. package/src/routes/data-collection/index.tsx +1 -11
  531. package/src/routes/data-explorer/components/DataExplorerLayout.tsx +1 -11
  532. package/src/routes/data-explorer/components/class-detail/UsedByRules.tsx +2 -2
  533. package/src/routes/datastores/index.tsx +3 -9
  534. package/src/routes/explain/index.tsx +1 -11
  535. package/src/routes/integrations/components/connect-forms/DashConnectForm.tsx +0 -1
  536. package/src/routes/integrations/components/connect-forms/GoogleAdsConnectForm.tsx +0 -1
  537. package/src/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.tsx +0 -1
  538. package/src/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.tsx +0 -1
  539. package/src/routes/integrations/components/connect-forms/InferalCredentialConnectForm.tsx +5 -3
  540. package/src/routes/integrations/components/connect-forms/KlaviyoConnectForm.tsx +0 -1
  541. package/src/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.tsx +0 -1
  542. package/src/routes/integrations/components/connect-forms/OAuthSetupConnectForm.tsx +7 -7
  543. package/src/routes/integrations/components/connect-forms/TriplewhaleConnectForm.tsx +0 -1
  544. package/src/routes/integrations/components/connect-forms/WoocommerceConnectForm.tsx +0 -1
  545. package/src/routes/integrations/types.ts +22 -6
  546. package/src/routes/memories/components/DateValueInput.tsx +72 -0
  547. package/src/routes/memories/components/EntityValuePicker.tsx +132 -0
  548. package/src/routes/memories/components/FieldLabel.tsx +49 -0
  549. package/src/routes/memories/components/ImportanceSlider.tsx +5 -1
  550. package/src/routes/memories/components/MemoriesFilters.tsx +2 -2
  551. package/src/routes/memories/components/MemoriesPanel.tsx +7 -3
  552. package/src/routes/memories/components/MemoriesTabPanel.tsx +2 -2
  553. package/src/routes/memories/components/MemoryActions.tsx +26 -2
  554. package/src/routes/memories/components/MemoryFields.tsx +75 -12
  555. package/src/routes/memories/components/MemoryFormDialog.tsx +305 -199
  556. package/src/routes/memories/components/MemoryPropertyFields.tsx +288 -0
  557. package/src/routes/memories/components/RuleDraftDialog.tsx +35 -0
  558. package/src/routes/memories/components/SchemasTab.tsx +481 -118
  559. package/src/routes/memories/components/badges.tsx +16 -4
  560. package/src/routes/memories/hooks/useMemoryColumns.tsx +69 -35
  561. package/src/routes/memories/index.tsx +125 -51
  562. package/src/routes/memories/memory-mutation-input.ts +5 -2
  563. package/src/routes/memories/memory-property-values.ts +83 -0
  564. package/src/routes/memories/schemas/AllowedValuesField.tsx +188 -0
  565. package/src/routes/memories/schemas/MemorySchemaPage.tsx +476 -0
  566. package/src/routes/memories/schemas/SchemaChangeReviewDialog.tsx +290 -0
  567. package/src/routes/memories/schemas/SchemaConfirmDialog.tsx +62 -0
  568. package/src/routes/memories/schemas/SchemaDetailPage.tsx +373 -0
  569. package/src/routes/memories/schemas/SchemaEditorForm.tsx +990 -0
  570. package/src/routes/memories/schemas/SchemaTemplatesDialog.tsx +81 -0
  571. package/src/routes/memories/schemas/ValueTypeSelect.tsx +37 -0
  572. package/src/routes/memories/schemas/schema-form.ts +360 -0
  573. package/src/routes/memories/schemas/schema-impact.ts +66 -0
  574. package/src/routes/memories/schemas/schema-route.ts +30 -0
  575. package/src/routes/memories/schemas/schema-rule-context.ts +103 -0
  576. package/src/routes/memories/schemas/schema-table.ts +54 -0
  577. package/src/routes/memories/schemas/useMemorySchemaMutations.ts +49 -0
  578. package/src/routes/memories/schemas/useSchemaChangeReview.ts +238 -0
  579. package/src/routes/memories/schemas/useSchemaLifecycle.tsx +151 -0
  580. package/src/routes/memories/schemas/useSchemasTab.ts +119 -0
  581. package/src/routes/plans/index.tsx +3 -14
  582. package/src/routes/rules/components/CreateRuleChatModal.tsx +46 -22
  583. package/src/routes/rules/components/RuleValueControls.tsx +3 -35
  584. package/src/routes/rules/components/rule-value-input.ts +34 -0
  585. package/src/routes/rules/components/rules.utils.ts +25 -3
  586. package/src/routes/rules/pages.ts +5 -1
  587. package/src/shared/graph-derived-queries.ts +6 -0
  588. package/src/themes/manta-dark.css +4 -0
  589. package/src/worker/index.ts +175 -0
  590. package/src/worker/policy.ts +62 -0
  591. package/src/worker/proxy.ts +101 -0
  592. 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.datastoreId ?? undefined;
52
- const selectable = isPresent(datastoreId) && !node.removed;
53
- const unprovisioned = !isPresent(datastoreId);
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: node.id,
63
+ headingId,
58
64
  item: {
59
- id: datastoreId ?? node.id,
60
- name: node.name,
61
- depth: pickerDepth(node.depth),
62
- treeDepth: node.depth ?? 0,
63
- active: selectable && datastoreId === currentDatastoreId,
65
+ id,
66
+ name,
67
+ depth: pickerDepth(depth),
68
+ treeDepth: depth ?? 0,
69
+ active: selectable && id === currentDatastoreId,
64
70
  heading: !selectable,
65
- ...(unprovisioned ? { note: operatorUnprovisionedNote } : {}),
66
- ...(node.removed ? { note: removedDatastoreNote } : {}),
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
- const head = entries[index];
95
- if (!head) return false;
96
- const headDepth = depthOf(head);
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
- for (let next = index + 1; next < entries.length; next++) {
99
- const entry = entries[next];
100
- if (!entry || depthOf(entry) <= headDepth) return false;
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
- if (pageBindings.length === 0) return new Map();
510
-
511
- const bindingGroups: RDF.Bindings[][] = [];
512
- for (const batch of splitEvery(detailGraphBatchSize, pageBindings)) {
513
- const stream = await engine.queryBindings(buildDetailBatchQuery(batch.map((binding) => binding.graph)), context);
514
- bindingGroups.push(await collectBindings(stream));
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
- const bindings = bindingGroups.flat();
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
- export function useActivityFeed(config: UseActivityFeedOptions = {}) {
236
- const { page = 1, pageSize = 10, enabled = true, filters } = config;
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 [pageStream, countStream] = await Promise.all([
246
- engine.queryBindings(buildActivityFeedQuery(pageSize, offset, filters), context),
247
- engine.queryBindings(buildActivityFeedCountQuery(filters), context),
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
  },
@@ -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) => ["ldo-ui", "entities", schema] as const;
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 UseEntitiesOptions<S extends Schema> = {
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
- return lens.find();
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(options: Options, planGraphIris: string[]) {
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
+ }
@@ -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 { valid: false, canSwitchDatastore: false, allowedModels: [] };
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("/graphql", mantaBaseUrl), {
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 { decodeRuleRouteName } from "../routes/rules/components/rules.utils";
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: expandPrefix(`:${decodeRuleRouteName(ruleName)}`),
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("/api/switch-datastore", mantaBaseUrl), {
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
+ }
package/src/ldo-ui.ts CHANGED
@@ -22,6 +22,7 @@ export {
22
22
  useEntity,
23
23
  useEntities,
24
24
  useEntitiesByIris,
25
+ type EntitiesPage,
25
26
  type Entity,
26
27
  type UseEntitiesByIrisOptions,
27
28
  type UseEntitiesOptions,