@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.
Files changed (585) 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/MantaClientProvider.d.ts.map +1 -1
  218. package/dist/providers/MantaClientProvider.js +3 -3
  219. package/dist/providers/MantaClientProvider.js.map +1 -1
  220. package/dist/providers/index.d.ts +3 -1
  221. package/dist/providers/index.d.ts.map +1 -1
  222. package/dist/providers/index.js +2 -2
  223. package/dist/providers/index.js.map +1 -1
  224. package/dist/routes/activity/detail/ActivityDetailRoute.d.ts.map +1 -1
  225. package/dist/routes/activity/detail/ActivityDetailRoute.js +1 -3
  226. package/dist/routes/activity/detail/ActivityDetailRoute.js.map +1 -1
  227. package/dist/routes/activity/index.d.ts.map +1 -1
  228. package/dist/routes/activity/index.js +1 -3
  229. package/dist/routes/activity/index.js.map +1 -1
  230. package/dist/routes/chat/index.d.ts +2 -21
  231. package/dist/routes/chat/index.d.ts.map +1 -1
  232. package/dist/routes/chat/index.js +4 -2
  233. package/dist/routes/chat/index.js.map +1 -1
  234. package/dist/routes/data-collection/index.d.ts.map +1 -1
  235. package/dist/routes/data-collection/index.js +1 -3
  236. package/dist/routes/data-collection/index.js.map +1 -1
  237. package/dist/routes/data-explorer/components/DataExplorerLayout.d.ts.map +1 -1
  238. package/dist/routes/data-explorer/components/DataExplorerLayout.js +1 -3
  239. package/dist/routes/data-explorer/components/DataExplorerLayout.js.map +1 -1
  240. package/dist/routes/data-explorer/components/class-detail/UsedByRules.js +2 -2
  241. package/dist/routes/data-explorer/components/class-detail/UsedByRules.js.map +1 -1
  242. package/dist/routes/datastores/index.d.ts.map +1 -1
  243. package/dist/routes/datastores/index.js +2 -2
  244. package/dist/routes/datastores/index.js.map +1 -1
  245. package/dist/routes/explain/index.d.ts.map +1 -1
  246. package/dist/routes/explain/index.js +1 -3
  247. package/dist/routes/explain/index.js.map +1 -1
  248. package/dist/routes/integrations/components/connect-forms/DashConnectForm.d.ts.map +1 -1
  249. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js +0 -1
  250. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js.map +1 -1
  251. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.d.ts.map +1 -1
  252. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js +0 -1
  253. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js.map +1 -1
  254. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.d.ts.map +1 -1
  255. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js +0 -1
  256. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js.map +1 -1
  257. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts.map +1 -1
  258. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js +0 -1
  259. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js.map +1 -1
  260. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts +0 -1
  261. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts.map +1 -1
  262. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js +3 -2
  263. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js.map +1 -1
  264. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.d.ts.map +1 -1
  265. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js +0 -1
  266. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js.map +1 -1
  267. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.d.ts.map +1 -1
  268. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js +0 -1
  269. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js.map +1 -1
  270. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts +0 -1
  271. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -1
  272. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +4 -3
  273. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js.map +1 -1
  274. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.d.ts.map +1 -1
  275. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js +0 -1
  276. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js.map +1 -1
  277. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.d.ts.map +1 -1
  278. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js +0 -1
  279. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js.map +1 -1
  280. package/dist/routes/integrations/types.d.ts +2 -1
  281. package/dist/routes/integrations/types.d.ts.map +1 -1
  282. package/dist/routes/integrations/types.js +16 -0
  283. package/dist/routes/integrations/types.js.map +1 -1
  284. package/dist/routes/memories/components/DateValueInput.d.ts +16 -0
  285. package/dist/routes/memories/components/DateValueInput.d.ts.map +1 -0
  286. package/dist/routes/memories/components/DateValueInput.js +35 -0
  287. package/dist/routes/memories/components/DateValueInput.js.map +1 -0
  288. package/dist/routes/memories/components/EntityValuePicker.d.ts +11 -0
  289. package/dist/routes/memories/components/EntityValuePicker.d.ts.map +1 -0
  290. package/dist/routes/memories/components/EntityValuePicker.js +61 -0
  291. package/dist/routes/memories/components/EntityValuePicker.js.map +1 -0
  292. package/dist/routes/memories/components/FieldLabel.d.ts +12 -0
  293. package/dist/routes/memories/components/FieldLabel.d.ts.map +1 -0
  294. package/dist/routes/memories/components/FieldLabel.js +12 -0
  295. package/dist/routes/memories/components/FieldLabel.js.map +1 -0
  296. package/dist/routes/memories/components/ImportanceSlider.d.ts +2 -0
  297. package/dist/routes/memories/components/ImportanceSlider.d.ts.map +1 -1
  298. package/dist/routes/memories/components/ImportanceSlider.js +4 -1
  299. package/dist/routes/memories/components/ImportanceSlider.js.map +1 -1
  300. package/dist/routes/memories/components/MemoriesFilters.d.ts +2 -2
  301. package/dist/routes/memories/components/MemoriesFilters.d.ts.map +1 -1
  302. package/dist/routes/memories/components/MemoriesFilters.js.map +1 -1
  303. package/dist/routes/memories/components/MemoriesPanel.d.ts.map +1 -1
  304. package/dist/routes/memories/components/MemoriesPanel.js +4 -0
  305. package/dist/routes/memories/components/MemoriesPanel.js.map +1 -1
  306. package/dist/routes/memories/components/MemoriesTabPanel.d.ts +2 -2
  307. package/dist/routes/memories/components/MemoriesTabPanel.d.ts.map +1 -1
  308. package/dist/routes/memories/components/MemoryActions.d.ts +2 -0
  309. package/dist/routes/memories/components/MemoryActions.d.ts.map +1 -1
  310. package/dist/routes/memories/components/MemoryActions.js +3 -3
  311. package/dist/routes/memories/components/MemoryActions.js.map +1 -1
  312. package/dist/routes/memories/components/MemoryFields.d.ts +15 -3
  313. package/dist/routes/memories/components/MemoryFields.d.ts.map +1 -1
  314. package/dist/routes/memories/components/MemoryFields.js +34 -5
  315. package/dist/routes/memories/components/MemoryFields.js.map +1 -1
  316. package/dist/routes/memories/components/MemoryFormDialog.d.ts +6 -3
  317. package/dist/routes/memories/components/MemoryFormDialog.d.ts.map +1 -1
  318. package/dist/routes/memories/components/MemoryFormDialog.js +105 -59
  319. package/dist/routes/memories/components/MemoryFormDialog.js.map +1 -1
  320. package/dist/routes/memories/components/MemoryPropertyFields.d.ts +10 -0
  321. package/dist/routes/memories/components/MemoryPropertyFields.d.ts.map +1 -0
  322. package/dist/routes/memories/components/MemoryPropertyFields.js +67 -0
  323. package/dist/routes/memories/components/MemoryPropertyFields.js.map +1 -0
  324. package/dist/routes/memories/components/RuleDraftDialog.d.ts +7 -0
  325. package/dist/routes/memories/components/RuleDraftDialog.d.ts.map +1 -0
  326. package/dist/routes/memories/components/RuleDraftDialog.js +20 -0
  327. package/dist/routes/memories/components/RuleDraftDialog.js.map +1 -0
  328. package/dist/routes/memories/components/SchemasTab.d.ts +17 -2
  329. package/dist/routes/memories/components/SchemasTab.d.ts.map +1 -1
  330. package/dist/routes/memories/components/SchemasTab.js +146 -28
  331. package/dist/routes/memories/components/SchemasTab.js.map +1 -1
  332. package/dist/routes/memories/components/badges.d.ts +7 -0
  333. package/dist/routes/memories/components/badges.d.ts.map +1 -1
  334. package/dist/routes/memories/components/badges.js +11 -3
  335. package/dist/routes/memories/components/badges.js.map +1 -1
  336. package/dist/routes/memories/hooks/useMemoryColumns.d.ts +4 -2
  337. package/dist/routes/memories/hooks/useMemoryColumns.d.ts.map +1 -1
  338. package/dist/routes/memories/hooks/useMemoryColumns.js +31 -15
  339. package/dist/routes/memories/hooks/useMemoryColumns.js.map +1 -1
  340. package/dist/routes/memories/index.d.ts +2 -1
  341. package/dist/routes/memories/index.d.ts.map +1 -1
  342. package/dist/routes/memories/index.js +72 -30
  343. package/dist/routes/memories/index.js.map +1 -1
  344. package/dist/routes/memories/memory-mutation-input.d.ts.map +1 -1
  345. package/dist/routes/memories/memory-mutation-input.js +5 -2
  346. package/dist/routes/memories/memory-mutation-input.js.map +1 -1
  347. package/dist/routes/memories/memory-property-values.d.ts +13 -0
  348. package/dist/routes/memories/memory-property-values.d.ts.map +1 -0
  349. package/dist/routes/memories/memory-property-values.js +40 -0
  350. package/dist/routes/memories/memory-property-values.js.map +1 -0
  351. package/dist/routes/memories/schemas/AllowedValuesField.d.ts +14 -0
  352. package/dist/routes/memories/schemas/AllowedValuesField.d.ts.map +1 -0
  353. package/dist/routes/memories/schemas/AllowedValuesField.js +64 -0
  354. package/dist/routes/memories/schemas/AllowedValuesField.js.map +1 -0
  355. package/dist/routes/memories/schemas/MemorySchemaPage.d.ts +127 -0
  356. package/dist/routes/memories/schemas/MemorySchemaPage.d.ts.map +1 -0
  357. package/dist/routes/memories/schemas/MemorySchemaPage.js +285 -0
  358. package/dist/routes/memories/schemas/MemorySchemaPage.js.map +1 -0
  359. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts +20 -0
  360. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts.map +1 -0
  361. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js +54 -0
  362. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js.map +1 -0
  363. package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts +15 -0
  364. package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts.map +1 -0
  365. package/dist/routes/memories/schemas/SchemaConfirmDialog.js +8 -0
  366. package/dist/routes/memories/schemas/SchemaConfirmDialog.js.map +1 -0
  367. package/dist/routes/memories/schemas/SchemaDetailPage.d.ts +15 -0
  368. package/dist/routes/memories/schemas/SchemaDetailPage.d.ts.map +1 -0
  369. package/dist/routes/memories/schemas/SchemaDetailPage.js +74 -0
  370. package/dist/routes/memories/schemas/SchemaDetailPage.js.map +1 -0
  371. package/dist/routes/memories/schemas/SchemaEditorForm.d.ts +10 -0
  372. package/dist/routes/memories/schemas/SchemaEditorForm.d.ts.map +1 -0
  373. package/dist/routes/memories/schemas/SchemaEditorForm.js +242 -0
  374. package/dist/routes/memories/schemas/SchemaEditorForm.js.map +1 -0
  375. package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts +13 -0
  376. package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts.map +1 -0
  377. package/dist/routes/memories/schemas/SchemaTemplatesDialog.js +13 -0
  378. package/dist/routes/memories/schemas/SchemaTemplatesDialog.js.map +1 -0
  379. package/dist/routes/memories/schemas/ValueTypeSelect.d.ts +12 -0
  380. package/dist/routes/memories/schemas/ValueTypeSelect.d.ts.map +1 -0
  381. package/dist/routes/memories/schemas/ValueTypeSelect.js +10 -0
  382. package/dist/routes/memories/schemas/ValueTypeSelect.js.map +1 -0
  383. package/dist/routes/memories/schemas/schema-form.d.ts +72 -0
  384. package/dist/routes/memories/schemas/schema-form.d.ts.map +1 -0
  385. package/dist/routes/memories/schemas/schema-form.js +279 -0
  386. package/dist/routes/memories/schemas/schema-form.js.map +1 -0
  387. package/dist/routes/memories/schemas/schema-impact.d.ts +13 -0
  388. package/dist/routes/memories/schemas/schema-impact.d.ts.map +1 -0
  389. package/dist/routes/memories/schemas/schema-impact.js +40 -0
  390. package/dist/routes/memories/schemas/schema-impact.js.map +1 -0
  391. package/dist/routes/memories/schemas/schema-route.d.ts +18 -0
  392. package/dist/routes/memories/schemas/schema-route.d.ts.map +1 -0
  393. package/dist/routes/memories/schemas/schema-route.js +21 -0
  394. package/dist/routes/memories/schemas/schema-route.js.map +1 -0
  395. package/dist/routes/memories/schemas/schema-rule-context.d.ts +17 -0
  396. package/dist/routes/memories/schemas/schema-rule-context.d.ts.map +1 -0
  397. package/dist/routes/memories/schemas/schema-rule-context.js +83 -0
  398. package/dist/routes/memories/schemas/schema-rule-context.js.map +1 -0
  399. package/dist/routes/memories/schemas/schema-table.d.ts +11 -0
  400. package/dist/routes/memories/schemas/schema-table.d.ts.map +1 -0
  401. package/dist/routes/memories/schemas/schema-table.js +34 -0
  402. package/dist/routes/memories/schemas/schema-table.js.map +1 -0
  403. package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts +32 -0
  404. package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts.map +1 -0
  405. package/dist/routes/memories/schemas/useMemorySchemaMutations.js +31 -0
  406. package/dist/routes/memories/schemas/useMemorySchemaMutations.js.map +1 -0
  407. package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts +51 -0
  408. package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts.map +1 -0
  409. package/dist/routes/memories/schemas/useSchemaChangeReview.js +175 -0
  410. package/dist/routes/memories/schemas/useSchemaChangeReview.js.map +1 -0
  411. package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts +46 -0
  412. package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts.map +1 -0
  413. package/dist/routes/memories/schemas/useSchemaLifecycle.js +93 -0
  414. package/dist/routes/memories/schemas/useSchemaLifecycle.js.map +1 -0
  415. package/dist/routes/memories/schemas/useSchemasTab.d.ts +18 -0
  416. package/dist/routes/memories/schemas/useSchemasTab.d.ts.map +1 -0
  417. package/dist/routes/memories/schemas/useSchemasTab.js +92 -0
  418. package/dist/routes/memories/schemas/useSchemasTab.js.map +1 -0
  419. package/dist/routes/plans/index.d.ts.map +1 -1
  420. package/dist/routes/plans/index.js +2 -2
  421. package/dist/routes/plans/index.js.map +1 -1
  422. package/dist/routes/rules/components/CreateRuleChatModal.d.ts +7 -1
  423. package/dist/routes/rules/components/CreateRuleChatModal.d.ts.map +1 -1
  424. package/dist/routes/rules/components/CreateRuleChatModal.js +9 -4
  425. package/dist/routes/rules/components/CreateRuleChatModal.js.map +1 -1
  426. package/dist/routes/rules/components/RuleValueControls.d.ts.map +1 -1
  427. package/dist/routes/rules/components/RuleValueControls.js +3 -24
  428. package/dist/routes/rules/components/RuleValueControls.js.map +1 -1
  429. package/dist/routes/rules/components/rule-value-input.d.ts +11 -0
  430. package/dist/routes/rules/components/rule-value-input.d.ts.map +1 -0
  431. package/dist/routes/rules/components/rule-value-input.js +24 -0
  432. package/dist/routes/rules/components/rule-value-input.js.map +1 -0
  433. package/dist/routes/rules/components/rules.utils.d.ts +5 -0
  434. package/dist/routes/rules/components/rules.utils.d.ts.map +1 -1
  435. package/dist/routes/rules/components/rules.utils.js +18 -3
  436. package/dist/routes/rules/components/rules.utils.js.map +1 -1
  437. package/dist/routes/rules/pages.d.ts +1 -1
  438. package/dist/routes/rules/pages.d.ts.map +1 -1
  439. package/dist/routes/rules/pages.js +1 -1
  440. package/dist/routes/rules/pages.js.map +1 -1
  441. package/dist/shared/graph-derived-queries.d.ts.map +1 -1
  442. package/dist/shared/graph-derived-queries.js +4 -1
  443. package/dist/shared/graph-derived-queries.js.map +1 -1
  444. package/dist/worker/index.d.ts +22 -0
  445. package/dist/worker/index.d.ts.map +1 -0
  446. package/dist/worker/index.js +110 -0
  447. package/dist/worker/index.js.map +1 -0
  448. package/dist/worker/policy.d.ts +21 -0
  449. package/dist/worker/policy.d.ts.map +1 -0
  450. package/dist/worker/policy.js +42 -0
  451. package/dist/worker/policy.js.map +1 -0
  452. package/dist/worker/proxy.d.ts +14 -0
  453. package/dist/worker/proxy.d.ts.map +1 -0
  454. package/dist/worker/proxy.js +58 -0
  455. package/dist/worker/proxy.js.map +1 -0
  456. package/dist/worker/session.d.ts +24 -0
  457. package/dist/worker/session.d.ts.map +1 -0
  458. package/dist/worker/session.js +72 -0
  459. package/dist/worker/session.js.map +1 -0
  460. package/package.json +52 -7
  461. package/src/app-subpaths.json +9 -1
  462. package/src/components/AppErrorBoundary.tsx +14 -11
  463. package/src/components/app-gate/AppGate.tsx +122 -0
  464. package/src/components/app-gate/AwaitingDatastoreStatus.tsx +35 -0
  465. package/src/components/app-gate/EnterDatastoreRoute.tsx +30 -0
  466. package/src/components/app-gate/ErrorRoute.tsx +43 -0
  467. package/src/components/app-gate/FailureAlert.tsx +15 -0
  468. package/src/components/app-gate/NoDatastoreAccess.tsx +26 -0
  469. package/src/components/app-gate/NotFoundRoute.tsx +20 -0
  470. package/src/components/app-gate/PendingInvitations.tsx +134 -0
  471. package/src/components/app-gate/ServiceError.tsx +27 -0
  472. package/src/components/app-gate/index.ts +2 -0
  473. package/src/components/app-gate/sdk-route-elements.tsx +46 -0
  474. package/src/components/app-shell/AppShell.tsx +22 -0
  475. package/src/components/app-shell/AppShellRoutes.tsx +34 -0
  476. package/src/components/app-shell/GroupDatastores.tsx +28 -0
  477. package/src/components/app-shell/GroupRoute.tsx +34 -0
  478. package/src/components/app-shell/index.ts +2 -0
  479. package/src/components/authenticated-chat/index.tsx +1 -34
  480. package/src/components/chat-view/Chat.tsx +9 -3
  481. package/src/components/chat-view/MessageItem.tsx +10 -2
  482. package/src/components/chat-view/tool-part-rendering.ts +10 -1
  483. package/src/components/chip/index.tsx +8 -1
  484. package/src/components/embedded-chat/index.tsx +2 -1
  485. package/src/components/input/input-date-time.tsx +10 -3
  486. package/src/components/input/input-date.tsx +93 -21
  487. package/src/components/input/input-time.tsx +59 -26
  488. package/src/components/layouts/RouteLayout.tsx +11 -50
  489. package/src/components/layouts/Sidebar.tsx +21 -23
  490. package/src/components/plan-limits/PlanLimitsDialog.tsx +331 -0
  491. package/src/components/plan-limits/index.tsx +3 -0
  492. package/src/components/plan-limits/plan-limits-client.ts +71 -0
  493. package/src/components/plan-limits/plan-limits-model.ts +180 -0
  494. package/src/components/plan-limits/plan-limits-save.ts +68 -0
  495. package/src/components/planning/PlanLimitsAction.tsx +44 -0
  496. package/src/components/slider/index.tsx +2 -1
  497. package/src/datastore-picker/datastore-picker-rows.ts +36 -20
  498. package/src/hooks/use-action-plans-list.ts +20 -12
  499. package/src/hooks/use-activity-feed.ts +30 -14
  500. package/src/hooks/use-entity.ts +11 -6
  501. package/src/hooks/use-manual-actions.ts +11 -6
  502. package/src/hooks/use-unsaved-changes-warning.ts +12 -0
  503. package/src/hooks/useAuth.ts +5 -3
  504. package/src/hooks/useChatPanelSync.ts +2 -3
  505. package/src/hooks/useDatastoreSelection.ts +10 -4
  506. package/src/hooks/useExecuteAction.ts +2 -0
  507. package/src/hooks/useLoginRedirect.ts +66 -0
  508. package/src/hooks/usePlanLimits.ts +97 -0
  509. package/src/ldo-ui.ts +1 -0
  510. package/src/lib/app-tools.ts +63 -0
  511. package/src/lib/chat-types.ts +5 -0
  512. package/src/lib/datastore-route-table.ts +9 -0
  513. package/src/lib/graphql-error.ts +7 -0
  514. package/src/lib/update-notice.ts +12 -2
  515. package/src/providers/ActiveChatProvider.tsx +8 -3
  516. package/src/providers/ActiveDatastoreProvider.tsx +179 -9
  517. package/src/providers/AuthContext.ts +1 -0
  518. package/src/providers/MantaClientProvider.tsx +8 -3
  519. package/src/providers/index.tsx +7 -4
  520. package/src/routes/activity/detail/ActivityDetailRoute.tsx +1 -10
  521. package/src/routes/activity/index.tsx +1 -10
  522. package/src/routes/chat/index.tsx +11 -47
  523. package/src/routes/data-collection/index.tsx +1 -11
  524. package/src/routes/data-explorer/components/DataExplorerLayout.tsx +1 -11
  525. package/src/routes/data-explorer/components/class-detail/UsedByRules.tsx +2 -2
  526. package/src/routes/datastores/index.tsx +3 -9
  527. package/src/routes/explain/index.tsx +1 -11
  528. package/src/routes/integrations/components/connect-forms/DashConnectForm.tsx +0 -1
  529. package/src/routes/integrations/components/connect-forms/GoogleAdsConnectForm.tsx +0 -1
  530. package/src/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.tsx +0 -1
  531. package/src/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.tsx +0 -1
  532. package/src/routes/integrations/components/connect-forms/InferalCredentialConnectForm.tsx +5 -3
  533. package/src/routes/integrations/components/connect-forms/KlaviyoConnectForm.tsx +0 -1
  534. package/src/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.tsx +0 -1
  535. package/src/routes/integrations/components/connect-forms/OAuthSetupConnectForm.tsx +7 -7
  536. package/src/routes/integrations/components/connect-forms/TriplewhaleConnectForm.tsx +0 -1
  537. package/src/routes/integrations/components/connect-forms/WoocommerceConnectForm.tsx +0 -1
  538. package/src/routes/integrations/types.ts +22 -6
  539. package/src/routes/memories/components/DateValueInput.tsx +72 -0
  540. package/src/routes/memories/components/EntityValuePicker.tsx +132 -0
  541. package/src/routes/memories/components/FieldLabel.tsx +49 -0
  542. package/src/routes/memories/components/ImportanceSlider.tsx +5 -1
  543. package/src/routes/memories/components/MemoriesFilters.tsx +2 -2
  544. package/src/routes/memories/components/MemoriesPanel.tsx +7 -3
  545. package/src/routes/memories/components/MemoriesTabPanel.tsx +2 -2
  546. package/src/routes/memories/components/MemoryActions.tsx +26 -2
  547. package/src/routes/memories/components/MemoryFields.tsx +75 -12
  548. package/src/routes/memories/components/MemoryFormDialog.tsx +305 -199
  549. package/src/routes/memories/components/MemoryPropertyFields.tsx +288 -0
  550. package/src/routes/memories/components/RuleDraftDialog.tsx +35 -0
  551. package/src/routes/memories/components/SchemasTab.tsx +481 -118
  552. package/src/routes/memories/components/badges.tsx +16 -4
  553. package/src/routes/memories/hooks/useMemoryColumns.tsx +69 -35
  554. package/src/routes/memories/index.tsx +125 -51
  555. package/src/routes/memories/memory-mutation-input.ts +5 -2
  556. package/src/routes/memories/memory-property-values.ts +83 -0
  557. package/src/routes/memories/schemas/AllowedValuesField.tsx +188 -0
  558. package/src/routes/memories/schemas/MemorySchemaPage.tsx +476 -0
  559. package/src/routes/memories/schemas/SchemaChangeReviewDialog.tsx +290 -0
  560. package/src/routes/memories/schemas/SchemaConfirmDialog.tsx +62 -0
  561. package/src/routes/memories/schemas/SchemaDetailPage.tsx +373 -0
  562. package/src/routes/memories/schemas/SchemaEditorForm.tsx +990 -0
  563. package/src/routes/memories/schemas/SchemaTemplatesDialog.tsx +81 -0
  564. package/src/routes/memories/schemas/ValueTypeSelect.tsx +37 -0
  565. package/src/routes/memories/schemas/schema-form.ts +360 -0
  566. package/src/routes/memories/schemas/schema-impact.ts +66 -0
  567. package/src/routes/memories/schemas/schema-route.ts +30 -0
  568. package/src/routes/memories/schemas/schema-rule-context.ts +103 -0
  569. package/src/routes/memories/schemas/schema-table.ts +54 -0
  570. package/src/routes/memories/schemas/useMemorySchemaMutations.ts +49 -0
  571. package/src/routes/memories/schemas/useSchemaChangeReview.ts +238 -0
  572. package/src/routes/memories/schemas/useSchemaLifecycle.tsx +151 -0
  573. package/src/routes/memories/schemas/useSchemasTab.ts +119 -0
  574. package/src/routes/plans/index.tsx +3 -14
  575. package/src/routes/rules/components/CreateRuleChatModal.tsx +46 -22
  576. package/src/routes/rules/components/RuleValueControls.tsx +3 -35
  577. package/src/routes/rules/components/rule-value-input.ts +34 -0
  578. package/src/routes/rules/components/rules.utils.ts +25 -3
  579. package/src/routes/rules/pages.ts +5 -1
  580. package/src/shared/graph-derived-queries.ts +6 -0
  581. package/src/themes/manta-dark.css +4 -0
  582. package/src/worker/index.ts +175 -0
  583. package/src/worker/policy.ts +62 -0
  584. package/src/worker/proxy.ts +101 -0
  585. package/src/worker/session.ts +111 -0
@@ -1,15 +1,21 @@
1
1
  import type { GQLMemoryKind } from "@manta-eu/client";
2
- import { type GQLConflictingMemory, type GQLMemory, type GQLMemorySchema } from "@manta-eu/client";
2
+ import {
3
+ GQLMemorySchemaStatus,
4
+ type GQLConflictingMemory,
5
+ type GQLMemory,
6
+ type GQLMemorySchemaFieldsFragment,
7
+ } from "@manta-eu/client";
3
8
  import { isTrustedUntilExpiringSoon } from "@manta-eu/client/shared/memory-preload-gate";
4
9
  import { formatEntityName } from "@manta-eu/client/shared/rdf-namespaces";
5
10
  import { isPresent } from "@manta-eu/lib/present";
6
11
  import type { ColumnDef } from "@tanstack/react-table";
7
12
  import { addDays, format, formatDistanceToNow, isBefore } from "date-fns";
8
- import { ChevronDown, Clock } from "lucide-react";
13
+ import { Clock } from "lucide-react";
9
14
  import type { ReactNode } from "react";
10
15
  import { useMemo } from "react";
11
16
  import {
12
17
  AutoCapturedBadge,
18
+ autoAssignedNote,
13
19
  DuplicateBadge,
14
20
  KindBadge,
15
21
  MemoryAbout,
@@ -89,18 +95,31 @@ function MaybeTooltip(props: MaybeTooltipProps) {
89
95
  type UseMemoryColumnsArgs = {
90
96
  canManageSharedMemories?: boolean;
91
97
  userId: string;
92
- schemas?: GQLMemorySchema[];
98
+ schemas?: GQLMemorySchemaFieldsFragment[];
93
99
  onEdit: (memory: GQLMemory) => void;
94
100
  onDelete: (iri: string) => void;
95
101
  onMove?: (memory: GQLMemory) => void;
96
102
  onRestore?: (iri: string) => void;
97
103
  onReconfirm?: (iri: string) => void;
104
+ onUndoSchemaAssignment?: (iri: string) => void;
105
+ onWriteRule?: (memory: GQLMemory) => void;
98
106
  duplicates?: Map<string, GQLConflictingMemory[]>;
99
107
  };
100
108
 
101
109
  export function useMemoryColumns(args: UseMemoryColumnsArgs): ColumnDef<GQLMemory>[] {
102
- const { canManageSharedMemories, userId, schemas, onEdit, onDelete, onMove, onRestore, onReconfirm, duplicates } =
103
- args;
110
+ const {
111
+ canManageSharedMemories,
112
+ userId,
113
+ schemas,
114
+ onEdit,
115
+ onDelete,
116
+ onMove,
117
+ onRestore,
118
+ onReconfirm,
119
+ onUndoSchemaAssignment,
120
+ onWriteRule,
121
+ duplicates,
122
+ } = args;
104
123
 
105
124
  return useMemo<ColumnDef<GQLMemory>[]>(() => {
106
125
  const schemaByIri = new Map(schemas?.map((s) => [s.iri, s]) ?? []);
@@ -163,43 +182,41 @@ export function useMemoryColumns(args: UseMemoryColumnsArgs): ColumnDef<GQLMemor
163
182
  filterFn: (row, _columnId, filterValue: GQLMemoryKind) =>
164
183
  row.original.memorySubclass === filterValue || row.original.kind === filterValue,
165
184
  cell: ({ row }) => {
166
- const props = row.original.customProperties as Record<string, string> | null;
167
- const filledEntries = props ? Object.entries(props).filter(([, v]) => isPresent(v)) : [];
185
+ const filledEntries = row.original.customPropertyValues.filter(({ values }) => isPresent(values));
168
186
  const schema = row.original.memorySubclass ? schemaByIri.get(row.original.memorySubclass) : undefined;
169
187
  const schemaLabel = row.original.memorySubclass
170
188
  ? (schema?.label ?? formatEntityName(row.original.memorySubclass))
171
189
  : null;
172
- const badges = (
173
- <>
174
- <KindBadge kind={row.original.kind} />
175
- <SchemaBadge label={schemaLabel} />
176
- </>
190
+ const autoNote = autoAssignedNote(row.original);
191
+ const schemaBadge = (
192
+ <SchemaBadge label={schemaLabel} autoAssigned={autoNote !== null} filledCount={filledEntries.length} />
177
193
  );
178
194
 
179
- if (!isPresent(filledEntries)) {
180
- return <div className="flex min-w-36 flex-wrap items-center gap-1.5">{badges}</div>;
195
+ if (schemaLabel === null || (!isPresent(filledEntries) && autoNote === null)) {
196
+ return (
197
+ <div className="flex min-w-36 flex-wrap items-center gap-1.5">
198
+ <KindBadge kind={row.original.kind} />
199
+ {schemaBadge}
200
+ </div>
201
+ );
181
202
  }
182
203
  return (
183
204
  <div className="flex min-w-36 flex-wrap items-center gap-1.5">
205
+ <KindBadge kind={row.original.kind} />
184
206
  <Tooltip>
185
207
  <TooltipTrigger asChild>
186
- <div className="inline-flex w-fit flex-wrap items-center gap-1.5">
187
- {badges}
188
- <span className="inline-flex items-center gap-0.5 rounded-full px-2 py-0.5 typography-tiny bg-faint border border-muted-border text-muted-foreground">
189
- {filledEntries.length}
190
- <ChevronDown className="size-3" />
191
- </span>
192
- </div>
208
+ <span className="inline-flex min-w-0 max-w-full cursor-default">{schemaBadge}</span>
193
209
  </TooltipTrigger>
194
210
  <TooltipContent className="typography-small text-left max-w-sm">
195
211
  <div className="flex flex-col gap-1">
196
- {filledEntries.map(([path, value]) => {
212
+ {autoNote && <span className="text-muted-foreground">{autoNote}</span>}
213
+ {filledEntries.map(({ path, values }) => {
197
214
  const propDef = schema?.properties.find((p) => p.path === path);
198
215
  const label = propDef?.label ?? formatEntityName(path);
199
216
  return (
200
217
  <div key={path} className="flex items-center gap-1.5">
201
218
  <span className="text-muted-foreground shrink-0 whitespace-nowrap">{label}:</span>
202
- <span className="min-w-0 truncate">{value}</span>
219
+ <span className="min-w-0 truncate">{values.join(", ")}</span>
203
220
  </div>
204
221
  );
205
222
  })}
@@ -339,18 +356,35 @@ export function useMemoryColumns(args: UseMemoryColumnsArgs): ColumnDef<GQLMemor
339
356
  id: memoryColumnIds.actions,
340
357
  enableHiding: false,
341
358
  enableSorting: false,
342
- cell: ({ row }) => (
343
- <MemoryActions
344
- memory={row.original}
345
- canManageSharedMemories={canManageSharedMemories}
346
- onEdit={onEdit}
347
- onDelete={onDelete}
348
- onMove={onMove}
349
- onRestore={onRestore}
350
- onReconfirm={onReconfirm}
351
- />
352
- ),
359
+ cell: ({ row }) => {
360
+ const schema = schemaByIri.get(row.original.memorySubclass ?? "");
361
+ return (
362
+ <MemoryActions
363
+ memory={row.original}
364
+ canManageSharedMemories={canManageSharedMemories}
365
+ onEdit={onEdit}
366
+ onDelete={onDelete}
367
+ onMove={onMove}
368
+ onRestore={onRestore}
369
+ onReconfirm={onReconfirm}
370
+ onUndoSchemaAssignment={onUndoSchemaAssignment}
371
+ onWriteRule={schema?.status === GQLMemorySchemaStatus.Active ? onWriteRule : undefined}
372
+ />
373
+ );
374
+ },
353
375
  },
354
376
  ];
355
- }, [canManageSharedMemories, userId, schemas, onEdit, onDelete, onMove, onRestore, onReconfirm, duplicates]);
377
+ }, [
378
+ canManageSharedMemories,
379
+ userId,
380
+ schemas,
381
+ onEdit,
382
+ onDelete,
383
+ onMove,
384
+ onRestore,
385
+ onReconfirm,
386
+ onUndoSchemaAssignment,
387
+ onWriteRule,
388
+ duplicates,
389
+ ]);
356
390
  }
@@ -6,14 +6,16 @@ import {
6
6
  useConsolidateMemoriesMutation,
7
7
  useMemoriesQuery,
8
8
  useMemoryRedundancyReviewQuery,
9
- useMemorySchemasQuery,
10
9
  useReconfirmMemoryMutation,
11
10
  useRestoreMemoryMutation,
11
+ useUndoMemorySchemaAssignmentMutation,
12
12
  useUpdateMemoryMutation,
13
13
  type GQLMemory,
14
- type GQLMemorySchema,
14
+ type GQLMemorySchemaFieldsFragment,
15
+ useMemorySchemaRuleCountsQuery,
15
16
  } from "@manta-eu/client";
16
17
  import { parseError } from "@manta-eu/client/shared/error-utils";
18
+ import { memoryPreloadConfidenceThreshold } from "@manta-eu/client/shared/memory-preload-gate";
17
19
  import { isPresent } from "@manta-eu/lib/present";
18
20
  import { useQueryClient } from "@tanstack/react-query";
19
21
  import { Archive, Brain, CalendarX, CopyCheck, EyeOff, Plus, RefreshCcw } from "lucide-react";
@@ -29,15 +31,22 @@ import { LiveContextTab } from "./components/LiveContextTab";
29
31
  import type { KindFilter } from "./components/MemoriesFilters";
30
32
  import { MemoriesTabPanel } from "./components/MemoriesTabPanel";
31
33
  import type { MemoryFormState } from "./components/MemoryFields";
32
- import { MemoryFormDialog } from "./components/MemoryFormDialog";
34
+ import { MemoryFormDialog, type MemorySaveResult } from "./components/MemoryFormDialog";
33
35
  import { MemoryOnboardingWizard } from "./components/MemoryOnboardingWizard";
34
36
  import { RestoreBlockedDialog } from "./components/RestoreBlockedDialog";
37
+ import { RuleDraftDialog } from "./components/RuleDraftDialog";
35
38
  import { SchemasTab } from "./components/SchemasTab";
36
39
  import { useDuplicateDetection } from "./hooks/useDuplicateDetection";
37
40
  import { liveContextQueryKey } from "./hooks/useLiveContext";
38
41
  import { useMemoryColumns } from "./hooks/useMemoryColumns";
39
42
  import { useMemoryTable, type StatusFilterKey } from "./hooks/useMemoryTable";
40
43
  import { buildCreateMemoryInput, buildUpdateMemoryInput, deriveLabel } from "./memory-mutation-input";
44
+ import { MemorySchemaPage } from "./schemas/MemorySchemaPage";
45
+ import { memoryRuleDraft, schemaRuleDraft, type RuleDraftRequest } from "./schemas/schema-rule-context";
46
+ import { ruleCountsFrom } from "./schemas/schema-table";
47
+ import { SchemaTemplatesDialog } from "./schemas/SchemaTemplatesDialog";
48
+ import { useSchemaLifecycle } from "./schemas/useSchemaLifecycle";
49
+ import { useSchemasTab } from "./schemas/useSchemasTab";
41
50
  import { Input } from "#components/input/index";
42
51
  import { PageHeader, PageHeaderActions, type PageHeaderAction } from "#components/layouts/page/index";
43
52
  import { RouteLayout } from "#components/layouts/RouteLayout";
@@ -71,7 +80,7 @@ type ScopeMemoriesTabProps = {
71
80
  tabs: ReactNode;
72
81
  isLoading: boolean;
73
82
  errorMessage: string | null;
74
- schemas: GQLMemorySchema[];
83
+ schemas: GQLMemorySchemaFieldsFragment[];
75
84
  onRowClick: (memory: GQLMemory) => void;
76
85
  visibleStatusFilters?: StatusFilterKey[];
77
86
  };
@@ -155,8 +164,9 @@ export {
155
164
  type MemoriesEmptyStateProps,
156
165
  } from "./components/EmptyStates";
157
166
  export { LoadingSkeleton } from "./components/LoadingSkeleton";
158
- export { MemoryFormDialog, type MemoryFormDialogProps } from "./components/MemoryFormDialog";
167
+ export { MemoryFormDialog, type MemoryFormDialogProps, type MemorySaveResult } from "./components/MemoryFormDialog";
159
168
  export type { MemoryFormState } from "./components/MemoryFields";
169
+ export type { MemoryPropertyValues } from "./memory-property-values";
160
170
 
161
171
  const tableKeyPersonal = "memories-table-personal";
162
172
  const tableKeyCompany = "memories-table-company";
@@ -190,46 +200,52 @@ const tabLabels: Record<ActiveTab, string> = {
190
200
  type AddDialogState = { scope: GQLMemoryScope } | null;
191
201
 
192
202
  export function MemoriesRoute() {
193
- const { datastore, datastores, user, logout, isOperator, canManageSharedMemories, canSwitchDatastore } =
194
- useAuthContext();
203
+ const { user, canManageSharedMemories } = useAuthContext();
204
+
195
205
  const { mantaClient } = useMantaClient();
196
206
  const queryClient = useQueryClient();
197
207
 
198
208
  const [showArchived, setShowArchived] = useState(false);
199
209
  // Server-side like showArchived — these rows are absent from the response unless requested.
200
210
  const [showOutOfWindow, setShowOutOfWindow] = useState(false);
211
+ const schemaTab = useSchemasTab({ canManage: !!canManageSharedMemories });
212
+ const { schemas, view: schemaView } = schemaTab;
201
213
  const {
202
214
  data,
203
215
  isLoading,
204
216
  isFetching,
205
217
  refetch,
206
218
  error: queriedError,
207
- } = useMemoriesQuery(mantaClient, {
208
- includeArchived: showArchived,
209
- includeOutOfWindow: showOutOfWindow,
210
- });
211
- const { data: schemasData } = useMemorySchemasQuery(mantaClient);
212
- const schemas = schemasData?.memorySchemas.schemas ?? [];
219
+ } = useMemoriesQuery(
220
+ mantaClient,
221
+ { includeArchived: showArchived, includeOutOfWindow: showOutOfWindow },
222
+ { enabled: schemaView === null },
223
+ );
213
224
  const allMemories = data?.memories.memories ?? emptyMemories;
214
225
  const personalMemories = useMemo(() => allMemories.filter((m) => m.scope === GQLMemoryScope.User), [allMemories]);
215
226
  const companyMemories = useMemo(() => allMemories.filter((m) => m.scope === GQLMemoryScope.Company), [allMemories]);
216
227
  const teamMemories = useMemo(() => allMemories.filter((m) => m.scope === GQLMemoryScope.Team), [allMemories]);
217
- const unreviewedPersonalMemories = useMemo(
228
+ const autoCapturedPersonalMemories = useMemo(
218
229
  () => personalMemories.filter((m) => m.confidence != null && m.confidence < 1),
219
230
  [personalMemories],
220
231
  );
232
+ const needsReviewMemories = useMemo(
233
+ () => autoCapturedPersonalMemories.filter((m) => (m.confidence ?? 1) < memoryPreloadConfidenceThreshold),
234
+ [autoCapturedPersonalMemories],
235
+ );
221
236
  const errorMessage = queriedError ? parseError(queriedError, "Failed to load memories").message : null;
222
237
 
223
238
  const personalCount = personalMemories.length;
224
239
  const companyCount = companyMemories.length;
225
240
  const teamCount = teamMemories.length;
226
- const unreviewedCount = unreviewedPersonalMemories.length;
241
+ const needsReviewCount = needsReviewMemories.length;
227
242
 
228
243
  const createMutation = useCreateMemoryMutation(mantaClient);
229
244
  const updateMutation = useUpdateMemoryMutation(mantaClient);
230
245
  const deleteMutation = useDeleteMemoryMutation(mantaClient);
231
246
  const restoreMutation = useRestoreMemoryMutation(mantaClient);
232
247
  const reconfirmMutation = useReconfirmMemoryMutation(mantaClient);
248
+ const undoAssignmentMutation = useUndoMemorySchemaAssignmentMutation(mantaClient);
233
249
  const { data: teamsData } = useAvailableTeamsQuery(mantaClient, undefined, { enabled: !!canManageSharedMemories });
234
250
  const hasTeams = isPresent(teamsData?.availableTeams.teams);
235
251
 
@@ -238,7 +254,7 @@ export function MemoriesRoute() {
238
254
  ...(canManageSharedMemories ? (["company"] as ActiveTab[]) : []),
239
255
  ...(canManageSharedMemories && hasTeams ? (["team"] as ActiveTab[]) : []),
240
256
  "personal",
241
- ...(canManageSharedMemories ? (["schemas"] as ActiveTab[]) : []),
257
+ "schemas",
242
258
  "live-context",
243
259
  ],
244
260
  [canManageSharedMemories, hasTeams],
@@ -252,21 +268,26 @@ export function MemoriesRoute() {
252
268
  return availableTabs[0] ?? "personal";
253
269
  }, [tabParam, availableTabs]);
254
270
 
271
+ const { data: ruleCountsData } = useMemorySchemaRuleCountsQuery(mantaClient, undefined, {
272
+ enabled: !!canManageSharedMemories && activeTab === "schemas",
273
+ });
274
+ const ruleCounts = useMemo(() => ruleCountsFrom(ruleCountsData?.memorySchemaRuleCounts), [ruleCountsData]);
275
+
276
+ const onSchemaPage = schemaView !== null;
255
277
  useEffect(() => {
256
- if (tabParam !== activeTab) {
278
+ if (!onSchemaPage && tabParam !== activeTab) {
257
279
  setSearchParams({ tab: activeTab }, { replace: true });
258
280
  }
259
- }, [tabParam, activeTab, setSearchParams]);
281
+ }, [onSchemaPage, tabParam, activeTab, setSearchParams]);
260
282
 
261
283
  useEffect(() => {
262
- if (unreviewedCount === 0) setUnreviewedOnly(false);
263
- }, [unreviewedCount]);
284
+ if (needsReviewCount === 0) setNeedsReviewOnly(false);
285
+ }, [needsReviewCount]);
264
286
 
265
287
  function handleTabChange(tab: string) {
266
288
  setSearchParams({ tab }, { replace: true });
267
289
  }
268
290
 
269
- const [schemasQuery, setSchemasQuery] = useState("");
270
291
  const [liveContextQuery, setLiveContextQuery] = useState("");
271
292
  const [addDialog, setAddDialog] = useState<AddDialogState>(null);
272
293
  const [editingMemory, setEditingMemory] = useState<GQLMemory | null>(null);
@@ -276,7 +297,7 @@ export function MemoriesRoute() {
276
297
  blockedByIri: string;
277
298
  blockedByLabel: string | null;
278
299
  } | null>(null);
279
- const [unreviewedOnly, setUnreviewedOnly] = useState(false);
300
+ const [needsReviewOnly, setNeedsReviewOnly] = useState(false);
280
301
  const [showCompanyOnboarding, setShowOrgOnboarding] = useState(false);
281
302
  const invalidate = useCallback(() => {
282
303
  void refetch();
@@ -357,7 +378,7 @@ export function MemoriesRoute() {
357
378
  const kindFilterResetRef = useRef<((kind: KindFilter) => void) | null>(null);
358
379
 
359
380
  const handleCreate = useCallback(
360
- async (form: MemoryFormState, supersedesMemoryIris?: string[]) => {
381
+ async (form: MemoryFormState, supersedesMemoryIris?: string[]): Promise<MemorySaveResult> => {
361
382
  if (!addDialog) return;
362
383
  if (!canManageSharedMemories && addDialog.scope !== GQLMemoryScope.User) return;
363
384
  try {
@@ -365,6 +386,8 @@ export function MemoriesRoute() {
365
386
  input: buildCreateMemoryInput(form, addDialog.scope, supersedesMemoryIris),
366
387
  });
367
388
 
389
+ if (isPresent(result.createMemory.propertyErrors))
390
+ return { propertyErrors: result.createMemory.propertyErrors };
368
391
  if (result.createMemory.error) throw new Error(result.createMemory.error);
369
392
 
370
393
  toast.success("Memory added");
@@ -379,7 +402,7 @@ export function MemoriesRoute() {
379
402
  );
380
403
 
381
404
  const handleUpdate = useCallback(
382
- async (form: MemoryFormState, supersedesMemoryIris?: string[]) => {
405
+ async (form: MemoryFormState, supersedesMemoryIris?: string[]): Promise<MemorySaveResult> => {
383
406
  if (!editingMemory) return;
384
407
  if (!canManageSharedMemories && editingMemory.scope !== GQLMemoryScope.User) return;
385
408
  try {
@@ -387,6 +410,8 @@ export function MemoriesRoute() {
387
410
  input: buildUpdateMemoryInput(editingMemory.iri, form, editingMemory.scope, supersedesMemoryIris),
388
411
  });
389
412
 
413
+ if (isPresent(result.updateMemory.propertyErrors))
414
+ return { propertyErrors: result.updateMemory.propertyErrors };
390
415
  if (result.updateMemory.error) throw new Error(result.updateMemory.error);
391
416
 
392
417
  toast.success("Memory updated");
@@ -451,6 +476,20 @@ export function MemoriesRoute() {
451
476
  [reconfirmMutation, invalidate],
452
477
  );
453
478
 
479
+ const handleUndoSchemaAssignment = useCallback(
480
+ async (iri: string) => {
481
+ try {
482
+ const result = await undoAssignmentMutation.mutateAsync({ memoryIri: iri });
483
+ if (result.undoMemorySchemaAssignment.error) throw new Error(result.undoMemorySchemaAssignment.error);
484
+ toast.success("Schema removed", { description: "Manta won't assign one to this memory again." });
485
+ invalidate();
486
+ } catch (e) {
487
+ reportMutationError(e, "Failed to remove the schema");
488
+ }
489
+ },
490
+ [undoAssignmentMutation, invalidate],
491
+ );
492
+
454
493
  const handleConfirmRestoreBlocked = useCallback(() => {
455
494
  if (!restoreBlocked) return;
456
495
  const { iri, blockedByIri, blockedByLabel } = restoreBlocked;
@@ -502,23 +541,39 @@ export function MemoriesRoute() {
502
541
  [movingMemory, updateMutation, invalidate, canManageSharedMemories],
503
542
  );
504
543
 
505
- const { duplicates } = useDuplicateDetection(unreviewedPersonalMemories, {
544
+ const { duplicates } = useDuplicateDetection(autoCapturedPersonalMemories, {
506
545
  enabled: activeTab === "personal",
507
546
  });
508
547
 
548
+ const [ruleDraft, setRuleDraft] = useState<RuleDraftRequest | null>(null);
549
+ const schemaLifecycle = useSchemaLifecycle();
550
+ const handleWriteRule = useCallback(
551
+ (memory: GQLMemory) => {
552
+ const schema = schemas.find((candidate) => candidate.iri === memory.memorySubclass);
553
+ if (schema) setRuleDraft(memoryRuleDraft(schema, memory));
554
+ },
555
+ [schemas],
556
+ );
557
+ const handleWriteSchemaRule = useCallback(
558
+ (schema: GQLMemorySchemaFieldsFragment) => setRuleDraft(schemaRuleDraft(schema)),
559
+ [],
560
+ );
561
+
509
562
  const columns = useMemoryColumns({
510
563
  canManageSharedMemories,
511
564
  userId: user.id,
512
565
  schemas,
566
+ onWriteRule: canManageSharedMemories ? handleWriteRule : undefined,
513
567
  onEdit: setEditingMemory,
514
568
  onDelete: handleDelete,
515
569
  onMove: canManageSharedMemories ? setMovingMemory : undefined,
516
570
  onRestore: handleRestore,
517
571
  onReconfirm: handleReconfirm,
572
+ onUndoSchemaAssignment: handleUndoSchemaAssignment,
518
573
  duplicates,
519
574
  });
520
575
 
521
- const displayedPersonalMemories = unreviewedOnly ? unreviewedPersonalMemories : personalMemories;
576
+ const displayedPersonalMemories = needsReviewOnly ? needsReviewMemories : personalMemories;
522
577
 
523
578
  const personalTableState = useMemoryTable(
524
579
  tableKeyPersonal,
@@ -539,7 +594,7 @@ export function MemoriesRoute() {
539
594
  const tabCounts: Partial<Record<ActiveTab, { count?: number; secondaryCount?: number }>> = {
540
595
  company: { count: companyCount },
541
596
  team: { count: teamCount },
542
- personal: { count: personalCount, secondaryCount: unreviewedCount },
597
+ personal: { count: personalCount },
543
598
  };
544
599
  const scopeTabs: ScopeTab<ActiveTab>[] = availableTabs.map((tab) => ({
545
600
  value: tab,
@@ -597,17 +652,19 @@ export function MemoriesRoute() {
597
652
  } satisfies PageHeaderAction,
598
653
  ]
599
654
  : []),
600
- ...(activeTab === "personal" && unreviewedCount > 0
655
+ ...(activeTab === "personal" && needsReviewCount > 0
601
656
  ? [
602
657
  {
603
- key: "unreviewed",
604
- label: unreviewedOnly ? "All memories" : `Unreviewed (${unreviewedCount})`,
605
- variant: unreviewedOnly ? "secondary" : "ghost",
606
- active: unreviewedOnly,
607
- onClick: () => setUnreviewedOnly((v) => !v),
658
+ key: "needs-review",
659
+ label: needsReviewOnly ? "All memories" : `Needs review (${needsReviewCount})`,
660
+ hint: "Memories Manta saved from chats but was unsure about. They are not used until you open one and save it.",
661
+ variant: needsReviewOnly ? "secondary" : "ghost",
662
+ active: needsReviewOnly,
663
+ onClick: () => setNeedsReviewOnly((v) => !v),
608
664
  } satisfies PageHeaderAction,
609
665
  ]
610
666
  : []),
667
+ ...(activeTab === "schemas" ? schemaTab.headerActions : []),
611
668
  ...(addMemoryButton
612
669
  ? [
613
670
  {
@@ -638,15 +695,22 @@ export function MemoriesRoute() {
638
695
  }
639
696
  : null;
640
697
 
698
+ if (schemaView) {
699
+ return (
700
+ <RouteLayout>
701
+ <MemorySchemaPage
702
+ view={schemaView}
703
+ schemas={schemas}
704
+ isLoading={schemaTab.isLoading}
705
+ errorMessage={schemaTab.errorMessage}
706
+ canManage={!!canManageSharedMemories}
707
+ />
708
+ </RouteLayout>
709
+ );
710
+ }
711
+
641
712
  return (
642
- <RouteLayout
643
- user={user}
644
- datastore={datastore}
645
- datastores={datastores}
646
- isOperator={isOperator}
647
- canSwitchDatastore={canSwitchDatastore}
648
- logout={logout}
649
- >
713
+ <RouteLayout>
650
714
  <PageHeader title="Memories" icon={Brain} actions={<PageHeaderActions actions={headerActions} />} />
651
715
 
652
716
  <Tabs value={activeTab} onValueChange={handleTabChange} className="flex flex-col flex-1 min-h-0 overflow-hidden">
@@ -715,17 +779,23 @@ export function MemoriesRoute() {
715
779
  />
716
780
  )}
717
781
 
718
- {canManageSharedMemories && (
719
- <FilterableTabContent
720
- value="schemas"
782
+ <TabsContent value="schemas" className="flex min-h-0 flex-1 flex-col overflow-hidden">
783
+ <SchemasTab
721
784
  tabs={tabsList}
722
- placeholder="Filter schemas…"
723
- query={schemasQuery}
724
- onQueryChange={setSchemasQuery}
725
- >
726
- <SchemasTab query={schemasQuery} />
727
- </FilterableTabContent>
728
- )}
785
+ schemas={schemaTab.listedSchemas}
786
+ query={schemaTab.query}
787
+ onQueryChange={schemaTab.setQuery}
788
+ isLoading={schemaTab.isLoading}
789
+ errorMessage={schemaTab.errorMessage}
790
+ canManage={!!canManageSharedMemories}
791
+ ruleCounts={ruleCounts}
792
+ onCreate={schemaTab.openNew}
793
+ onWriteRule={handleWriteSchemaRule}
794
+ onArchive={schemaLifecycle.askToArchive}
795
+ onRestore={schemaLifecycle.restore}
796
+ onDelete={schemaLifecycle.askToDelete}
797
+ />
798
+ </TabsContent>
729
799
 
730
800
  <FilterableTabContent
731
801
  value="live-context"
@@ -738,6 +808,8 @@ export function MemoriesRoute() {
738
808
  </FilterableTabContent>
739
809
  </Tabs>
740
810
 
811
+ <RuleDraftDialog request={ruleDraft} onClose={() => setRuleDraft(null)} />
812
+ {schemaLifecycle.dialogs}
741
813
  {formDialogState && (
742
814
  <MemoryFormDialog
743
815
  open={true}
@@ -754,6 +826,8 @@ export function MemoriesRoute() {
754
826
  />
755
827
  )}
756
828
 
829
+ {canManageSharedMemories && <SchemaTemplatesDialog {...schemaTab.templatesDialog} />}
830
+
757
831
  {movingMemory && (
758
832
  <ChangeScopeDialog
759
833
  open={true}
@@ -1,6 +1,7 @@
1
1
  import { GQLMemoryScope, type GQLCreateMemoryInput, type GQLUpdateMemoryInput } from "@manta-eu/client";
2
2
  import { isPresent } from "@manta-eu/lib/present";
3
3
  import type { MemoryFormState } from "./components/MemoryFields";
4
+ import { cleanPropertyValues } from "./memory-property-values";
4
5
 
5
6
  export function deriveLabel(description: string): string {
6
7
  const words = description.trim().split(/\s+/).filter(Boolean);
@@ -28,7 +29,9 @@ export function buildCreateMemoryInput(
28
29
  description: form.description ?? null,
29
30
  scope,
30
31
  ...(form.memorySubclass ? { memorySubclass: form.memorySubclass } : {}),
31
- ...(isPresent(form.customProperties) ? { customProperties: form.customProperties } : {}),
32
+ ...(form.memorySubclass && isPresent(form.customProperties)
33
+ ? { customProperties: cleanPropertyValues(form.customProperties) }
34
+ : {}),
32
35
  ...(form.memoryValidUntil != null ? { memoryValidUntil: form.memoryValidUntil } : {}),
33
36
  ...(form.memoryTrustedUntil != null ? { memoryTrustedUntil: form.memoryTrustedUntil } : {}),
34
37
  ...(supersedesMemoryIris !== undefined ? { supersedesMemoryIris } : {}),
@@ -48,7 +51,7 @@ export function buildUpdateMemoryInput(
48
51
  description: form.description,
49
52
  memoryValidUntil: form.memoryValidUntil,
50
53
  memoryTrustedUntil: form.memoryTrustedUntil,
51
- customProperties: form.customProperties,
54
+ customProperties: cleanPropertyValues(form.customProperties),
52
55
  ...(form.memorySubclass !== undefined ? { memorySubclass: form.memorySubclass } : {}),
53
56
  ...(isPresent(supersedesMemoryIris) ? { supersedesMemoryIris } : {}),
54
57
  };
@@ -0,0 +1,83 @@
1
+ import type {
2
+ GQLMemory,
3
+ GQLMemoryPropertyProblem,
4
+ GQLMemorySchemaFieldsFragment,
5
+ GQLMemorySchemaPropertyFieldsFragment,
6
+ } from "@manta-eu/client";
7
+ import { isPresent } from "@manta-eu/lib/present";
8
+
9
+ export type MemoryPropertyValues = Record<string, string[]>;
10
+
11
+ export type MemoryPropertyErrors = Record<string, string>;
12
+
13
+ export function writableProperties(
14
+ schema: GQLMemorySchemaFieldsFragment | null | undefined,
15
+ ): GQLMemorySchemaPropertyFieldsFragment[] {
16
+ return [...(schema?.properties ?? [])].filter((property) => !property.computed).sort((a, b) => a.order - b.order);
17
+ }
18
+
19
+ export function propertyDefaults(schema: GQLMemorySchemaFieldsFragment): MemoryPropertyValues {
20
+ return Object.fromEntries(
21
+ writableProperties(schema).flatMap((property) =>
22
+ property.defaultValue != null ? [[property.path, [property.defaultValue]]] : [],
23
+ ),
24
+ );
25
+ }
26
+
27
+ export function computedProperties(
28
+ schema: GQLMemorySchemaFieldsFragment | null | undefined,
29
+ ): GQLMemorySchemaPropertyFieldsFragment[] {
30
+ return [...(schema?.properties ?? [])].filter((property) => property.computed).sort((a, b) => a.order - b.order);
31
+ }
32
+
33
+ export function propertyValuesFromMemory(memory: Pick<GQLMemory, "customPropertyValues">): MemoryPropertyValues {
34
+ return Object.fromEntries(memory.customPropertyValues.map(({ path, values }) => [path, [...values]]));
35
+ }
36
+
37
+ export function cleanPropertyValues(values: MemoryPropertyValues): MemoryPropertyValues {
38
+ return Object.fromEntries(
39
+ Object.entries(values).map(([path, given]) => [path, given.map((value) => value.trim()).filter(isPresent)]),
40
+ );
41
+ }
42
+
43
+ export function filledPropertyCount(
44
+ schema: GQLMemorySchemaFieldsFragment | null | undefined,
45
+ values: MemoryPropertyValues,
46
+ ): number {
47
+ const cleaned = cleanPropertyValues(values);
48
+ return writableProperties(schema).filter((property) => isPresent(cleaned[property.path] ?? [])).length;
49
+ }
50
+
51
+ export function missingRequiredProperties(
52
+ schema: GQLMemorySchemaFieldsFragment | null | undefined,
53
+ values: MemoryPropertyValues,
54
+ ): MemoryPropertyErrors {
55
+ const cleaned = cleanPropertyValues(values);
56
+ return Object.fromEntries(
57
+ writableProperties(schema)
58
+ .filter((property) => property.required && !isPresent(cleaned[property.path] ?? []))
59
+ .map((property) => [property.path, `${property.label} is required`]),
60
+ );
61
+ }
62
+
63
+ export function propertyErrorsByPath(problems: readonly GQLMemoryPropertyProblem[]): MemoryPropertyErrors {
64
+ const byPath: MemoryPropertyErrors = {};
65
+ for (const problem of problems) {
66
+ const message = `${problem.label ?? "This value"} ${problem.message}`;
67
+ byPath[problem.path] = byPath[problem.path] ? `${byPath[problem.path]}; ${problem.message}` : message;
68
+ }
69
+ return byPath;
70
+ }
71
+
72
+ // An edit sends only what it changed, so a stored value a later constraint would refuse does not block it.
73
+ export function changedPropertyValues(
74
+ current: MemoryPropertyValues,
75
+ initial: MemoryPropertyValues,
76
+ ): MemoryPropertyValues {
77
+ const cleanedInitial = cleanPropertyValues(initial);
78
+ return Object.fromEntries(
79
+ Object.entries(cleanPropertyValues(current)).filter(
80
+ ([path, values]) => JSON.stringify(values) !== JSON.stringify(cleanedInitial[path] ?? []),
81
+ ),
82
+ );
83
+ }