@vertesia/ui 0.78.0 → 0.79.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/SelectList.js +18 -13
- package/lib/esm/core/components/SelectList.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 +41 -14
- package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
- package/lib/esm/core/components/shadcn/index.js +2 -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 +15 -0
- package/lib/esm/core/components/shadcn/resizeable.js.map +1 -0
- 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 +20 -8
- 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/components/table/index.js +1 -1
- package/lib/esm/core/components/table/index.js.map +1 -1
- 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 +85 -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 +88 -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} +9 -4
- 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/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 +43 -31
- package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
- package/lib/esm/features/store/collections/SelectCollection.js +46 -16
- package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
- package/lib/esm/features/store/objects/DocumentSearchResults.js +43 -13
- 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 +225 -87
- package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/esm/features/store/objects/components/DocumentIcon.js +11 -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 +7 -8
- 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 +12 -4
- 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 +16 -8
- 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/store/types/ObjectSchemaEditor.js +1 -1
- package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -1
- package/lib/esm/features/user/UserInfo.js +35 -1
- 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/shell/login/UserInfo.js +1 -1
- package/lib/esm/shell/login/UserInfo.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/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/Panel.d.ts +11 -0
- package/lib/types/core/components/Panel.d.ts.map +1 -0
- 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/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 +2 -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/resizeable.d.ts +9 -0
- package/lib/types/core/components/shadcn/resizeable.d.ts.map +1 -0
- 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 +2 -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 +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 +14 -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/utils/SearchInterface.d.ts +14 -0
- 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/{VTypeFacet.d.ts → utils/VTypeFacet.d.ts} +2 -1
- 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/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 +12 -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/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 +7 -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 +2 -3
- 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 +12 -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/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-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 +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 -165
- package/src/core/components/Panel.tsx +34 -0
- package/src/core/components/SelectList.tsx +11 -1
- package/src/core/components/SidePanel.tsx +18 -13
- 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 +49 -23
- package/src/core/components/shadcn/index.ts +2 -0
- package/src/core/components/shadcn/input.tsx +10 -7
- package/src/core/components/shadcn/resizeable.tsx +54 -0
- package/src/core/components/shadcn/selectBox.tsx +87 -67
- package/src/core/components/shadcn/tabs.tsx +25 -8
- package/src/core/components/shadcn/textarea.tsx +21 -0
- package/src/core/components/table/index.tsx +1 -1
- 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 +115 -0
- package/src/features/facets/DocumentsFacetsNav.tsx +22 -11
- package/src/features/facets/EnvironmentFacet.tsx +1 -1
- package/src/features/facets/InteractionsFacetsNav.tsx +121 -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 +12 -0
- package/src/features/facets/{VTypeFacet.tsx → utils/VTypeFacet.tsx} +12 -5
- package/src/features/facets/{VUserFacet.tsx → utils/VUserFacet.tsx} +1 -1
- 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 +104 -85
- package/src/features/store/collections/SelectCollection.tsx +214 -29
- package/src/features/store/objects/DocumentSearchResults.tsx +98 -27
- package/src/features/store/objects/DocumentTable.tsx +14 -4
- package/src/features/store/objects/components/ContentOverview.tsx +536 -267
- package/src/features/store/objects/components/DocumentIcon.tsx +42 -13
- 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 +10 -12
- 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 +23 -10
- package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +22 -2
- package/src/features/store/objects/upload/DocumentUploadModal.tsx +23 -15
- package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +10 -7
- package/src/features/store/types/CreateOrUpdateTypeModal.tsx +1 -1
- package/src/features/store/types/ObjectSchemaEditor.tsx +1 -1
- package/src/features/user/UserInfo.tsx +66 -3
- package/src/router/HistoryNavigator.ts +33 -2
- package/src/router/Nav.tsx +4 -3
- package/src/shell/login/UserInfo.tsx +1 -1
- 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/src/widgets/schema-editor/index.ts +0 -1
- package/lib/esm/core/components/Textarea.js +0 -15
- package/lib/esm/core/components/Textarea.js.map +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/core/components/Textarea.d.ts +0 -8
- package/lib/types/core/components/Textarea.d.ts.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 +0 -16
- 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/core/components/Textarea.tsx +0 -25
- 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/{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
|
@@ -29,7 +29,8 @@ interface FilterProviderProps {
|
|
|
29
29
|
const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterProviderProps) => {
|
|
30
30
|
const url = new URL(window.location.href);
|
|
31
31
|
const searchParams = url.searchParams;
|
|
32
|
-
|
|
32
|
+
const [hasInitialized, setHasInitialized] = React.useState(false);
|
|
33
|
+
|
|
33
34
|
useEffect(() => {
|
|
34
35
|
try {
|
|
35
36
|
const params = new URLSearchParams(searchParams.toString());
|
|
@@ -42,16 +43,22 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
|
|
|
42
43
|
// Handle stringList with direct string array - always array format
|
|
43
44
|
values = `[${(filter.value as string[]).map(item => encodeURIComponent(item)).join(',')}]`;
|
|
44
45
|
} else if (Array.isArray(filter.value)) {
|
|
45
|
-
if (filter.multiple
|
|
46
|
-
// Handle multiple
|
|
47
|
-
values = `[${filter.value.map((item: any) => encodeURIComponent(item.value || '')).join(',')}]`;
|
|
46
|
+
if (filter.multiple) {
|
|
47
|
+
// Handle multiple filters - always use array format for multiple=true
|
|
48
|
+
values = `[${filter.value.map((item: any) => encodeURIComponent(item.value || item || '')).join(',')}]`;
|
|
49
|
+
} else if (filter.value.length > 1) {
|
|
50
|
+
// Handle multiple values for non-multiple filters
|
|
51
|
+
values = `[${filter.value.map((item: any) => encodeURIComponent(item.value || item || '')).join(',')}]`;
|
|
48
52
|
} else {
|
|
49
|
-
// Single value in array - don't use array format
|
|
53
|
+
// Single value in array for non-multiple filter - don't use array format
|
|
50
54
|
const firstValue = filter.value[0];
|
|
51
55
|
if (typeof firstValue === 'string') {
|
|
52
56
|
values = encodeURIComponent(firstValue);
|
|
57
|
+
} else if (typeof firstValue === 'object' && firstValue?.value !== undefined) {
|
|
58
|
+
// Handle FilterOption object
|
|
59
|
+
values = encodeURIComponent(String(firstValue.value));
|
|
53
60
|
} else {
|
|
54
|
-
values = encodeURIComponent(firstValue
|
|
61
|
+
values = encodeURIComponent(String(firstValue || ''));
|
|
55
62
|
}
|
|
56
63
|
}
|
|
57
64
|
} else {
|
|
@@ -64,8 +71,8 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
|
|
|
64
71
|
params.delete('filters');
|
|
65
72
|
}
|
|
66
73
|
|
|
67
|
-
const newUrl = `${window.location.pathname}?${params.toString()}`;
|
|
68
|
-
window.history.replaceState({}, '', newUrl);
|
|
74
|
+
const newUrl = `${window.location.pathname}?${params.toString()}${window.location.hash}`;
|
|
75
|
+
window.history.replaceState(window.history.state || {}, '', newUrl);
|
|
69
76
|
} catch (error) {
|
|
70
77
|
console.error("Failed to update URL with filters:", error);
|
|
71
78
|
}
|
|
@@ -73,14 +80,14 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
|
|
|
73
80
|
|
|
74
81
|
useEffect(() => {
|
|
75
82
|
const filtersParam = searchParams.get('filters');
|
|
76
|
-
if (filtersParam) {
|
|
83
|
+
if (filtersParam && filterGroups.length > 0 && !hasInitialized) {
|
|
77
84
|
try {
|
|
78
85
|
// Parse format with array indicators: filterName:value or filterName:[value1,value2]
|
|
79
86
|
const filterPairs = filtersParam.split(';');
|
|
80
87
|
const parsedFilters = filterPairs.map(pair => {
|
|
81
88
|
const [encodedName, valuesString] = pair.split(':');
|
|
82
89
|
const name = decodeURIComponent(encodedName);
|
|
83
|
-
|
|
90
|
+
|
|
84
91
|
let values: string[];
|
|
85
92
|
// Check if it's an array format [value1,value2]
|
|
86
93
|
if (valuesString.startsWith('[') && valuesString.endsWith(']')) {
|
|
@@ -100,8 +107,8 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
|
|
|
100
107
|
filterValue = values;
|
|
101
108
|
} else if (group?.type === 'text') {
|
|
102
109
|
// For text, return FilterOption array (single value for text inputs)
|
|
103
|
-
filterValue = values.length === 1 ? [{ value: values[0], label: values[0] }] :
|
|
104
|
-
|
|
110
|
+
filterValue = values.length === 1 ? [{ value: values[0], label: values[0] }] :
|
|
111
|
+
values.map(value => ({ value, label: value }));
|
|
105
112
|
} else {
|
|
106
113
|
// For other types, find options with labels
|
|
107
114
|
filterValue = values.map(value => {
|
|
@@ -123,21 +130,40 @@ const FilterProvider = ({ filters, setFilters, filterGroups, children }: FilterP
|
|
|
123
130
|
});
|
|
124
131
|
}
|
|
125
132
|
|
|
126
|
-
|
|
133
|
+
if (group?.multiple && !valuesString.startsWith('[') && !valuesString.endsWith(']')) {
|
|
134
|
+
if (group.type === 'stringList') {
|
|
135
|
+
filterValue = values;
|
|
136
|
+
} else {
|
|
137
|
+
if (!Array.isArray(filterValue)) {
|
|
138
|
+
filterValue = [filterValue];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Fallback: if group not found but we detected array format, assume it should be multiple
|
|
144
|
+
const shouldBeMultiple = group?.multiple || (!group && valuesString.startsWith('[') && valuesString.endsWith(']'));
|
|
145
|
+
|
|
146
|
+
const filter = {
|
|
127
147
|
name,
|
|
128
148
|
type: group?.type || 'select',
|
|
129
149
|
placeholder: group?.placeholder,
|
|
130
150
|
value: filterValue,
|
|
131
|
-
multiple:
|
|
151
|
+
multiple: shouldBeMultiple
|
|
132
152
|
};
|
|
153
|
+
|
|
154
|
+
return filter;
|
|
133
155
|
});
|
|
134
156
|
|
|
135
157
|
setFilters(parsedFilters);
|
|
158
|
+
setHasInitialized(true);
|
|
136
159
|
} catch (error) {
|
|
137
|
-
|
|
160
|
+
setHasInitialized(true);
|
|
138
161
|
}
|
|
162
|
+
} else if (filterGroups.length > 0 && !hasInitialized) {
|
|
163
|
+
// No URL params but we have groups - mark as initialized
|
|
164
|
+
setHasInitialized(true);
|
|
139
165
|
}
|
|
140
|
-
}, []);
|
|
166
|
+
}, [filterGroups, hasInitialized]);
|
|
141
167
|
|
|
142
168
|
return (
|
|
143
169
|
<FilterContext.Provider value={{ filters, setFilters, filterGroups }}>
|
|
@@ -287,7 +313,7 @@ const FilterBtn = ({ className }: { className?: string }) => {
|
|
|
287
313
|
{"Filter"}
|
|
288
314
|
</Button>
|
|
289
315
|
</PopoverTrigger>
|
|
290
|
-
<PopoverContent className="w-[300px] p-0" align="start">
|
|
316
|
+
<PopoverContent className="w-[300px] p-0" align="start" sideOffset={4}>
|
|
291
317
|
<Command>
|
|
292
318
|
{
|
|
293
319
|
filterGroups.find(group => group.name === selectedView)?.type === "select" && (
|
|
@@ -303,7 +329,7 @@ const FilterBtn = ({ className }: { className?: string }) => {
|
|
|
303
329
|
/>
|
|
304
330
|
)
|
|
305
331
|
}
|
|
306
|
-
<CommandList
|
|
332
|
+
<CommandList>
|
|
307
333
|
<CommandGroup>
|
|
308
334
|
{!selectedView ? getAvailableFilterGroups() : renderFilterOptions()}
|
|
309
335
|
</CommandGroup>
|
|
@@ -316,7 +342,7 @@ const FilterBtn = ({ className }: { className?: string }) => {
|
|
|
316
342
|
|
|
317
343
|
const FilterBar = ({ className }: { className?: string }) => {
|
|
318
344
|
const { filters, setFilters, filterGroups } = React.useContext(FilterContext);
|
|
319
|
-
|
|
345
|
+
|
|
320
346
|
return (
|
|
321
347
|
<div className={cn(className)}>
|
|
322
348
|
<Filters filters={filters} setFilters={setFilters} filterGroups={filterGroups} />
|
|
@@ -324,15 +350,15 @@ const FilterBar = ({ className }: { className?: string }) => {
|
|
|
324
350
|
);
|
|
325
351
|
};
|
|
326
352
|
|
|
327
|
-
const FilterClear = ({ className }: { className?: string
|
|
353
|
+
const FilterClear = ({ className }: { className?: string}) => {
|
|
328
354
|
const { filters, setFilters } = React.useContext(FilterContext);
|
|
329
|
-
|
|
355
|
+
|
|
330
356
|
const hasActiveFilters = filters.filter((filter) => filter.value?.length > 0).length > 0;
|
|
331
|
-
|
|
357
|
+
|
|
332
358
|
if (!hasActiveFilters) {
|
|
333
359
|
return null;
|
|
334
360
|
}
|
|
335
|
-
|
|
361
|
+
|
|
336
362
|
return (
|
|
337
363
|
<Button
|
|
338
364
|
variant="outline"
|
|
@@ -4,6 +4,7 @@ import { cva, type VariantProps } from "class-variance-authority"
|
|
|
4
4
|
import { cn } from "../libs/utils"
|
|
5
5
|
import { X } from "lucide-react";
|
|
6
6
|
import { ChangeEvent } from "react";
|
|
7
|
+
import { Button } from "@vertesia/ui/core";
|
|
7
8
|
|
|
8
9
|
const variants = cva(
|
|
9
10
|
"",
|
|
@@ -53,14 +54,14 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
|
53
54
|
};
|
|
54
55
|
|
|
55
56
|
return (
|
|
56
|
-
<div className="w-full
|
|
57
|
+
<div className="w-full relative inline-block [&:hover_.clear-button]:opacity-100">
|
|
57
58
|
<input
|
|
58
59
|
type={type}
|
|
59
60
|
className={
|
|
60
61
|
cn(
|
|
61
62
|
variants({ size, variant }),
|
|
62
63
|
className,
|
|
63
|
-
clearable && value ? "pr-
|
|
64
|
+
clearable && value ? "pr-8" : "",
|
|
64
65
|
)}
|
|
65
66
|
ref={ref}
|
|
66
67
|
value={value == null ? '' : value}
|
|
@@ -68,14 +69,16 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
|
68
69
|
{...props}
|
|
69
70
|
/>
|
|
70
71
|
{clearable && value && !props.readOnly && !props.disabled && (
|
|
71
|
-
<
|
|
72
|
-
onClick={_onClear}
|
|
73
|
-
className={`absolute ${type !== 'number' ? 'right-0' : 'right-7'} top-1/2 -translate-y-1/2 size-7 text-muted-foreground hover:text-destructive cursor-pointer flex items-center justify-center`}
|
|
72
|
+
<Button variant={"link"} size={"icon"}
|
|
74
73
|
type="button"
|
|
75
|
-
|
|
74
|
+
onClick={_onClear}
|
|
75
|
+
className={`clear-button opacity-0 transition-opacity duration-200
|
|
76
|
+
absolute top-1/2 -translate-y-1/2 text-muted !hover:text-destructive cursor-pointer
|
|
77
|
+
flex items-center justify-center size-6 rounded right-2`}
|
|
78
|
+
alt="Clear input"
|
|
76
79
|
>
|
|
77
80
|
<X size={16} />
|
|
78
|
-
</
|
|
81
|
+
</Button>
|
|
79
82
|
)}
|
|
80
83
|
</div>
|
|
81
84
|
)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { Minus } from "lucide-react"
|
|
3
|
+
import * as ResizablePrimitive from "react-resizable-panels"
|
|
4
|
+
|
|
5
|
+
import { cn } from "../libs/utils"
|
|
6
|
+
|
|
7
|
+
function ResizablePanelGroup({
|
|
8
|
+
className,
|
|
9
|
+
...props
|
|
10
|
+
}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) {
|
|
11
|
+
return (
|
|
12
|
+
<ResizablePrimitive.PanelGroup
|
|
13
|
+
data-slot="resizable-panel-group"
|
|
14
|
+
className={cn(
|
|
15
|
+
"flex h-full w-full data-[panel-group-direction=vertical]:flex-col",
|
|
16
|
+
className
|
|
17
|
+
)}
|
|
18
|
+
{...props}
|
|
19
|
+
/>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function ResizablePanel({
|
|
24
|
+
...props
|
|
25
|
+
}: React.ComponentProps<typeof ResizablePrimitive.Panel>) {
|
|
26
|
+
return <ResizablePrimitive.Panel data-slot="resizable-panel" {...props} />
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function ResizableHandle({
|
|
30
|
+
withHandle,
|
|
31
|
+
className,
|
|
32
|
+
...props
|
|
33
|
+
}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
|
|
34
|
+
withHandle?: boolean
|
|
35
|
+
}) {
|
|
36
|
+
return (
|
|
37
|
+
<ResizablePrimitive.PanelResizeHandle
|
|
38
|
+
data-slot="resizable-handle"
|
|
39
|
+
className={cn(
|
|
40
|
+
"bg-muted focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:translate-x-0 data-[panel-group-direction=vertical]:after:-translate-y-1/2 [&[data-panel-group-direction=vertical]>div]:rotate-90",
|
|
41
|
+
className
|
|
42
|
+
)}
|
|
43
|
+
{...props}
|
|
44
|
+
>
|
|
45
|
+
{withHandle && (
|
|
46
|
+
<div className="z-10 flex size-4 items-center justify-center rounded-xs font-semibold">
|
|
47
|
+
<Minus className="size-4 rotate-90" />
|
|
48
|
+
</div>
|
|
49
|
+
)}
|
|
50
|
+
</ResizablePrimitive.PanelResizeHandle>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { ResizablePanelGroup, ResizablePanel, ResizableHandle }
|
|
@@ -6,8 +6,9 @@ import { useState, useEffect, useRef } from 'react';
|
|
|
6
6
|
import { Popover, PopoverContent, PopoverTrigger, PopoverClose } from './popover';
|
|
7
7
|
import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList } from './command';
|
|
8
8
|
import { Input } from './input';
|
|
9
|
+
import { Button } from '@vertesia/ui/core';
|
|
9
10
|
|
|
10
|
-
interface VSelectBoxBaseProps<T> {
|
|
11
|
+
export interface VSelectBoxBaseProps<T> {
|
|
11
12
|
options: T[] | undefined;
|
|
12
13
|
optionLabel?: (option: T) => React.ReactNode;
|
|
13
14
|
onBlur?: () => void;
|
|
@@ -23,6 +24,7 @@ interface VSelectBoxBaseProps<T> {
|
|
|
23
24
|
popupClass?: string;
|
|
24
25
|
isClearable?: boolean;
|
|
25
26
|
border?: boolean;
|
|
27
|
+
inline?: boolean;
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
interface VSelectBoxSingleProps<T> extends VSelectBoxBaseProps<T> {
|
|
@@ -39,7 +41,7 @@ interface VSelectBoxMultipleProps<T> extends VSelectBoxBaseProps<T> {
|
|
|
39
41
|
|
|
40
42
|
type VSelectBoxProps<T> = VSelectBoxSingleProps<T> | VSelectBoxMultipleProps<T>;
|
|
41
43
|
|
|
42
|
-
export function VSelectBox<T = any>({ options, optionLabel, value, onChange, addNew, addNewLabel, disabled, filterBy, label, placeholder, className, popupClass, isClearable, border = true, multiple = false, by }: Readonly<VSelectBoxProps<T>>) {
|
|
44
|
+
export function VSelectBox<T = any>({ options, optionLabel, value, onChange, addNew, addNewLabel, disabled, filterBy, label, placeholder, className, popupClass, isClearable, border = true, multiple = false, by, inline = false }: Readonly<VSelectBoxProps<T>>) {
|
|
43
45
|
const triggerRef = useRef<HTMLDivElement>(null);
|
|
44
46
|
const [open, setOpen] = useState(false);
|
|
45
47
|
const [width, setWidth] = useState<number>(0);
|
|
@@ -169,6 +171,82 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
|
|
|
169
171
|
);
|
|
170
172
|
};
|
|
171
173
|
|
|
174
|
+
// Render the options list content
|
|
175
|
+
const renderOptionsContent = () => (
|
|
176
|
+
<>
|
|
177
|
+
{filterBy && (
|
|
178
|
+
<div className='flex justify-start items-center mb-1'>
|
|
179
|
+
<div className='mx-2'>
|
|
180
|
+
<SearchIcon className="size-4" />
|
|
181
|
+
</div>
|
|
182
|
+
<Input variant='unstyled' value={filterValue} onChange={setFilterValue} className="w-full p-1 rounded-md" placeholder="Search..." />
|
|
183
|
+
</div>
|
|
184
|
+
)}
|
|
185
|
+
<Command className="overflow-hidden">
|
|
186
|
+
<CommandList className={inline ? "max-h-full overflow-y-auto" : "max-h-[200px] overflow-y-auto"}>
|
|
187
|
+
<CommandEmpty>No result found.</CommandEmpty>
|
|
188
|
+
<CommandGroup className="overflow-visible">
|
|
189
|
+
{filteredOptions?.map((opt, index) => {
|
|
190
|
+
const isSelected = multiple
|
|
191
|
+
? isOptionSelected(opt, Array.isArray(value) ? value : [])
|
|
192
|
+
: value != null ? isOptionsEqual(value as T, opt) : false;
|
|
193
|
+
|
|
194
|
+
return (
|
|
195
|
+
<CommandItem
|
|
196
|
+
key={index}
|
|
197
|
+
onSelect={() => _onClick(opt)}
|
|
198
|
+
className="w-full"
|
|
199
|
+
>
|
|
200
|
+
{multiple || inline ? (
|
|
201
|
+
<div className='w-full flex justify-between items-center cursor-pointer'>
|
|
202
|
+
<div className='w-full truncate text-left'>
|
|
203
|
+
{optionLabel ? optionLabel(opt) : opt as String}
|
|
204
|
+
</div>
|
|
205
|
+
{isSelected && <Check className="size-4" />}
|
|
206
|
+
</div>
|
|
207
|
+
) : (
|
|
208
|
+
<PopoverClose className='w-full flex justify-between items-center'>
|
|
209
|
+
<div className='w-full truncate text-left'>
|
|
210
|
+
{optionLabel ? optionLabel(opt) : opt as String}
|
|
211
|
+
</div>
|
|
212
|
+
{isSelected && <Check className="size-4" />}
|
|
213
|
+
</PopoverClose>
|
|
214
|
+
)}
|
|
215
|
+
</CommandItem>
|
|
216
|
+
);
|
|
217
|
+
})}
|
|
218
|
+
</CommandGroup>
|
|
219
|
+
</CommandList>
|
|
220
|
+
</Command>
|
|
221
|
+
{addNew && (
|
|
222
|
+
<div className='p-1'>
|
|
223
|
+
<a
|
|
224
|
+
onClick={addNew}
|
|
225
|
+
className={clsx(
|
|
226
|
+
'gap-x-2 px-2 py-1.5 truncate group flex rounded-md items-center text-sm cursor-pointer hover:bg-accent',
|
|
227
|
+
)}
|
|
228
|
+
>
|
|
229
|
+
<SquarePlus size={16} strokeWidth={1.25} absoluteStrokeWidth />
|
|
230
|
+
{addNewLabel}
|
|
231
|
+
</a>
|
|
232
|
+
</div>
|
|
233
|
+
)}
|
|
234
|
+
</>
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
if (inline) {
|
|
238
|
+
return (
|
|
239
|
+
<div className={clsx(
|
|
240
|
+
className,
|
|
241
|
+
border && 'border border-border rounded-md',
|
|
242
|
+
"bg-popover p-1",
|
|
243
|
+
popupClass
|
|
244
|
+
)}>
|
|
245
|
+
{renderOptionsContent()}
|
|
246
|
+
</div>
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
172
250
|
return (
|
|
173
251
|
<Popover>
|
|
174
252
|
<PopoverTrigger asChild>
|
|
@@ -178,7 +256,7 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
|
|
|
178
256
|
className={clsx(
|
|
179
257
|
className,
|
|
180
258
|
border && 'border border-border',
|
|
181
|
-
'flex flex-row gap-2 items-center justify-between p-2 rounded-md group relative',
|
|
259
|
+
'flex flex-row gap-2 items-center justify-between p-2 rounded-md group relative [&:hover_.clear-button]:opacity-100',
|
|
182
260
|
!disabled ? "cursor-pointer hover:bg-muted" : "cursor-not-allowed text-muted",
|
|
183
261
|
)}
|
|
184
262
|
>
|
|
@@ -194,9 +272,10 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
|
|
|
194
272
|
{multiple ? renderMultipleValue() : renderSingleValue()}
|
|
195
273
|
</div>
|
|
196
274
|
</div>
|
|
197
|
-
<div className="flex items-center gap-1">
|
|
275
|
+
<div className="flex items-center gap-1 group">
|
|
198
276
|
{isClearable && value && (Array.isArray(value) ? value.length > 0 : true) && (
|
|
199
|
-
<
|
|
277
|
+
<Button variant={"link"} size={"icon"}
|
|
278
|
+
alt="Clear selection"
|
|
200
279
|
onClick={(e) => {
|
|
201
280
|
e.stopPropagation();
|
|
202
281
|
if (multiple) {
|
|
@@ -205,10 +284,10 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
|
|
|
205
284
|
(onChange as (option: T) => void)(undefined as any);
|
|
206
285
|
}
|
|
207
286
|
}}
|
|
208
|
-
className="cursor-pointer hover:bg-muted/20 rounded p-1"
|
|
287
|
+
className="cursor-pointer hover:bg-muted/20 clear-button opacity-0 transition-opacity duration-200 rounded p-1"
|
|
209
288
|
>
|
|
210
289
|
<X className="size-4" />
|
|
211
|
-
</
|
|
290
|
+
</Button>
|
|
212
291
|
)}
|
|
213
292
|
{!disabled && (
|
|
214
293
|
<ChevronsUpDown className="size-4 opacity-50" />
|
|
@@ -225,66 +304,7 @@ export function VSelectBox<T = any>({ options, optionLabel, value, onChange, add
|
|
|
225
304
|
popupClass
|
|
226
305
|
)}
|
|
227
306
|
>
|
|
228
|
-
{
|
|
229
|
-
|
|
230
|
-
<div className='flex justify-start items-center mb-1'>
|
|
231
|
-
<div className='mx-2'>
|
|
232
|
-
<SearchIcon className="size-4" />
|
|
233
|
-
</div>
|
|
234
|
-
<Input variant='unstyled' value={filterValue} onChange={setFilterValue} className="w-full p-1 rounded-md" placeholder="Search..." />
|
|
235
|
-
</div>
|
|
236
|
-
)}
|
|
237
|
-
<Command className="overflow-hidden">
|
|
238
|
-
<CommandList className="max-h-[200px] overflow-y-auto">
|
|
239
|
-
<CommandEmpty>No result found.</CommandEmpty>
|
|
240
|
-
<CommandGroup className="overflow-visible">
|
|
241
|
-
{filteredOptions?.map((opt, index) => {
|
|
242
|
-
const isSelected = multiple
|
|
243
|
-
? isOptionSelected(opt, Array.isArray(value) ? value : [])
|
|
244
|
-
: value != null ? isOptionsEqual(value as T, opt) : false;
|
|
245
|
-
|
|
246
|
-
return (
|
|
247
|
-
<CommandItem
|
|
248
|
-
key={index}
|
|
249
|
-
onSelect={() => _onClick(opt)}
|
|
250
|
-
className="w-full"
|
|
251
|
-
>
|
|
252
|
-
{multiple ? (
|
|
253
|
-
<div className='w-full flex justify-between items-center cursor-pointer'>
|
|
254
|
-
<div className='w-full truncate text-left'>
|
|
255
|
-
{optionLabel ? optionLabel(opt) : opt as String}
|
|
256
|
-
</div>
|
|
257
|
-
{isSelected && <Check className="size-4" />}
|
|
258
|
-
</div>
|
|
259
|
-
) : (
|
|
260
|
-
<PopoverClose className='w-full flex justify-between items-center'>
|
|
261
|
-
<div className='w-full truncate text-left'>
|
|
262
|
-
{optionLabel ? optionLabel(opt) : opt as String}
|
|
263
|
-
</div>
|
|
264
|
-
{isSelected && <Check className="size-4" />}
|
|
265
|
-
</PopoverClose>
|
|
266
|
-
)}
|
|
267
|
-
</CommandItem>
|
|
268
|
-
);
|
|
269
|
-
})}
|
|
270
|
-
</CommandGroup>
|
|
271
|
-
</CommandList>
|
|
272
|
-
</Command>
|
|
273
|
-
{
|
|
274
|
-
addNew && (
|
|
275
|
-
<div className='p-1'>
|
|
276
|
-
<a
|
|
277
|
-
onClick={addNew}
|
|
278
|
-
className={clsx(
|
|
279
|
-
'gap-x-2 px-2 py-1.5 truncate group flex rounded-md items-center text-sm cursor-pointer hover:bg-accent',
|
|
280
|
-
)}
|
|
281
|
-
>
|
|
282
|
-
<SquarePlus size={16} strokeWidth={1.25} absoluteStrokeWidth />
|
|
283
|
-
{addNewLabel}
|
|
284
|
-
</a>
|
|
285
|
-
</div>
|
|
286
|
-
)
|
|
287
|
-
}
|
|
307
|
+
{renderOptionsContent()}
|
|
288
308
|
</PopoverContent>
|
|
289
309
|
</Popover>
|
|
290
310
|
);
|
|
@@ -12,13 +12,15 @@ const TabsContext = React.createContext<{
|
|
|
12
12
|
setTab?: (name: string) => void;
|
|
13
13
|
responsive?: boolean;
|
|
14
14
|
variant?: "tabs" | "pills";
|
|
15
|
+
updateHash?: boolean;
|
|
15
16
|
}>({
|
|
16
17
|
size: undefined,
|
|
17
18
|
tabs: undefined,
|
|
18
19
|
current: undefined,
|
|
19
20
|
setTab: undefined,
|
|
20
21
|
responsive: false,
|
|
21
|
-
variant: "tabs"
|
|
22
|
+
variant: "tabs",
|
|
23
|
+
updateHash: true
|
|
22
24
|
});
|
|
23
25
|
|
|
24
26
|
interface TabsProps {
|
|
@@ -31,6 +33,7 @@ interface TabsProps {
|
|
|
31
33
|
onTabChange?: (tabName: string) => void;
|
|
32
34
|
responsive?: boolean;
|
|
33
35
|
variant?: "tabs" | "pills";
|
|
36
|
+
updateHash?: boolean;
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
const VTabs = ({
|
|
@@ -42,7 +45,8 @@ const VTabs = ({
|
|
|
42
45
|
children,
|
|
43
46
|
onTabChange,
|
|
44
47
|
responsive = false,
|
|
45
|
-
variant = "tabs"
|
|
48
|
+
variant = "tabs",
|
|
49
|
+
updateHash = true
|
|
46
50
|
}: TabsProps) => {
|
|
47
51
|
// Initialize value
|
|
48
52
|
const [value, setValue] = React.useState(() => {
|
|
@@ -99,6 +103,15 @@ const VTabs = ({
|
|
|
99
103
|
|
|
100
104
|
const handleValueChange = (newValue: string) => {
|
|
101
105
|
setValue(newValue);
|
|
106
|
+
|
|
107
|
+
// Update the URL hash when tab changes (only if updateHash is true and not controlled by parent)
|
|
108
|
+
if (updateHash && !current) {
|
|
109
|
+
// Preserve existing history state when changing hash
|
|
110
|
+
const currentState = window.history.state;
|
|
111
|
+
const newUrl = window.location.pathname + window.location.search + '#' + newValue;
|
|
112
|
+
window.history.pushState(currentState, '', newUrl);
|
|
113
|
+
}
|
|
114
|
+
|
|
102
115
|
if (onTabChange) {
|
|
103
116
|
onTabChange(newValue);
|
|
104
117
|
}
|
|
@@ -109,7 +122,7 @@ const VTabs = ({
|
|
|
109
122
|
}, [handleValueChange]);
|
|
110
123
|
|
|
111
124
|
return (
|
|
112
|
-
<TabsContext.Provider value={{ tabs, size: fullWidth ? tabs.length : 0, current: value, setTab, responsive: responsive, variant }}>
|
|
125
|
+
<TabsContext.Provider value={{ tabs, size: fullWidth ? tabs.length : 0, current: value, setTab, responsive: responsive, variant, updateHash }}>
|
|
113
126
|
<TabsPrimitive.Root
|
|
114
127
|
defaultValue={value || tabs[0]?.name}
|
|
115
128
|
value={value}
|
|
@@ -123,7 +136,7 @@ const VTabs = ({
|
|
|
123
136
|
};
|
|
124
137
|
|
|
125
138
|
const VTabsBar = ({ className }: { className?: string }) => {
|
|
126
|
-
const { tabs, size, current, setTab, responsive, variant } = React.useContext(TabsContext);
|
|
139
|
+
const { tabs, size, current, setTab, responsive, variant, updateHash } = React.useContext(TabsContext);
|
|
127
140
|
|
|
128
141
|
const fullWidth = size !== 0;
|
|
129
142
|
|
|
@@ -132,13 +145,15 @@ const VTabsBar = ({ className }: { className?: string }) => {
|
|
|
132
145
|
|
|
133
146
|
const tab = tabs.find(t => t.name === tabName);
|
|
134
147
|
|
|
135
|
-
if (tab?.href) {
|
|
136
|
-
|
|
148
|
+
if (tab?.href && updateHash) {
|
|
149
|
+
// Preserve existing history state when changing tabs
|
|
150
|
+
const currentState = window.history.state;
|
|
151
|
+
window.history.pushState(currentState, '', tab.href);
|
|
137
152
|
}
|
|
138
153
|
|
|
139
154
|
setTab(tabName);
|
|
140
155
|
|
|
141
|
-
}, [tabs, setTab]);
|
|
156
|
+
}, [tabs, setTab, updateHash]);
|
|
142
157
|
|
|
143
158
|
if (!tabs || !setTab) {
|
|
144
159
|
console.warn("TabsBar: No tabs provided or setTab not available");
|
|
@@ -226,7 +241,9 @@ const TabsTrigger = React.forwardRef<
|
|
|
226
241
|
const handleClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
227
242
|
if (href) {
|
|
228
243
|
event.preventDefault();
|
|
229
|
-
|
|
244
|
+
// Preserve existing history state when changing tabs
|
|
245
|
+
const currentState = window.history.state;
|
|
246
|
+
window.history.pushState(currentState, '', href);
|
|
230
247
|
}
|
|
231
248
|
if (props.onClick) {
|
|
232
249
|
(props.onClick as React.MouseEventHandler<HTMLButtonElement>)(event);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../libs/utils"
|
|
4
|
+
|
|
5
|
+
function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
|
|
6
|
+
return (
|
|
7
|
+
<textarea
|
|
8
|
+
data-slot="textarea"
|
|
9
|
+
className={cn(
|
|
10
|
+
"py-2 text-sm",
|
|
11
|
+
"flex w-full rounded-md border border-input bg-background ring-offset-background",
|
|
12
|
+
"placeholder:text-muted focus-visible:outline-none focus-visible:ring-1 ring-inset focus-visible:ring-ring",
|
|
13
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
14
|
+
className
|
|
15
|
+
)}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { Textarea }
|
|
@@ -23,7 +23,7 @@ export function RowSkeleton({ columns }: { columns: number }) {
|
|
|
23
23
|
<tr className="hover:bg-muted">
|
|
24
24
|
{Array(columns).fill(0).map((_, index) =>
|
|
25
25
|
<td key={index}>
|
|
26
|
-
<div className="animate-pulse rounded-xs h-5 bg-
|
|
26
|
+
<div className="animate-pulse rounded-xs h-5 bg-muted"></div>
|
|
27
27
|
</td>
|
|
28
28
|
)}
|
|
29
29
|
</tr>
|
package/src/core/hooks/index.ts
CHANGED