@manta-eu/react 0.1.10 → 0.2.1

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 (324) hide show
  1. package/dist/components/channel-icon/index.d.ts +1 -0
  2. package/dist/components/channel-icon/index.d.ts.map +1 -1
  3. package/dist/components/channel-icon/index.js +1 -1
  4. package/dist/components/channel-icon/index.js.map +1 -1
  5. package/dist/components/chat-view/ChatTurnErrorNotice.d.ts.map +1 -1
  6. package/dist/components/chat-view/ChatTurnErrorNotice.js +3 -1
  7. package/dist/components/chat-view/ChatTurnErrorNotice.js.map +1 -1
  8. package/dist/components/layouts/ConnectedCustomApp.d.ts +13 -0
  9. package/dist/components/layouts/ConnectedCustomApp.d.ts.map +1 -0
  10. package/dist/components/layouts/ConnectedCustomApp.js +37 -0
  11. package/dist/components/layouts/ConnectedCustomApp.js.map +1 -0
  12. package/dist/components/layouts/Sidebar.d.ts.map +1 -1
  13. package/dist/components/layouts/Sidebar.js +6 -3
  14. package/dist/components/layouts/Sidebar.js.map +1 -1
  15. package/dist/components/planning/ActioningView.d.ts +1 -2
  16. package/dist/components/planning/ActioningView.d.ts.map +1 -1
  17. package/dist/components/planning/ActioningView.js +19 -44
  18. package/dist/components/planning/ActioningView.js.map +1 -1
  19. package/dist/components/planning/ManualActionCard.d.ts +4 -0
  20. package/dist/components/planning/ManualActionCard.d.ts.map +1 -1
  21. package/dist/components/planning/ManualActionCard.js +7 -5
  22. package/dist/components/planning/ManualActionCard.js.map +1 -1
  23. package/dist/components/planning/ManualActionList.d.ts +4 -0
  24. package/dist/components/planning/ManualActionList.d.ts.map +1 -1
  25. package/dist/components/planning/ManualActionList.js +8 -2
  26. package/dist/components/planning/ManualActionList.js.map +1 -1
  27. package/dist/components/planning/actioning-view-utils.d.ts +9 -0
  28. package/dist/components/planning/actioning-view-utils.d.ts.map +1 -1
  29. package/dist/components/planning/actioning-view-utils.js +19 -1
  30. package/dist/components/planning/actioning-view-utils.js.map +1 -1
  31. package/dist/components/table-skeleton/index.d.ts +2 -0
  32. package/dist/components/table-skeleton/index.d.ts.map +1 -1
  33. package/dist/components/table-skeleton/index.js +2 -1
  34. package/dist/components/table-skeleton/index.js.map +1 -1
  35. package/dist/components/tooltip/index.d.ts +7 -0
  36. package/dist/components/tooltip/index.d.ts.map +1 -1
  37. package/dist/components/tooltip/index.js +10 -1
  38. package/dist/components/tooltip/index.js.map +1 -1
  39. package/dist/globals.css +19 -6
  40. package/dist/graph/createNodeRouter.js +3 -3
  41. package/dist/graph/createNodeRouter.js.map +1 -1
  42. package/dist/graph/entity-link.d.ts +14 -0
  43. package/dist/graph/entity-link.d.ts.map +1 -0
  44. package/dist/graph/entity-link.js +12 -0
  45. package/dist/graph/entity-link.js.map +1 -0
  46. package/dist/graph/graph-list-utils.d.ts +1 -0
  47. package/dist/graph/graph-list-utils.d.ts.map +1 -1
  48. package/dist/graph/graph-list-utils.js +1 -0
  49. package/dist/graph/graph-list-utils.js.map +1 -1
  50. package/dist/graph/graph-model.d.ts.map +1 -1
  51. package/dist/graph/graph-model.js +14 -5
  52. package/dist/graph/graph-model.js.map +1 -1
  53. package/dist/graph/nodes/BrandAssetAnalysisView.d.ts.map +1 -1
  54. package/dist/graph/nodes/BrandAssetAnalysisView.js +2 -1
  55. package/dist/graph/nodes/BrandAssetAnalysisView.js.map +1 -1
  56. package/dist/graph/nodes/BrandFontSuggestionView.d.ts +3 -0
  57. package/dist/graph/nodes/BrandFontSuggestionView.d.ts.map +1 -0
  58. package/dist/graph/nodes/{BrandFontFamilyView.js → BrandFontSuggestionView.js} +22 -13
  59. package/dist/graph/nodes/BrandFontSuggestionView.js.map +1 -0
  60. package/dist/graph/nodes/BrandGuidelinesView.js +1 -1
  61. package/dist/graph/nodes/BrandGuidelinesView.js.map +1 -1
  62. package/dist/graph/nodes/NodePropertyTable.d.ts +4 -2
  63. package/dist/graph/nodes/NodePropertyTable.d.ts.map +1 -1
  64. package/dist/graph/nodes/NodePropertyTable.js +12 -59
  65. package/dist/graph/nodes/NodePropertyTable.js.map +1 -1
  66. package/dist/graph/nodes/brand-font.d.ts +8 -0
  67. package/dist/graph/nodes/brand-font.d.ts.map +1 -1
  68. package/dist/graph/nodes/brand-font.js +6 -0
  69. package/dist/graph/nodes/brand-font.js.map +1 -1
  70. package/dist/graph/nodes/brand-shared.d.ts +0 -3
  71. package/dist/graph/nodes/brand-shared.d.ts.map +1 -1
  72. package/dist/graph/nodes/brand-shared.js +1 -4
  73. package/dist/graph/nodes/brand-shared.js.map +1 -1
  74. package/dist/graph/nodes/node-property-row.d.ts +30 -0
  75. package/dist/graph/nodes/node-property-row.d.ts.map +1 -0
  76. package/dist/graph/nodes/node-property-row.js +35 -0
  77. package/dist/graph/nodes/node-property-row.js.map +1 -0
  78. package/dist/graph/property-formatters.d.ts +1 -0
  79. package/dist/graph/property-formatters.d.ts.map +1 -1
  80. package/dist/graph/property-formatters.js +4 -1
  81. package/dist/graph/property-formatters.js.map +1 -1
  82. package/dist/graph/special-nodes/AttributeList.d.ts +27 -0
  83. package/dist/graph/special-nodes/AttributeList.d.ts.map +1 -0
  84. package/dist/graph/special-nodes/AttributeList.js +57 -0
  85. package/dist/graph/special-nodes/AttributeList.js.map +1 -0
  86. package/dist/graph/special-nodes/EntityPreview.d.ts +5 -0
  87. package/dist/graph/special-nodes/EntityPreview.d.ts.map +1 -0
  88. package/dist/graph/special-nodes/EntityPreview.js +19 -0
  89. package/dist/graph/special-nodes/EntityPreview.js.map +1 -0
  90. package/dist/graph/special-nodes/EntityValueChip.d.ts +11 -0
  91. package/dist/graph/special-nodes/EntityValueChip.d.ts.map +1 -0
  92. package/dist/graph/special-nodes/EntityValueChip.js +40 -0
  93. package/dist/graph/special-nodes/EntityValueChip.js.map +1 -0
  94. package/dist/graph/special-nodes/GenericView.d.ts +2 -1
  95. package/dist/graph/special-nodes/GenericView.d.ts.map +1 -1
  96. package/dist/graph/special-nodes/GenericView.js +23 -69
  97. package/dist/graph/special-nodes/GenericView.js.map +1 -1
  98. package/dist/graph/special-nodes/card-facts.d.ts +52 -0
  99. package/dist/graph/special-nodes/card-facts.d.ts.map +1 -0
  100. package/dist/graph/special-nodes/card-facts.js +189 -0
  101. package/dist/graph/special-nodes/card-facts.js.map +1 -0
  102. package/dist/graph/special-nodes/property-icons.d.ts +9 -0
  103. package/dist/graph/special-nodes/property-icons.d.ts.map +1 -0
  104. package/dist/graph/special-nodes/property-icons.js +39 -0
  105. package/dist/graph/special-nodes/property-icons.js.map +1 -0
  106. package/dist/graph/status-utils.d.ts +16 -0
  107. package/dist/graph/status-utils.d.ts.map +1 -1
  108. package/dist/graph/status-utils.js +35 -0
  109. package/dist/graph/status-utils.js.map +1 -1
  110. package/dist/graph/types.d.ts +5 -0
  111. package/dist/graph/types.d.ts.map +1 -1
  112. package/dist/hooks/use-approve-anyway.d.ts +12 -0
  113. package/dist/hooks/use-approve-anyway.d.ts.map +1 -0
  114. package/dist/hooks/use-approve-anyway.js +81 -0
  115. package/dist/hooks/use-approve-anyway.js.map +1 -0
  116. package/dist/hooks/use-connection-problems.d.ts.map +1 -1
  117. package/dist/hooks/useAuth.d.ts +2 -2
  118. package/dist/hooks/useAuth.d.ts.map +1 -1
  119. package/dist/hooks/useAuth.js +2 -2
  120. package/dist/hooks/useAuth.js.map +1 -1
  121. package/dist/hooks/useOnboardingState.js +1 -1
  122. package/dist/hooks/useOnboardingState.js.map +1 -1
  123. package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
  124. package/dist/ldo-ui.d.ts +2 -1
  125. package/dist/ldo-ui.d.ts.map +1 -1
  126. package/dist/ldo-ui.js +1 -0
  127. package/dist/ldo-ui.js.map +1 -1
  128. package/dist/lib/datastore-route-table.d.ts +2 -1
  129. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  130. package/dist/lib/datastore-route-table.js +2 -1
  131. package/dist/lib/datastore-route-table.js.map +1 -1
  132. package/dist/lib/manual-actions.d.ts +2 -1
  133. package/dist/lib/manual-actions.d.ts.map +1 -1
  134. package/dist/lib/manual-actions.js +3 -2
  135. package/dist/lib/manual-actions.js.map +1 -1
  136. package/dist/providers/ActiveChatProvider.js +3 -1
  137. package/dist/providers/ActiveChatProvider.js.map +1 -1
  138. package/dist/providers/AuthContext.d.ts +2 -1
  139. package/dist/providers/AuthContext.d.ts.map +1 -1
  140. package/dist/providers/AuthContext.js.map +1 -1
  141. package/dist/providers/ChatManagerProvider.d.ts.map +1 -1
  142. package/dist/providers/ChatManagerProvider.js +22 -9
  143. package/dist/providers/ChatManagerProvider.js.map +1 -1
  144. package/dist/providers/chat-socket-auth.d.ts +7 -2
  145. package/dist/providers/chat-socket-auth.d.ts.map +1 -1
  146. package/dist/providers/chat-socket-auth.js +87 -16
  147. package/dist/providers/chat-socket-auth.js.map +1 -1
  148. package/dist/providers/index.d.ts.map +1 -1
  149. package/dist/providers/index.js +8 -1
  150. package/dist/providers/index.js.map +1 -1
  151. package/dist/routes/activity/detail/ActivityChanges.d.ts +2 -0
  152. package/dist/routes/activity/detail/ActivityChanges.d.ts.map +1 -1
  153. package/dist/routes/activity/detail/ActivityChanges.js +8 -7
  154. package/dist/routes/activity/detail/ActivityChanges.js.map +1 -1
  155. package/dist/routes/activity/detail/ActivityDetail.d.ts +1 -0
  156. package/dist/routes/activity/detail/ActivityDetail.d.ts.map +1 -1
  157. package/dist/routes/activity/detail/ActivityDetail.js +5 -4
  158. package/dist/routes/activity/detail/ActivityDetail.js.map +1 -1
  159. package/dist/routes/activity/detail/ActivityStepsRail.d.ts +1 -0
  160. package/dist/routes/activity/detail/ActivityStepsRail.d.ts.map +1 -1
  161. package/dist/routes/activity/detail/ActivityStepsRail.js +3 -2
  162. package/dist/routes/activity/detail/ActivityStepsRail.js.map +1 -1
  163. package/dist/routes/activity/detail/ActivityTimeline.js +2 -2
  164. package/dist/routes/activity/detail/ActivityTimeline.js.map +1 -1
  165. package/dist/routes/activity/detail/NoChangesMessage.d.ts +6 -0
  166. package/dist/routes/activity/detail/NoChangesMessage.d.ts.map +1 -0
  167. package/dist/routes/activity/detail/NoChangesMessage.js +10 -0
  168. package/dist/routes/activity/detail/NoChangesMessage.js.map +1 -0
  169. package/dist/routes/data-explorer/components/RawTriples.js +1 -1
  170. package/dist/routes/data-explorer/components/RawTriples.js.map +1 -1
  171. package/dist/routes/data-explorer/components/RecentTypes.js +1 -1
  172. package/dist/routes/data-explorer/components/RecentTypes.js.map +1 -1
  173. package/dist/routes/data-explorer/components/class-detail/Instances.js +1 -1
  174. package/dist/routes/data-explorer/components/class-detail/Instances.js.map +1 -1
  175. package/dist/routes/data-explorer/components/namespace-detail/NamespaceClassRow.js +1 -1
  176. package/dist/routes/data-explorer/components/namespace-detail/NamespaceClassRow.js.map +1 -1
  177. package/dist/routes/data-explorer/components/ontology-coverage/CoverageTermColumns.js +1 -1
  178. package/dist/routes/data-explorer/components/ontology-coverage/CoverageTermColumns.js.map +1 -1
  179. package/dist/routes/data-explorer/components/ontology-coverage/UnobservedRuleVocabulary.js +1 -1
  180. package/dist/routes/data-explorer/components/ontology-coverage/UnobservedRuleVocabulary.js.map +1 -1
  181. package/dist/routes/data-explorer/components/record-detail/ChatPreview.js +2 -2
  182. package/dist/routes/data-explorer/components/record-detail/ChatPreview.js.map +1 -1
  183. package/dist/routes/data-explorer/declared-namespaces.d.ts +3 -0
  184. package/dist/routes/data-explorer/declared-namespaces.d.ts.map +1 -1
  185. package/dist/routes/data-explorer/declared-namespaces.js +21 -13
  186. package/dist/routes/data-explorer/declared-namespaces.js.map +1 -1
  187. package/dist/routes/data-explorer/namespaces.d.ts +1 -0
  188. package/dist/routes/data-explorer/namespaces.d.ts.map +1 -1
  189. package/dist/routes/data-explorer/namespaces.js +7 -6
  190. package/dist/routes/data-explorer/namespaces.js.map +1 -1
  191. package/dist/routes/datastores/components/DeleteDatastoreDialog.d.ts +10 -0
  192. package/dist/routes/datastores/components/DeleteDatastoreDialog.d.ts.map +1 -0
  193. package/dist/routes/datastores/components/DeleteDatastoreDialog.js +20 -0
  194. package/dist/routes/datastores/components/DeleteDatastoreDialog.js.map +1 -0
  195. package/dist/routes/datastores/flatten.d.ts +1 -0
  196. package/dist/routes/datastores/flatten.d.ts.map +1 -1
  197. package/dist/routes/datastores/flatten.js +17 -0
  198. package/dist/routes/datastores/flatten.js.map +1 -1
  199. package/dist/routes/datastores/hooks/useDatastoreColumns.d.ts +3 -1
  200. package/dist/routes/datastores/hooks/useDatastoreColumns.d.ts.map +1 -1
  201. package/dist/routes/datastores/hooks/useDatastoreColumns.js +14 -6
  202. package/dist/routes/datastores/hooks/useDatastoreColumns.js.map +1 -1
  203. package/dist/routes/datastores/index.d.ts.map +1 -1
  204. package/dist/routes/datastores/index.js +31 -5
  205. package/dist/routes/datastores/index.js.map +1 -1
  206. package/dist/routes/integrations/components/ProviderGroup.js +2 -2
  207. package/dist/routes/integrations/components/ProviderGroup.js.map +1 -1
  208. package/dist/routes/integrations/components/connect-forms/DataConnectionConnectForm.d.ts.map +1 -1
  209. package/dist/routes/integrations/components/connect-forms/DataConnectionConnectForm.js +13 -6
  210. package/dist/routes/integrations/components/connect-forms/DataConnectionConnectForm.js.map +1 -1
  211. package/dist/routes/integrations/components/connect-forms/data-connection-fields.d.ts +3 -0
  212. package/dist/routes/integrations/components/connect-forms/data-connection-fields.d.ts.map +1 -1
  213. package/dist/routes/integrations/components/connect-forms/data-connection-fields.js +9 -2
  214. package/dist/routes/integrations/components/connect-forms/data-connection-fields.js.map +1 -1
  215. package/dist/routes/plans/components/ActionPlanPage.d.ts.map +1 -1
  216. package/dist/routes/plans/components/ActionPlanPage.js +4 -7
  217. package/dist/routes/plans/components/ActionPlanPage.js.map +1 -1
  218. package/dist/routes/plans/components/PlanDetailRouteContent.d.ts.map +1 -1
  219. package/dist/routes/plans/components/PlanDetailRouteContent.js +2 -1
  220. package/dist/routes/plans/components/PlanDetailRouteContent.js.map +1 -1
  221. package/package.json +12 -7
  222. package/src/app-subpaths.json +1 -0
  223. package/src/components/channel-icon/index.tsx +1 -1
  224. package/src/components/chat-view/ChatTurnErrorNotice.tsx +3 -1
  225. package/src/components/layouts/ConnectedCustomApp.tsx +63 -0
  226. package/src/components/layouts/Sidebar.tsx +9 -3
  227. package/src/components/planning/ActioningView.tsx +62 -70
  228. package/src/components/planning/ManualActionCard.tsx +66 -14
  229. package/src/components/planning/ManualActionList.tsx +30 -11
  230. package/src/components/planning/actioning-view-utils.ts +27 -1
  231. package/src/components/table-skeleton/index.tsx +7 -1
  232. package/src/components/tooltip/index.tsx +35 -2
  233. package/src/graph/createNodeRouter.tsx +3 -3
  234. package/src/graph/entity-link.tsx +20 -0
  235. package/src/graph/graph-list-utils.ts +2 -0
  236. package/src/graph/graph-model.ts +15 -6
  237. package/src/graph/nodes/BrandAssetAnalysisView.tsx +3 -1
  238. package/src/graph/nodes/{BrandFontFamilyView.tsx → BrandFontSuggestionView.tsx} +41 -27
  239. package/src/graph/nodes/BrandGuidelinesView.tsx +1 -1
  240. package/src/graph/nodes/NodePropertyTable.tsx +32 -143
  241. package/src/graph/nodes/brand-font.ts +17 -0
  242. package/src/graph/nodes/brand-shared.tsx +1 -4
  243. package/src/graph/nodes/node-property-row.tsx +154 -0
  244. package/src/graph/property-formatters.ts +5 -1
  245. package/src/graph/special-nodes/AttributeList.tsx +177 -0
  246. package/src/graph/special-nodes/EntityPreview.tsx +27 -0
  247. package/src/graph/special-nodes/EntityValueChip.tsx +85 -0
  248. package/src/graph/special-nodes/GenericView.tsx +49 -139
  249. package/src/graph/special-nodes/card-facts.ts +278 -0
  250. package/src/graph/special-nodes/property-icons.ts +59 -0
  251. package/src/graph/status-utils.ts +40 -0
  252. package/src/graph/types.ts +4 -0
  253. package/src/hooks/use-approve-anyway.ts +100 -0
  254. package/src/hooks/useAuth.ts +3 -3
  255. package/src/hooks/useOnboardingState.ts +1 -1
  256. package/src/ldo-ui.ts +8 -0
  257. package/src/lib/datastore-route-table.ts +4 -2
  258. package/src/lib/manual-actions.ts +3 -2
  259. package/src/providers/ActiveChatProvider.tsx +3 -1
  260. package/src/providers/AuthContext.ts +3 -1
  261. package/src/providers/ChatManagerProvider.tsx +19 -9
  262. package/src/providers/chat-socket-auth.ts +95 -16
  263. package/src/providers/index.tsx +16 -1
  264. package/src/routes/activity/detail/ActivityChanges.tsx +21 -5
  265. package/src/routes/activity/detail/ActivityDetail.tsx +24 -5
  266. package/src/routes/activity/detail/ActivityStepsRail.tsx +4 -2
  267. package/src/routes/activity/detail/ActivityTimeline.tsx +2 -2
  268. package/src/routes/activity/detail/NoChangesMessage.tsx +20 -0
  269. package/src/routes/data-explorer/components/RawTriples.tsx +1 -1
  270. package/src/routes/data-explorer/components/RecentTypes.tsx +1 -1
  271. package/src/routes/data-explorer/components/class-detail/Instances.tsx +1 -1
  272. package/src/routes/data-explorer/components/namespace-detail/NamespaceClassRow.tsx +1 -1
  273. package/src/routes/data-explorer/components/ontology-coverage/CoverageTermColumns.tsx +1 -1
  274. package/src/routes/data-explorer/components/ontology-coverage/UnobservedRuleVocabulary.tsx +1 -1
  275. package/src/routes/data-explorer/components/record-detail/ChatPreview.tsx +2 -2
  276. package/src/routes/data-explorer/declared-namespaces.ts +21 -13
  277. package/src/routes/data-explorer/namespaces.ts +7 -6
  278. package/src/routes/datastores/components/DeleteDatastoreDialog.tsx +78 -0
  279. package/src/routes/datastores/flatten.ts +15 -0
  280. package/src/routes/datastores/hooks/useDatastoreColumns.tsx +88 -49
  281. package/src/routes/datastores/index.tsx +41 -2
  282. package/src/routes/integrations/components/ProviderGroup.tsx +2 -2
  283. package/src/routes/integrations/components/connect-forms/DataConnectionConnectForm.tsx +38 -12
  284. package/src/routes/integrations/components/connect-forms/data-connection-fields.ts +11 -2
  285. package/src/routes/plans/components/ActionPlanPage.tsx +9 -8
  286. package/src/routes/plans/components/PlanDetailRouteContent.tsx +4 -3
  287. package/dist/components/planning/ExecutionActivityRow.d.ts +0 -9
  288. package/dist/components/planning/ExecutionActivityRow.d.ts.map +0 -1
  289. package/dist/components/planning/ExecutionActivityRow.js +0 -53
  290. package/dist/components/planning/ExecutionActivityRow.js.map +0 -1
  291. package/dist/components/planning/ExecutionSectionItem.d.ts +0 -20
  292. package/dist/components/planning/ExecutionSectionItem.d.ts.map +0 -1
  293. package/dist/components/planning/ExecutionSectionItem.js +0 -66
  294. package/dist/components/planning/ExecutionSectionItem.js.map +0 -1
  295. package/dist/components/planning/ExecutionSections.d.ts +0 -16
  296. package/dist/components/planning/ExecutionSections.d.ts.map +0 -1
  297. package/dist/components/planning/ExecutionSections.js +0 -32
  298. package/dist/components/planning/ExecutionSections.js.map +0 -1
  299. package/dist/components/planning/action-plan-icons.d.ts +0 -3
  300. package/dist/components/planning/action-plan-icons.d.ts.map +0 -1
  301. package/dist/components/planning/action-plan-icons.js +0 -25
  302. package/dist/components/planning/action-plan-icons.js.map +0 -1
  303. package/dist/components/planning/execution-section-model.d.ts +0 -24
  304. package/dist/components/planning/execution-section-model.d.ts.map +0 -1
  305. package/dist/components/planning/execution-section-model.js +0 -150
  306. package/dist/components/planning/execution-section-model.js.map +0 -1
  307. package/dist/graph/nodes/BrandFontFamilyView.d.ts +0 -3
  308. package/dist/graph/nodes/BrandFontFamilyView.d.ts.map +0 -1
  309. package/dist/graph/nodes/BrandFontFamilyView.js.map +0 -1
  310. package/dist/graph/nodes/BrandFontUploadButton.d.ts +0 -6
  311. package/dist/graph/nodes/BrandFontUploadButton.d.ts.map +0 -1
  312. package/dist/graph/nodes/BrandFontUploadButton.js +0 -69
  313. package/dist/graph/nodes/BrandFontUploadButton.js.map +0 -1
  314. package/dist/routes/data-explorer/components/TruncateTooltip.d.ts +0 -7
  315. package/dist/routes/data-explorer/components/TruncateTooltip.d.ts.map +0 -1
  316. package/dist/routes/data-explorer/components/TruncateTooltip.js +0 -9
  317. package/dist/routes/data-explorer/components/TruncateTooltip.js.map +0 -1
  318. package/src/components/planning/ExecutionActivityRow.tsx +0 -89
  319. package/src/components/planning/ExecutionSectionItem.tsx +0 -184
  320. package/src/components/planning/ExecutionSections.tsx +0 -97
  321. package/src/components/planning/action-plan-icons.tsx +0 -27
  322. package/src/components/planning/execution-section-model.ts +0 -190
  323. package/src/graph/nodes/BrandFontUploadButton.tsx +0 -95
  324. package/src/routes/data-explorer/components/TruncateTooltip.tsx +0 -25
@@ -42,7 +42,7 @@ export function ActivityTimeline(props: ActivityTimelineProps) {
42
42
 
43
43
  if (!isPresent(bars)) {
44
44
  return (
45
- <div className="rounded-xl border border-muted-border bg-card px-5 py-4">
45
+ <div className="shrink-0 rounded-xl border border-muted-border bg-card px-5 py-4">
46
46
  <p className="typography-small text-muted-foreground">No timestamps to plot.</p>
47
47
  </div>
48
48
  );
@@ -57,7 +57,7 @@ export function ActivityTimeline(props: ActivityTimelineProps) {
57
57
  const trackHeightPx = Math.max(laneCount, 1) * rowHeightPx;
58
58
 
59
59
  return (
60
- <div className="overflow-auto rounded-xl border border-muted-border bg-card">
60
+ <div className="shrink-0 overflow-auto rounded-xl border border-muted-border bg-card">
61
61
  <div className="px-5 pb-3 pt-3" style={{ minWidth: `${trackMinWidthPx}px` }}>
62
62
  <div className="relative h-4">
63
63
  {ticks.map((tick, index) => (
@@ -0,0 +1,20 @@
1
+ import { Loader } from "#components/loader/index";
2
+
3
+ type NoChangesMessageProps = {
4
+ running?: boolean;
5
+ };
6
+
7
+ export function NoChangesMessage(props: NoChangesMessageProps) {
8
+ const { running = false } = props;
9
+
10
+ if (!running) {
11
+ return <p className="typography-small text-muted-foreground">No recorded changes.</p>;
12
+ }
13
+
14
+ return (
15
+ <p role="status" className="flex items-center gap-2 typography-small text-muted-foreground">
16
+ <Loader className="size-4 shrink-0" />
17
+ Running. Changes appear as each step completes.
18
+ </p>
19
+ );
20
+ }
@@ -7,8 +7,8 @@ import type { ReactNode } from "react";
7
7
  import { Link } from "react-router";
8
8
  import { useTriples } from "../triples";
9
9
  import { turtleForSubject } from "../turtle";
10
- import { TruncateTooltip } from "./TruncateTooltip";
11
10
  import { Skeleton } from "#components/skeleton/index";
11
+ import { TruncateTooltip } from "#components/tooltip/index";
12
12
  import { decodeSkolem, isBlankNode, useInstanceLabel } from "#ldo-ui";
13
13
  import { cn } from "#lib/utils";
14
14
 
@@ -16,8 +16,8 @@ import { Breadcrumbs } from "./Breadcrumbs";
16
16
  import { DetailHeader, TypeBadge } from "./DetailHeader";
17
17
  import { ModifiedAgo } from "./ModifiedAgo";
18
18
  import { EntityName, LinkList, LinkRow, LoadingRows, StatusText } from "./RawTriples";
19
- import { TruncateTooltip } from "./TruncateTooltip";
20
19
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "#components/collapsible/index";
20
+ import { TruncateTooltip } from "#components/tooltip/index";
21
21
  import { cn } from "#lib/utils";
22
22
 
23
23
  type RecentInstanceRowsProps = { recentType: RecentType };
@@ -7,7 +7,7 @@ import { LoadMoreButton } from "../LoadMoreButton";
7
7
  import { ModifiedAgo } from "../ModifiedAgo";
8
8
  import { entityNameClass, EntityName, LinkList, LinkRow, LoadingRows, StatusText } from "../RawTriples";
9
9
  import { SegmentBuilder } from "../SegmentBuilder";
10
- import { TruncateTooltip } from "../TruncateTooltip";
10
+ import { TruncateTooltip } from "#components/tooltip/index";
11
11
  import { encodeBlankKey, useBlankInstances } from "#routes/data-explorer/blank-record";
12
12
  import { useFilteredCount, useFilteredInstances } from "#routes/data-explorer/filter-hooks";
13
13
  import { classAnchor, hasActiveConditions, type SegmentFilter } from "#routes/data-explorer/filter-query";
@@ -1,7 +1,7 @@
1
1
  import { humanCount } from "@manta-eu/lib/humanize";
2
2
  import { classPath } from "../../namespaces";
3
3
  import { entityNameClass, LinkRow } from "../RawTriples";
4
- import { TruncateTooltip } from "../TruncateTooltip";
4
+ import { TruncateTooltip } from "#components/tooltip/index";
5
5
  import type { ExplorerClass } from "#routes/data-explorer/classes";
6
6
 
7
7
  type NamespaceClassRowProps = { entry: ExplorerClass; count?: number };
@@ -4,10 +4,10 @@ import { useMemo } from "react";
4
4
  import { Link } from "react-router";
5
5
  import { classRef, namespaceLabel } from "../../namespaces";
6
6
  import { NamespaceSwatch } from "../NamespaceSwatch";
7
- import { TruncateTooltip } from "../TruncateTooltip";
8
7
  import { MissingValue } from "./MissingValue";
9
8
  import { RuleReferencesCell } from "./RuleReferencesCell";
10
9
  import { Badge } from "#components/badge/index";
10
+ import { TruncateTooltip } from "#components/tooltip/index";
11
11
  import { sectionLabelClass } from "#ldo-ui";
12
12
  import { cn } from "#lib/utils";
13
13
  import type { CoverageTerm } from "#routes/data-explorer/coverage";
@@ -6,13 +6,13 @@ import { useEffect, useMemo, useState } from "react";
6
6
  import { Link } from "react-router";
7
7
  import { classRef, namespaceLabel } from "../../namespaces";
8
8
  import { NamespaceSwatch } from "../NamespaceSwatch";
9
- import { TruncateTooltip } from "../TruncateTooltip";
10
9
  import { RuleReferencesCell } from "./RuleReferencesCell";
11
10
  import { Badge } from "#components/badge/index";
12
11
  import { EmptyState } from "#components/empty-state/index";
13
12
  import { SearchInput } from "#components/input/index";
14
13
  import { PaginationBlock } from "#components/pagination/index";
15
14
  import { createTableConfig, DataTable } from "#components/table/index";
15
+ import { TruncateTooltip } from "#components/tooltip/index";
16
16
  import { shouldClampPageIndex, useFittedPagination } from "#hooks/useFittedPagination";
17
17
  import { sectionLabelClass } from "#ldo-ui";
18
18
  import { cn } from "#lib/utils";
@@ -90,14 +90,14 @@ export function ChatPreview(props: ChatPreviewProps) {
90
90
 
91
91
  if (!node) return <StatusText>Nothing to preview.</StatusText>;
92
92
 
93
- const EntityView = getEntityView(node.data.type, node.data.actionShape) ?? GenericView;
93
+ const EntityView = getEntityView(node.data.type, node.data.actionShape);
94
94
 
95
95
  return (
96
96
  <div className="flex flex-col gap-6">
97
97
  <section>
98
98
  <h3 className={cn(sectionLabelClass, "mb-1.5 text-muted-foreground")}>Chat rendering</h3>
99
99
  <div className="max-w-md">
100
- <EntityView data={node.data} />
100
+ {EntityView ? <EntityView data={node.data} /> : <GenericView data={node.data} defaultExpanded />}
101
101
  </div>
102
102
  </section>
103
103
 
@@ -1,22 +1,29 @@
1
- import { ontologyGraphIri } from "@manta-eu/client/shared/rdf-namespaces";
1
+ import { expandPrefix, ontologyGraphIri } from "@manta-eu/client/shared/rdf-namespaces";
2
2
  import { isPresent } from "@manta-eu/lib/present";
3
3
  import { DataFactory, type RDF } from "ldkit/rdf";
4
4
  import { SELECT } from "ldkit/sparql";
5
5
  import { useMemo } from "react";
6
- import { prefixes, registerDeclaredNamespaces, type DeclaredNamespace } from "./namespaces";
6
+ import { prefixes, realmPath, registerDeclaredNamespaces, type DeclaredNamespace } from "./namespaces";
7
7
  import { bindingValue, useSparqlSelect } from "#ldo-ui";
8
8
 
9
9
  const df = new DataFactory();
10
10
 
11
- const declaredNamespacesQuery = `${prefixes}${SELECT`?prefix ?namespace ?source ?title ?sourceLabel`.WHERE`
12
- GRAPH ${df.namedNode(ontologyGraphIri)} {
13
- [] sh:declare ?declaration .
14
- ?declaration sh:prefix ?prefix ; sh:namespace ?namespace .
15
- OPTIONAL {
16
- ?declaration rdfs:isDefinedBy ?source .
17
- OPTIONAL { ?source dcterms:title ?title }
18
- OPTIONAL { ?source rdfs:label ?sourceLabel }
11
+ const declaredNamespacesQuery = `${prefixes}${SELECT`?prefix ?namespace ?source ?title ?sourceLabel ?connectionName`
12
+ .WHERE`
13
+ {
14
+ GRAPH ${df.namedNode(ontologyGraphIri)} {
15
+ [] sh:declare ?declaration .
16
+ ?declaration sh:prefix ?prefix ; sh:namespace ?namespace .
17
+ OPTIONAL {
18
+ ?declaration rdfs:isDefinedBy ?source .
19
+ OPTIONAL { ?source dcterms:title ?title }
20
+ OPTIONAL { ?source rdfs:label ?sourceLabel }
21
+ }
19
22
  }
23
+ } UNION {
24
+ ?declaration a sh:PrefixDeclaration ; sh:namespace ?namespace ; schema:identifier ?id .
25
+ ?connection a ${df.namedNode(expandPrefix(":DataConnection"))} ; schema:identifier ?id ; schema:name ?connectionName .
26
+ FILTER NOT EXISTS { ?connection ${df.namedNode(expandPrefix(":deletedAt"))} ?deleted }
20
27
  }
21
28
  `.build()}`;
22
29
 
@@ -28,15 +35,16 @@ function sourceFrom(binding: RDF.Bindings) {
28
35
  return { iri, label: bindingValue(binding, "title") ?? bindingValue(binding, "sourceLabel") ?? iri };
29
36
  }
30
37
 
31
- function declaredNamespacesFrom(bindings: RDF.Bindings[]): Record<string, DeclaredNamespace> {
38
+ export function declaredNamespacesFrom(bindings: RDF.Bindings[]): Record<string, DeclaredNamespace> {
32
39
  return Object.fromEntries(
33
40
  bindings.flatMap<[string, DeclaredNamespace]>((binding) => {
34
- const prefix = bindingValue(binding, "prefix");
35
41
  const iri = bindingValue(binding, "namespace");
42
+ const connectionName = bindingValue(binding, "connectionName");
43
+ const prefix = isPresent(connectionName) && isPresent(iri) ? realmPath(iri) : bindingValue(binding, "prefix");
36
44
 
37
45
  if (!isPresent(prefix) || !isPresent(iri)) return [];
38
46
 
39
- return [[prefix, { iri, label: prefix, source: sourceFrom(binding) }]];
47
+ return [[prefix, { iri, label: connectionName ?? prefix, source: sourceFrom(binding) }]];
40
48
  }),
41
49
  );
42
50
  }
@@ -78,12 +78,13 @@ export function prefixForIri(iri: string): string | undefined {
78
78
 
79
79
  if (registered) return registered;
80
80
 
81
- if (!iri.startsWith(realmVocabRoot)) return undefined;
81
+ return realmPath(iri);
82
+ }
82
83
 
83
- const rest = iri.slice(realmVocabRoot.length);
84
- const segment = rest.split(/[#/]/)[0];
84
+ export function realmPath(iri: string): string | undefined {
85
+ if (!iri.startsWith(realmVocabRoot) || !iri.includes("#")) return undefined;
85
86
 
86
- return rest.startsWith(`${segment}#`) ? segment || undefined : undefined;
87
+ return iri.slice(realmVocabRoot.length).split("#")[0] || undefined;
87
88
  }
88
89
 
89
90
  export function localName(iri: string, prefix: string): string {
@@ -118,11 +119,11 @@ export function groupCrumb(prefix: string): { label: string; to: string } {
118
119
  }
119
120
 
120
121
  export function classPath(prefix: string, name: string): string {
121
- return `${explorerPath}/${prefix}/${name}`;
122
+ return `${namespacePath(prefix)}/${name}`;
122
123
  }
123
124
 
124
125
  export function recordPath(prefix: string, type: string, id: string): string {
125
- return `${explorerPath}/${prefix}/${type}/${encodeURIComponent(id)}`;
126
+ return `${classPath(prefix, type)}/${encodeURIComponent(id)}`;
126
127
  }
127
128
 
128
129
  export type ClassRef = { iri: string; prefix: string; localName: string; path: string };
@@ -0,0 +1,78 @@
1
+ import { useState } from "react";
2
+ import type { DatastoreRow } from "../flatten";
3
+ import { Button } from "#components/button/index";
4
+ import { Input } from "#components/input/index";
5
+ import {
6
+ Dialog,
7
+ DialogContent,
8
+ DialogDescription,
9
+ DialogFooter,
10
+ DialogHeader,
11
+ DialogTitle,
12
+ } from "#components/modal/index";
13
+
14
+ type DeleteDatastoreDialogProps = {
15
+ target: DatastoreRow;
16
+ isDeleting: boolean;
17
+ onConfirm: (confirmName: string) => void;
18
+ onCancel: () => void;
19
+ };
20
+
21
+ export function DeleteDatastoreDialog(props: DeleteDatastoreDialogProps) {
22
+ const { target, isDeleting, onConfirm, onCancel } = props;
23
+ const [typed, setTyped] = useState("");
24
+
25
+ const canDelete = typed.trim() === target.name.trim() && !isDeleting;
26
+ const deletesOrganization = target.isOrganization && target.mirrored !== true;
27
+
28
+ function confirm() {
29
+ if (canDelete) onConfirm(target.name);
30
+ }
31
+
32
+ return (
33
+ <Dialog open onOpenChange={(nextOpen) => !nextOpen && !isDeleting && onCancel()}>
34
+ <DialogContent className="flex flex-col overflow-hidden" showCloseButton={!isDeleting}>
35
+ <DialogHeader>
36
+ <DialogTitle
37
+ text={deletesOrganization ? "Delete organization permanently" : "Delete datastore permanently"}
38
+ />
39
+ <DialogDescription>This can't be undone. Deleting &quot;{target.name}&quot; removes:</DialogDescription>
40
+ </DialogHeader>
41
+
42
+ <ul className="list-disc pl-5 typography-small text-muted-foreground">
43
+ <li>its knowledge graph and everything in it</li>
44
+ <li>its connected integrations and their secrets</li>
45
+ <li>its uploaded files and chats</li>
46
+ {deletesOrganization && <li>the organization, its groups and memberships</li>}
47
+ {!target.isOrganization && !target.isUnlinked && <li>the group and its memberships</li>}
48
+ </ul>
49
+ {target.isOrganization && !deletesOrganization && (
50
+ <p className="typography-small text-muted-foreground">
51
+ The organization itself stays, because the identity provider holds it. It is listed as having no datastore
52
+ afterwards.
53
+ </p>
54
+ )}
55
+
56
+ <Input
57
+ autoFocus
58
+ label={`Type "${target.name}" to confirm`}
59
+ value={typed}
60
+ disabled={isDeleting}
61
+ onChange={(event) => setTyped(event.target.value)}
62
+ onKeyDown={(event) => {
63
+ if (event.key === "Enter") confirm();
64
+ }}
65
+ />
66
+
67
+ <DialogFooter>
68
+ <Button variant="tertiary" onClick={onCancel} disabled={isDeleting}>
69
+ Cancel
70
+ </Button>
71
+ <Button variant="destructive" onClick={confirm} disabled={!canDelete} isLoading={isDeleting}>
72
+ Delete permanently
73
+ </Button>
74
+ </DialogFooter>
75
+ </DialogContent>
76
+ </Dialog>
77
+ );
78
+ }
@@ -79,6 +79,21 @@ export function visibleDatastoreRows(rows: DatastoreRow[], visibility: Datastore
79
79
  return rows.filter((_row, index) => shown[index] || hasVisibleDescendant(rows, shown, index));
80
80
  }
81
81
 
82
+ // The server refuses to delete a datastore while others live under it.
83
+ export function nestedDatastoreNamesByRowId(rows: DatastoreRow[]): Map<string, string[]> {
84
+ const nested = new Map<string, string[]>();
85
+ rows.forEach((row, index) => {
86
+ const names: string[] = [];
87
+ for (let i = index + 1; i < rows.length; i++) {
88
+ const descendant = rows[i];
89
+ if (!descendant || descendant.depth <= row.depth) break;
90
+ if (isPresent(descendant.datastoreId)) names.push(descendant.name);
91
+ }
92
+ if (isPresent(names)) nested.set(row.id, names);
93
+ });
94
+ return nested;
95
+ }
96
+
82
97
  export function hiddenRowCount(
83
98
  rows: DatastoreRow[],
84
99
  visibility: DatastoreRowVisibility,
@@ -13,6 +13,7 @@ import {
13
13
  Power,
14
14
  RefreshCw,
15
15
  RotateCcw,
16
+ Trash,
16
17
  Trash2,
17
18
  TriangleAlert,
18
19
  Users,
@@ -28,6 +29,7 @@ import { isUnmirroredOrganization, type DatastoreRow } from "../flatten";
28
29
  import { Badge } from "#components/badge/index";
29
30
  import { Button } from "#components/button/index";
30
31
  import { datastoreStatusCategory, isMaterializing, type DatastoreStatus } from "#components/datastore-management/tree";
32
+ import { DisabledActionTooltip } from "#components/disabled-action-tooltip/index";
31
33
  import {
32
34
  Dropdown,
33
35
  DropdownContent,
@@ -99,6 +101,7 @@ type UseDatastoreColumnsArgs = {
99
101
  // Indentation only means something while rows are in hierarchy order; a sort makes it a lie.
100
102
  indented: boolean;
101
103
  matchableRowIds: Set<string>;
104
+ nestedDatastoreNamesByRowId: Map<string, string[]>;
102
105
  suggestedMatchByDatastoreId?: Record<string, DatastoreRow>;
103
106
  onSelect: (row: DatastoreRow) => void;
104
107
  onAddChild: (row: DatastoreRow) => void;
@@ -107,10 +110,11 @@ type UseDatastoreColumnsArgs = {
107
110
  onLinkExisting: (row: DatastoreRow) => void;
108
111
  onRemove: (row: DatastoreRow) => void;
109
112
  onRestore: (row: DatastoreRow) => void;
113
+ onDelete: (row: DatastoreRow) => void;
110
114
  onRename: (row: DatastoreRow) => void;
111
115
  onRegister: (row: DatastoreRow) => void;
112
116
  onManageUsers: (row: DatastoreRow) => void;
113
- onManageExternalApps: (row: DatastoreRow) => void;
117
+ onManageCustomApps: (row: DatastoreRow) => void;
114
118
  onBringOnline: (row: DatastoreRow) => void;
115
119
  isBringingOnline?: boolean;
116
120
  onLinkProvider: (row: DatastoreRow) => void;
@@ -125,6 +129,7 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
125
129
  isSwitching,
126
130
  indented,
127
131
  matchableRowIds,
132
+ nestedDatastoreNamesByRowId,
128
133
  suggestedMatchByDatastoreId,
129
134
  onSelect,
130
135
  onAddChild,
@@ -133,10 +138,11 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
133
138
  onLinkExisting,
134
139
  onRemove,
135
140
  onRestore,
141
+ onDelete,
136
142
  onRename,
137
143
  onRegister,
138
144
  onManageUsers,
139
- onManageExternalApps,
145
+ onManageCustomApps,
140
146
  onBringOnline,
141
147
  isBringingOnline,
142
148
  onLinkProvider,
@@ -310,6 +316,11 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
310
316
  .with({ materializing: true }, () => "Still materializing - this can take a few minutes.")
311
317
  .otherwise(() => undefined);
312
318
  const canSelect = hasDatastore && !reason && !current && !isSwitching;
319
+ const canDelete = hasDatastore && !current;
320
+ const nestedDatastoreNames = nestedDatastoreNamesByRowId.get(datastoreRow.id);
321
+ const deleteBlockedReason = isPresent(nestedDatastoreNames)
322
+ ? `Delete the datastores under it first: ${nestedDatastoreNames.join(", ")}`
323
+ : undefined;
313
324
 
314
325
  return (
315
326
  <div className={cn(columnMinWidths[datastoreColumnIds.actions], "flex items-center justify-end gap-1.5")}>
@@ -376,7 +387,7 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
376
387
  Select
377
388
  </Button>
378
389
  )}
379
- {isRealmDefault || isUnlinked ? (
390
+ {isRealmDefault || (isUnlinked && !canDelete) ? (
380
391
  // Same-sized spacer keeps Select/Selected aligned with rows that have the ellipsis.
381
392
  <div className="size-6" aria-hidden="true" />
382
393
  ) : (
@@ -391,57 +402,83 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
391
402
  </button>
392
403
  </DropdownTrigger>
393
404
  <DropdownContent align="end" className="min-w-52">
394
- <DropdownItem icon={<Pencil className="size-4" />} onSelect={() => onRename(datastoreRow)}>
395
- Rename
396
- </DropdownItem>
397
- {isPresent(datastoreRow.organizationAlias) && (
398
- <DropdownItem icon={<Users className="size-4" />} onSelect={() => onManageUsers(datastoreRow)}>
399
- Manage users
400
- </DropdownItem>
401
- )}
402
- {datastoreRow.isOrganization && isPresent(datastoreRow.organizationAlias) && (
403
- <DropdownItem
404
- icon={<Blocks className="size-4" />}
405
- onSelect={() => onManageExternalApps(datastoreRow)}
406
- >
407
- Custom apps
408
- </DropdownItem>
409
- )}
410
- {!hasDatastore &&
411
- (matchableRowIds.has(datastoreRow.id) ? (
412
- <DropdownItem icon={<Link2 className="size-4" />} onSelect={() => onLinkExisting(datastoreRow)}>
413
- Link existing datastore
405
+ {!isUnlinked && (
406
+ <>
407
+ <DropdownItem icon={<Pencil className="size-4" />} onSelect={() => onRename(datastoreRow)}>
408
+ Rename
414
409
  </DropdownItem>
415
- ) : (
416
- <DropdownItem
417
- icon={<DatabaseZap className="size-4" />}
418
- onSelect={() => onProvision(datastoreRow)}
419
- >
420
- Provision datastore
410
+ {isPresent(datastoreRow.organizationAlias) && (
411
+ <DropdownItem
412
+ icon={<Users className="size-4" />}
413
+ onSelect={() => onManageUsers(datastoreRow)}
414
+ >
415
+ Manage users
416
+ </DropdownItem>
417
+ )}
418
+ {datastoreRow.isOrganization && isPresent(datastoreRow.organizationAlias) && (
419
+ <DropdownItem
420
+ icon={<Blocks className="size-4" />}
421
+ onSelect={() => onManageCustomApps(datastoreRow)}
422
+ >
423
+ Custom apps
424
+ </DropdownItem>
425
+ )}
426
+ {!hasDatastore &&
427
+ (matchableRowIds.has(datastoreRow.id) ? (
428
+ <DropdownItem
429
+ icon={<Link2 className="size-4" />}
430
+ onSelect={() => onLinkExisting(datastoreRow)}
431
+ >
432
+ Link existing datastore
433
+ </DropdownItem>
434
+ ) : (
435
+ <DropdownItem
436
+ icon={<DatabaseZap className="size-4" />}
437
+ onSelect={() => onProvision(datastoreRow)}
438
+ >
439
+ Provision datastore
440
+ </DropdownItem>
441
+ ))}
442
+ <DropdownItem icon={<Plus className="size-4" />} onSelect={() => onAddChild(datastoreRow)}>
443
+ Add datastore
421
444
  </DropdownItem>
422
- ))}
423
- <DropdownItem icon={<Plus className="size-4" />} onSelect={() => onAddChild(datastoreRow)}>
424
- Add datastore
425
- </DropdownItem>
426
- {enableDatastoreRemoval && hasDatastore && !removed && (
427
- <>
428
- <DropdownSeparator />
445
+ {enableDatastoreRemoval && hasDatastore && !removed && (
446
+ <>
447
+ <DropdownSeparator />
448
+ <DropdownItem
449
+ className="text-error-foreground"
450
+ icon={<Trash2 className="size-4" />}
451
+ onSelect={() => onRemove(datastoreRow)}
452
+ >
453
+ Remove datastore
454
+ </DropdownItem>
455
+ </>
456
+ )}
457
+ {enableDatastoreRemoval && hasDatastore && removed && (
458
+ <>
459
+ <DropdownSeparator />
460
+ <DropdownItem
461
+ icon={<RotateCcw className="size-4" />}
462
+ onSelect={() => onRestore(datastoreRow)}
463
+ >
464
+ Restore datastore
465
+ </DropdownItem>
466
+ </>
467
+ )}
468
+ {!enableDatastoreRemoval && canDelete && <DropdownSeparator />}
469
+ </>
470
+ )}
471
+ {canDelete && (
472
+ <DisabledActionTooltip reason={deleteBlockedReason}>
429
473
  <DropdownItem
430
474
  className="text-error-foreground"
431
- icon={<Trash2 className="size-4" />}
432
- onSelect={() => onRemove(datastoreRow)}
475
+ icon={<Trash className="size-4" />}
476
+ disabled={isPresent(deleteBlockedReason)}
477
+ onSelect={() => onDelete(datastoreRow)}
433
478
  >
434
- Remove datastore
435
- </DropdownItem>
436
- </>
437
- )}
438
- {enableDatastoreRemoval && hasDatastore && removed && (
439
- <>
440
- <DropdownSeparator />
441
- <DropdownItem icon={<RotateCcw className="size-4" />} onSelect={() => onRestore(datastoreRow)}>
442
- Restore datastore
479
+ Delete permanently
443
480
  </DropdownItem>
444
- </>
481
+ </DisabledActionTooltip>
445
482
  )}
446
483
  </DropdownContent>
447
484
  </Dropdown>
@@ -457,6 +494,7 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
457
494
  isSwitching,
458
495
  indented,
459
496
  matchableRowIds,
497
+ nestedDatastoreNamesByRowId,
460
498
  suggestedMatchByDatastoreId,
461
499
  onSelect,
462
500
  onAddChild,
@@ -465,10 +503,11 @@ export function useDatastoreColumns(args: UseDatastoreColumnsArgs): ColumnDef<Da
465
503
  onLinkExisting,
466
504
  onRemove,
467
505
  onRestore,
506
+ onDelete,
468
507
  onRegister,
469
508
  onRename,
470
509
  onManageUsers,
471
- onManageExternalApps,
510
+ onManageCustomApps,
472
511
  onBringOnline,
473
512
  isBringingOnline,
474
513
  onLinkProvider,