@manta-eu/react 0.1.7 → 0.1.9

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 (231) hide show
  1. package/README.md +2 -0
  2. package/dist/components/chart/AreaChart.d.ts.map +1 -1
  3. package/dist/components/chart/AreaChart.js +4 -6
  4. package/dist/components/chart/BarChart.d.ts.map +1 -1
  5. package/dist/components/chart/BarChart.js +5 -6
  6. package/dist/components/chart/ComposedChart.d.ts.map +1 -1
  7. package/dist/components/chart/ComposedChart.js +15 -7
  8. package/dist/components/chart/LineChart.d.ts.map +1 -1
  9. package/dist/components/chart/LineChart.js +4 -6
  10. package/dist/components/chart/annotations.d.ts +4 -0
  11. package/dist/components/chart/annotations.d.ts.map +1 -1
  12. package/dist/components/chart/annotations.js +10 -2
  13. package/dist/components/chart/chart-schemas.d.ts +1960 -54
  14. package/dist/components/chart/chart-schemas.d.ts.map +1 -1
  15. package/dist/components/chart/chart-schemas.js +137 -15
  16. package/dist/components/chart/series.d.ts +28 -0
  17. package/dist/components/chart/series.d.ts.map +1 -0
  18. package/dist/components/chart/series.js +61 -0
  19. package/dist/components/chart/stacks.d.ts +9 -0
  20. package/dist/components/chart/stacks.d.ts.map +1 -0
  21. package/dist/components/chart/stacks.js +11 -0
  22. package/dist/components/chat-view/ChatHeaders.d.ts.map +1 -1
  23. package/dist/components/chat-view/ChatHeaders.js +2 -2
  24. package/dist/components/layouts/Sidebar.d.ts.map +1 -1
  25. package/dist/components/layouts/Sidebar.js +14 -3
  26. package/dist/components/planning/ActioningView.d.ts +1 -0
  27. package/dist/components/planning/ActioningView.d.ts.map +1 -1
  28. package/dist/components/planning/ActioningView.js +15 -52
  29. package/dist/components/planning/ExecutionSectionItem.d.ts +6 -4
  30. package/dist/components/planning/ExecutionSectionItem.d.ts.map +1 -1
  31. package/dist/components/planning/ExecutionSectionItem.js +2 -2
  32. package/dist/components/planning/ExecutionSections.d.ts +6 -4
  33. package/dist/components/planning/ExecutionSections.d.ts.map +1 -1
  34. package/dist/components/planning/ExecutionSections.js +2 -2
  35. package/dist/components/planning/ManualActionCard.d.ts +14 -8
  36. package/dist/components/planning/ManualActionCard.d.ts.map +1 -1
  37. package/dist/components/planning/ManualActionCard.js +44 -24
  38. package/dist/components/planning/ManualActionList.d.ts +22 -0
  39. package/dist/components/planning/ManualActionList.d.ts.map +1 -0
  40. package/dist/components/planning/ManualActionList.js +35 -0
  41. package/dist/components/planning/manual-action-targets.d.ts +4 -0
  42. package/dist/components/planning/manual-action-targets.d.ts.map +1 -0
  43. package/dist/components/planning/manual-action-targets.js +19 -0
  44. package/dist/components/select/index.d.ts.map +1 -1
  45. package/dist/components/select/index.js +4 -1
  46. package/dist/components/sidebar/index.d.ts +2 -0
  47. package/dist/components/sidebar/index.d.ts.map +1 -1
  48. package/dist/components/sidebar/index.js +1 -0
  49. package/dist/components/sidebar/nav-user.d.ts +1 -1
  50. package/dist/components/sidebar/nav-user.d.ts.map +1 -1
  51. package/dist/components/sidebar/nav-user.js +3 -3
  52. package/dist/components/sidebar/user-avatar.d.ts +7 -0
  53. package/dist/components/sidebar/user-avatar.d.ts.map +1 -0
  54. package/dist/components/sidebar/user-avatar.js +9 -0
  55. package/dist/globals.css +6 -13
  56. package/dist/hooks/use-connection-problems.d.ts.map +1 -1
  57. package/dist/hooks/use-manual-actions.d.ts +13 -3
  58. package/dist/hooks/use-manual-actions.d.ts.map +1 -1
  59. package/dist/hooks/use-manual-actions.js +16 -10
  60. package/dist/hooks/useAuth.d.ts +1 -0
  61. package/dist/hooks/useAuth.d.ts.map +1 -1
  62. package/dist/hooks/useAuth.js +7 -1
  63. package/dist/hooks/useConversations.d.ts +1 -0
  64. package/dist/hooks/useConversations.d.ts.map +1 -1
  65. package/dist/hooks/useResolveManualAction.d.ts +14 -0
  66. package/dist/hooks/useResolveManualAction.d.ts.map +1 -0
  67. package/dist/hooks/useResolveManualAction.js +47 -0
  68. package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
  69. package/dist/ldo-ui.d.ts +2 -1
  70. package/dist/ldo-ui.d.ts.map +1 -1
  71. package/dist/ldo-ui.js +2 -1
  72. package/dist/lib/build-config.d.ts +2 -0
  73. package/dist/lib/build-config.d.ts.map +1 -1
  74. package/dist/lib/build-config.js +2 -0
  75. package/dist/lib/chat-types.d.ts +1 -0
  76. package/dist/lib/chat-types.d.ts.map +1 -1
  77. package/dist/lib/datastore-route-table.d.ts +2 -0
  78. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  79. package/dist/lib/datastore-route-table.js +3 -1
  80. package/dist/lib/datastore-routes.d.ts +7 -1
  81. package/dist/lib/datastore-routes.d.ts.map +1 -1
  82. package/dist/lib/datastore-routes.js +7 -2
  83. package/dist/lib/decode-chart-entities.d.ts.map +1 -1
  84. package/dist/lib/decode-chart-entities.js +5 -1
  85. package/dist/lib/manual-actions.d.ts +1 -0
  86. package/dist/lib/manual-actions.d.ts.map +1 -1
  87. package/dist/lib/manual-actions.js +4 -1
  88. package/dist/lib/structured-data/types.d.ts +7 -2
  89. package/dist/lib/structured-data/types.d.ts.map +1 -1
  90. package/dist/providers/ChatManagerProvider.d.ts.map +1 -1
  91. package/dist/providers/ChatManagerProvider.js +18 -16
  92. package/dist/providers/NavExtrasProvider.d.ts +23 -0
  93. package/dist/providers/NavExtrasProvider.d.ts.map +1 -0
  94. package/dist/providers/NavExtrasProvider.js +10 -0
  95. package/dist/providers/index.d.ts +1 -0
  96. package/dist/providers/index.d.ts.map +1 -1
  97. package/dist/providers/index.js +1 -0
  98. package/dist/routes/explain/ExplainEmpty.d.ts.map +1 -1
  99. package/dist/routes/explain/ExplainEmpty.js +2 -1
  100. package/dist/routes/integrations/catalog-shape.d.ts +2 -1
  101. package/dist/routes/integrations/catalog-shape.d.ts.map +1 -1
  102. package/dist/routes/integrations/components/AddIntegrationModal.d.ts.map +1 -1
  103. package/dist/routes/integrations/components/AddIntegrationModal.js +1 -1
  104. package/dist/routes/integrations/components/MantaSyncPluginDownload.d.ts +13 -0
  105. package/dist/routes/integrations/components/MantaSyncPluginDownload.d.ts.map +1 -0
  106. package/dist/routes/integrations/components/MantaSyncPluginDownload.js +23 -0
  107. package/dist/routes/integrations/components/connect-forms/ConnectFormHeader.d.ts +1 -1
  108. package/dist/routes/integrations/components/connect-forms/ConnectFormHeader.d.ts.map +1 -1
  109. package/dist/routes/integrations/components/connect-forms/ConnectWizardShell.d.ts +1 -1
  110. package/dist/routes/integrations/components/connect-forms/ConnectWizardShell.d.ts.map +1 -1
  111. package/dist/routes/integrations/components/connect-forms/ConnectionStringInput.d.ts +11 -0
  112. package/dist/routes/integrations/components/connect-forms/ConnectionStringInput.d.ts.map +1 -0
  113. package/dist/routes/integrations/components/connect-forms/ConnectionStringInput.js +49 -0
  114. package/dist/routes/integrations/components/connect-forms/DashConnectForm.d.ts +7 -0
  115. package/dist/routes/integrations/components/connect-forms/DashConnectForm.d.ts.map +1 -0
  116. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js +87 -0
  117. package/dist/routes/integrations/components/connect-forms/DataConnectionConnectForm.d.ts +20 -0
  118. package/dist/routes/integrations/components/connect-forms/DataConnectionConnectForm.d.ts.map +1 -0
  119. package/dist/routes/integrations/components/connect-forms/DataConnectionConnectForm.js +144 -0
  120. package/dist/routes/integrations/components/connect-forms/DataConnectionFieldInputs.d.ts +8 -0
  121. package/dist/routes/integrations/components/connect-forms/DataConnectionFieldInputs.d.ts.map +1 -0
  122. package/dist/routes/integrations/components/connect-forms/DataConnectionFieldInputs.js +44 -0
  123. package/dist/routes/integrations/components/connect-forms/FigmaConnectForm.d.ts +3 -0
  124. package/dist/routes/integrations/components/connect-forms/FigmaConnectForm.d.ts.map +1 -0
  125. package/dist/routes/integrations/components/connect-forms/FigmaConnectForm.js +20 -0
  126. package/dist/routes/integrations/components/connect-forms/GmailConnectForm.d.ts +3 -0
  127. package/dist/routes/integrations/components/connect-forms/GmailConnectForm.d.ts.map +1 -0
  128. package/dist/routes/integrations/components/connect-forms/GmailConnectForm.js +11 -0
  129. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.d.ts +3 -0
  130. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.d.ts.map +1 -0
  131. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js +37 -0
  132. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.d.ts +3 -0
  133. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.d.ts.map +1 -0
  134. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js +37 -0
  135. package/dist/routes/integrations/components/connect-forms/ImportStartedNotice.d.ts +21 -0
  136. package/dist/routes/integrations/components/connect-forms/ImportStartedNotice.d.ts.map +1 -0
  137. package/dist/routes/integrations/components/connect-forms/ImportStartedNotice.js +25 -0
  138. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts +45 -0
  139. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts.map +1 -0
  140. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js +188 -0
  141. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.d.ts +6 -0
  142. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.d.ts.map +1 -0
  143. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js +68 -0
  144. package/dist/routes/integrations/components/connect-forms/LinkedinConnectForm.d.ts +10 -0
  145. package/dist/routes/integrations/components/connect-forms/LinkedinConnectForm.d.ts.map +1 -0
  146. package/dist/routes/integrations/components/connect-forms/LinkedinConnectForm.js +124 -0
  147. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.d.ts +14 -0
  148. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.d.ts.map +1 -0
  149. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js +183 -0
  150. package/dist/routes/integrations/components/connect-forms/OAuthConnectLink.d.ts +10 -0
  151. package/dist/routes/integrations/components/connect-forms/OAuthConnectLink.d.ts.map +1 -0
  152. package/dist/routes/integrations/components/connect-forms/OAuthConnectLink.js +17 -0
  153. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts +45 -0
  154. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -0
  155. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +136 -0
  156. package/dist/routes/integrations/components/connect-forms/OAuthSingleAccountConnectForm.d.ts +23 -0
  157. package/dist/routes/integrations/components/connect-forms/OAuthSingleAccountConnectForm.d.ts.map +1 -0
  158. package/dist/routes/integrations/components/connect-forms/OAuthSingleAccountConnectForm.js +63 -0
  159. package/dist/routes/integrations/components/connect-forms/ShopifyConnectForm.d.ts +3 -0
  160. package/dist/routes/integrations/components/connect-forms/ShopifyConnectForm.d.ts.map +1 -0
  161. package/dist/routes/integrations/components/connect-forms/ShopifyConnectForm.js +14 -0
  162. package/dist/routes/integrations/components/connect-forms/SlackConnectForm.d.ts +3 -0
  163. package/dist/routes/integrations/components/connect-forms/SlackConnectForm.d.ts.map +1 -0
  164. package/dist/routes/integrations/components/connect-forms/SlackConnectForm.js +10 -0
  165. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.d.ts +5 -0
  166. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.d.ts.map +1 -0
  167. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js +35 -0
  168. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.d.ts +5 -0
  169. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.d.ts.map +1 -0
  170. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js +47 -0
  171. package/dist/routes/integrations/components/connect-forms/connection-string-fields.d.ts +13 -0
  172. package/dist/routes/integrations/components/connect-forms/connection-string-fields.d.ts.map +1 -0
  173. package/dist/routes/integrations/components/connect-forms/connection-string-fields.js +110 -0
  174. package/dist/routes/integrations/components/connect-forms/dash-folder-tree.d.ts +6 -0
  175. package/dist/routes/integrations/components/connect-forms/dash-folder-tree.d.ts.map +1 -0
  176. package/dist/routes/integrations/components/connect-forms/dash-folder-tree.js +14 -0
  177. package/dist/routes/integrations/components/connect-forms/data-connection-fields.d.ts +35 -0
  178. package/dist/routes/integrations/components/connect-forms/data-connection-fields.d.ts.map +1 -0
  179. package/dist/routes/integrations/components/connect-forms/data-connection-fields.js +88 -0
  180. package/dist/routes/integrations/components/connect-forms/google-ads-account-tree.d.ts +11 -0
  181. package/dist/routes/integrations/components/connect-forms/google-ads-account-tree.d.ts.map +1 -0
  182. package/dist/routes/integrations/components/connect-forms/google-ads-account-tree.js +36 -0
  183. package/dist/routes/integrations/components/connect-forms/google-analytics-property-tree.d.ts +6 -0
  184. package/dist/routes/integrations/components/connect-forms/google-analytics-property-tree.d.ts.map +1 -0
  185. package/dist/routes/integrations/components/connect-forms/google-analytics-property-tree.js +34 -0
  186. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.d.ts +12 -0
  187. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.d.ts.map +1 -0
  188. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.js +33 -0
  189. package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.d.ts +3 -0
  190. package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.d.ts.map +1 -0
  191. package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.js +8 -0
  192. package/dist/routes/integrations/components/connect-forms/types.d.ts +5 -1
  193. package/dist/routes/integrations/components/connect-forms/types.d.ts.map +1 -1
  194. package/dist/routes/integrations/components/connect-forms/useConnectWizard.d.ts +19 -0
  195. package/dist/routes/integrations/components/connect-forms/useConnectWizard.d.ts.map +1 -0
  196. package/dist/routes/integrations/components/connect-forms/useConnectWizard.js +28 -0
  197. package/dist/routes/integrations/components/connect-forms/useConnectedExternalIds.d.ts +4 -0
  198. package/dist/routes/integrations/components/connect-forms/useConnectedExternalIds.d.ts.map +1 -0
  199. package/dist/routes/integrations/components/connect-forms/useConnectedExternalIds.js +17 -0
  200. package/dist/routes/integrations/components/connect-forms/useWindowFocusPoll.d.ts +7 -0
  201. package/dist/routes/integrations/components/connect-forms/useWindowFocusPoll.d.ts.map +1 -0
  202. package/dist/routes/integrations/components/connect-forms/useWindowFocusPoll.js +18 -0
  203. package/dist/routes/integrations/connect-forms.d.ts +16 -0
  204. package/dist/routes/integrations/connect-forms.d.ts.map +1 -0
  205. package/dist/routes/integrations/connect-forms.js +14 -0
  206. package/dist/routes/integrations/filter-connected-providers.d.ts +3 -0
  207. package/dist/routes/integrations/filter-connected-providers.d.ts.map +1 -0
  208. package/dist/routes/integrations/filter-connected-providers.js +15 -0
  209. package/dist/routes/integrations/overview.d.ts +3 -0
  210. package/dist/routes/integrations/overview.d.ts.map +1 -0
  211. package/dist/routes/integrations/overview.js +2 -0
  212. package/dist/routes/integrations/use-connected-account-entities.d.ts +10 -0
  213. package/dist/routes/integrations/use-connected-account-entities.d.ts.map +1 -0
  214. package/dist/routes/integrations/use-connected-account-entities.js +29 -0
  215. package/dist/routes/memories/components/EmptyStates.d.ts.map +1 -1
  216. package/dist/routes/memories/components/EmptyStates.js +2 -1
  217. package/dist/routes/plans/components/ActionPlanPage.d.ts +1 -0
  218. package/dist/routes/plans/components/ActionPlanPage.d.ts.map +1 -1
  219. package/dist/routes/plans/components/ActionPlanPage.js +9 -5
  220. package/dist/routes/plans/components/actionPlansTableConfig.d.ts +12 -12
  221. package/dist/rules/datalog-ast/DatalogBodyFormulaComponent.d.ts.map +1 -1
  222. package/dist/rules/datalog-ast/DatalogBodyFormulaComponent.js +4 -1
  223. package/dist/rules/rule-narrative-aggregates.d.ts +1 -0
  224. package/dist/rules/rule-narrative-aggregates.d.ts.map +1 -1
  225. package/dist/rules/rule-narrative-aggregates.js +20 -0
  226. package/dist/rules/rule-narrative-context.d.ts.map +1 -1
  227. package/dist/rules/rule-narrative-context.js +3 -9
  228. package/dist/rules/rule-narrative-format.d.ts +1 -1
  229. package/dist/rules/rule-narrative.d.ts.map +1 -1
  230. package/dist/rules/rule-narrative.js +22 -7
  231. package/package.json +47 -8
@@ -1 +1 @@
1
- {"version":3,"file":"chart-schemas.d.ts","sourceRoot":"","sources":["../../../src/components/chart/chart-schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart-schemas.d.ts","sourceRoot":"","sources":["../../../src/components/chart/chart-schemas.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { z } from "zod/v4";
2
+ import { chartColorPalette } from "./chart-colors.js";
3
+ import { offsetSeriesKeys } from "./stacks.js";
2
4
  const baseChartSchema = z.object({
3
5
  title: z.string().optional(),
4
6
  height: z.number().int().min(120).max(600).optional(),
@@ -7,14 +9,105 @@ const cartesianAxisFields = {
7
9
  xAxisLabel: z.string().optional(),
8
10
  yAxisLabel: z.string().optional(),
9
11
  };
10
- const xyDataPointSchema = z.object({
12
+ const seriesKeySchema = z
13
+ .string()
14
+ .regex(/^[A-Za-z_][A-Za-z0-9_]*$/, "A series key is letters, digits and underscores, starting with a letter");
15
+ export const chartSeriesAxes = ["left", "right"];
16
+ export const chartSeriesKinds = ["bar", "line"];
17
+ export const maxChartSeries = chartColorPalette.length;
18
+ export const chartSeriesSchema = z.object({
19
+ key: seriesKeySchema,
20
+ label: z.string().optional(),
21
+ axis: z.enum(chartSeriesAxes).optional(),
22
+ });
23
+ export const composedChartSeriesSchema = chartSeriesSchema.extend({
24
+ kind: z.enum(chartSeriesKinds),
25
+ });
26
+ const multiSeriesFields = {
27
+ series: z.array(chartSeriesSchema).min(1).max(maxChartSeries).optional(),
28
+ rightAxisLabel: z.string().optional(),
29
+ };
30
+ const xyDataPointSchema = z.looseObject({
11
31
  x: z.union([z.string(), z.number()]),
12
- y: z.number(),
32
+ y: z.number().optional(),
13
33
  });
14
34
  const nameValueDataPointSchema = z.object({
15
35
  name: z.string(),
16
36
  value: z.number(),
17
37
  });
38
+ const seriesNameValueDataPointSchema = z.looseObject({
39
+ name: z.string(),
40
+ value: z.number().optional(),
41
+ });
42
+ function checkStatSeries(chart, ctx, keys = [], offset = new Set()) {
43
+ const known = new Set([...annotationSeriesValues, ...keys]);
44
+ chart.annotations?.forEach((annotation, index) => {
45
+ if (annotation.series === undefined) {
46
+ return;
47
+ }
48
+ if (offset.has(annotation.series)) {
49
+ ctx.addIssue({
50
+ code: "custom",
51
+ message: `"${annotation.series}" is stacked on another series, so a stat line on it would not line up; leave out "series" to measure the stack total`,
52
+ path: ["annotations", index, "series"],
53
+ });
54
+ }
55
+ else if (!known.has(annotation.series)) {
56
+ ctx.addIssue({
57
+ code: "custom",
58
+ message: `"${annotation.series}" is not a series of this chart`,
59
+ path: ["annotations", index, "series"],
60
+ });
61
+ }
62
+ });
63
+ }
64
+ function checkSeries(valueKeys, categoryKey) {
65
+ return (chart, ctx) => {
66
+ const { data, series } = chart;
67
+ checkStatSeries(chart, ctx, series?.map(({ key }) => key), offsetSeriesKeys(series, chart.stacked));
68
+ if (series === undefined) {
69
+ data.forEach((point, index) => {
70
+ valueKeys.forEach((key) => {
71
+ if (typeof point[key] !== "number") {
72
+ ctx.addIssue({ code: "custom", message: `Expected a number for "${key}"`, path: ["data", index, key] });
73
+ }
74
+ });
75
+ });
76
+ return;
77
+ }
78
+ const seen = new Set();
79
+ series.forEach(({ key }, index) => {
80
+ if (key === categoryKey) {
81
+ ctx.addIssue({ code: "custom", message: `"${key}" is the category field`, path: ["series", index, "key"] });
82
+ }
83
+ if (seen.has(key)) {
84
+ ctx.addIssue({ code: "custom", message: `"${key}" is listed twice`, path: ["series", index, "key"] });
85
+ }
86
+ seen.add(key);
87
+ });
88
+ data.forEach((point, index) => {
89
+ series.forEach(({ key }) => {
90
+ const value = point[key];
91
+ if (value !== undefined && value !== null && typeof value !== "number") {
92
+ ctx.addIssue({ code: "custom", message: `Expected a number for "${key}"`, path: ["data", index, key] });
93
+ }
94
+ });
95
+ });
96
+ series.forEach(({ key }, index) => {
97
+ if (!data.some((point) => typeof point[key] === "number")) {
98
+ ctx.addIssue({
99
+ code: "custom",
100
+ message: `"${key}" has no values: give each point a number under "${key}"`,
101
+ path: ["series", index, "key"],
102
+ });
103
+ }
104
+ });
105
+ };
106
+ }
107
+ function asSeriesChartData() {
108
+ // checkSeries has proven the shape; this only tells TypeScript.
109
+ return (chart) => chart;
110
+ }
18
111
  const scatterDataPointSchema = z.object({
19
112
  x: z.number(),
20
113
  y: z.number(),
@@ -23,10 +116,10 @@ const radarDataPointSchema = z.object({
23
116
  subject: z.string(),
24
117
  value: z.number(),
25
118
  });
26
- const composedDataPointSchema = z.object({
119
+ const composedDataPointSchema = z.looseObject({
27
120
  name: z.string(),
28
- barValue: z.number(),
29
- lineValue: z.number(),
121
+ barValue: z.number().optional(),
122
+ lineValue: z.number().optional(),
30
123
  });
31
124
  const axisValueSchema = z.union([z.string(), z.number()]);
32
125
  export const annotationTones = ["danger", "warning", "success", "info", "neutral"];
@@ -48,7 +141,7 @@ const statLineAnnotationSchema = z.object({
48
141
  kind: z.literal("stat-line"),
49
142
  stat: annotationStatSchema,
50
143
  axis: z.enum(["x", "y"]).optional(),
51
- series: annotationSeriesSchema.optional(),
144
+ series: z.union([annotationSeriesSchema, seriesKeySchema]).optional(),
52
145
  label: z.string().optional(),
53
146
  tone: annotationToneSchema.optional(),
54
147
  color: z.string().optional(),
@@ -81,46 +174,68 @@ const cartesianAnnotationFields = {
81
174
  annotations: z.array(annotationSchema).optional(),
82
175
  showValueLabels: z.boolean().optional(),
83
176
  };
84
- export const lineChartSchema = baseChartSchema.extend({
177
+ export const lineChartFieldsSchema = baseChartSchema.extend({
85
178
  type: z.literal("line"),
86
179
  data: z.array(xyDataPointSchema).min(1),
87
180
  ...cartesianAxisFields,
88
181
  ...cartesianAnnotationFields,
182
+ ...multiSeriesFields,
89
183
  });
90
- export const areaChartSchema = baseChartSchema.extend({
184
+ export const lineChartSchema = lineChartFieldsSchema
185
+ .superRefine(checkSeries(["y"], "x"))
186
+ .transform(asSeriesChartData());
187
+ export const areaChartFieldsSchema = baseChartSchema.extend({
91
188
  type: z.literal("area"),
92
189
  data: z.array(xyDataPointSchema).min(1),
190
+ stacked: z.boolean().optional(),
93
191
  ...cartesianAxisFields,
94
192
  ...cartesianAnnotationFields,
193
+ ...multiSeriesFields,
95
194
  });
96
- export const barChartSchema = baseChartSchema.extend({
195
+ export const areaChartSchema = areaChartFieldsSchema
196
+ .superRefine(checkSeries(["y"], "x"))
197
+ .transform(asSeriesChartData());
198
+ export const barChartFieldsSchema = baseChartSchema.extend({
97
199
  type: z.literal("bar"),
98
- data: z.array(nameValueDataPointSchema).min(1),
200
+ data: z.array(seriesNameValueDataPointSchema).min(1),
201
+ stacked: z.boolean().optional(),
99
202
  ...cartesianAxisFields,
100
203
  ...cartesianAnnotationFields,
204
+ ...multiSeriesFields,
101
205
  });
206
+ export const barChartSchema = barChartFieldsSchema
207
+ .superRefine(checkSeries(["value"], "name"))
208
+ .transform(asSeriesChartData());
102
209
  export const pieChartSchema = baseChartSchema.extend({
103
210
  type: z.literal("pie"),
104
211
  data: z.array(nameValueDataPointSchema).min(1),
105
212
  });
106
- export const scatterChartSchema = baseChartSchema.extend({
213
+ export const scatterChartSchema = baseChartSchema
214
+ .extend({
107
215
  type: z.literal("scatter"),
108
216
  data: z.array(scatterDataPointSchema).min(1),
109
217
  ...cartesianAxisFields,
110
218
  ...cartesianAnnotationFields,
111
- });
219
+ })
220
+ .superRefine((chart, ctx) => checkStatSeries(chart, ctx));
112
221
  export const radarChartSchema = baseChartSchema.extend({
113
222
  type: z.literal("radar"),
114
223
  data: z.array(radarDataPointSchema).min(1),
115
224
  });
116
- export const composedChartSchema = baseChartSchema.extend({
225
+ export const composedChartFieldsSchema = baseChartSchema.extend({
117
226
  type: z.literal("composed"),
118
227
  data: z.array(composedDataPointSchema).min(1),
119
228
  barLabel: z.string().optional(),
120
229
  lineLabel: z.string().optional(),
230
+ stacked: z.boolean().optional(),
121
231
  ...cartesianAxisFields,
122
232
  ...cartesianAnnotationFields,
233
+ ...multiSeriesFields,
234
+ series: z.array(composedChartSeriesSchema).min(1).max(maxChartSeries).optional(),
123
235
  });
236
+ export const composedChartSchema = composedChartFieldsSchema
237
+ .superRefine(checkSeries(["barValue", "lineValue"], "name"))
238
+ .transform(asSeriesChartData());
124
239
  export const chartSchema = z.discriminatedUnion("type", [
125
240
  lineChartSchema,
126
241
  areaChartSchema,
@@ -130,7 +245,7 @@ export const chartSchema = z.discriminatedUnion("type", [
130
245
  radarChartSchema,
131
246
  composedChartSchema,
132
247
  ]);
133
- const generateChartDataPointSchema = z.object({
248
+ const generateChartDataPointSchema = z.looseObject({
134
249
  x: z.union([z.string(), z.number()]).optional(),
135
250
  y: z.number().optional(),
136
251
  name: z.string().optional(),
@@ -148,7 +263,7 @@ const generateChartAnnotationSchema = z.object({
148
263
  x: axisValueSchema.optional(),
149
264
  y: z.number().optional(),
150
265
  stat: annotationStatSchema.optional(),
151
- series: annotationSeriesSchema.optional(),
266
+ series: z.union([annotationSeriesSchema, seriesKeySchema]).optional(),
152
267
  label: z.string().optional(),
153
268
  tone: annotationToneSchema.optional(),
154
269
  color: z.string().optional(),
@@ -162,7 +277,14 @@ export const generateChartInputSchema = z.object({
162
277
  yAxisLabel: z.string().optional(),
163
278
  barLabel: z.string().optional(),
164
279
  lineLabel: z.string().optional(),
280
+ rightAxisLabel: z.string().optional(),
165
281
  data: z.array(generateChartDataPointSchema).min(1),
282
+ series: z
283
+ .array(chartSeriesSchema.extend({ kind: z.enum(chartSeriesKinds).optional() }))
284
+ .min(1)
285
+ .max(maxChartSeries)
286
+ .optional(),
287
+ stacked: z.boolean().optional(),
166
288
  annotations: z.array(generateChartAnnotationSchema).optional(),
167
289
  showValueLabels: z.boolean().optional(),
168
290
  });
@@ -0,0 +1,28 @@
1
+ import type { StatContext } from "./annotations.js";
2
+ import type { ChartConfig } from "./chart.js";
3
+ import type { ChartSeries, ComposedChartSeries } from "./chart-schemas.js";
4
+ export declare const rightAxisId = "right";
5
+ export declare function seriesConfig(series: readonly ChartSeries[]): ChartConfig;
6
+ export declare function seriesColor(series: readonly ChartSeries[], item: ChartSeries): string;
7
+ export declare function rightAxisProps(label?: string): {
8
+ yAxisId: string;
9
+ orientation: "right";
10
+ tickLine: false;
11
+ axisLine: false;
12
+ width: number;
13
+ label: {
14
+ value: string;
15
+ angle: number;
16
+ position: string;
17
+ } | undefined;
18
+ };
19
+ export declare function hasRightAxis(series: readonly ChartSeries[]): boolean;
20
+ export declare function seriesAxisId(item: ChartSeries): string | undefined;
21
+ export declare function seriesAxisProps(item: ChartSeries): {
22
+ yAxisId?: string;
23
+ };
24
+ export declare function barRadius(series: readonly ChartSeries[], item: ChartSeries, stacked: boolean): [number, number, number, number];
25
+ export declare function seriesValues(rows: readonly Record<string, unknown>[], key: string): number[];
26
+ export declare function stackTotals(rows: readonly Record<string, unknown>[], keys: readonly string[]): number[];
27
+ export declare function seriesStats(rows: readonly Record<string, unknown>[], series: readonly (ChartSeries | ComposedChartSeries)[], stacked?: boolean): StatContext;
28
+ //# sourceMappingURL=series.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"series.d.ts","sourceRoot":"","sources":["../../../src/components/chart/series.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGxE,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CAExE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAErF;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;EAS5C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAEpE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAGvE;AAID,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,OAAO,GACf,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAMlC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAEvG;AAkBD,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACxC,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC,EAAE,EACtD,OAAO,UAAQ,GACd,WAAW,CAUb"}
@@ -0,0 +1,61 @@
1
+ import { isPresent } from "@manta-eu/lib/present";
2
+ import { chartColorAt } from "./chart-colors.js";
3
+ import { offsetSeriesKeys, stackedSeries } from "./stacks.js";
4
+ export const rightAxisId = "right";
5
+ export function seriesConfig(series) {
6
+ return Object.fromEntries(series.map((item) => [item.key, { label: item.label ?? item.key }]));
7
+ }
8
+ export function seriesColor(series, item) {
9
+ return chartColorAt(series.findIndex((other) => other.key === item.key));
10
+ }
11
+ export function rightAxisProps(label) {
12
+ return {
13
+ yAxisId: rightAxisId,
14
+ orientation: "right",
15
+ tickLine: false,
16
+ axisLine: false,
17
+ width: isPresent(label) ? 56 : 44,
18
+ label: isPresent(label) ? { value: label, angle: 90, position: "insideRight" } : undefined,
19
+ };
20
+ }
21
+ export function hasRightAxis(series) {
22
+ return series.some((item) => item.axis === "right");
23
+ }
24
+ export function seriesAxisId(item) {
25
+ return item.axis === "right" ? rightAxisId : undefined;
26
+ }
27
+ export function seriesAxisProps(item) {
28
+ const yAxisId = seriesAxisId(item);
29
+ return yAxisId === undefined ? {} : { yAxisId };
30
+ }
31
+ const roundedTop = [4, 4, 0, 0];
32
+ export function barRadius(series, item, stacked) {
33
+ if (!stacked) {
34
+ return roundedTop;
35
+ }
36
+ const stack = series.filter((other) => (other.axis ?? "left") === (item.axis ?? "left"));
37
+ return stack[stack.length - 1]?.key === item.key ? roundedTop : [0, 0, 0, 0];
38
+ }
39
+ export function seriesValues(rows, key) {
40
+ return rows.map((row) => row[key]).filter((value) => typeof value === "number");
41
+ }
42
+ export function stackTotals(rows, keys) {
43
+ return rows.map((row) => keys.reduce((total, key) => total + (typeof row[key] === "number" ? row[key] : 0), 0));
44
+ }
45
+ function defaultStatValues(rows, series, stacked) {
46
+ const leftStack = stacked ? stackedSeries(series, "left") : [];
47
+ if (leftStack.length > 1) {
48
+ return stackTotals(rows, leftStack.map((item) => item.key));
49
+ }
50
+ const firstLeft = series.find((item) => item.axis !== "right");
51
+ return firstLeft === undefined ? [] : seriesValues(rows, firstLeft.key);
52
+ }
53
+ export function seriesStats(rows, series, stacked = false) {
54
+ const offset = offsetSeriesKeys(series, stacked);
55
+ return {
56
+ y: defaultStatValues(rows, series, stacked),
57
+ series: Object.fromEntries(series
58
+ .filter((item) => !offset.has(item.key))
59
+ .map((item) => [item.key, { values: seriesValues(rows, item.key), yAxisId: seriesAxisId(item) }])),
60
+ };
61
+ }
@@ -0,0 +1,9 @@
1
+ type StackableSeries = {
2
+ key: string;
3
+ axis?: "left" | "right";
4
+ kind?: "bar" | "line";
5
+ };
6
+ export declare function stackedSeries(series: readonly StackableSeries[], axis: "left" | "right"): StackableSeries[];
7
+ export declare function offsetSeriesKeys(series: readonly StackableSeries[] | undefined, stacked: boolean | undefined): Set<string>;
8
+ export {};
9
+ //# sourceMappingURL=stacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../../src/components/chart/stacks.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC;AAEvF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,eAAe,EAAE,CAE3G;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,eAW5G"}
@@ -0,0 +1,11 @@
1
+ export function stackedSeries(series, axis) {
2
+ return series.filter((item) => item.kind !== "line" && (item.axis ?? "left") === axis);
3
+ }
4
+ export function offsetSeriesKeys(series, stacked) {
5
+ if (!stacked || series === undefined) {
6
+ return new Set();
7
+ }
8
+ return new Set(["left", "right"].flatMap((axis) => stackedSeries(series, axis)
9
+ .slice(1)
10
+ .map((item) => item.key)));
11
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatHeaders.d.ts","sourceRoot":"","sources":["../../../src/components/chat-view/ChatHeaders.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAIjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3D,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA8BxD;AAED,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,SAAS,EAAE,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CA+FtD"}
1
+ {"version":3,"file":"ChatHeaders.d.ts","sourceRoot":"","sources":["../../../src/components/chat-view/ChatHeaders.tsx"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAI9F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3D,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA8BxD;AAED,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,SAAS,EAAE,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CA+FtD"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { withDatastorePrefix } from "@manta-eu/client/shared/datastore-path";
3
- import { chatIdToPath } from "@manta-eu/client/shared/index";
3
+ import { chatIdToPath, newChatPath } from "@manta-eu/client/shared/index";
4
4
  import { isPresent } from "@manta-eu/lib/present";
5
5
  import { Bug, Ellipsis, ExternalLink, Trash2, X } from "lucide-react";
6
6
  import { useCallback, useState } from "react";
@@ -29,7 +29,7 @@ export function CopilotHeader(props) {
29
29
  const canClear = Boolean(conversationId && isPresent(messages) && onClear);
30
30
  const showDebugMessages = isOperator || isDevBuild;
31
31
  const handleOpenInManta = useCallback(() => {
32
- const path = conversationId ? chatIdToPath(conversationId) : "/";
32
+ const path = conversationId ? chatIdToPath(conversationId) : newChatPath;
33
33
  const scopedPath = datastoreId ? withDatastorePrefix(datastoreId, path) : datastorePath(path);
34
34
  const url = new URL(scopedPath, mantaBaseUrl.origin);
35
35
  window.open(url.toString(), "_blank");
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layouts/Sidebar.tsx"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AA6BvD,KAAK,YAAY,GAAG;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,2CAmZ1C"}
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layouts/Sidebar.tsx"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AA8BvD,KAAK,YAAY,GAAG;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,2CA8Z1C"}
@@ -16,7 +16,7 @@ import { Button } from "#components/button/index";
16
16
  import { ChannelIcon } from "#components/channel-icon/index";
17
17
  import { DropdownGroup, DropdownItem } from "#components/dropdown/index";
18
18
  import { Popover, PopoverContent, PopoverTrigger } from "#components/popover/index";
19
- import { Sidebar as BaseSidebar, Initials, NavMenu, NavUser, SidebarContent, SidebarFooter, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "#components/sidebar/index";
19
+ import { Sidebar as BaseSidebar, NavMenu, NavUser, SidebarContent, SidebarFooter, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, UserAvatar, useSidebar, } from "#components/sidebar/index";
20
20
  import { useConnectionProblems } from "#hooks/use-connection-problems";
21
21
  import { useConversations } from "#hooks/useConversations";
22
22
  import { useDeleteChat } from "#hooks/useDeleteChat";
@@ -28,6 +28,7 @@ import { useAbsoluteNavigate } from "#providers/ActiveDatastoreProvider";
28
28
  import { AuthContext } from "#providers/AuthContext";
29
29
  import { useChatManagerConnection } from "#providers/ChatManagerProvider";
30
30
  import { useCommandContext } from "#providers/commands/CommandContext";
31
+ import { useNavExtras } from "#providers/NavExtrasProvider";
31
32
  import { useKnowledgeGraphState } from "#providers/KnowledgeGraphStateContext";
32
33
  import { useMantaClient } from "#providers/MantaClientProvider";
33
34
  // Not a Keycloak Organization, so an operator without an explicit pick still resolves to this.
@@ -67,6 +68,7 @@ export function Sidebar(props) {
67
68
  const { isApple } = usePlatform();
68
69
  const ModifierIcon = isApple ? Command : ChevronUp;
69
70
  const navItemTooltip = isKnowledgeGraphUnavailable ? "Available when Manta is ready" : undefined;
71
+ const navExtras = useNavExtras();
70
72
  const navItems = useMemo(() => [
71
73
  {
72
74
  title: "New chat",
@@ -132,7 +134,16 @@ export function Sidebar(props) {
132
134
  },
133
135
  ]
134
136
  : []),
137
+ // Last, and only where the host mounts something of its own: the entries above are this app's.
138
+ ...navExtras.map((extra) => ({
139
+ ...(extra.id === undefined ? {} : { id: extra.id }),
140
+ title: extra.title,
141
+ icon: extra.icon,
142
+ isActive: extra.isCurrent?.(pathname) ?? pathname.startsWith(extra.href),
143
+ href: extra.href,
144
+ })),
135
145
  ].map((item) => ({ ...item, disabled: isKnowledgeGraphUnavailable, tooltip: navItemTooltip })), [
146
+ navExtras,
136
147
  ModifierIcon,
137
148
  startNewChat,
138
149
  isKnowledgeGraphUnavailable,
@@ -194,8 +205,8 @@ export function Sidebar(props) {
194
205
  openConversation(chat.id);
195
206
  }), title: chat.title, className: cn("flex w-full items-center gap-2 overflow-hidden rounded-xl px-3 py-2.5 text-left typography-small whitespace-nowrap transition-colors hover:bg-muted", chat.isActive
196
207
  ? "bg-faint text-default-foreground"
197
- : "text-muted-foreground hover:text-default-foreground"), children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: chat.title }) }, chat.id)))] })] }) }) }))] }), _jsx(ConnectionBadge, {}), _jsx(SidebarFooter, { children: onLogout ? (_jsx(NavUser, { name: userName, currentDatastore: { name: datastoreName }, pickerSlot: showDatastorePicker &&
208
+ : "text-muted-foreground hover:text-default-foreground"), children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: chat.title }) }, chat.id)))] })] }) }) }))] }), _jsx(ConnectionBadge, {}), _jsx(SidebarFooter, { children: onLogout ? (_jsx(NavUser, { name: userName, picture: user?.picture, currentDatastore: { name: datastoreName }, pickerSlot: showDatastorePicker &&
198
209
  onDatastoreSelected && (_jsx(ConnectedDatastorePicker, { currentDatastoreId: datastore?.id, isOperator: isOperator, isSwitching: isSwitching, datastores: datastores, onDatastoreSelected: onDatastoreSelected })), onCloseAutoFocus: handleProfileMenuCloseAutoFocus, onNavigateToAccount: () => {
199
210
  // TODO: Implement account navigation when account page is available
200
- }, onLogout: onLogout, children: _jsxs(DropdownGroup, { className: "p-2", children: [_jsx(ThemeSelectorDropdown, {}), canManageDatastores && (_jsx(ManageDatastoresMenuItem, { onSelect: () => (pendingMenuNavigateRef.current = "/datastores") })), canManageTeam && (_jsxs(DropdownItem, { className: "flex flex-row items-center gap-1.5 typography-caption h-11", onSelect: () => (pendingMenuNavigateRef.current = "/team"), children: [_jsx(UserPlus, { className: "size-5" }), _jsx("span", { className: "typography-caption", children: "Team Members" })] }))] }) })) : (_jsxs("div", { className: "flex items-center gap-3 px-2", children: [_jsx(Initials, { name: userName }), _jsxs("div", { className: "flex flex-col min-w-0 flex-1", children: [_jsx("span", { className: "truncate typography-small text-left", children: userName }), datastoreName && (_jsx("span", { className: "truncate typography-tiny text-muted-foreground text-left", children: datastoreName }))] })] })) }), conversationToDelete && (_jsx(DeleteConfirmationDialog, { title: "Delete Conversation", description: "Are you sure you want to delete this conversation? This action cannot be undone and will permanently remove the conversation and all its data.", open: true, onOpenChange: (open) => !open && handleCancelDeleteChat(), onConfirm: handleConfirmDeleteChat, onCancel: handleCancelDeleteChat }))] }));
211
+ }, onLogout: onLogout, children: _jsxs(DropdownGroup, { className: "p-2", children: [_jsx(ThemeSelectorDropdown, {}), canManageDatastores && (_jsx(ManageDatastoresMenuItem, { onSelect: () => (pendingMenuNavigateRef.current = "/datastores") })), canManageTeam && (_jsxs(DropdownItem, { className: "flex flex-row items-center gap-1.5 typography-caption h-11", onSelect: () => (pendingMenuNavigateRef.current = "/team"), children: [_jsx(UserPlus, { className: "size-5" }), _jsx("span", { className: "typography-caption", children: "Team Members" })] }))] }) })) : (_jsxs("div", { className: "flex items-center gap-3 px-2", children: [_jsx(UserAvatar, { name: userName, picture: user?.picture }), _jsxs("div", { className: "flex flex-col min-w-0 flex-1", children: [_jsx("span", { className: "truncate typography-small text-left", children: userName }), datastoreName && (_jsx("span", { className: "truncate typography-tiny text-muted-foreground text-left", children: datastoreName }))] })] })) }), conversationToDelete && (_jsx(DeleteConfirmationDialog, { title: "Delete Conversation", description: "Are you sure you want to delete this conversation? This action cannot be undone and will permanently remove the conversation and all its data.", open: true, onOpenChange: (open) => !open && handleCancelDeleteChat(), onConfirm: handleConfirmDeleteChat, onCancel: handleCancelDeleteChat }))] }));
201
212
  }
@@ -11,6 +11,7 @@ type ActioningViewProps = {
11
11
  datastoreId?: string;
12
12
  userId?: string;
13
13
  hideTopBar?: boolean;
14
+ hideRunControls?: boolean;
14
15
  chatIri?: string;
15
16
  completedChangesSlot?: ReactNode;
16
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ActioningView.d.ts","sourceRoot":"","sources":["../../../src/components/planning/ActioningView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAclF,OAAO,EAA0B,KAAK,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAmB1G,KAAK,kBAAkB,GAAG;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,GAAG,CAAC;IACtB,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,SAAS,CAAC;CAClC,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAkOtD"}
1
+ {"version":3,"file":"ActioningView.d.ts","sourceRoot":"","sources":["../../../src/components/planning/ActioningView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAclF,OAAO,EAA0B,KAAK,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAM1G,KAAK,kBAAkB,GAAG;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,GAAG,CAAC;IACtB,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,SAAS,CAAC;CAClC,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CA8LtD"}
@@ -1,8 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { GQLActionPlanState, GQLManualActionResolveStatus, useResolveManualActionMutation, } from "@manta-eu/client";
2
+ import { GQLActionPlanState } from "@manta-eu/client";
3
3
  import { extractPlanName } from "@manta-eu/client/shared/agent-mode";
4
4
  import { isPresent } from "@manta-eu/lib/present";
5
- import { useQueryClient } from "@tanstack/react-query";
6
5
  import { useCallback, useEffect, useMemo, useState } from "react";
7
6
  import { toast } from "sonner";
8
7
  import { deriveExecutionStatus, deriveIsDryRun, isStalePlanCompletion } from "./actioning-view-utils.js";
@@ -11,33 +10,29 @@ import { parseTimestampMs } from "./execution-section-model.js";
11
10
  import { ExecutionSections } from "./ExecutionSections.js";
12
11
  import { ExecutionTopBar } from "./ExecutionTopBar.js";
13
12
  import { FailedBanner } from "./FailedBanner.js";
13
+ import { useManualActionTargets } from "./manual-action-targets.js";
14
14
  import { SummaryBar } from "./SummaryBar.js";
15
15
  import { UnavailablePlanNotice } from "./UnavailablePlanNotice.js";
16
16
  import { Loader } from "#components/loader/index";
17
17
  import { useActionPlanDetail } from "#hooks/useActionPlanDetail";
18
18
  import { useActionPlanExecution } from "#hooks/useActionPlanExecution";
19
- import { useActionPlanDiff, useActionPlanExecutionProvenance, useManualActions, } from "#ldo-ui";
20
- import { extractLabel } from "#lib/iri-labels";
19
+ import { useResolveManualAction } from "#hooks/useResolveManualAction";
20
+ import { useActionPlanDiff, useActionPlanExecutionProvenance, useManualActions } from "#ldo-ui";
21
21
  import { getPendingManualActions } from "#lib/manual-actions";
22
22
  import { cn } from "#lib/utils";
23
- import { useMantaClient } from "#providers/MantaClientProvider";
24
- import { invalidateActionPlanQueries } from "#shared/query-keys";
25
- const resolutionStatuses = {
26
- COMPLETED: GQLManualActionResolveStatus.Completed,
27
- RETRY: GQLManualActionResolveStatus.Retry,
28
- REJECTED: GQLManualActionResolveStatus.Rejected,
29
- };
30
23
  export function ActioningView(props) {
31
- const { planGraphIri, diff, isLoading, executionControl, executePromptNonce, datastoreId, userId, hideTopBar = false, chatIri, completedChangesSlot, } = props;
24
+ const { planGraphIri, diff, isLoading, executionControl, executePromptNonce, datastoreId, userId, hideTopBar = false, hideRunControls = false, chatIri, completedChangesSlot, } = props;
32
25
  const planName = extractPlanName(planGraphIri);
33
26
  const [isExecuteDialogOpen, setIsExecuteDialogOpen] = useState(false);
34
27
  const internalExecutionControl = useActionPlanExecution(planGraphIri, chatIri);
35
28
  const { execute, isTriggered, triggeredAtMs, dryRun, workflowId, triggerError } = executionControl ?? internalExecutionControl;
36
29
  useEffect(() => {
30
+ if (hideRunControls)
31
+ return;
37
32
  if ((executePromptNonce ?? 0) > 0) {
38
33
  setIsExecuteDialogOpen(true);
39
34
  }
40
- }, [executePromptNonce]);
35
+ }, [executePromptNonce, hideRunControls]);
41
36
  const { plan } = useActionPlanDetail(planGraphIri);
42
37
  const hasCurrentFacts = plan?.hasCurrentFacts ?? false;
43
38
  const { data: fetchedDiff } = useActionPlanDiff({ planGraphIri, enabled: !!planGraphIri });
@@ -73,30 +68,7 @@ export function ActioningView(props) {
73
68
  const planEndedAtMs = stale ? null : parseTimestampMs(provenance?.planEndedAtTime);
74
69
  const isExecutionActive = executionStatus === "running" || executionStatus === "needs-approval";
75
70
  const activeStartedAtMs = isExecutionActive ? planStartedAtMs : null;
76
- const queryClient = useQueryClient();
77
- const { mantaClient } = useMantaClient();
78
- const resolveManualAction = useResolveManualActionMutation(mantaClient);
79
- const canResolveManualAction = !!datastoreId && !!userId;
80
- const handleManualActionResolve = useCallback((subjectIri, resolution) => {
81
- if (!userId) {
82
- toast.error("Cannot resolve manual action: missing user context.");
83
- return;
84
- }
85
- resolveManualAction.mutate({
86
- namedGraphIri: planGraphIri,
87
- subjectIri,
88
- resolvedBy: userId,
89
- status: resolutionStatuses[resolution],
90
- }, {
91
- onSuccess: async () => {
92
- await invalidateActionPlanQueries(queryClient, planGraphIri);
93
- },
94
- onError: (err) => {
95
- console.error("Failed to resolve manual action", err);
96
- toast.error(err instanceof Error ? err.message : "Failed to resolve manual action.");
97
- },
98
- });
99
- }, [userId, planGraphIri, resolveManualAction, queryClient]);
71
+ const manualActionResolver = useResolveManualAction({ planGraphIri, userId, datastoreId });
100
72
  const handleExecute = useCallback((nextDryRun) => {
101
73
  void execute(nextDryRun);
102
74
  }, [execute]);
@@ -109,19 +81,10 @@ export function ActioningView(props) {
109
81
  toast.error(nextDryRun ? "Failed to preview plan re-run" : "Failed to re-run plan");
110
82
  }
111
83
  }, [execute]);
112
- const manualActionEntities = useMemo(() => {
113
- const map = new Map();
114
- for (const ma of manualActions) {
115
- map.set(ma.subjectIri, [
116
- {
117
- subjectIri: ma.subjectIri,
118
- label: (ma.aboutIri && extractLabel(ma.aboutIri)) || ma.subjectLabel || ma.typeName || "Manual action",
119
- properties: [],
120
- },
121
- ]);
122
- }
123
- return map;
124
- }, [manualActions]);
84
+ const canRunPlan = !hideRunControls && hasCurrentFacts;
85
+ const onExecute = canRunPlan ? handleExecute : undefined;
86
+ const onRerun = canRunPlan ? handleConfirmRerun : undefined;
87
+ const manualActionEntities = useManualActionTargets(manualActions);
125
88
  const entityTypes = useMemo(() => {
126
89
  if (!ldoDiff)
127
90
  return [];
@@ -153,6 +116,6 @@ export function ActioningView(props) {
153
116
  return Array.from(byType.values());
154
117
  }, [entityTypes, manualActions]);
155
118
  const completedChanges = executionStatus === "completed" ? completedChangesSlot : null;
156
- return (_jsxs("div", { className: cn("flex flex-col", !hideTopBar && "h-full bg-background"), children: [!hideTopBar && (_jsx(ExecutionTopBar, { planName: planName, status: executionStatus, workflowId: workflowId, triggerError: triggerError, onExecute: hasCurrentFacts ? handleExecute : undefined, onRerun: hasCurrentFacts ? handleConfirmRerun : undefined, isExecuteDialogOpen: isExecuteDialogOpen, onExecuteDialogOpenChange: setIsExecuteDialogOpen, isDryRun: isDryRun })), !hideTopBar && isDryRunCompleted && _jsx(DryRunCompleteBanner, {}), _jsx("div", { className: cn(!hideTopBar && "flex-1 overflow-y-auto"), children: _jsxs("div", { className: cn("space-y-6", hideTopBar ? "mx-auto w-full max-w-7xl px-8" : "mx-auto max-w-[960px] px-16 py-8"), children: [!hideTopBar && plan && !plan.hasCurrentFacts && (_jsx(UnavailablePlanNotice, { hasExecutionHistory: plan.hasExecutionHistory })), executionStatus === "failed" && (provenance?.planErrorMessage || triggerError) && (_jsx(FailedBanner, { message: provenance?.planErrorMessage ?? triggerError ?? "Execution failed" })), isLoading && !isPresent(effectiveEntityTypes) && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Loader, { className: "size-6" }) })), plan && (_jsx(SummaryBar, { plan: plan, executionStatus: executionStatus, startedAtMs: planStartedAtMs, endedAtMs: planEndedAtMs })), completedChanges ??
157
- (isPresent(effectiveEntityTypes) && (_jsx(ExecutionSections, { entityTypes: effectiveEntityTypes, provenance: provenance ?? null, manualActions: manualActions, manualActionEntities: manualActionEntities, activeStartedAtMs: activeStartedAtMs, onManualActionResolve: handleManualActionResolve, isResolvingManualAction: resolveManualAction.isPending || !canResolveManualAction })))] }) })] }));
119
+ return (_jsxs("div", { className: cn("flex flex-col", !hideTopBar && "h-full bg-background"), children: [!hideTopBar && (_jsx(ExecutionTopBar, { planName: planName, status: executionStatus, workflowId: workflowId, triggerError: triggerError, onExecute: onExecute, onRerun: onRerun, isExecuteDialogOpen: isExecuteDialogOpen, onExecuteDialogOpenChange: setIsExecuteDialogOpen, isDryRun: isDryRun })), !hideTopBar && isDryRunCompleted && _jsx(DryRunCompleteBanner, {}), _jsx("div", { className: cn(!hideTopBar && "flex-1 overflow-y-auto"), children: _jsxs("div", { className: cn("space-y-6", hideTopBar ? "mx-auto w-full max-w-7xl px-8" : "mx-auto max-w-[960px] px-16 py-8"), children: [!hideTopBar && plan && !plan.hasCurrentFacts && (_jsx(UnavailablePlanNotice, { hasExecutionHistory: plan.hasExecutionHistory })), executionStatus === "failed" && (provenance?.planErrorMessage || triggerError) && (_jsx(FailedBanner, { message: provenance?.planErrorMessage ?? triggerError ?? "Execution failed" })), isLoading && !isPresent(effectiveEntityTypes) && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Loader, { className: "size-6" }) })), plan && (_jsx(SummaryBar, { plan: plan, executionStatus: executionStatus, startedAtMs: planStartedAtMs, endedAtMs: planEndedAtMs })), completedChanges ??
120
+ (isPresent(effectiveEntityTypes) && (_jsx(ExecutionSections, { entityTypes: effectiveEntityTypes, provenance: provenance ?? null, manualActions: manualActions, manualActionEntities: manualActionEntities, activeStartedAtMs: activeStartedAtMs, onManualActionResolve: manualActionResolver.resolve, resolvingManualAction: manualActionResolver.resolving, canResolveManualAction: manualActionResolver.canResolve, manualActionDisabledReason: manualActionResolver.disabledReason })))] }) })] }));
158
121
  }