@vertesia/ui 0.79.0 → 0.79.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 (280) hide show
  1. package/lib/esm/core/components/Panel.js +8 -0
  2. package/lib/esm/core/components/Panel.js.map +1 -0
  3. package/lib/esm/core/components/SelectBox.js +1 -1
  4. package/lib/esm/core/components/SelectBox.js.map +1 -1
  5. package/lib/esm/core/components/SidePanel.js +2 -2
  6. package/lib/esm/core/components/SidePanel.js.map +1 -1
  7. package/lib/esm/core/components/index.js +1 -1
  8. package/lib/esm/core/components/index.js.map +1 -1
  9. package/lib/esm/core/components/shadcn/breadcrumb.js +29 -8
  10. package/lib/esm/core/components/shadcn/breadcrumb.js.map +1 -1
  11. package/lib/esm/core/components/shadcn/button.js +3 -2
  12. package/lib/esm/core/components/shadcn/button.js.map +1 -1
  13. package/lib/esm/core/components/shadcn/filters/filterBar.js +2 -2
  14. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  15. package/lib/esm/core/components/shadcn/index.js +1 -0
  16. package/lib/esm/core/components/shadcn/index.js.map +1 -1
  17. package/lib/esm/core/components/shadcn/input.js +4 -1
  18. package/lib/esm/core/components/shadcn/input.js.map +1 -1
  19. package/lib/esm/core/components/shadcn/resizeable.js +2 -2
  20. package/lib/esm/core/components/shadcn/resizeable.js.map +1 -1
  21. package/lib/esm/core/components/shadcn/selectBox.js +15 -9
  22. package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
  23. package/lib/esm/core/components/shadcn/tabs.js +10 -3
  24. package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
  25. package/lib/esm/core/components/shadcn/textarea.js +7 -0
  26. package/lib/esm/core/components/shadcn/textarea.js.map +1 -0
  27. package/lib/esm/core/hooks/CompositeState.js +139 -1
  28. package/lib/esm/core/hooks/CompositeState.js.map +1 -1
  29. package/lib/esm/core/hooks/index.js +1 -0
  30. package/lib/esm/core/hooks/index.js.map +1 -1
  31. package/lib/esm/core/hooks/useScrollableSearch.js +92 -0
  32. package/lib/esm/core/hooks/useScrollableSearch.js.map +1 -0
  33. package/lib/esm/env/index.js +1 -1
  34. package/lib/esm/env/index.js.map +1 -1
  35. package/lib/esm/features/agent/PayloadBuilder.js +80 -55
  36. package/lib/esm/features/agent/PayloadBuilder.js.map +1 -1
  37. package/lib/esm/features/agent/chat/ModernAgentConversation.js +22 -24
  38. package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -1
  39. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +2 -3
  40. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  41. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +2 -2
  42. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  43. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +15 -20
  44. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -1
  45. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js +1 -0
  46. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -1
  47. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +3 -3
  48. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -1
  49. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +6 -6
  50. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  51. package/lib/esm/features/facets/CollectionsFacetsNav.js +19 -0
  52. package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -1
  53. package/lib/esm/features/facets/InteractionsFacetsNav.js +9 -3
  54. package/lib/esm/features/facets/InteractionsFacetsNav.js.map +1 -1
  55. package/lib/esm/features/facets/utils/VTypeFacet.js +4 -1
  56. package/lib/esm/features/facets/utils/VTypeFacet.js.map +1 -1
  57. package/lib/esm/features/layout/GenericPageNavHeader.js +58 -5
  58. package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -1
  59. package/lib/esm/features/store/collections/BrowseCollectionView.js +3 -0
  60. package/lib/esm/features/store/collections/BrowseCollectionView.js.map +1 -1
  61. package/lib/esm/features/store/collections/CreateCollection.js +2 -2
  62. package/lib/esm/features/store/collections/CreateCollection.js.map +1 -1
  63. package/lib/esm/features/store/collections/EditCollectionView.js +29 -30
  64. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  65. package/lib/esm/features/store/collections/SelectCollection.js +46 -45
  66. package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
  67. package/lib/esm/features/store/objects/DocumentSearchResults.js +35 -9
  68. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
  69. package/lib/esm/features/store/objects/DocumentTable.js +6 -6
  70. package/lib/esm/features/store/objects/DocumentTable.js.map +1 -1
  71. package/lib/esm/features/store/objects/components/ContentOverview.js +158 -114
  72. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
  73. package/lib/esm/features/store/objects/components/DocumentIcon.js +5 -3
  74. package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -1
  75. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js +11 -2
  76. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -1
  77. package/lib/esm/features/store/objects/components/useDownloadObject.js +2 -2
  78. package/lib/esm/features/store/objects/components/useDownloadObject.js.map +1 -1
  79. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +13 -1
  80. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
  81. package/lib/esm/features/store/objects/layout/documentLayout.js +5 -5
  82. package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -1
  83. package/lib/esm/features/store/objects/layout/renderers.js +28 -12
  84. package/lib/esm/features/store/objects/layout/renderers.js.map +1 -1
  85. package/lib/esm/features/store/objects/search/DocumentSearchContext.js +5 -1
  86. package/lib/esm/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  87. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js +1 -1
  88. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js.map +1 -1
  89. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js +3 -2
  90. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js.map +1 -1
  91. package/lib/esm/features/store/objects/selection/SelectionActions.js +2 -0
  92. package/lib/esm/features/store/objects/selection/SelectionActions.js.map +1 -1
  93. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +10 -2
  94. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -1
  95. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js +20 -2
  96. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -1
  97. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +15 -7
  98. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  99. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js +1 -1
  100. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js.map +1 -1
  101. package/lib/esm/features/user/UserInfo.js +2 -0
  102. package/lib/esm/features/user/UserInfo.js.map +1 -1
  103. package/lib/esm/router/HistoryNavigator.js +25 -2
  104. package/lib/esm/router/HistoryNavigator.js.map +1 -1
  105. package/lib/esm/router/Nav.js +3 -3
  106. package/lib/esm/router/Nav.js.map +1 -1
  107. package/lib/esm/session/UserSession.js +1 -0
  108. package/lib/esm/session/UserSession.js.map +1 -1
  109. package/lib/esm/session/UserSessionProvider.js +9 -2
  110. package/lib/esm/session/UserSessionProvider.js.map +1 -1
  111. package/lib/esm/session/auth/composable.js +66 -67
  112. package/lib/esm/session/auth/composable.js.map +1 -1
  113. package/lib/esm/widgets/form/Form.js +17 -30
  114. package/lib/esm/widgets/form/Form.js.map +1 -1
  115. package/lib/esm/widgets/form/FormContext.js +4 -2
  116. package/lib/esm/widgets/form/FormContext.js.map +1 -1
  117. package/lib/esm/widgets/form/ManagedObject.js +4 -0
  118. package/lib/esm/widgets/form/ManagedObject.js.map +1 -1
  119. package/lib/esm/widgets/form/fields.js +4 -3
  120. package/lib/esm/widgets/form/fields.js.map +1 -1
  121. package/lib/esm/widgets/form/inputs.js +2 -0
  122. package/lib/esm/widgets/form/inputs.js.map +1 -1
  123. package/lib/tsconfig.tsbuildinfo +1 -1
  124. package/lib/types/core/components/Panel.d.ts +11 -0
  125. package/lib/types/core/components/Panel.d.ts.map +1 -0
  126. package/lib/types/core/components/SidePanel.d.ts.map +1 -1
  127. package/lib/types/core/components/index.d.ts +1 -1
  128. package/lib/types/core/components/index.d.ts.map +1 -1
  129. package/lib/types/core/components/shadcn/breadcrumb.d.ts +3 -2
  130. package/lib/types/core/components/shadcn/breadcrumb.d.ts.map +1 -1
  131. package/lib/types/core/components/shadcn/button.d.ts.map +1 -1
  132. package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  133. package/lib/types/core/components/shadcn/index.d.ts +1 -0
  134. package/lib/types/core/components/shadcn/index.d.ts.map +1 -1
  135. package/lib/types/core/components/shadcn/input.d.ts.map +1 -1
  136. package/lib/types/core/components/shadcn/selectBox.d.ts +3 -2
  137. package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -1
  138. package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
  139. package/lib/types/core/components/shadcn/textarea.d.ts +4 -0
  140. package/lib/types/core/components/shadcn/textarea.d.ts.map +1 -0
  141. package/lib/types/core/hooks/CompositeState.d.ts +115 -6
  142. package/lib/types/core/hooks/CompositeState.d.ts.map +1 -1
  143. package/lib/types/core/hooks/index.d.ts +1 -0
  144. package/lib/types/core/hooks/index.d.ts.map +1 -1
  145. package/lib/types/core/hooks/useScrollableSearch.d.ts +82 -0
  146. package/lib/types/core/hooks/useScrollableSearch.d.ts.map +1 -0
  147. package/lib/types/env/index.d.ts +3 -1
  148. package/lib/types/env/index.d.ts.map +1 -1
  149. package/lib/types/features/agent/PayloadBuilder.d.ts +11 -19
  150. package/lib/types/features/agent/PayloadBuilder.d.ts.map +1 -1
  151. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  152. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +1 -1
  153. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  154. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  155. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
  156. package/lib/types/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -1
  157. package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
  158. package/lib/types/features/facets/InteractionsFacetsNav.d.ts +1 -0
  159. package/lib/types/features/facets/InteractionsFacetsNav.d.ts.map +1 -1
  160. package/lib/types/features/facets/utils/SearchInterface.d.ts +6 -1
  161. package/lib/types/features/facets/utils/SearchInterface.d.ts.map +1 -1
  162. package/lib/types/features/facets/utils/VTypeFacet.d.ts +2 -1
  163. package/lib/types/features/facets/utils/VTypeFacet.d.ts.map +1 -1
  164. package/lib/types/features/layout/GenericPageNavHeader.d.ts +2 -1
  165. package/lib/types/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  166. package/lib/types/features/store/collections/BrowseCollectionView.d.ts.map +1 -1
  167. package/lib/types/features/store/collections/CreateCollection.d.ts.map +1 -1
  168. package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
  169. package/lib/types/features/store/collections/SelectCollection.d.ts +6 -4
  170. package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
  171. package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  172. package/lib/types/features/store/objects/DocumentTable.d.ts +4 -0
  173. package/lib/types/features/store/objects/DocumentTable.d.ts.map +1 -1
  174. package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  175. package/lib/types/features/store/objects/components/DocumentIcon.d.ts +3 -1
  176. package/lib/types/features/store/objects/components/DocumentIcon.d.ts.map +1 -1
  177. package/lib/types/features/store/objects/components/SaveVersionConfirmModal.d.ts.map +1 -1
  178. package/lib/types/features/store/objects/components/useDownloadObject.d.ts +1 -1
  179. package/lib/types/features/store/objects/components/useDownloadObject.d.ts.map +1 -1
  180. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts +2 -1
  181. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
  182. package/lib/types/features/store/objects/layout/documentLayout.d.ts +4 -2
  183. package/lib/types/features/store/objects/layout/documentLayout.d.ts.map +1 -1
  184. package/lib/types/features/store/objects/layout/renderers.d.ts +1 -1
  185. package/lib/types/features/store/objects/layout/renderers.d.ts.map +1 -1
  186. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +1 -0
  187. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  188. package/lib/types/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
  189. package/lib/types/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
  190. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts +1 -0
  191. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -1
  192. package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
  193. package/lib/types/features/user/UserInfo.d.ts.map +1 -1
  194. package/lib/types/router/HistoryNavigator.d.ts.map +1 -1
  195. package/lib/types/router/Nav.d.ts +2 -1
  196. package/lib/types/router/Nav.d.ts.map +1 -1
  197. package/lib/types/session/UserSession.d.ts.map +1 -1
  198. package/lib/types/session/UserSessionProvider.d.ts.map +1 -1
  199. package/lib/types/session/auth/composable.d.ts.map +1 -1
  200. package/lib/types/widgets/form/Form.d.ts +2 -1
  201. package/lib/types/widgets/form/Form.d.ts.map +1 -1
  202. package/lib/types/widgets/form/FormContext.d.ts +5 -2
  203. package/lib/types/widgets/form/FormContext.d.ts.map +1 -1
  204. package/lib/types/widgets/form/ManagedObject.d.ts.map +1 -1
  205. package/lib/types/widgets/form/fields.d.ts +2 -2
  206. package/lib/types/widgets/form/fields.d.ts.map +1 -1
  207. package/lib/types/widgets/form/inputs.d.ts.map +1 -1
  208. package/lib/vertesia-ui-core.js +1 -1
  209. package/lib/vertesia-ui-core.js.map +1 -1
  210. package/lib/vertesia-ui-env.js +1 -1
  211. package/lib/vertesia-ui-env.js.map +1 -1
  212. package/lib/vertesia-ui-features.js +1 -1
  213. package/lib/vertesia-ui-features.js.map +1 -1
  214. package/lib/vertesia-ui-router.js +1 -1
  215. package/lib/vertesia-ui-router.js.map +1 -1
  216. package/lib/vertesia-ui-session.js +1 -1
  217. package/lib/vertesia-ui-session.js.map +1 -1
  218. package/lib/vertesia-ui-shell.js.map +1 -1
  219. package/lib/vertesia-ui-widgets.js +1 -1
  220. package/lib/vertesia-ui-widgets.js.map +1 -1
  221. package/package.json +166 -166
  222. package/src/core/components/Panel.tsx +34 -0
  223. package/src/core/components/SidePanel.tsx +5 -3
  224. package/src/core/components/index.ts +1 -1
  225. package/src/core/components/shadcn/breadcrumb.tsx +49 -30
  226. package/src/core/components/shadcn/button.tsx +3 -2
  227. package/src/core/components/shadcn/filters/filterBar.tsx +3 -3
  228. package/src/core/components/shadcn/index.ts +2 -1
  229. package/src/core/components/shadcn/input.tsx +10 -7
  230. package/src/core/components/shadcn/resizeable.tsx +4 -4
  231. package/src/core/components/shadcn/selectBox.tsx +87 -67
  232. package/src/core/components/shadcn/tabs.tsx +10 -3
  233. package/src/core/components/shadcn/textarea.tsx +21 -0
  234. package/src/core/hooks/index.ts +1 -0
  235. package/src/core/hooks/useScrollableSearch.tsx +193 -0
  236. package/src/features/agent/chat/ModernAgentConversation.tsx +109 -118
  237. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +2 -22
  238. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +1 -9
  239. package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +39 -55
  240. package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +1 -0
  241. package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +8 -8
  242. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +8 -8
  243. package/src/features/facets/CollectionsFacetsNav.tsx +21 -0
  244. package/src/features/facets/InteractionsFacetsNav.tsx +13 -3
  245. package/src/features/facets/utils/SearchInterface.tsx +5 -1
  246. package/src/features/facets/utils/VTypeFacet.tsx +6 -2
  247. package/src/features/layout/GenericPageNavHeader.tsx +73 -10
  248. package/src/features/store/collections/BrowseCollectionView.tsx +4 -0
  249. package/src/features/store/collections/CreateCollection.tsx +3 -4
  250. package/src/features/store/collections/EditCollectionView.tsx +91 -85
  251. package/src/features/store/collections/SelectCollection.tsx +105 -49
  252. package/src/features/store/objects/DocumentSearchResults.tsx +117 -51
  253. package/src/features/store/objects/DocumentTable.tsx +14 -4
  254. package/src/features/store/objects/components/ContentOverview.tsx +208 -110
  255. package/src/features/store/objects/components/DocumentIcon.tsx +11 -12
  256. package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +12 -2
  257. package/src/features/store/objects/layout/DocumentTableColumn.tsx +16 -1
  258. package/src/features/store/objects/layout/documentLayout.tsx +7 -5
  259. package/src/features/store/objects/layout/knowledge.md +10 -10
  260. package/src/features/store/objects/layout/renderers.tsx +39 -18
  261. package/src/features/store/objects/search/DocumentSearchContext.ts +6 -1
  262. package/src/features/store/objects/search/DocumentSearchProvider.tsx +1 -1
  263. package/src/features/store/objects/selection/ObjectsActionContext.tsx +3 -2
  264. package/src/features/store/objects/selection/SelectionActions.tsx +2 -0
  265. package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +8 -2
  266. package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +22 -2
  267. package/src/features/store/objects/upload/DocumentUploadModal.tsx +18 -9
  268. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +10 -7
  269. package/src/features/store/types/CreateOrUpdateTypeModal.tsx +1 -1
  270. package/src/router/HistoryNavigator.ts +33 -2
  271. package/src/router/Nav.tsx +4 -3
  272. package/src/widgets/form/Form.tsx +19 -43
  273. package/src/widgets/form/FormContext.ts +5 -2
  274. package/src/widgets/form/fields.tsx +8 -6
  275. package/src/widgets/form/inputs.tsx +1 -0
  276. package/lib/esm/core/components/Textarea.js +0 -15
  277. package/lib/esm/core/components/Textarea.js.map +0 -1
  278. package/lib/types/core/components/Textarea.d.ts +0 -8
  279. package/lib/types/core/components/Textarea.d.ts.map +0 -1
  280. package/src/core/components/Textarea.tsx +0 -25
@@ -1,6 +1,7 @@
1
1
  import { Filter as BaseFilter, FilterProvider, FilterBtn, FilterBar, FilterClear, FilterGroup } from '@vertesia/ui/core';
2
2
  import { useState } from 'react';
3
3
  import { SearchInterface } from './utils/SearchInterface';
4
+ import { useUserSession } from '@vertesia/ui/session';
4
5
 
5
6
  interface CollectionsFacetsNavProps {
6
7
  facets: {
@@ -13,6 +14,8 @@ interface CollectionsFacetsNavProps {
13
14
  // Hook to create filter groups for collections
14
15
  export function useCollectionsFilterGroups(facets: CollectionsFacetsNavProps['facets']): FilterGroup[] {
15
16
  void facets;
17
+ const { typeRegistry } = useUserSession();
18
+
16
19
  const customFilterGroups: FilterGroup[] = [];
17
20
 
18
21
  // Add name filter as text type
@@ -24,6 +27,24 @@ export function useCollectionsFilterGroups(facets: CollectionsFacetsNavProps['fa
24
27
  };
25
28
  customFilterGroups.push(nameFilterGroup);
26
29
 
30
+ // add type filter as select type
31
+ if (typeRegistry) {
32
+ const typeOptions = typeRegistry.types.map(type => {
33
+ return {
34
+ label: type.name,
35
+ value: type.id
36
+ }
37
+ });
38
+ const typeFilterGroup = {
39
+ name: 'types',
40
+ placeholder: 'Type',
41
+ type: 'select' as const,
42
+ multiple: true,
43
+ options: typeOptions
44
+ };
45
+ customFilterGroups.push(typeFilterGroup);
46
+ }
47
+
27
48
  return customFilterGroups;
28
49
  }
29
50
 
@@ -7,6 +7,7 @@ interface InteractionsFacetsNavProps {
7
7
  tags?: any[];
8
8
  };
9
9
  search: SearchInterface;
10
+ env?: string | null;
10
11
  }
11
12
 
12
13
  // Hook to create filter groups for interactions
@@ -32,6 +33,14 @@ export function useInteractionsFilterGroups(facets: InteractionsFacetsNavProps['
32
33
  };
33
34
  customFilterGroups.push(promptNameFilterGroup);
34
35
 
36
+ const ModelFilterGroup = {
37
+ name: 'model',
38
+ placeholder: 'Model',
39
+ type: 'text' as const,
40
+ multiple: false
41
+ };
42
+ customFilterGroups.push(ModelFilterGroup);
43
+
35
44
  // Add tags filter as stringList type (allows custom input)
36
45
  const tagsFilterGroup = {
37
46
  name: 'tags',
@@ -46,10 +55,11 @@ export function useInteractionsFilterGroups(facets: InteractionsFacetsNavProps['
46
55
 
47
56
  // Hook to create filter change handler for interactions
48
57
  export function useInteractionsFilterHandler(search: SearchInterface) {
58
+
49
59
  return (newFilters: BaseFilter[]) => {
50
60
  if (newFilters.length === 0) {
51
- // Clear filters without applying defaults - user wants to remove all filters
52
- search.clearFilters(true, false);
61
+ search.clearFilters(true, true);
62
+
53
63
  return;
54
64
  }
55
65
 
@@ -79,7 +89,7 @@ export function useInteractionsFilterHandler(search: SearchInterface) {
79
89
  }
80
90
  });
81
91
 
82
- search.search();
92
+ search.search(true);
83
93
  };
84
94
  }
85
95
 
@@ -1,8 +1,12 @@
1
+ interface defaultKeys {
2
+ [key: string]: string;
3
+ }
1
4
  export interface SearchInterface {
2
5
  getFilterValue(name: string): any;
3
6
  setFilterValue(name: string, value: any): void;
4
7
  clearFilters(autoSearch?: boolean, applyDefaults?: boolean): void;
5
- search(): Promise<boolean | undefined>;
8
+ search(applyDefaults?: boolean): Promise<boolean | undefined>;
9
+ setDefaultKeys(keys: defaultKeys[]): void;
6
10
  readonly isRunning: boolean;
7
11
  query: Record<string, any>;
8
12
  }
@@ -1,9 +1,10 @@
1
1
  import { FacetBucket } from "@vertesia/common";
2
2
  import { FilterGroup } from "@vertesia/ui/core";
3
+ import { TypeRegistry } from "@vertesia/ui/session";
3
4
 
4
5
  interface VTypeFacetProps {
5
6
  buckets: FacetBucket[];
6
- typeRegistry: any;
7
+ typeRegistry?: TypeRegistry;
7
8
  type?: 'select';
8
9
  multiple?: boolean;
9
10
  }
@@ -11,6 +12,9 @@ interface VTypeFacetProps {
11
12
  export function VTypeFacet({ buckets, typeRegistry, type = 'select', multiple = false }: VTypeFacetProps) {
12
13
  // Create a map for quick lookups of type names and counts
13
14
  const typeDataMap = new Map();
15
+ if (!typeRegistry) {
16
+ console.warn("Type names cannot be resolved");
17
+ }
14
18
  buckets.forEach((bucket) => {
15
19
  let name;
16
20
  let typeId = bucket._id;
@@ -19,7 +23,7 @@ export function VTypeFacet({ buckets, typeRegistry, type = 'select', multiple =
19
23
  typeId = "Document";
20
24
  name = "Document";
21
25
  } else {
22
- name = typeRegistry.getTypeName(bucket._id);
26
+ name = typeRegistry?.getTypeName(bucket._id);
23
27
  if (!name) {
24
28
  console.warn("Content Object Type not found", bucket._id);
25
29
  name = bucket._id;
@@ -2,7 +2,9 @@ import clsx from 'clsx';
2
2
  import { ReactElement, ReactNode } from 'react';
3
3
 
4
4
  import { ChevronRight, Info } from 'lucide-react';
5
- import { VTooltip } from '@vertesia/ui/core';
5
+ import { VTooltip, Breadcrumbs } from '@vertesia/ui/core';
6
+ import { capitalize } from 'lodash-es';
7
+ import { useNavigate } from '@vertesia/ui/router';
6
8
 
7
9
  interface GenericPageNavHeaderProps {
8
10
  title: string | ReactElement;
@@ -12,22 +14,83 @@ interface GenericPageNavHeaderProps {
12
14
  isCompact?: boolean
13
15
  children?: ReactNode
14
16
  className?: string
17
+ useDynamicBreadcrumbs?: boolean;
15
18
  }
16
19
 
17
- export function GenericPageNavHeader({ className, children, title, description, actions, breadcrumbs, isCompact = false }: GenericPageNavHeaderProps) {
20
+ export function GenericPageNavHeader({ className, children, title, description, actions, breadcrumbs, isCompact = false, useDynamicBreadcrumbs = true }: GenericPageNavHeaderProps) {
21
+ const navigate = useNavigate();
22
+
23
+ const buildBreadcrumbLabel = (entry: any): string => {
24
+ const href = entry?.href || '';
25
+ if (!href) return 'Page';
26
+
27
+ const cleanHref = href.split('#')[0].split('?')[0];
28
+ const pathSegments: string[] = (cleanHref as string).split('/').filter((segment: string) => segment.length > 0);
29
+
30
+ if (pathSegments.length === 3) {
31
+ const secondSegment = pathSegments[1];
32
+ return `${capitalize(secondSegment)} Detail`;
33
+ } else if (pathSegments.length >= 2) {
34
+ return capitalize(pathSegments[pathSegments.length - 1]);
35
+ } else if (pathSegments.length === 1) {
36
+ return capitalize(pathSegments[0]);
37
+ }
38
+
39
+ return 'Page';
40
+ }
41
+
42
+ // Build breadcrumb items from history chain and current breadcrumbs
43
+ const buildBreadcrumbItems = (): Array<{ label: string, href?: string, onClick?: () => void }> => {
44
+ const items: Array<{ label: string, href?: string, onClick?: () => void, clearHistory?: boolean }> = [];
45
+
46
+ // Add items from history chain
47
+ if (useDynamicBreadcrumbs && typeof window !== 'undefined' && window.history.state?.historyChain) {
48
+ const historyChain = window.history.state.historyChain;
49
+ historyChain.forEach((entry: any, index: number) => {
50
+ const stepsBack = historyChain.length - index;
51
+ items.push({
52
+ label: buildBreadcrumbLabel(entry),
53
+ href: entry.href,
54
+ onClick: () => window.history.go(-stepsBack)
55
+ });
56
+ });
57
+ }
58
+
59
+ // Add current page breadcrumbs
60
+ if (breadcrumbs && breadcrumbs.length > 0) {
61
+ breadcrumbs.forEach((breadcrumb: any) => {
62
+ // Extract text content from React element
63
+ const label = typeof breadcrumb?.props?.children === 'string'
64
+ ? breadcrumb.props.children
65
+ : 'Page';
66
+
67
+ items.push(( breadcrumb?.props?.href ) ? {
68
+ href: breadcrumb?.props?.href,
69
+ label: label,
70
+ onClick: () => navigate(breadcrumb.props.href, { replace: breadcrumb.props.clearBreadcrumbs }),
71
+ } : {
72
+ label: label
73
+ });
74
+ });
75
+ }
76
+
77
+ return items;
78
+ };
79
+
80
+ const breadcrumbItems = buildBreadcrumbItems();
81
+
18
82
  return (
19
83
  <div className={clsx(isCompact ? 'pb-0' : 'pb-2', 'p-4 flex flex-col', className)}>
20
84
  <div className='flex items-start gap-4'>
21
85
  <div className="w-full flex place-content-between h-auto min-h-8 flex-col items-start">
22
86
  <nav className="flex-1 flex justify-start text-xs">
23
- {breadcrumbs?.map((breadcrumb, index) => {
24
- return (
25
- <div className="flex items-center text-muted" key={index}>
26
- {breadcrumb}
27
- {index < breadcrumbs.length - 1 && <ChevronRight className="w-3.5 h-3.5" />}
28
- </div>
29
- )
30
- })}
87
+ {breadcrumbItems.length > 0 && (
88
+ <Breadcrumbs
89
+ path={breadcrumbItems}
90
+ separator={<ChevronRight className="w-3.5 h-3.5" />}
91
+ maxItems={4}
92
+ />
93
+ )}
31
94
  </nav>
32
95
  <div className='flex gap-2 items-center'>
33
96
  <h1 className="text-xl font-semibold break-all">{title}</h1>
@@ -2,6 +2,7 @@ import { useUserSession, TypeRegistry } from "@vertesia/ui/session";
2
2
  import { Collection } from "@vertesia/common";
3
3
  import { DocumentSearchResultsWithDropZone, DocumentSearchResults } from "../objects/DocumentSearchResults";
4
4
  import { useToast } from "@vertesia/ui/core";
5
+ import { useDocumentSearch } from "../objects/search/DocumentSearchContext";
5
6
 
6
7
 
7
8
  interface BrowseCollectionViewProps {
@@ -10,6 +11,9 @@ interface BrowseCollectionViewProps {
10
11
  export function BrowseCollectionView({ collection }: BrowseCollectionViewProps) {
11
12
  const toast = useToast();
12
13
  const { client, typeRegistry } = useUserSession();
14
+ const search = useDocumentSearch();
15
+ search.query.all_revisions = true;
16
+
13
17
  const onUploadDone = async (objectIds: string[]) => {
14
18
  if (objectIds.length > 0) {
15
19
  await client.store.collections.addMembers(collection.id, objectIds).catch(err => {
@@ -1,5 +1,5 @@
1
1
  import { CreateCollectionPayload } from "@vertesia/common";
2
- import { useToast, VModalBody, FormItem, Styles, VModalFooter, Input, Switch, Button, VModal, VModalTitle } from "@vertesia/ui/core";
2
+ import { useToast, VModalBody, FormItem, VModalFooter, Input, Switch, Button, VModal, VModalTitle, Textarea } from "@vertesia/ui/core";
3
3
  import { SelectContentType } from "../types/SelectContentType";
4
4
  import { useNavigate } from "@vertesia/ui/router";
5
5
  import { useUserSession } from "@vertesia/ui/session";
@@ -80,10 +80,9 @@ export function CreateCollectionForm({ onClose, redirect = true, onAddToCollecti
80
80
  <Input type="text" value={payload.name || ""} onChange={(value) => setPayloadProp("name", value)} />
81
81
  </FormItem>
82
82
  <FormItem label="Description" className="mt-2">
83
- <textarea
84
- className={Styles.INPUT}
83
+ <Textarea
85
84
  value={payload.description || ""}
86
- onChange={(ev) => setPayloadProp("description", ev.target.value)}
85
+ onChange={(ev) => setPayloadProp("description", ev)}
87
86
  />
88
87
  </FormItem>
89
88
  <FormItem label="Dynamic Collection" className="mt-2" direction="row" description="Dynamically fetch content for the collection based on a query. If not enabled, then content must be added by users or agents.">
@@ -1,10 +1,12 @@
1
1
  import { json } from "@codemirror/lang-json";
2
- import { Collection, CreateCollectionPayload } from "@vertesia/common";
3
- import { Button, ErrorBox, FormItem, Input, Styles, useFetch, useToast } from "@vertesia/ui/core";
4
- import { useUserSession } from "@vertesia/ui/session";
5
- import { CodeMirrorEditor, EditorApi, GeneratedForm, ManagedObject } from "@vertesia/ui/widgets";
2
+ import dayjs from "dayjs";
6
3
  import { basicSetup } from "codemirror";
7
4
  import { useMemo, useRef, useState } from "react";
5
+ import { UserInfo } from "@vertesia/ui/features";
6
+ import { useUserSession } from "@vertesia/ui/session";
7
+ import { Collection, CreateCollectionPayload } from "@vertesia/common";
8
+ import { CodeMirrorEditor, EditorApi, GeneratedForm, ManagedObject } from "@vertesia/ui/widgets";
9
+ import { Button, ErrorBox, FormItem, Input, Styles, Textarea, useFetch, useToast, Panel } from "@vertesia/ui/core";
8
10
  import { SelectContentType, stringifyTableLayout } from "../types";
9
11
 
10
12
  const extensions = [basicSetup, json()];
@@ -54,7 +56,7 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
54
56
  });
55
57
  return;
56
58
  }
57
-
59
+
58
60
  const payload: Partial<CreateCollectionPayload> = {
59
61
  name: metadata.name,
60
62
  description: metadata.description,
@@ -131,61 +133,82 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
131
133
 
132
134
  return (
133
135
  <div className="flex flex-col gap-4 py-2">
134
- <FormItem label="Name" required>
135
- <Input value={metadata.name} onChange={(v) => setField("name", v)} />
136
- </FormItem>
137
- <FormItem label="Description">
138
- <textarea
139
- className={Styles.INPUT}
140
- value={metadata.description}
141
- onChange={(e) => setField("description", e.target.value)}
142
- />
143
- </FormItem>
144
- {
145
- !collection.dynamic &&
146
- <FormItem label="Allowed Content Types" description="Select which content types can be added to the collection. If not set, then all content types are allowed.">
136
+ <Panel title="Configuration"
137
+ action={
138
+ <Button size="lg" isDisabled={isUpdating} onClick={onSubmit}>
139
+ Save
140
+ </Button>
141
+ }>
142
+ <div className="flex justify-between mb-2">
143
+ <div className="w-1/2 gap-2 flex flex-col">
144
+ <div className="text-sm font-medium mb-1">Created By</div>
145
+ <div className="gap-2 flex items-center">
146
+ <UserInfo userRef={collection.created_by} showTitle />
147
+ <span>at {dayjs(collection.created_at).format("YYYY-MM-DD HH:mm:ss")}</span>
148
+ </div>
149
+ </div>
150
+ <div className="w-1/2 gap-2 flex flex-col">
151
+ <div className="text-sm font-medium mb-1">Updated By</div>
152
+ <div className="gap-2 flex items-center">
153
+ <UserInfo userRef={collection.updated_by} showTitle />
154
+ <span>at {dayjs(collection.updated_at).format("YYYY-MM-DD HH:mm:ss")}</span>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ <FormItem label="Name" required>
159
+ <Input value={metadata.name} onChange={(v) => setField("name", v)} />
160
+ </FormItem>
161
+ <FormItem label="Description">
162
+ <Textarea
163
+ value={metadata.description}
164
+ onChange={(e) => setField("description", e)}
165
+ />
166
+ </FormItem>
167
+ {
168
+ !collection.dynamic &&
169
+ <FormItem label="Allowed Content Types" description="Select which content types can be added to the collection. If not set, then all content types are allowed.">
170
+ <SelectContentType
171
+ defaultValue={metadata.allowed_types || null}
172
+ onChange={(v) => {
173
+ if (Array.isArray(v)) {
174
+ setField("allowed_types", v.map(type => type.id));
175
+ } else {
176
+ setField("allowed_types", v ? [v.id] : []);
177
+ }
178
+ }}
179
+ isClearable multiple
180
+ />
181
+ </FormItem>
182
+ }
183
+ {
184
+ collection.dynamic && (
185
+ <FormItem label="Query" description="Define the query to dynamically fetch content for the collection.">
186
+ <Textarea
187
+ className={Styles.INPUT}
188
+ value={metadata.query}
189
+ onChange={(e) => setField("query", e)}
190
+ />
191
+ </FormItem>
192
+ )
193
+ }
194
+ <FormItem label="Table Layout" description="Define a custom layout for displaying the collection in tables.">
195
+ <CodeMirrorEditor className="border-1 rounded-md border-border"
196
+ value={tableLayoutValue} extensions={extensions} editorRef={tableLayoutRef} />
197
+ </FormItem>
198
+ <FormItem label="Type" description="Select a content type to assign custom properties and data to the collection.">
147
199
  <SelectContentType
148
- defaultValue={metadata.allowed_types || null}
200
+ defaultValue={metadata.type || null}
149
201
  onChange={(v) => {
150
202
  if (Array.isArray(v)) {
151
- setField("allowed_types", v.map(type => type.id));
203
+ setField("type", v.length > 0 ? v[0].id : null);
152
204
  } else {
153
- setField("allowed_types", v ? [v.id] : []);
205
+ setField("type", v?.id || null);
154
206
  }
155
207
  }}
156
- isClearable multiple
208
+ isClearable
157
209
  />
158
210
  </FormItem>
159
- }
160
- {collection.dynamic && (
161
- <FormItem label="Query" description="Define the query to dynamically fetch content for the collection.">
162
- <textarea
163
- className={Styles.INPUT}
164
- value={metadata.query}
165
- onChange={(e) => setField("query", e.target.value)}
166
- />
167
- </FormItem>
168
- )}
169
- <FormItem label="Table Layout" description="Define a custom layout for displaying the collection in tables.">
170
- <CodeMirrorEditor className="border-1 rounded-md border-border"
171
- value={tableLayoutValue} extensions={extensions} editorRef={tableLayoutRef} />
172
- </FormItem>
173
- <FormItem label="Type" description="Select a content type to assign custom properties and data to the collection.">
174
- <SelectContentType
175
- defaultValue={metadata.type || null}
176
- onChange={(v) => {
177
- if (Array.isArray(v)) {
178
- setField("type", v.length > 0 ? v[0].id : null);
179
- } else {
180
- setField("type", v?.id || null);
181
- }
182
- }}
183
- isClearable
184
- />
185
- </FormItem>
186
- <Button size="lg" className="w-min my-4" isDisabled={isUpdating} onClick={onSubmit}>
187
- Save Metadata
188
- </Button>
211
+ </Panel>
189
212
 
190
213
  {typeId && <PropertiesEditor typeId={typeId} collection={collection} />}
191
214
  </div>
@@ -197,28 +220,22 @@ interface PropertiesEditorProps {
197
220
  collection: Collection;
198
221
  }
199
222
  function PropertiesEditor({ typeId, collection }: PropertiesEditorProps) {
223
+ const toast = useToast();
200
224
  const { client } = useUserSession();
225
+ const [isUpdating, setIsUpdating] = useState(false);
226
+
201
227
  const { data: type, error } = useFetch(() => client.store.types.retrieve(typeId), [typeId]);
228
+ const schema = type?.object_schema || {};
229
+ const object = useMemo(() => new ManagedObject(schema, collection.properties || {}), [schema, collection.properties]);
230
+
202
231
  if (error) {
203
232
  return <ErrorBox title="Failed to load type">{error.message}</ErrorBox>;
204
233
  }
205
234
 
206
- return (
207
- <Section title="Properties">
208
- {type && <PropertiesForm collection={collection} schema={type.object_schema} />}
209
- </Section>
210
- );
211
- }
235
+ if (!type) {
236
+ return null;
237
+ }
212
238
 
213
- interface PropertiesFormProps {
214
- schema: any;
215
- collection: Collection;
216
- }
217
- function PropertiesForm({ schema = {}, collection }: PropertiesFormProps) {
218
- const { client } = useUserSession();
219
- const toast = useToast();
220
- const object = useMemo(() => new ManagedObject(schema, collection.properties || {}), [schema, collection]);
221
- const [isUpdating, setIsUpdating] = useState(false);
222
239
 
223
240
  const _onSave = (data: any) => {
224
241
  const payload = { properties: data || {} };
@@ -247,23 +264,12 @@ function PropertiesForm({ schema = {}, collection }: PropertiesFormProps) {
247
264
  };
248
265
 
249
266
  return (
250
- <GeneratedForm object={object} onSubmit={_onSave}>
251
- <Button size="lg" isLoading={isUpdating} className="my-4" variant="primary" type="submit">
252
- Save Properties
253
- </Button>
254
- </GeneratedForm>
255
- );
256
- }
257
-
258
- interface SectionProps {
259
- children: React.ReactNode;
260
- title: string;
261
- }
262
- function Section({ children, title }: SectionProps) {
263
- return (
264
- <div className="my-4">
265
- <div className="text-lg text-gray-700 font-semibold border-b border-b-gray-300 py-2 mb-4">{title}</div>
266
- {children}
267
- </div>
267
+ <Panel title="Properties" action={
268
+ <Button size="lg" isLoading={isUpdating} type="submit">
269
+ Save
270
+ </Button>}
271
+ >
272
+ <GeneratedForm object={object} onSubmit={_onSave} />
273
+ </Panel>
268
274
  );
269
275
  }