@vertesia/ui 0.78.0 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/lib/esm/core/components/SelectList.js +18 -13
  2. package/lib/esm/core/components/SelectList.js.map +1 -1
  3. package/lib/esm/core/components/SidePanel.js +1 -1
  4. package/lib/esm/core/components/SidePanel.js.map +1 -1
  5. package/lib/esm/core/components/shadcn/filters/filterBar.js +39 -12
  6. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  7. package/lib/esm/core/components/shadcn/index.js +1 -0
  8. package/lib/esm/core/components/shadcn/index.js.map +1 -1
  9. package/lib/esm/core/components/shadcn/resizeable.js +15 -0
  10. package/lib/esm/core/components/shadcn/resizeable.js.map +1 -0
  11. package/lib/esm/core/components/shadcn/tabs.js +11 -6
  12. package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
  13. package/lib/esm/core/components/table/index.js +1 -1
  14. package/lib/esm/core/components/table/index.js.map +1 -1
  15. package/lib/esm/features/facets/CollectionsFacetsNav.js +66 -0
  16. package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -0
  17. package/lib/esm/features/facets/DocumentsFacetsNav.js +19 -7
  18. package/lib/esm/features/facets/DocumentsFacetsNav.js.map +1 -1
  19. package/lib/esm/features/facets/EnvironmentFacet.js +1 -1
  20. package/lib/esm/features/facets/EnvironmentFacet.js.map +1 -1
  21. package/lib/esm/features/facets/InteractionsFacetsNav.js +82 -0
  22. package/lib/esm/features/facets/InteractionsFacetsNav.js.map +1 -0
  23. package/lib/esm/features/facets/PromptsFacetsNav.js +80 -0
  24. package/lib/esm/features/facets/PromptsFacetsNav.js.map +1 -0
  25. package/lib/esm/features/facets/RunsFacetsNav.js +28 -6
  26. package/lib/esm/features/facets/RunsFacetsNav.js.map +1 -1
  27. package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js +7 -5
  28. package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
  29. package/lib/esm/features/facets/index.js +10 -8
  30. package/lib/esm/features/facets/index.js.map +1 -1
  31. package/lib/esm/features/facets/utils/SearchInterface.js +2 -0
  32. package/lib/esm/features/facets/utils/SearchInterface.js.map +1 -0
  33. package/lib/esm/features/facets/utils/StringFacet.js.map +1 -0
  34. package/lib/esm/features/facets/utils/StringListFacet.js.map +1 -0
  35. package/lib/esm/features/facets/utils/TypeFacet.js.map +1 -0
  36. package/lib/esm/features/facets/utils/VEnvironmentFacet.js.map +1 -0
  37. package/lib/esm/features/facets/utils/VInteractionFacet.js.map +1 -0
  38. package/lib/esm/features/facets/utils/VStringFacet.js.map +1 -0
  39. package/lib/esm/features/facets/{VTypeFacet.js → utils/VTypeFacet.js} +5 -3
  40. package/lib/esm/features/facets/utils/VTypeFacet.js.map +1 -0
  41. package/lib/esm/features/facets/{VUserFacet.js → utils/VUserFacet.js} +1 -1
  42. package/lib/esm/features/facets/utils/VUserFacet.js.map +1 -0
  43. package/lib/esm/features/facets/utils/utils.js.map +1 -0
  44. package/lib/esm/features/store/collections/EditCollectionView.js +14 -1
  45. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  46. package/lib/esm/features/store/collections/SelectCollection.js +47 -18
  47. package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
  48. package/lib/esm/features/store/objects/DocumentSearchResults.js +9 -5
  49. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
  50. package/lib/esm/features/store/objects/components/ContentOverview.js +172 -78
  51. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
  52. package/lib/esm/features/store/objects/components/DocumentIcon.js +6 -0
  53. package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -1
  54. package/lib/esm/features/store/objects/layout/documentLayout.js +3 -4
  55. package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -1
  56. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +2 -2
  57. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -1
  58. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +1 -1
  59. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  60. package/lib/esm/features/store/types/ObjectSchemaEditor.js +1 -1
  61. package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -1
  62. package/lib/esm/features/user/UserInfo.js +33 -1
  63. package/lib/esm/features/user/UserInfo.js.map +1 -1
  64. package/lib/esm/shell/login/UserInfo.js +1 -1
  65. package/lib/esm/shell/login/UserInfo.js.map +1 -1
  66. package/lib/esm/widgets/schema-editor/index.js +0 -1
  67. package/lib/esm/widgets/schema-editor/index.js.map +1 -1
  68. package/lib/tsconfig.tsbuildinfo +1 -1
  69. package/lib/types/core/components/SelectList.d.ts +2 -1
  70. package/lib/types/core/components/SelectList.d.ts.map +1 -1
  71. package/lib/types/core/components/SidePanel.d.ts.map +1 -1
  72. package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  73. package/lib/types/core/components/shadcn/index.d.ts +1 -0
  74. package/lib/types/core/components/shadcn/index.d.ts.map +1 -1
  75. package/lib/types/core/components/shadcn/resizeable.d.ts +9 -0
  76. package/lib/types/core/components/shadcn/resizeable.d.ts.map +1 -0
  77. package/lib/types/core/components/shadcn/tabs.d.ts +2 -1
  78. package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
  79. package/lib/types/features/facets/CollectionsFacetsNav.d.ts +14 -0
  80. package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -0
  81. package/lib/types/features/facets/DocumentsFacetsNav.d.ts +1 -1
  82. package/lib/types/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
  83. package/lib/types/features/facets/InteractionsFacetsNav.d.ts +13 -0
  84. package/lib/types/features/facets/InteractionsFacetsNav.d.ts.map +1 -0
  85. package/lib/types/features/facets/PromptsFacetsNav.d.ts +15 -0
  86. package/lib/types/features/facets/PromptsFacetsNav.d.ts.map +1 -0
  87. package/lib/types/features/facets/RunsFacetsNav.d.ts +1 -1
  88. package/lib/types/features/facets/RunsFacetsNav.d.ts.map +1 -1
  89. package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts +1 -1
  90. package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
  91. package/lib/types/features/facets/index.d.ts +10 -8
  92. package/lib/types/features/facets/index.d.ts.map +1 -1
  93. package/lib/types/features/facets/{VFacetsNav.d.ts → utils/SearchInterface.d.ts} +1 -8
  94. package/lib/types/features/facets/utils/SearchInterface.d.ts.map +1 -0
  95. package/lib/types/features/facets/utils/StringFacet.d.ts.map +1 -0
  96. package/lib/types/features/facets/utils/StringListFacet.d.ts.map +1 -0
  97. package/lib/types/features/facets/utils/TypeFacet.d.ts.map +1 -0
  98. package/lib/types/features/facets/utils/VEnvironmentFacet.d.ts.map +1 -0
  99. package/lib/types/features/facets/utils/VInteractionFacet.d.ts.map +1 -0
  100. package/lib/types/features/facets/utils/VStringFacet.d.ts.map +1 -0
  101. package/lib/types/features/facets/utils/VTypeFacet.d.ts.map +1 -0
  102. package/lib/types/features/facets/utils/VUserFacet.d.ts.map +1 -0
  103. package/lib/types/features/facets/utils/utils.d.ts.map +1 -0
  104. package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
  105. package/lib/types/features/store/collections/SelectCollection.d.ts +10 -8
  106. package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
  107. package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  108. package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  109. package/lib/types/features/store/objects/components/DocumentIcon.d.ts +4 -0
  110. package/lib/types/features/store/objects/components/DocumentIcon.d.ts.map +1 -1
  111. package/lib/types/features/store/objects/layout/documentLayout.d.ts.map +1 -1
  112. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +1 -3
  113. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  114. package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
  115. package/lib/types/features/user/UserInfo.d.ts +12 -1
  116. package/lib/types/features/user/UserInfo.d.ts.map +1 -1
  117. package/lib/types/widgets/schema-editor/index.d.ts +0 -1
  118. package/lib/types/widgets/schema-editor/index.d.ts.map +1 -1
  119. package/lib/vertesia-ui-core.js +1 -1
  120. package/lib/vertesia-ui-core.js.map +1 -1
  121. package/lib/vertesia-ui-features.js +1 -1
  122. package/lib/vertesia-ui-features.js.map +1 -1
  123. package/lib/vertesia-ui-shell.js +1 -1
  124. package/lib/vertesia-ui-shell.js.map +1 -1
  125. package/lib/vertesia-ui-widgets.js +1 -1
  126. package/lib/vertesia-ui-widgets.js.map +1 -1
  127. package/package.json +5 -4
  128. package/src/core/components/SelectList.tsx +11 -1
  129. package/src/core/components/SidePanel.tsx +13 -10
  130. package/src/core/components/shadcn/filters/filterBar.tsx +46 -20
  131. package/src/core/components/shadcn/index.ts +1 -0
  132. package/src/core/components/shadcn/resizeable.tsx +54 -0
  133. package/src/core/components/shadcn/tabs.tsx +16 -6
  134. package/src/core/components/table/index.tsx +1 -1
  135. package/src/features/facets/CollectionsFacetsNav.tsx +94 -0
  136. package/src/features/facets/DocumentsFacetsNav.tsx +22 -11
  137. package/src/features/facets/EnvironmentFacet.tsx +1 -1
  138. package/src/features/facets/InteractionsFacetsNav.tsx +111 -0
  139. package/src/features/facets/PromptsFacetsNav.tsx +110 -0
  140. package/src/features/facets/RunsFacetsNav.tsx +40 -9
  141. package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +10 -8
  142. package/src/features/facets/index.ts +11 -9
  143. package/src/features/facets/utils/SearchInterface.tsx +8 -0
  144. package/src/features/facets/{VTypeFacet.tsx → utils/VTypeFacet.tsx} +6 -3
  145. package/src/features/facets/{VUserFacet.tsx → utils/VUserFacet.tsx} +1 -1
  146. package/src/features/store/collections/EditCollectionView.tsx +14 -1
  147. package/src/features/store/collections/SelectCollection.tsx +160 -31
  148. package/src/features/store/objects/DocumentSearchResults.tsx +42 -37
  149. package/src/features/store/objects/components/ContentOverview.tsx +432 -261
  150. package/src/features/store/objects/components/DocumentIcon.tsx +31 -1
  151. package/src/features/store/objects/layout/documentLayout.tsx +3 -7
  152. package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +15 -8
  153. package/src/features/store/objects/upload/DocumentUploadModal.tsx +5 -6
  154. package/src/features/store/types/ObjectSchemaEditor.tsx +1 -1
  155. package/src/features/user/UserInfo.tsx +66 -3
  156. package/src/shell/login/UserInfo.tsx +1 -1
  157. package/src/widgets/schema-editor/index.ts +0 -1
  158. package/lib/esm/features/facets/FacetsNav.js +0 -8
  159. package/lib/esm/features/facets/FacetsNav.js.map +0 -1
  160. package/lib/esm/features/facets/StringFacet.js.map +0 -1
  161. package/lib/esm/features/facets/StringListFacet.js.map +0 -1
  162. package/lib/esm/features/facets/TypeFacet.js.map +0 -1
  163. package/lib/esm/features/facets/VEnvironmentFacet.js.map +0 -1
  164. package/lib/esm/features/facets/VFacetsNav.js +0 -48
  165. package/lib/esm/features/facets/VFacetsNav.js.map +0 -1
  166. package/lib/esm/features/facets/VInteractionFacet.js.map +0 -1
  167. package/lib/esm/features/facets/VStringFacet.js.map +0 -1
  168. package/lib/esm/features/facets/VTypeFacet.js.map +0 -1
  169. package/lib/esm/features/facets/VUserFacet.js.map +0 -1
  170. package/lib/esm/features/facets/utils.js.map +0 -1
  171. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js +0 -49
  172. package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js.map +0 -1
  173. package/lib/types/features/facets/FacetsNav.d.ts +0 -7
  174. package/lib/types/features/facets/FacetsNav.d.ts.map +0 -1
  175. package/lib/types/features/facets/StringFacet.d.ts.map +0 -1
  176. package/lib/types/features/facets/StringListFacet.d.ts.map +0 -1
  177. package/lib/types/features/facets/TypeFacet.d.ts.map +0 -1
  178. package/lib/types/features/facets/VEnvironmentFacet.d.ts.map +0 -1
  179. package/lib/types/features/facets/VFacetsNav.d.ts.map +0 -1
  180. package/lib/types/features/facets/VInteractionFacet.d.ts.map +0 -1
  181. package/lib/types/features/facets/VStringFacet.d.ts.map +0 -1
  182. package/lib/types/features/facets/VTypeFacet.d.ts.map +0 -1
  183. package/lib/types/features/facets/VUserFacet.d.ts.map +0 -1
  184. package/lib/types/features/facets/utils.d.ts.map +0 -1
  185. package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts +0 -10
  186. package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts.map +0 -1
  187. package/src/features/facets/FacetsNav.tsx +0 -19
  188. package/src/features/facets/VFacetsNav.tsx +0 -81
  189. package/src/widgets/schema-editor/JSONSchemaEditorModal.tsx +0 -67
  190. /package/lib/esm/features/facets/{StringFacet.js → utils/StringFacet.js} +0 -0
  191. /package/lib/esm/features/facets/{StringListFacet.js → utils/StringListFacet.js} +0 -0
  192. /package/lib/esm/features/facets/{TypeFacet.js → utils/TypeFacet.js} +0 -0
  193. /package/lib/esm/features/facets/{VEnvironmentFacet.js → utils/VEnvironmentFacet.js} +0 -0
  194. /package/lib/esm/features/facets/{VInteractionFacet.js → utils/VInteractionFacet.js} +0 -0
  195. /package/lib/esm/features/facets/{VStringFacet.js → utils/VStringFacet.js} +0 -0
  196. /package/lib/esm/features/facets/{utils.js → utils/utils.js} +0 -0
  197. /package/lib/types/features/facets/{StringFacet.d.ts → utils/StringFacet.d.ts} +0 -0
  198. /package/lib/types/features/facets/{StringListFacet.d.ts → utils/StringListFacet.d.ts} +0 -0
  199. /package/lib/types/features/facets/{TypeFacet.d.ts → utils/TypeFacet.d.ts} +0 -0
  200. /package/lib/types/features/facets/{VEnvironmentFacet.d.ts → utils/VEnvironmentFacet.d.ts} +0 -0
  201. /package/lib/types/features/facets/{VInteractionFacet.d.ts → utils/VInteractionFacet.d.ts} +0 -0
  202. /package/lib/types/features/facets/{VStringFacet.d.ts → utils/VStringFacet.d.ts} +0 -0
  203. /package/lib/types/features/facets/{VTypeFacet.d.ts → utils/VTypeFacet.d.ts} +0 -0
  204. /package/lib/types/features/facets/{VUserFacet.d.ts → utils/VUserFacet.d.ts} +0 -0
  205. /package/lib/types/features/facets/{utils.d.ts → utils/utils.d.ts} +0 -0
  206. /package/src/features/facets/{StringFacet.tsx → utils/StringFacet.tsx} +0 -0
  207. /package/src/features/facets/{StringListFacet.tsx → utils/StringListFacet.tsx} +0 -0
  208. /package/src/features/facets/{TypeFacet.tsx → utils/TypeFacet.tsx} +0 -0
  209. /package/src/features/facets/{VEnvironmentFacet.tsx → utils/VEnvironmentFacet.tsx} +0 -0
  210. /package/src/features/facets/{VInteractionFacet.tsx → utils/VInteractionFacet.tsx} +0 -0
  211. /package/src/features/facets/{VStringFacet.tsx → utils/VStringFacet.tsx} +0 -0
  212. /package/src/features/facets/{utils.tsx → utils/utils.tsx} +0 -0
@@ -0,0 +1,111 @@
1
+ import { Filter as BaseFilter, FilterProvider, FilterBtn, FilterBar, FilterClear, FilterGroup } from '@vertesia/ui/core';
2
+ import { useState } from 'react';
3
+ import { SearchInterface } from './utils/SearchInterface';
4
+
5
+ interface InteractionsFacetsNavProps {
6
+ facets: {
7
+ tags?: any[];
8
+ };
9
+ search: SearchInterface;
10
+ }
11
+
12
+ // Hook to create filter groups for interactions
13
+ export function useInteractionsFilterGroups(facets: InteractionsFacetsNavProps['facets']): FilterGroup[] {
14
+ void facets;
15
+ const customFilterGroups: FilterGroup[] = [];
16
+
17
+ // Add name filter as string type
18
+ const nameFilterGroup = {
19
+ name: 'name',
20
+ placeholder: 'Name',
21
+ type: 'text' as const,
22
+ multiple: false
23
+ };
24
+ customFilterGroups.push(nameFilterGroup);
25
+
26
+ // Add prompt name filter as string type
27
+ const promptNameFilterGroup = {
28
+ name: 'prompt',
29
+ placeholder: 'Prompt Name',
30
+ type: 'text' as const,
31
+ multiple: false
32
+ };
33
+ customFilterGroups.push(promptNameFilterGroup);
34
+
35
+ // Add tags filter as stringList type (allows custom input)
36
+ const tagsFilterGroup = {
37
+ name: 'tags',
38
+ placeholder: 'Tags',
39
+ type: 'stringList' as const,
40
+ multiple: true
41
+ };
42
+ customFilterGroups.push(tagsFilterGroup);
43
+
44
+ return customFilterGroups;
45
+ }
46
+
47
+ // Hook to create filter change handler for interactions
48
+ export function useInteractionsFilterHandler(search: SearchInterface) {
49
+ return (newFilters: BaseFilter[]) => {
50
+ if (newFilters.length === 0) {
51
+ // Clear filters without applying defaults - user wants to remove all filters
52
+ search.clearFilters(true, false);
53
+ return;
54
+ }
55
+
56
+ // Clear all filters first without defaults, then apply new ones
57
+ search.clearFilters(false, false);
58
+
59
+ newFilters.forEach(filter => {
60
+ if (filter.value && filter.value.length > 0) {
61
+ const filterName = filter.name;
62
+ let filterValue;
63
+ if (filter.type === 'stringList') {
64
+ filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);
65
+ } else if (filter.multiple) {
66
+ filterValue = Array.isArray(filter.value)
67
+ ? filter.value.map((v: any) => typeof v === 'object' && v.value ? v.value : v)
68
+ : [typeof filter.value === 'object' && (filter.value as any).value ? (filter.value as any).value : filter.value];
69
+ } else {
70
+ // Single value - don't wrap in array
71
+ filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'
72
+ ? (filter.value[0] as any).value
73
+ : Array.isArray(filter.value) && filter.value[0]
74
+ ? filter.value[0]
75
+ : filter.value;
76
+ }
77
+
78
+ search.query[filterName] = filterValue;
79
+ }
80
+ });
81
+
82
+ search.search();
83
+ };
84
+ }
85
+
86
+ // Component for interactions filtering
87
+ export function InteractionsFacetsNav({ facets, search }: InteractionsFacetsNavProps) {
88
+ const [filters, setFilters] = useState<BaseFilter[]>([]);
89
+ const filterGroups = useInteractionsFilterGroups(facets);
90
+ const handleFilterLogic = useInteractionsFilterHandler(search);
91
+
92
+ const handleFilterChange: React.Dispatch<React.SetStateAction<BaseFilter[]>> = (value) => {
93
+ const newFilters = typeof value === 'function' ? value(filters) : value;
94
+ setFilters(newFilters);
95
+ handleFilterLogic(newFilters);
96
+ };
97
+
98
+ return (
99
+ <FilterProvider
100
+ filterGroups={filterGroups}
101
+ filters={filters}
102
+ setFilters={handleFilterChange}
103
+ >
104
+ <div className="flex gap-2 items-center">
105
+ <FilterBtn />
106
+ <FilterBar />
107
+ <FilterClear />
108
+ </div>
109
+ </FilterProvider>
110
+ );
111
+ }
@@ -0,0 +1,110 @@
1
+ import { Filter as BaseFilter, FilterProvider, FilterBtn, FilterBar, FilterClear, FilterGroup } from '@vertesia/ui/core';
2
+ import { useState } from 'react';
3
+ import { SearchInterface } from './utils/SearchInterface';
4
+
5
+ interface PromptsFacetsNavProps {
6
+ facets: {
7
+ role?: any[];
8
+ status?: any[];
9
+ tags?: any[];
10
+ };
11
+ search: SearchInterface;
12
+ }
13
+
14
+ // Hook to create filter groups for prompts
15
+ export function usePromptsFilterGroups(facets: PromptsFacetsNavProps['facets']): FilterGroup[] {
16
+ void facets;
17
+ const customFilterGroups: FilterGroup[] = [];
18
+
19
+ // Add name filter as text type
20
+ const nameFilterGroup = {
21
+ name: 'name',
22
+ placeholder: 'Name',
23
+ type: 'text' as const,
24
+ multiple: false
25
+ };
26
+ customFilterGroups.push(nameFilterGroup);
27
+
28
+ // Add role filter as select type if role facets are available
29
+ if (facets.role && facets.role.length > 0) {
30
+ const rolesFilterGroup = {
31
+ name: 'role',
32
+ placeholder: 'Role',
33
+ type: 'select' as const,
34
+ options: facets.role.map((facet: { _id: string; count: number }) => ({
35
+ label: facet._id,
36
+ value: facet._id,
37
+ count: facet.count
38
+ })),
39
+ };
40
+ customFilterGroups.push(rolesFilterGroup);
41
+ }
42
+
43
+ return customFilterGroups;
44
+ }
45
+
46
+ // Hook to create filter change handler for prompts
47
+ export function usePromptsFilterHandler(search: SearchInterface) {
48
+ return (newFilters: BaseFilter[]) => {
49
+ if (newFilters.length === 0) {
50
+ // Clear filters without applying defaults - user wants to remove all filters
51
+ search.clearFilters(true, false);
52
+ return;
53
+ }
54
+
55
+ // Clear all filters first without defaults, then apply new ones
56
+ search.clearFilters(false, false);
57
+
58
+ newFilters.forEach(filter => {
59
+ if (filter.value && filter.value.length > 0) {
60
+ const filterName = filter.name;
61
+ let filterValue;
62
+ if (filter.type === 'stringList') {
63
+ filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);
64
+ } else if (filter.multiple) {
65
+ filterValue = Array.isArray(filter.value)
66
+ ? filter.value.map((v: any) => typeof v === 'object' && v.value ? v.value : v)
67
+ : [typeof filter.value === 'object' && (filter.value as any).value ? (filter.value as any).value : filter.value];
68
+ } else {
69
+ // Single value - don't wrap in array
70
+ filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'
71
+ ? (filter.value[0] as any).value
72
+ : Array.isArray(filter.value) && filter.value[0]
73
+ ? filter.value[0]
74
+ : filter.value;
75
+ }
76
+
77
+ search.query[filterName] = filterValue;
78
+ }
79
+ });
80
+
81
+ search.search();
82
+ };
83
+ }
84
+
85
+ // Component for prompts filtering
86
+ export function PromptsFacetsNav({ facets, search }: PromptsFacetsNavProps) {
87
+ const [filters, setFilters] = useState<BaseFilter[]>([]);
88
+ const filterGroups = usePromptsFilterGroups(facets);
89
+ const handleFilterLogic = usePromptsFilterHandler(search);
90
+
91
+ const handleFilterChange: React.Dispatch<React.SetStateAction<BaseFilter[]>> = (value) => {
92
+ const newFilters = typeof value === 'function' ? value(filters) : value;
93
+ setFilters(newFilters);
94
+ handleFilterLogic(newFilters);
95
+ };
96
+
97
+ return (
98
+ <FilterProvider
99
+ filterGroups={filterGroups}
100
+ filters={filters}
101
+ setFilters={handleFilterChange}
102
+ >
103
+ <div className="flex gap-2 items-center">
104
+ <FilterBtn />
105
+ <FilterBar />
106
+ <FilterClear />
107
+ </div>
108
+ </FilterProvider>
109
+ );
110
+ }
@@ -1,10 +1,11 @@
1
- import { Filter as BaseFilter, FilterProvider, FilterBtn, FilterBar, FilterClear, FilterGroup } from '@vertesia/ui/core';
1
+ import { Button, Filter as BaseFilter, FilterProvider, FilterBtn, FilterBar, FilterClear, FilterGroup } from '@vertesia/ui/core';
2
2
  import { useState } from 'react';
3
- import { VEnvironmentFacet } from './VEnvironmentFacet';
4
- import { VInteractionFacet } from './VInteractionFacet';
5
- import { VStringFacet } from './VStringFacet';
6
- import { VUserFacet } from './VUserFacet';
7
- import { SearchInterface } from './VFacetsNav';
3
+ import { VEnvironmentFacet } from './utils/VEnvironmentFacet';
4
+ import { VInteractionFacet } from './utils/VInteractionFacet';
5
+ import { VStringFacet } from './utils/VStringFacet';
6
+ import { VUserFacet } from './utils/VUserFacet';
7
+ import { SearchInterface } from './utils/SearchInterface';
8
+ import { RefreshCw } from 'lucide-react';
8
9
 
9
10
  interface RunsFacetsNavProps {
10
11
  facets: {
@@ -24,6 +25,14 @@ interface RunsFacetsNavProps {
24
25
  export function useRunsFilterGroups(facets: RunsFacetsNavProps['facets']): FilterGroup[] {
25
26
  const customFilterGroups: FilterGroup[] = [];
26
27
 
28
+ const runIdFilterGroup = {
29
+ name: 'run_ids',
30
+ placeholder: 'Run ID',
31
+ type: 'text' as const,
32
+ multiple: false
33
+ };
34
+ customFilterGroups.push(runIdFilterGroup);
35
+
27
36
  if (facets.interactions) {
28
37
  const interactionFilterGroup = VInteractionFacet({
29
38
  buckets: facets.interactions || [],
@@ -108,6 +117,14 @@ export function useRunsFilterGroups(facets: RunsFacetsNavProps['facets']): Filte
108
117
  };
109
118
  customFilterGroups.push(dateBeforeFilterGroup);
110
119
 
120
+ const workflowRunIdFilterGroup = {
121
+ name: 'workflow_run_ids',
122
+ placeholder: 'Workflow Run ID',
123
+ type: 'text' as const,
124
+ multiple: false
125
+ };
126
+ customFilterGroups.push(workflowRunIdFilterGroup);
127
+
111
128
  return customFilterGroups;
112
129
  }
113
130
 
@@ -130,18 +147,23 @@ export function useRunsFilterHandler(search: SearchInterface) {
130
147
  if (filter.type === 'stringList') {
131
148
  filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);
132
149
  } else if (filter.multiple) {
133
- filterValue = Array.isArray(filter.value)
150
+ filterValue = Array.isArray(filter.value)
134
151
  ? filter.value.map((v: any) => typeof v === 'object' && v.value ? v.value : v)
135
152
  : [typeof filter.value === 'object' && (filter.value as any).value ? (filter.value as any).value : filter.value];
136
153
  } else {
137
154
  // Single value - don't wrap in array
138
155
  filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'
139
156
  ? (filter.value[0] as any).value
140
- : Array.isArray(filter.value) && filter.value[0]
157
+ : Array.isArray(filter.value) && filter.value[0]
141
158
  ? filter.value[0]
142
159
  : filter.value;
143
160
  }
144
161
 
162
+ // Force array format for backend fields that expect arrays
163
+ if ((filterName === 'run_ids' || filterName === 'workflow_run_ids') && !Array.isArray(filterValue)) {
164
+ filterValue = [filterValue];
165
+ }
166
+
145
167
  search.query[filterName] = filterValue;
146
168
  }
147
169
  });
@@ -162,14 +184,23 @@ export function RunsFacetsNav({ facets, search }: RunsFacetsNavProps) {
162
184
  handleFilterLogic(newFilters);
163
185
  };
164
186
 
187
+ const handleRefetch = () => {
188
+ search.search();
189
+ }
190
+
165
191
  return (
166
192
  <FilterProvider
167
193
  filterGroups={filterGroups}
168
194
  filters={filters}
169
195
  setFilters={handleFilterChange}
170
196
  >
171
- <div className="flex gap-2 items-center">
197
+ <div className='flex justify-between mb-1'>
172
198
  <FilterBtn />
199
+ <Button onClick={handleRefetch} variant='outline' title="Refresh">
200
+ <RefreshCw className="size-5" />
201
+ </Button>
202
+ </div>
203
+ <div className='flex gap-2 items-center'>
173
204
  <FilterBar />
174
205
  <FilterClear />
175
206
  </div>
@@ -1,8 +1,8 @@
1
1
  import { Filter as BaseFilter, FilterProvider, FilterBtn, FilterBar, FilterClear, FilterGroup } from '@vertesia/ui/core';
2
2
  import { useState } from 'react';
3
- import { VStringFacet } from './VStringFacet';
4
- import { VUserFacet } from './VUserFacet';
5
- import { SearchInterface } from './VFacetsNav';
3
+ import { VStringFacet } from './utils/VStringFacet';
4
+ import { VUserFacet } from './utils/VUserFacet';
5
+ import { SearchInterface } from './utils/SearchInterface';
6
6
 
7
7
  interface WorkflowExecutionsFacetsNavProps {
8
8
  facets: {
@@ -17,7 +17,7 @@ export function useWorkflowExecutionsFilterGroups(facets: WorkflowExecutionsFace
17
17
  const customFilterGroups: FilterGroup[] = [];
18
18
 
19
19
  customFilterGroups.push({
20
- placeholder: 'Search by Workflow or Run ID',
20
+ placeholder: 'Workflow or Run ID',
21
21
  name: 'name',
22
22
  type: 'text',
23
23
  options: [],
@@ -27,7 +27,8 @@ export function useWorkflowExecutionsFilterGroups(facets: WorkflowExecutionsFace
27
27
  const statusFilterGroup = VStringFacet({
28
28
  search: null as any, // This will be provided by the search context
29
29
  buckets: facets.status || [],
30
- name: 'Status'
30
+ name: 'status',
31
+ placeholder: 'Status'
31
32
  });
32
33
  customFilterGroups.push(statusFilterGroup);
33
34
  }
@@ -35,7 +36,8 @@ export function useWorkflowExecutionsFilterGroups(facets: WorkflowExecutionsFace
35
36
  if (facets.initiated_by) {
36
37
  const initiatedByFilterGroup = VUserFacet({
37
38
  buckets: facets.initiated_by || [],
38
- name: 'User'
39
+ name: 'initiated_by',
40
+ placeholder: 'Initiated By'
39
41
  });
40
42
  customFilterGroups.push(initiatedByFilterGroup);
41
43
  }
@@ -76,14 +78,14 @@ export function useWorkflowExecutionsFilterHandler(search: SearchInterface) {
76
78
  if (filter.type === 'stringList') {
77
79
  filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);
78
80
  } else if (filter.multiple) {
79
- filterValue = Array.isArray(filter.value)
81
+ filterValue = Array.isArray(filter.value)
80
82
  ? filter.value.map((v: any) => typeof v === 'object' && v.value ? v.value : v)
81
83
  : [typeof filter.value === 'object' && (filter.value as any).value ? (filter.value as any).value : filter.value];
82
84
  } else {
83
85
  // Single value - don't wrap in array
84
86
  filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'
85
87
  ? (filter.value[0] as any).value
86
- : Array.isArray(filter.value) && filter.value[0]
88
+ : Array.isArray(filter.value) && filter.value[0]
87
89
  ? filter.value[0]
88
90
  : filter.value;
89
91
  }
@@ -1,14 +1,16 @@
1
- export { EnvironmentFacet } from "./EnvironmentFacet";
2
- export * from "./FacetsNav";
3
- export { StringFacet } from "./StringFacet";
4
- export { StringListFacet } from "./StringListFacet";
5
- export { TypeFacet } from "./TypeFacet";
1
+ export * from "./utils/SearchInterface";
6
2
 
7
- export * from "./VFacetsNav";
8
- export { VStringFacet } from "./VStringFacet";
9
- export { VTypeFacet } from "./VTypeFacet";
10
- export { VUserFacet } from "./VUserFacet";
3
+ export { StringFacet } from "./utils/StringFacet";
4
+ export { StringListFacet } from "./utils/StringListFacet";
5
+ export { TypeFacet } from "./utils/TypeFacet";
6
+ export { VStringFacet } from "./utils/VStringFacet";
7
+ export { VTypeFacet } from "./utils/VTypeFacet";
8
+ export { VUserFacet } from "./utils/VUserFacet";
11
9
 
10
+ export { EnvironmentFacet } from "./EnvironmentFacet";
12
11
  export { RunsFacetsNav, useRunsFilterGroups, useRunsFilterHandler } from "./RunsFacetsNav";
13
12
  export { WorkflowExecutionsFacetsNav, useWorkflowExecutionsFilterGroups, useWorkflowExecutionsFilterHandler } from "./WorkflowExecutionsFacetsNav";
14
13
  export { DocumentsFacetsNav, useDocumentFilterGroups, useDocumentFilterHandler } from "./DocumentsFacetsNav";
14
+ export { InteractionsFacetsNav, useInteractionsFilterGroups, useInteractionsFilterHandler } from "./InteractionsFacetsNav";
15
+ export { PromptsFacetsNav, usePromptsFilterGroups, usePromptsFilterHandler } from "./PromptsFacetsNav";
16
+ export { CollectionsFacetsNav, useCollectionsFilterGroups, useCollectionsFilterHandler } from "./CollectionsFacetsNav";
@@ -0,0 +1,8 @@
1
+ export interface SearchInterface {
2
+ getFilterValue(name: string): any;
3
+ setFilterValue(name: string, value: any): void;
4
+ clearFilters(autoSearch?: boolean, applyDefaults?: boolean): void;
5
+ search(): Promise<boolean | undefined>;
6
+ readonly isRunning: boolean;
7
+ query: Record<string, any>;
8
+ }
@@ -33,10 +33,13 @@ export function VTypeFacet({ buckets, typeRegistry, type = 'select', multiple =
33
33
  });
34
34
 
35
35
  const options = buckets.map((bucket) => {
36
- const typeId = bucket._id || "Document";
36
+ const actualId = bucket._id;
37
+ const displayKey = actualId || "Document";
38
+ const typeData = typeDataMap.get(displayKey);
39
+
37
40
  return {
38
- value: typeId,
39
- label: `(${bucket.count})`
41
+ value: actualId,
42
+ label: typeData ? `${typeData.name} (${typeData.count})` : `Unknown (${bucket.count})`
40
43
  };
41
44
  });
42
45
 
@@ -1,6 +1,6 @@
1
1
  import { FacetBucket } from '@vertesia/common';
2
2
  import { FilterGroup } from '@vertesia/ui/core';
3
- import { UserInfo } from '../user/UserInfo';
3
+ import { UserInfo } from '../../user/UserInfo';
4
4
 
5
5
  interface UserFacetProps {
6
6
  buckets: FacetBucket[];
@@ -42,7 +42,19 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
42
42
  }, [collection.table_layout]);
43
43
 
44
44
  const onSubmit = () => {
45
- const query = metadata.query ? JSON.parse(metadata.query) : undefined;
45
+ let query: any = undefined;
46
+ try {
47
+ query = metadata.query ? JSON.parse(metadata.query) : undefined;
48
+ } catch (err: any) {
49
+ toast({
50
+ title: "Invalid Query JSON",
51
+ description: err.message,
52
+ status: "error",
53
+ duration: 5000,
54
+ });
55
+ return;
56
+ }
57
+
46
58
  const payload: Partial<CreateCollectionPayload> = {
47
59
  name: metadata.name,
48
60
  description: metadata.description,
@@ -65,6 +77,7 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
65
77
  status: "error",
66
78
  duration: 5000,
67
79
  });
80
+ return;
68
81
  }
69
82
  if (tableLayoutRef.current) {
70
83
  const layout = tableLayoutRef.current.getValue();