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