@vertesia/ui 0.78.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 (409) 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/SelectList.js +18 -13
  6. package/lib/esm/core/components/SelectList.js.map +1 -1
  7. package/lib/esm/core/components/SidePanel.js +2 -2
  8. package/lib/esm/core/components/SidePanel.js.map +1 -1
  9. package/lib/esm/core/components/index.js +1 -1
  10. package/lib/esm/core/components/index.js.map +1 -1
  11. package/lib/esm/core/components/shadcn/breadcrumb.js +29 -8
  12. package/lib/esm/core/components/shadcn/breadcrumb.js.map +1 -1
  13. package/lib/esm/core/components/shadcn/button.js +3 -2
  14. package/lib/esm/core/components/shadcn/button.js.map +1 -1
  15. package/lib/esm/core/components/shadcn/filters/filterBar.js +41 -14
  16. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  17. package/lib/esm/core/components/shadcn/index.js +2 -0
  18. package/lib/esm/core/components/shadcn/index.js.map +1 -1
  19. package/lib/esm/core/components/shadcn/input.js +4 -1
  20. package/lib/esm/core/components/shadcn/input.js.map +1 -1
  21. package/lib/esm/core/components/shadcn/resizeable.js +15 -0
  22. package/lib/esm/core/components/shadcn/resizeable.js.map +1 -0
  23. package/lib/esm/core/components/shadcn/selectBox.js +15 -9
  24. package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
  25. package/lib/esm/core/components/shadcn/tabs.js +20 -8
  26. package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
  27. package/lib/esm/core/components/shadcn/textarea.js +7 -0
  28. package/lib/esm/core/components/shadcn/textarea.js.map +1 -0
  29. package/lib/esm/core/components/table/index.js +1 -1
  30. package/lib/esm/core/components/table/index.js.map +1 -1
  31. package/lib/esm/core/hooks/CompositeState.js +139 -1
  32. package/lib/esm/core/hooks/CompositeState.js.map +1 -1
  33. package/lib/esm/core/hooks/index.js +1 -0
  34. package/lib/esm/core/hooks/index.js.map +1 -1
  35. package/lib/esm/core/hooks/useScrollableSearch.js +92 -0
  36. package/lib/esm/core/hooks/useScrollableSearch.js.map +1 -0
  37. package/lib/esm/env/index.js +1 -1
  38. package/lib/esm/env/index.js.map +1 -1
  39. package/lib/esm/features/agent/PayloadBuilder.js +80 -55
  40. package/lib/esm/features/agent/PayloadBuilder.js.map +1 -1
  41. package/lib/esm/features/agent/chat/ModernAgentConversation.js +22 -24
  42. package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -1
  43. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +2 -3
  44. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  45. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +2 -2
  46. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  47. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +15 -20
  48. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -1
  49. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js +1 -0
  50. package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -1
  51. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +3 -3
  52. package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -1
  53. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +6 -6
  54. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  55. package/lib/esm/features/facets/CollectionsFacetsNav.js +85 -0
  56. package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -0
  57. package/lib/esm/features/facets/DocumentsFacetsNav.js +19 -7
  58. package/lib/esm/features/facets/DocumentsFacetsNav.js.map +1 -1
  59. package/lib/esm/features/facets/EnvironmentFacet.js +1 -1
  60. package/lib/esm/features/facets/EnvironmentFacet.js.map +1 -1
  61. package/lib/esm/features/facets/InteractionsFacetsNav.js +88 -0
  62. package/lib/esm/features/facets/InteractionsFacetsNav.js.map +1 -0
  63. package/lib/esm/features/facets/PromptsFacetsNav.js +80 -0
  64. package/lib/esm/features/facets/PromptsFacetsNav.js.map +1 -0
  65. package/lib/esm/features/facets/RunsFacetsNav.js +28 -6
  66. package/lib/esm/features/facets/RunsFacetsNav.js.map +1 -1
  67. package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js +7 -5
  68. package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
  69. package/lib/esm/features/facets/index.js +10 -8
  70. package/lib/esm/features/facets/index.js.map +1 -1
  71. package/lib/esm/features/facets/utils/SearchInterface.js +2 -0
  72. package/lib/esm/features/facets/utils/SearchInterface.js.map +1 -0
  73. package/lib/esm/features/facets/utils/StringFacet.js.map +1 -0
  74. package/lib/esm/features/facets/utils/StringListFacet.js.map +1 -0
  75. package/lib/esm/features/facets/utils/TypeFacet.js.map +1 -0
  76. package/lib/esm/features/facets/utils/VEnvironmentFacet.js.map +1 -0
  77. package/lib/esm/features/facets/utils/VInteractionFacet.js.map +1 -0
  78. package/lib/esm/features/facets/utils/VStringFacet.js.map +1 -0
  79. package/lib/esm/features/facets/{VTypeFacet.js → utils/VTypeFacet.js} +9 -4
  80. package/lib/esm/features/facets/utils/VTypeFacet.js.map +1 -0
  81. package/lib/esm/features/facets/{VUserFacet.js → utils/VUserFacet.js} +1 -1
  82. package/lib/esm/features/facets/utils/VUserFacet.js.map +1 -0
  83. package/lib/esm/features/facets/utils/utils.js.map +1 -0
  84. package/lib/esm/features/layout/GenericPageNavHeader.js +58 -5
  85. package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -1
  86. package/lib/esm/features/store/collections/BrowseCollectionView.js +3 -0
  87. package/lib/esm/features/store/collections/BrowseCollectionView.js.map +1 -1
  88. package/lib/esm/features/store/collections/CreateCollection.js +2 -2
  89. package/lib/esm/features/store/collections/CreateCollection.js.map +1 -1
  90. package/lib/esm/features/store/collections/EditCollectionView.js +43 -31
  91. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  92. package/lib/esm/features/store/collections/SelectCollection.js +46 -16
  93. package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
  94. package/lib/esm/features/store/objects/DocumentSearchResults.js +43 -13
  95. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
  96. package/lib/esm/features/store/objects/DocumentTable.js +6 -6
  97. package/lib/esm/features/store/objects/DocumentTable.js.map +1 -1
  98. package/lib/esm/features/store/objects/components/ContentOverview.js +225 -87
  99. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
  100. package/lib/esm/features/store/objects/components/DocumentIcon.js +11 -3
  101. package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -1
  102. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js +11 -2
  103. package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -1
  104. package/lib/esm/features/store/objects/components/useDownloadObject.js +2 -2
  105. package/lib/esm/features/store/objects/components/useDownloadObject.js.map +1 -1
  106. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +13 -1
  107. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
  108. package/lib/esm/features/store/objects/layout/documentLayout.js +7 -8
  109. package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -1
  110. package/lib/esm/features/store/objects/layout/renderers.js +28 -12
  111. package/lib/esm/features/store/objects/layout/renderers.js.map +1 -1
  112. package/lib/esm/features/store/objects/search/DocumentSearchContext.js +5 -1
  113. package/lib/esm/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  114. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js +1 -1
  115. package/lib/esm/features/store/objects/search/DocumentSearchProvider.js.map +1 -1
  116. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js +3 -2
  117. package/lib/esm/features/store/objects/selection/ObjectsActionContext.js.map +1 -1
  118. package/lib/esm/features/store/objects/selection/SelectionActions.js +2 -0
  119. package/lib/esm/features/store/objects/selection/SelectionActions.js.map +1 -1
  120. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +12 -4
  121. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -1
  122. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js +20 -2
  123. package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -1
  124. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +16 -8
  125. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  126. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js +1 -1
  127. package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js.map +1 -1
  128. package/lib/esm/features/store/types/ObjectSchemaEditor.js +1 -1
  129. package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -1
  130. package/lib/esm/features/user/UserInfo.js +35 -1
  131. package/lib/esm/features/user/UserInfo.js.map +1 -1
  132. package/lib/esm/router/HistoryNavigator.js +25 -2
  133. package/lib/esm/router/HistoryNavigator.js.map +1 -1
  134. package/lib/esm/router/Nav.js +3 -3
  135. package/lib/esm/router/Nav.js.map +1 -1
  136. package/lib/esm/session/UserSession.js +1 -0
  137. package/lib/esm/session/UserSession.js.map +1 -1
  138. package/lib/esm/session/UserSessionProvider.js +9 -2
  139. package/lib/esm/session/UserSessionProvider.js.map +1 -1
  140. package/lib/esm/session/auth/composable.js +66 -67
  141. package/lib/esm/session/auth/composable.js.map +1 -1
  142. package/lib/esm/shell/login/UserInfo.js +1 -1
  143. package/lib/esm/shell/login/UserInfo.js.map +1 -1
  144. package/lib/esm/widgets/form/Form.js +17 -30
  145. package/lib/esm/widgets/form/Form.js.map +1 -1
  146. package/lib/esm/widgets/form/FormContext.js +4 -2
  147. package/lib/esm/widgets/form/FormContext.js.map +1 -1
  148. package/lib/esm/widgets/form/ManagedObject.js +4 -0
  149. package/lib/esm/widgets/form/ManagedObject.js.map +1 -1
  150. package/lib/esm/widgets/form/fields.js +4 -3
  151. package/lib/esm/widgets/form/fields.js.map +1 -1
  152. package/lib/esm/widgets/form/inputs.js +2 -0
  153. package/lib/esm/widgets/form/inputs.js.map +1 -1
  154. package/lib/esm/widgets/schema-editor/index.js +0 -1
  155. package/lib/esm/widgets/schema-editor/index.js.map +1 -1
  156. package/lib/tsconfig.tsbuildinfo +1 -1
  157. package/lib/types/core/components/Panel.d.ts +11 -0
  158. package/lib/types/core/components/Panel.d.ts.map +1 -0
  159. package/lib/types/core/components/SelectList.d.ts +2 -1
  160. package/lib/types/core/components/SelectList.d.ts.map +1 -1
  161. package/lib/types/core/components/SidePanel.d.ts.map +1 -1
  162. package/lib/types/core/components/index.d.ts +1 -1
  163. package/lib/types/core/components/index.d.ts.map +1 -1
  164. package/lib/types/core/components/shadcn/breadcrumb.d.ts +3 -2
  165. package/lib/types/core/components/shadcn/breadcrumb.d.ts.map +1 -1
  166. package/lib/types/core/components/shadcn/button.d.ts.map +1 -1
  167. package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  168. package/lib/types/core/components/shadcn/index.d.ts +2 -0
  169. package/lib/types/core/components/shadcn/index.d.ts.map +1 -1
  170. package/lib/types/core/components/shadcn/input.d.ts.map +1 -1
  171. package/lib/types/core/components/shadcn/resizeable.d.ts +9 -0
  172. package/lib/types/core/components/shadcn/resizeable.d.ts.map +1 -0
  173. package/lib/types/core/components/shadcn/selectBox.d.ts +3 -2
  174. package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -1
  175. package/lib/types/core/components/shadcn/tabs.d.ts +2 -1
  176. package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
  177. package/lib/types/core/components/shadcn/textarea.d.ts +4 -0
  178. package/lib/types/core/components/shadcn/textarea.d.ts.map +1 -0
  179. package/lib/types/core/hooks/CompositeState.d.ts +115 -6
  180. package/lib/types/core/hooks/CompositeState.d.ts.map +1 -1
  181. package/lib/types/core/hooks/index.d.ts +1 -0
  182. package/lib/types/core/hooks/index.d.ts.map +1 -1
  183. package/lib/types/core/hooks/useScrollableSearch.d.ts +82 -0
  184. package/lib/types/core/hooks/useScrollableSearch.d.ts.map +1 -0
  185. package/lib/types/env/index.d.ts +3 -1
  186. package/lib/types/env/index.d.ts.map +1 -1
  187. package/lib/types/features/agent/PayloadBuilder.d.ts +11 -19
  188. package/lib/types/features/agent/PayloadBuilder.d.ts.map +1 -1
  189. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  190. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +1 -1
  191. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  192. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  193. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
  194. package/lib/types/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -1
  195. package/lib/types/features/facets/CollectionsFacetsNav.d.ts +14 -0
  196. package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -0
  197. package/lib/types/features/facets/DocumentsFacetsNav.d.ts +1 -1
  198. package/lib/types/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
  199. package/lib/types/features/facets/InteractionsFacetsNav.d.ts +14 -0
  200. package/lib/types/features/facets/InteractionsFacetsNav.d.ts.map +1 -0
  201. package/lib/types/features/facets/PromptsFacetsNav.d.ts +15 -0
  202. package/lib/types/features/facets/PromptsFacetsNav.d.ts.map +1 -0
  203. package/lib/types/features/facets/RunsFacetsNav.d.ts +1 -1
  204. package/lib/types/features/facets/RunsFacetsNav.d.ts.map +1 -1
  205. package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts +1 -1
  206. package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
  207. package/lib/types/features/facets/index.d.ts +10 -8
  208. package/lib/types/features/facets/index.d.ts.map +1 -1
  209. package/lib/types/features/facets/utils/SearchInterface.d.ts +14 -0
  210. package/lib/types/features/facets/utils/SearchInterface.d.ts.map +1 -0
  211. package/lib/types/features/facets/utils/StringFacet.d.ts.map +1 -0
  212. package/lib/types/features/facets/utils/StringListFacet.d.ts.map +1 -0
  213. package/lib/types/features/facets/utils/TypeFacet.d.ts.map +1 -0
  214. package/lib/types/features/facets/utils/VEnvironmentFacet.d.ts.map +1 -0
  215. package/lib/types/features/facets/utils/VInteractionFacet.d.ts.map +1 -0
  216. package/lib/types/features/facets/utils/VStringFacet.d.ts.map +1 -0
  217. package/lib/types/features/facets/{VTypeFacet.d.ts → utils/VTypeFacet.d.ts} +2 -1
  218. package/lib/types/features/facets/utils/VTypeFacet.d.ts.map +1 -0
  219. package/lib/types/features/facets/utils/VUserFacet.d.ts.map +1 -0
  220. package/lib/types/features/facets/utils/utils.d.ts.map +1 -0
  221. package/lib/types/features/layout/GenericPageNavHeader.d.ts +2 -1
  222. package/lib/types/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  223. package/lib/types/features/store/collections/BrowseCollectionView.d.ts.map +1 -1
  224. package/lib/types/features/store/collections/CreateCollection.d.ts.map +1 -1
  225. package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
  226. package/lib/types/features/store/collections/SelectCollection.d.ts +12 -8
  227. package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
  228. package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  229. package/lib/types/features/store/objects/DocumentTable.d.ts +4 -0
  230. package/lib/types/features/store/objects/DocumentTable.d.ts.map +1 -1
  231. package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  232. package/lib/types/features/store/objects/components/DocumentIcon.d.ts +7 -1
  233. package/lib/types/features/store/objects/components/DocumentIcon.d.ts.map +1 -1
  234. package/lib/types/features/store/objects/components/SaveVersionConfirmModal.d.ts.map +1 -1
  235. package/lib/types/features/store/objects/components/useDownloadObject.d.ts +1 -1
  236. package/lib/types/features/store/objects/components/useDownloadObject.d.ts.map +1 -1
  237. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts +2 -1
  238. package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
  239. package/lib/types/features/store/objects/layout/documentLayout.d.ts +4 -2
  240. package/lib/types/features/store/objects/layout/documentLayout.d.ts.map +1 -1
  241. package/lib/types/features/store/objects/layout/renderers.d.ts +1 -1
  242. package/lib/types/features/store/objects/layout/renderers.d.ts.map +1 -1
  243. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +2 -3
  244. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  245. package/lib/types/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
  246. package/lib/types/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
  247. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts +1 -0
  248. package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -1
  249. package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
  250. package/lib/types/features/user/UserInfo.d.ts +12 -1
  251. package/lib/types/features/user/UserInfo.d.ts.map +1 -1
  252. package/lib/types/router/HistoryNavigator.d.ts.map +1 -1
  253. package/lib/types/router/Nav.d.ts +2 -1
  254. package/lib/types/router/Nav.d.ts.map +1 -1
  255. package/lib/types/session/UserSession.d.ts.map +1 -1
  256. package/lib/types/session/UserSessionProvider.d.ts.map +1 -1
  257. package/lib/types/session/auth/composable.d.ts.map +1 -1
  258. package/lib/types/widgets/form/Form.d.ts +2 -1
  259. package/lib/types/widgets/form/Form.d.ts.map +1 -1
  260. package/lib/types/widgets/form/FormContext.d.ts +5 -2
  261. package/lib/types/widgets/form/FormContext.d.ts.map +1 -1
  262. package/lib/types/widgets/form/ManagedObject.d.ts.map +1 -1
  263. package/lib/types/widgets/form/fields.d.ts +2 -2
  264. package/lib/types/widgets/form/fields.d.ts.map +1 -1
  265. package/lib/types/widgets/form/inputs.d.ts.map +1 -1
  266. package/lib/types/widgets/schema-editor/index.d.ts +0 -1
  267. package/lib/types/widgets/schema-editor/index.d.ts.map +1 -1
  268. package/lib/vertesia-ui-core.js +1 -1
  269. package/lib/vertesia-ui-core.js.map +1 -1
  270. package/lib/vertesia-ui-env.js +1 -1
  271. package/lib/vertesia-ui-env.js.map +1 -1
  272. package/lib/vertesia-ui-features.js +1 -1
  273. package/lib/vertesia-ui-features.js.map +1 -1
  274. package/lib/vertesia-ui-router.js +1 -1
  275. package/lib/vertesia-ui-router.js.map +1 -1
  276. package/lib/vertesia-ui-session.js +1 -1
  277. package/lib/vertesia-ui-session.js.map +1 -1
  278. package/lib/vertesia-ui-shell.js +1 -1
  279. package/lib/vertesia-ui-shell.js.map +1 -1
  280. package/lib/vertesia-ui-widgets.js +1 -1
  281. package/lib/vertesia-ui-widgets.js.map +1 -1
  282. package/package.json +166 -165
  283. package/src/core/components/Panel.tsx +34 -0
  284. package/src/core/components/SelectList.tsx +11 -1
  285. package/src/core/components/SidePanel.tsx +18 -13
  286. package/src/core/components/index.ts +1 -1
  287. package/src/core/components/shadcn/breadcrumb.tsx +49 -30
  288. package/src/core/components/shadcn/button.tsx +3 -2
  289. package/src/core/components/shadcn/filters/filterBar.tsx +49 -23
  290. package/src/core/components/shadcn/index.ts +2 -0
  291. package/src/core/components/shadcn/input.tsx +10 -7
  292. package/src/core/components/shadcn/resizeable.tsx +54 -0
  293. package/src/core/components/shadcn/selectBox.tsx +87 -67
  294. package/src/core/components/shadcn/tabs.tsx +25 -8
  295. package/src/core/components/shadcn/textarea.tsx +21 -0
  296. package/src/core/components/table/index.tsx +1 -1
  297. package/src/core/hooks/index.ts +1 -0
  298. package/src/core/hooks/useScrollableSearch.tsx +193 -0
  299. package/src/features/agent/chat/ModernAgentConversation.tsx +109 -118
  300. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +2 -22
  301. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +1 -9
  302. package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +39 -55
  303. package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +1 -0
  304. package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +8 -8
  305. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +8 -8
  306. package/src/features/facets/CollectionsFacetsNav.tsx +115 -0
  307. package/src/features/facets/DocumentsFacetsNav.tsx +22 -11
  308. package/src/features/facets/EnvironmentFacet.tsx +1 -1
  309. package/src/features/facets/InteractionsFacetsNav.tsx +121 -0
  310. package/src/features/facets/PromptsFacetsNav.tsx +110 -0
  311. package/src/features/facets/RunsFacetsNav.tsx +40 -9
  312. package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +10 -8
  313. package/src/features/facets/index.ts +11 -9
  314. package/src/features/facets/utils/SearchInterface.tsx +12 -0
  315. package/src/features/facets/{VTypeFacet.tsx → utils/VTypeFacet.tsx} +12 -5
  316. package/src/features/facets/{VUserFacet.tsx → utils/VUserFacet.tsx} +1 -1
  317. package/src/features/layout/GenericPageNavHeader.tsx +73 -10
  318. package/src/features/store/collections/BrowseCollectionView.tsx +4 -0
  319. package/src/features/store/collections/CreateCollection.tsx +3 -4
  320. package/src/features/store/collections/EditCollectionView.tsx +104 -85
  321. package/src/features/store/collections/SelectCollection.tsx +214 -29
  322. package/src/features/store/objects/DocumentSearchResults.tsx +98 -27
  323. package/src/features/store/objects/DocumentTable.tsx +14 -4
  324. package/src/features/store/objects/components/ContentOverview.tsx +536 -267
  325. package/src/features/store/objects/components/DocumentIcon.tsx +42 -13
  326. package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +12 -2
  327. package/src/features/store/objects/layout/DocumentTableColumn.tsx +16 -1
  328. package/src/features/store/objects/layout/documentLayout.tsx +10 -12
  329. package/src/features/store/objects/layout/knowledge.md +10 -10
  330. package/src/features/store/objects/layout/renderers.tsx +39 -18
  331. package/src/features/store/objects/search/DocumentSearchContext.ts +6 -1
  332. package/src/features/store/objects/search/DocumentSearchProvider.tsx +1 -1
  333. package/src/features/store/objects/selection/ObjectsActionContext.tsx +3 -2
  334. package/src/features/store/objects/selection/SelectionActions.tsx +2 -0
  335. package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +23 -10
  336. package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +22 -2
  337. package/src/features/store/objects/upload/DocumentUploadModal.tsx +23 -15
  338. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +10 -7
  339. package/src/features/store/types/CreateOrUpdateTypeModal.tsx +1 -1
  340. package/src/features/store/types/ObjectSchemaEditor.tsx +1 -1
  341. package/src/features/user/UserInfo.tsx +66 -3
  342. package/src/router/HistoryNavigator.ts +33 -2
  343. package/src/router/Nav.tsx +4 -3
  344. package/src/shell/login/UserInfo.tsx +1 -1
  345. package/src/widgets/form/Form.tsx +19 -43
  346. package/src/widgets/form/FormContext.ts +5 -2
  347. package/src/widgets/form/fields.tsx +8 -6
  348. package/src/widgets/form/inputs.tsx +1 -0
  349. package/src/widgets/schema-editor/index.ts +0 -1
  350. package/lib/esm/core/components/Textarea.js +0 -15
  351. package/lib/esm/core/components/Textarea.js.map +0 -1
  352. package/lib/esm/features/facets/FacetsNav.js +0 -8
  353. package/lib/esm/features/facets/FacetsNav.js.map +0 -1
  354. package/lib/esm/features/facets/StringFacet.js.map +0 -1
  355. package/lib/esm/features/facets/StringListFacet.js.map +0 -1
  356. package/lib/esm/features/facets/TypeFacet.js.map +0 -1
  357. package/lib/esm/features/facets/VEnvironmentFacet.js.map +0 -1
  358. package/lib/esm/features/facets/VFacetsNav.js +0 -48
  359. package/lib/esm/features/facets/VFacetsNav.js.map +0 -1
  360. package/lib/esm/features/facets/VInteractionFacet.js.map +0 -1
  361. package/lib/esm/features/facets/VStringFacet.js.map +0 -1
  362. package/lib/esm/features/facets/VTypeFacet.js.map +0 -1
  363. package/lib/esm/features/facets/VUserFacet.js.map +0 -1
  364. package/lib/esm/features/facets/utils.js.map +0 -1
  365. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js +0 -49
  366. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js.map +0 -1
  367. package/lib/types/core/components/Textarea.d.ts +0 -8
  368. package/lib/types/core/components/Textarea.d.ts.map +0 -1
  369. package/lib/types/features/facets/FacetsNav.d.ts +0 -7
  370. package/lib/types/features/facets/FacetsNav.d.ts.map +0 -1
  371. package/lib/types/features/facets/StringFacet.d.ts.map +0 -1
  372. package/lib/types/features/facets/StringListFacet.d.ts.map +0 -1
  373. package/lib/types/features/facets/TypeFacet.d.ts.map +0 -1
  374. package/lib/types/features/facets/VEnvironmentFacet.d.ts.map +0 -1
  375. package/lib/types/features/facets/VFacetsNav.d.ts +0 -16
  376. package/lib/types/features/facets/VFacetsNav.d.ts.map +0 -1
  377. package/lib/types/features/facets/VInteractionFacet.d.ts.map +0 -1
  378. package/lib/types/features/facets/VStringFacet.d.ts.map +0 -1
  379. package/lib/types/features/facets/VTypeFacet.d.ts.map +0 -1
  380. package/lib/types/features/facets/VUserFacet.d.ts.map +0 -1
  381. package/lib/types/features/facets/utils.d.ts.map +0 -1
  382. package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts +0 -10
  383. package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts.map +0 -1
  384. package/src/core/components/Textarea.tsx +0 -25
  385. package/src/features/facets/FacetsNav.tsx +0 -19
  386. package/src/features/facets/VFacetsNav.tsx +0 -81
  387. package/src/widgets/schema-editor/JSONSchemaEditorModal.tsx +0 -67
  388. /package/lib/esm/features/facets/{StringFacet.js → utils/StringFacet.js} +0 -0
  389. /package/lib/esm/features/facets/{StringListFacet.js → utils/StringListFacet.js} +0 -0
  390. /package/lib/esm/features/facets/{TypeFacet.js → utils/TypeFacet.js} +0 -0
  391. /package/lib/esm/features/facets/{VEnvironmentFacet.js → utils/VEnvironmentFacet.js} +0 -0
  392. /package/lib/esm/features/facets/{VInteractionFacet.js → utils/VInteractionFacet.js} +0 -0
  393. /package/lib/esm/features/facets/{VStringFacet.js → utils/VStringFacet.js} +0 -0
  394. /package/lib/esm/features/facets/{utils.js → utils/utils.js} +0 -0
  395. /package/lib/types/features/facets/{StringFacet.d.ts → utils/StringFacet.d.ts} +0 -0
  396. /package/lib/types/features/facets/{StringListFacet.d.ts → utils/StringListFacet.d.ts} +0 -0
  397. /package/lib/types/features/facets/{TypeFacet.d.ts → utils/TypeFacet.d.ts} +0 -0
  398. /package/lib/types/features/facets/{VEnvironmentFacet.d.ts → utils/VEnvironmentFacet.d.ts} +0 -0
  399. /package/lib/types/features/facets/{VInteractionFacet.d.ts → utils/VInteractionFacet.d.ts} +0 -0
  400. /package/lib/types/features/facets/{VStringFacet.d.ts → utils/VStringFacet.d.ts} +0 -0
  401. /package/lib/types/features/facets/{VUserFacet.d.ts → utils/VUserFacet.d.ts} +0 -0
  402. /package/lib/types/features/facets/{utils.d.ts → utils/utils.d.ts} +0 -0
  403. /package/src/features/facets/{StringFacet.tsx → utils/StringFacet.tsx} +0 -0
  404. /package/src/features/facets/{StringListFacet.tsx → utils/StringListFacet.tsx} +0 -0
  405. /package/src/features/facets/{TypeFacet.tsx → utils/TypeFacet.tsx} +0 -0
  406. /package/src/features/facets/{VEnvironmentFacet.tsx → utils/VEnvironmentFacet.tsx} +0 -0
  407. /package/src/features/facets/{VInteractionFacet.tsx → utils/VInteractionFacet.tsx} +0 -0
  408. /package/src/features/facets/{VStringFacet.tsx → utils/VStringFacet.tsx} +0 -0
  409. /package/src/features/facets/{utils.tsx → utils/utils.tsx} +0 -0
@@ -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()];
@@ -42,7 +44,19 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
42
44
  }, [collection.table_layout]);
43
45
 
44
46
  const onSubmit = () => {
45
- const query = metadata.query ? JSON.parse(metadata.query) : undefined;
47
+ let query: any = undefined;
48
+ try {
49
+ query = metadata.query ? JSON.parse(metadata.query) : undefined;
50
+ } catch (err: any) {
51
+ toast({
52
+ title: "Invalid Query JSON",
53
+ description: err.message,
54
+ status: "error",
55
+ duration: 5000,
56
+ });
57
+ return;
58
+ }
59
+
46
60
  const payload: Partial<CreateCollectionPayload> = {
47
61
  name: metadata.name,
48
62
  description: metadata.description,
@@ -65,6 +79,7 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
65
79
  status: "error",
66
80
  duration: 5000,
67
81
  });
82
+ return;
68
83
  }
69
84
  if (tableLayoutRef.current) {
70
85
  const layout = tableLayoutRef.current.getValue();
@@ -118,61 +133,82 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
118
133
 
119
134
  return (
120
135
  <div className="flex flex-col gap-4 py-2">
121
- <FormItem label="Name" required>
122
- <Input value={metadata.name} onChange={(v) => setField("name", v)} />
123
- </FormItem>
124
- <FormItem label="Description">
125
- <textarea
126
- className={Styles.INPUT}
127
- value={metadata.description}
128
- onChange={(e) => setField("description", e.target.value)}
129
- />
130
- </FormItem>
131
- {
132
- !collection.dynamic &&
133
- <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.">
134
199
  <SelectContentType
135
- defaultValue={metadata.allowed_types || null}
200
+ defaultValue={metadata.type || null}
136
201
  onChange={(v) => {
137
202
  if (Array.isArray(v)) {
138
- setField("allowed_types", v.map(type => type.id));
203
+ setField("type", v.length > 0 ? v[0].id : null);
139
204
  } else {
140
- setField("allowed_types", v ? [v.id] : []);
205
+ setField("type", v?.id || null);
141
206
  }
142
207
  }}
143
- isClearable multiple
144
- />
145
- </FormItem>
146
- }
147
- {collection.dynamic && (
148
- <FormItem label="Query" description="Define the query to dynamically fetch content for the collection.">
149
- <textarea
150
- className={Styles.INPUT}
151
- value={metadata.query}
152
- onChange={(e) => setField("query", e.target.value)}
208
+ isClearable
153
209
  />
154
210
  </FormItem>
155
- )}
156
- <FormItem label="Table Layout" description="Define a custom layout for displaying the collection in tables.">
157
- <CodeMirrorEditor className="border-1 rounded-md border-border"
158
- value={tableLayoutValue} extensions={extensions} editorRef={tableLayoutRef} />
159
- </FormItem>
160
- <FormItem label="Type" description="Select a content type to assign custom properties and data to the collection.">
161
- <SelectContentType
162
- defaultValue={metadata.type || null}
163
- onChange={(v) => {
164
- if (Array.isArray(v)) {
165
- setField("type", v.length > 0 ? v[0].id : null);
166
- } else {
167
- setField("type", v?.id || null);
168
- }
169
- }}
170
- isClearable
171
- />
172
- </FormItem>
173
- <Button size="lg" className="w-min my-4" isDisabled={isUpdating} onClick={onSubmit}>
174
- Save Metadata
175
- </Button>
211
+ </Panel>
176
212
 
177
213
  {typeId && <PropertiesEditor typeId={typeId} collection={collection} />}
178
214
  </div>
@@ -184,28 +220,22 @@ interface PropertiesEditorProps {
184
220
  collection: Collection;
185
221
  }
186
222
  function PropertiesEditor({ typeId, collection }: PropertiesEditorProps) {
223
+ const toast = useToast();
187
224
  const { client } = useUserSession();
225
+ const [isUpdating, setIsUpdating] = useState(false);
226
+
188
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
+
189
231
  if (error) {
190
232
  return <ErrorBox title="Failed to load type">{error.message}</ErrorBox>;
191
233
  }
192
234
 
193
- return (
194
- <Section title="Properties">
195
- {type && <PropertiesForm collection={collection} schema={type.object_schema} />}
196
- </Section>
197
- );
198
- }
235
+ if (!type) {
236
+ return null;
237
+ }
199
238
 
200
- interface PropertiesFormProps {
201
- schema: any;
202
- collection: Collection;
203
- }
204
- function PropertiesForm({ schema = {}, collection }: PropertiesFormProps) {
205
- const { client } = useUserSession();
206
- const toast = useToast();
207
- const object = useMemo(() => new ManagedObject(schema, collection.properties || {}), [schema, collection]);
208
- const [isUpdating, setIsUpdating] = useState(false);
209
239
 
210
240
  const _onSave = (data: any) => {
211
241
  const payload = { properties: data || {} };
@@ -234,23 +264,12 @@ function PropertiesForm({ schema = {}, collection }: PropertiesFormProps) {
234
264
  };
235
265
 
236
266
  return (
237
- <GeneratedForm object={object} onSubmit={_onSave}>
238
- <Button size="lg" isLoading={isUpdating} className="my-4" variant="primary" type="submit">
239
- Save Properties
240
- </Button>
241
- </GeneratedForm>
242
- );
243
- }
244
-
245
- interface SectionProps {
246
- children: React.ReactNode;
247
- title: string;
248
- }
249
- function Section({ children, title }: SectionProps) {
250
- return (
251
- <div className="my-4">
252
- <div className="text-lg text-gray-700 font-semibold border-b border-b-gray-300 py-2 mb-4">{title}</div>
253
- {children}
254
- </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>
255
274
  );
256
275
  }
@@ -1,46 +1,231 @@
1
- import { ErrorBox, useFetch, VSelectBox } from "@vertesia/ui/core";
2
- import { useUserSession } from "@vertesia/ui/session";
1
+ import { Check, ChevronsUpDown } from "lucide-react";
2
+ import { useCallback, useMemo, useState } from "react";
3
3
 
4
- interface SelectCollectionProps {
5
- value?: string; // Collection ID
6
- onChange: (collectionId: string | undefined, collection?: any) => void;
7
- disabled?: boolean;
8
- className?: string;
9
- }
4
+ import { CollectionItem } from "@vertesia/common";
5
+ import {
6
+ Button, cn, ErrorBox, useDebounce, useFetch,
7
+ Popover, PopoverContent, PopoverTrigger,
8
+ Command, CommandEmpty, CommandGroup, CommandItem, CommandInput
9
+ } from "@vertesia/ui/core";
10
+ import { useUserSession } from "@vertesia/ui/session";
10
11
 
11
12
  /**
12
13
  * A component to select a collection from a list of collections.
13
14
  * It fetches the collections from the store and displays them in a dropdown.
14
15
  * @param props - The properties for the component.
15
16
  * @returns A dropdown to select a collection.
16
- */
17
- export function SelectCollection({ onChange, value, disabled = false, className }: SelectCollectionProps) {
17
+ **/
18
+ interface SelectCollectionProps {
19
+ value?: string | string[];
20
+ onChange: (collectionId: string | string[] | undefined, collection?: CollectionItem | CollectionItem[]) => void;
21
+ disabled?: boolean;
22
+ placeholder?: string;
23
+ searchPlaceholder?: string;
24
+ filterOut?: string[]; // collection IDs to filter out from the list
25
+ allowDynamic?: boolean;
26
+ multiple?: boolean;
27
+ }
28
+
29
+ export function SelectCollection({ onChange, value, disabled = false, placeholder = "Select a collection", searchPlaceholder = "Search collections", filterOut, allowDynamic = true, multiple = false }: SelectCollectionProps) {
18
30
  const { client } = useUserSession();
19
- const { data: collections, error } = useFetch(() => client.store.collections.search({ dynamic: false }), []);
20
31
 
32
+ const [searchQuery, setSearchQuery] = useState('');
33
+ const [isSearching, setIsSearching] = useState(false);
34
+ const [useServerSearch, setUseServerSearch] = useState(false);
35
+
36
+ // Debounce the search query to avoid excessive API calls (only used for server-side search)
37
+ const debouncedSearchQuery = useDebounce(searchQuery, 300);
38
+
39
+ // Memoize the search function to prevent unnecessary re-renders
40
+ const searchCollections = useCallback(async (query: string) => {
41
+ setIsSearching(true);
42
+ const trimmedQuery = query.trim();
43
+
44
+ const collections = await client.store.collections.search({
45
+ dynamic: allowDynamic ? undefined : false,
46
+ name: useServerSearch ? (trimmedQuery || undefined) : undefined
47
+ });
48
+
49
+ setIsSearching(false);
50
+
51
+ // Check if we hit the maximum limit (1000 collections) - if so, enable server-side search
52
+ if (!useServerSearch && collections.length >= 1000) {
53
+ setUseServerSearch(true);
54
+ }
55
+
56
+ // Filter out collections if filterOut is provided
57
+ if (filterOut && filterOut.length > 0) {
58
+ return collections.filter(col => !filterOut.includes(col.id));
59
+ }
60
+ return collections;
61
+ }, [client, allowDynamic, filterOut, useServerSearch]);
62
+
63
+ // Fetch collections based on search mode
64
+ const { data: collections, error } = useFetch(
65
+ () => searchCollections(useServerSearch ? debouncedSearchQuery : ''),
66
+ [useServerSearch ? debouncedSearchQuery : '', searchCollections]
67
+ );
68
+
69
+ // Memoize the selected collection(s)
70
+ const selectedCollection = useMemo(() => {
71
+ if (!collections) return multiple ? [] : undefined;
72
+
73
+ if (multiple && Array.isArray(value)) {
74
+ return collections.filter((collection: CollectionItem) => value.includes(collection.id));
75
+ } else if (!multiple && typeof value === 'string') {
76
+ return collections.find((collection: CollectionItem) => collection.id === value);
77
+ }
78
+ return multiple ? [] : undefined;
79
+ }, [collections, value, multiple]);
80
+
81
+ // Handle collection selection
82
+ const handleSelect = useCallback((collection: CollectionItem) => {
83
+ if (multiple) {
84
+ const currentValues = Array.isArray(value) ? value : [];
85
+ const isSelected = currentValues.includes(collection.id);
86
+
87
+ if (isSelected) {
88
+ // Remove from selection
89
+ const newValues = currentValues.filter(id => id !== collection.id);
90
+ const newCollections = collections?.filter(c => newValues.includes(c.id)) || [];
91
+ onChange(newValues, newCollections);
92
+ } else {
93
+ // Add to selection
94
+ const newValues = [...currentValues, collection.id];
95
+ const newCollections = collections?.filter(c => newValues.includes(c.id)) || [];
96
+ onChange(newValues, newCollections);
97
+ }
98
+ } else {
99
+ onChange(collection.id, collection);
100
+ }
101
+ }, [onChange, value, collections, multiple]);
102
+
103
+ // Handle clear selection
104
+ const handleClear = useCallback(() => {
105
+ onChange(undefined, undefined);
106
+ }, [onChange]);
107
+
108
+ // Handle search input change
109
+ const handleSearchChange = useCallback((query: string) => {
110
+ setSearchQuery(query);
111
+ }, []);
112
+
113
+ const hasSearchQuery = searchQuery.trim().length > 0;
114
+
115
+ // Client-side filtering when not using server search
116
+ const filteredCollections = useMemo(() => {
117
+ if (!collections) return [];
118
+
119
+ // If using server search, collections are already filtered by the server
120
+ if (useServerSearch) return collections;
121
+
122
+ // Otherwise, do client-side filtering
123
+ if (!hasSearchQuery) return collections;
124
+
125
+ const queryLower = searchQuery.toLowerCase();
126
+ return collections.filter(col => col.name.toLowerCase().includes(queryLower));
127
+ }, [collections, useServerSearch, hasSearchQuery, searchQuery]);
128
+
129
+ const showClearOption = selectedCollection && hasSearchQuery;
130
+
131
+ // Show error state
21
132
  if (error) {
22
- return <ErrorBox title='Collection fetch failed'>{error.message}</ErrorBox>
133
+ return (
134
+ <ErrorBox title="Collection fetch failed">
135
+ {error.message}
136
+ </ErrorBox>
137
+ );
23
138
  }
24
139
 
25
- // Find the selected collection object from the ID
26
- const selectedCollection = value ? collections?.find(col => col.id === value) : undefined;
27
-
28
- const handleChange = (collection: any) => {
29
- // Call onChange with both the ID and the full collection object
30
- onChange(collection?.id, collection);
140
+ // Get display text for the button
141
+ const getDisplayText = () => {
142
+ if (multiple && Array.isArray(selectedCollection) && selectedCollection.length > 0) {
143
+ if (selectedCollection.length === 1) {
144
+ return selectedCollection[0].name;
145
+ }
146
+ return `${selectedCollection.length} collections selected`;
147
+ } else if (!multiple && selectedCollection && !Array.isArray(selectedCollection)) {
148
+ return selectedCollection.name;
149
+ }
150
+ return placeholder;
31
151
  };
32
152
 
33
153
  return (
34
- <VSelectBox
35
- filterBy={"name"}
36
- value={selectedCollection}
37
- onChange={handleChange}
38
- placeholder="Select a collection"
39
- options={collections || []}
40
- optionLabel={(col: any) => col.name}
41
- by="id"
42
- className={className}
43
- disabled={disabled}
44
- />
154
+ <Popover>
155
+ <PopoverTrigger asChild>
156
+ <Button
157
+ variant="outline"
158
+ role="combobox"
159
+ aria-haspopup="listbox"
160
+ className={cn("w-full justify-between min-w-0")}
161
+ disabled={disabled}
162
+ >
163
+ <span className="truncate flex-1 text-left min-w-0">
164
+ {getDisplayText()}
165
+ </span>
166
+ <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
167
+ </Button>
168
+ </PopoverTrigger>
169
+ <PopoverContent className="mt-2 mb-2 w-[var(--radix-popover-trigger-width)] p-0" align="start">
170
+ <Command shouldFilter={false}>
171
+ <div className="flex justify-between items-center border-b px-3" cmdk-input-wrapper="">
172
+ <CommandInput
173
+ placeholder={searchPlaceholder}
174
+ value={searchQuery}
175
+ onValueChange={handleSearchChange}
176
+ className="flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50"
177
+ />
178
+ {
179
+ isSearching && (
180
+ <div className="mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent" />
181
+ )
182
+ }
183
+ </div>
184
+ <CommandEmpty>
185
+ {
186
+ isSearching
187
+ ? "Searching..."
188
+ : hasSearchQuery
189
+ ? "No collections found."
190
+ : "No collections available."
191
+ }
192
+ </CommandEmpty>
193
+ <CommandGroup className="max-h-[300px] overflow-auto">
194
+ {
195
+ showClearOption && !multiple && (
196
+ <CommandItem
197
+ value="__clear__"
198
+ onSelect={handleClear}
199
+ className="text-muted-foreground"
200
+ >
201
+ Clear selection
202
+ </CommandItem>
203
+ )
204
+ }
205
+ {
206
+ filteredCollections.map((collection: CollectionItem) => {
207
+ const isSelected = multiple && Array.isArray(value)
208
+ ? value.includes(collection.id)
209
+ : value === collection.id;
210
+
211
+ return (
212
+ <CommandItem
213
+ key={collection.id}
214
+ value={collection.id}
215
+ onSelect={() => handleSelect(collection)}
216
+ className="flex items-center justify-between"
217
+ >
218
+ <span className="truncate">{collection.name}</span>
219
+ {isSelected && (
220
+ <Check className="ml-2 h-4 w-4 shrink-0" />
221
+ )}
222
+ </CommandItem>
223
+ );
224
+ })
225
+ }
226
+ </CommandGroup>
227
+ </Command>
228
+ </PopoverContent>
229
+ </Popover>
45
230
  );
46
231
  }