@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.
- package/lib/esm/core/components/SelectList.js +18 -13
- package/lib/esm/core/components/SelectList.js.map +1 -1
- package/lib/esm/core/components/SidePanel.js +1 -1
- package/lib/esm/core/components/SidePanel.js.map +1 -1
- package/lib/esm/core/components/shadcn/filters/filterBar.js +39 -12
- package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
- package/lib/esm/core/components/shadcn/index.js +1 -0
- package/lib/esm/core/components/shadcn/index.js.map +1 -1
- package/lib/esm/core/components/shadcn/resizeable.js +15 -0
- package/lib/esm/core/components/shadcn/resizeable.js.map +1 -0
- package/lib/esm/core/components/shadcn/tabs.js +11 -6
- package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
- package/lib/esm/core/components/table/index.js +1 -1
- package/lib/esm/core/components/table/index.js.map +1 -1
- package/lib/esm/features/facets/CollectionsFacetsNav.js +66 -0
- package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/DocumentsFacetsNav.js +19 -7
- package/lib/esm/features/facets/DocumentsFacetsNav.js.map +1 -1
- package/lib/esm/features/facets/EnvironmentFacet.js +1 -1
- package/lib/esm/features/facets/EnvironmentFacet.js.map +1 -1
- package/lib/esm/features/facets/InteractionsFacetsNav.js +82 -0
- package/lib/esm/features/facets/InteractionsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/PromptsFacetsNav.js +80 -0
- package/lib/esm/features/facets/PromptsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/RunsFacetsNav.js +28 -6
- package/lib/esm/features/facets/RunsFacetsNav.js.map +1 -1
- package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js +7 -5
- package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
- package/lib/esm/features/facets/index.js +10 -8
- package/lib/esm/features/facets/index.js.map +1 -1
- package/lib/esm/features/facets/utils/SearchInterface.js +2 -0
- package/lib/esm/features/facets/utils/SearchInterface.js.map +1 -0
- package/lib/esm/features/facets/utils/StringFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/StringListFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/TypeFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VEnvironmentFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VInteractionFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VStringFacet.js.map +1 -0
- package/lib/esm/features/facets/{VTypeFacet.js → utils/VTypeFacet.js} +5 -3
- package/lib/esm/features/facets/utils/VTypeFacet.js.map +1 -0
- package/lib/esm/features/facets/{VUserFacet.js → utils/VUserFacet.js} +1 -1
- package/lib/esm/features/facets/utils/VUserFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/utils.js.map +1 -0
- package/lib/esm/features/store/collections/EditCollectionView.js +14 -1
- package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
- package/lib/esm/features/store/collections/SelectCollection.js +47 -18
- package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
- package/lib/esm/features/store/objects/DocumentSearchResults.js +9 -5
- package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
- package/lib/esm/features/store/objects/components/ContentOverview.js +172 -78
- package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/esm/features/store/objects/components/DocumentIcon.js +6 -0
- package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -1
- package/lib/esm/features/store/objects/layout/documentLayout.js +3 -4
- package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -1
- package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +2 -2
- package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -1
- package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +1 -1
- package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
- package/lib/esm/features/store/types/ObjectSchemaEditor.js +1 -1
- package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -1
- package/lib/esm/features/user/UserInfo.js +33 -1
- package/lib/esm/features/user/UserInfo.js.map +1 -1
- package/lib/esm/shell/login/UserInfo.js +1 -1
- package/lib/esm/shell/login/UserInfo.js.map +1 -1
- package/lib/esm/widgets/schema-editor/index.js +0 -1
- package/lib/esm/widgets/schema-editor/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types/core/components/SelectList.d.ts +2 -1
- package/lib/types/core/components/SelectList.d.ts.map +1 -1
- package/lib/types/core/components/SidePanel.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/index.d.ts +1 -0
- package/lib/types/core/components/shadcn/index.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/resizeable.d.ts +9 -0
- package/lib/types/core/components/shadcn/resizeable.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/tabs.d.ts +2 -1
- package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
- package/lib/types/features/facets/CollectionsFacetsNav.d.ts +14 -0
- package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/DocumentsFacetsNav.d.ts +1 -1
- package/lib/types/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
- package/lib/types/features/facets/InteractionsFacetsNav.d.ts +13 -0
- package/lib/types/features/facets/InteractionsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/PromptsFacetsNav.d.ts +15 -0
- package/lib/types/features/facets/PromptsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/RunsFacetsNav.d.ts +1 -1
- package/lib/types/features/facets/RunsFacetsNav.d.ts.map +1 -1
- package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts +1 -1
- package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
- package/lib/types/features/facets/index.d.ts +10 -8
- package/lib/types/features/facets/index.d.ts.map +1 -1
- package/lib/types/features/facets/{VFacetsNav.d.ts → utils/SearchInterface.d.ts} +1 -8
- package/lib/types/features/facets/utils/SearchInterface.d.ts.map +1 -0
- package/lib/types/features/facets/utils/StringFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/StringListFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/TypeFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VEnvironmentFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VInteractionFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VStringFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VTypeFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VUserFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/utils.d.ts.map +1 -0
- package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
- package/lib/types/features/store/collections/SelectCollection.d.ts +10 -8
- package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
- package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
- package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
- package/lib/types/features/store/objects/components/DocumentIcon.d.ts +4 -0
- package/lib/types/features/store/objects/components/DocumentIcon.d.ts.map +1 -1
- package/lib/types/features/store/objects/layout/documentLayout.d.ts.map +1 -1
- package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +1 -3
- package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
- package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
- package/lib/types/features/user/UserInfo.d.ts +12 -1
- package/lib/types/features/user/UserInfo.d.ts.map +1 -1
- package/lib/types/widgets/schema-editor/index.d.ts +0 -1
- package/lib/types/widgets/schema-editor/index.d.ts.map +1 -1
- package/lib/vertesia-ui-core.js +1 -1
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-features.js +1 -1
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-shell.js +1 -1
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +1 -1
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/package.json +5 -4
- package/src/core/components/SelectList.tsx +11 -1
- package/src/core/components/SidePanel.tsx +13 -10
- package/src/core/components/shadcn/filters/filterBar.tsx +46 -20
- package/src/core/components/shadcn/index.ts +1 -0
- package/src/core/components/shadcn/resizeable.tsx +54 -0
- package/src/core/components/shadcn/tabs.tsx +16 -6
- package/src/core/components/table/index.tsx +1 -1
- package/src/features/facets/CollectionsFacetsNav.tsx +94 -0
- package/src/features/facets/DocumentsFacetsNav.tsx +22 -11
- package/src/features/facets/EnvironmentFacet.tsx +1 -1
- package/src/features/facets/InteractionsFacetsNav.tsx +111 -0
- package/src/features/facets/PromptsFacetsNav.tsx +110 -0
- package/src/features/facets/RunsFacetsNav.tsx +40 -9
- package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +10 -8
- package/src/features/facets/index.ts +11 -9
- package/src/features/facets/utils/SearchInterface.tsx +8 -0
- package/src/features/facets/{VTypeFacet.tsx → utils/VTypeFacet.tsx} +6 -3
- package/src/features/facets/{VUserFacet.tsx → utils/VUserFacet.tsx} +1 -1
- package/src/features/store/collections/EditCollectionView.tsx +14 -1
- package/src/features/store/collections/SelectCollection.tsx +160 -31
- package/src/features/store/objects/DocumentSearchResults.tsx +42 -37
- package/src/features/store/objects/components/ContentOverview.tsx +432 -261
- package/src/features/store/objects/components/DocumentIcon.tsx +31 -1
- package/src/features/store/objects/layout/documentLayout.tsx +3 -7
- package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +15 -8
- package/src/features/store/objects/upload/DocumentUploadModal.tsx +5 -6
- package/src/features/store/types/ObjectSchemaEditor.tsx +1 -1
- package/src/features/user/UserInfo.tsx +66 -3
- package/src/shell/login/UserInfo.tsx +1 -1
- package/src/widgets/schema-editor/index.ts +0 -1
- package/lib/esm/features/facets/FacetsNav.js +0 -8
- package/lib/esm/features/facets/FacetsNav.js.map +0 -1
- package/lib/esm/features/facets/StringFacet.js.map +0 -1
- package/lib/esm/features/facets/StringListFacet.js.map +0 -1
- package/lib/esm/features/facets/TypeFacet.js.map +0 -1
- package/lib/esm/features/facets/VEnvironmentFacet.js.map +0 -1
- package/lib/esm/features/facets/VFacetsNav.js +0 -48
- package/lib/esm/features/facets/VFacetsNav.js.map +0 -1
- package/lib/esm/features/facets/VInteractionFacet.js.map +0 -1
- package/lib/esm/features/facets/VStringFacet.js.map +0 -1
- package/lib/esm/features/facets/VTypeFacet.js.map +0 -1
- package/lib/esm/features/facets/VUserFacet.js.map +0 -1
- package/lib/esm/features/facets/utils.js.map +0 -1
- package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js +0 -49
- package/lib/esm/widgets/schema-editor/JSONSchemaEditorModal.js.map +0 -1
- package/lib/types/features/facets/FacetsNav.d.ts +0 -7
- package/lib/types/features/facets/FacetsNav.d.ts.map +0 -1
- package/lib/types/features/facets/StringFacet.d.ts.map +0 -1
- package/lib/types/features/facets/StringListFacet.d.ts.map +0 -1
- package/lib/types/features/facets/TypeFacet.d.ts.map +0 -1
- package/lib/types/features/facets/VEnvironmentFacet.d.ts.map +0 -1
- package/lib/types/features/facets/VFacetsNav.d.ts.map +0 -1
- package/lib/types/features/facets/VInteractionFacet.d.ts.map +0 -1
- package/lib/types/features/facets/VStringFacet.d.ts.map +0 -1
- package/lib/types/features/facets/VTypeFacet.d.ts.map +0 -1
- package/lib/types/features/facets/VUserFacet.d.ts.map +0 -1
- package/lib/types/features/facets/utils.d.ts.map +0 -1
- package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts +0 -10
- package/lib/types/widgets/schema-editor/JSONSchemaEditorModal.d.ts.map +0 -1
- package/src/features/facets/FacetsNav.tsx +0 -19
- package/src/features/facets/VFacetsNav.tsx +0 -81
- package/src/widgets/schema-editor/JSONSchemaEditorModal.tsx +0 -67
- /package/lib/esm/features/facets/{StringFacet.js → utils/StringFacet.js} +0 -0
- /package/lib/esm/features/facets/{StringListFacet.js → utils/StringListFacet.js} +0 -0
- /package/lib/esm/features/facets/{TypeFacet.js → utils/TypeFacet.js} +0 -0
- /package/lib/esm/features/facets/{VEnvironmentFacet.js → utils/VEnvironmentFacet.js} +0 -0
- /package/lib/esm/features/facets/{VInteractionFacet.js → utils/VInteractionFacet.js} +0 -0
- /package/lib/esm/features/facets/{VStringFacet.js → utils/VStringFacet.js} +0 -0
- /package/lib/esm/features/facets/{utils.js → utils/utils.js} +0 -0
- /package/lib/types/features/facets/{StringFacet.d.ts → utils/StringFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{StringListFacet.d.ts → utils/StringListFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{TypeFacet.d.ts → utils/TypeFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{VEnvironmentFacet.d.ts → utils/VEnvironmentFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{VInteractionFacet.d.ts → utils/VInteractionFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{VStringFacet.d.ts → utils/VStringFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{VTypeFacet.d.ts → utils/VTypeFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{VUserFacet.d.ts → utils/VUserFacet.d.ts} +0 -0
- /package/lib/types/features/facets/{utils.d.ts → utils/utils.d.ts} +0 -0
- /package/src/features/facets/{StringFacet.tsx → utils/StringFacet.tsx} +0 -0
- /package/src/features/facets/{StringListFacet.tsx → utils/StringListFacet.tsx} +0 -0
- /package/src/features/facets/{TypeFacet.tsx → utils/TypeFacet.tsx} +0 -0
- /package/src/features/facets/{VEnvironmentFacet.tsx → utils/VEnvironmentFacet.tsx} +0 -0
- /package/src/features/facets/{VInteractionFacet.tsx → utils/VInteractionFacet.tsx} +0 -0
- /package/src/features/facets/{VStringFacet.tsx → utils/VStringFacet.tsx} +0 -0
- /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 './
|
|
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=
|
|
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 './
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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
|
|
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
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
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
|
|
36
|
+
const actualId = bucket._id;
|
|
37
|
+
const displayKey = actualId || "Document";
|
|
38
|
+
const typeData = typeDataMap.get(displayKey);
|
|
39
|
+
|
|
37
40
|
return {
|
|
38
|
-
value:
|
|
39
|
-
label: `(${bucket.count})`
|
|
41
|
+
value: actualId,
|
|
42
|
+
label: typeData ? `${typeData.name} (${typeData.count})` : `Unknown (${bucket.count})`
|
|
40
43
|
};
|
|
41
44
|
});
|
|
42
45
|
|
|
@@ -42,7 +42,19 @@ export function EditCollectionView({ refetch, collection }: EditCollectionViewPr
|
|
|
42
42
|
}, [collection.table_layout]);
|
|
43
43
|
|
|
44
44
|
const onSubmit = () => {
|
|
45
|
-
|
|
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();
|