Skip to content

Commit 4cb651a

Browse files
authored
RI-7237 Rework tabs component for vector search flow
- replace the Tabs component with ButtonGroup, and make it feel like tabs re #RI-7237
1 parent a0c099a commit 4cb651a

File tree

3 files changed

+92
-28
lines changed

3 files changed

+92
-28
lines changed

redisinsight/ui/src/components/new-index/create-index-step/CreateIndexStepWrapper.spec.tsx

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import React from 'react'
22
import { cleanup, fireEvent, render, screen } from 'uiSrc/utils/test-utils'
3-
import { CreateIndexStepWrapper } from './CreateIndexStepWrapper'
3+
import {
4+
CreateIndexStepWrapper,
5+
CreateIndexStepWrapperProps,
6+
VectorIndexTab,
7+
} from './CreateIndexStepWrapper'
48

5-
const renderComponent = () => render(<CreateIndexStepWrapper />)
9+
const renderComponent = (props?: Partial<CreateIndexStepWrapperProps>) =>
10+
render(<CreateIndexStepWrapper {...props} />)
611

712
describe('CreateIndexStepWrapper', () => {
813
beforeEach(() => {
@@ -23,22 +28,42 @@ describe('CreateIndexStepWrapper', () => {
2328

2429
// Check if the "Use preset index" tab content is selected by default
2530
const usePresetIIndexTabContent = screen.queryByTestId(
26-
'vector-inde-tabs--use-preset-index-content',
31+
'vector-index-tabs--use-preset-index-content',
2732
)
2833
expect(usePresetIIndexTabContent).toBeInTheDocument()
2934
})
3035

3136
it('should switch to "Use preset index" tab when clicked', () => {
32-
renderComponent()
37+
const props: CreateIndexStepWrapperProps = {
38+
tabs: [
39+
{
40+
value: VectorIndexTab.BuildNewIndex,
41+
label: 'Build new index',
42+
},
43+
{
44+
value: VectorIndexTab.UsePresetIndex,
45+
label: 'Use preset index',
46+
},
47+
],
48+
}
49+
50+
renderComponent(props)
51+
52+
// Verify the initial render to ensure "Build new index" is selected
53+
const buildNewIndexTabContent = screen.queryByTestId(
54+
'vector-index-tabs--build-new-index-content',
55+
)
56+
expect(buildNewIndexTabContent).toBeInTheDocument()
3357

58+
// Click on the "Use preset index" tab
3459
const buildNewIndexTabTrigger = screen.getByText('Use preset index')
3560
fireEvent.click(buildNewIndexTabTrigger)
3661

3762
// Check if the "Use preset index" tab is rendered
38-
const buildNewIndexTabContent = screen.queryByTestId(
39-
'vector-inde-tabs--use-preset-index-content',
63+
const usePresetIndexTabContent = screen.queryByTestId(
64+
'vector-index-tabs--use-preset-index-content',
4065
)
41-
expect(buildNewIndexTabContent).toBeInTheDocument()
66+
expect(usePresetIndexTabContent).toBeInTheDocument()
4267
})
4368

4469
it("shouldn't switch to 'Build new index' tab when clicked, since it is disabled", () => {
@@ -48,15 +73,14 @@ describe('CreateIndexStepWrapper', () => {
4873
const buildNewIndexTabTriggerButton =
4974
buildNewIndexTabTriggerLabel.closest('[type="button"]')
5075

51-
expect(buildNewIndexTabTriggerButton).toHaveAttribute('disabled')
52-
expect(buildNewIndexTabTriggerButton).toHaveAttribute('data-disabled')
76+
expect(buildNewIndexTabTriggerButton).toBeDisabled()
5377

5478
// And when clicked, it should not change the active tab
5579
fireEvent.click(buildNewIndexTabTriggerLabel)
5680

5781
// Check if the "Use preset index" tab is still active
5882
const usePresetIndexTabContent = screen.queryByTestId(
59-
'vector-inde-tabs--use-preset-index-content',
83+
'vector-index-tabs--use-preset-index-content',
6084
)
6185
expect(usePresetIndexTabContent).toBeInTheDocument()
6286
})
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import styled from 'styled-components'
2+
3+
export const StyledCreateIndexStepWrapper = styled.div`
4+
display: flex;
5+
flex-direction: column;
6+
gap: ${({ theme }) => theme.components.boxSelectionGroup.defaultItem.gap};
7+
`
Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,73 @@
1-
import React from 'react'
2-
import { TabsProps } from '@redis-ui/components'
3-
import Tabs, { TabInfo } from 'uiSrc/components/base/layout/tabs'
1+
import React, { useState } from 'react'
2+
import { ButtonGroup, ButtonGroupProps } from '@redis-ui/components'
43
import { BuildNewIndexTabTrigger } from './build-new-index-tab/BuildNewIndexTabTrigger'
4+
import { StyledCreateIndexStepWrapper } from './CreateIndexStepWrapper.styles'
55

66
export enum VectorIndexTab {
77
BuildNewIndex = 'build-new-index',
88
UsePresetIndex = 'use-preset-index',
99
}
1010

11-
const VECTOR_INDEX_TABS: TabInfo<string>[] = [
11+
interface IndexStepTab {
12+
value: VectorIndexTab
13+
label: React.ReactNode
14+
disabled?: boolean
15+
}
16+
17+
const VECTOR_INDEX_TABS: IndexStepTab[] = [
1218
{
1319
value: VectorIndexTab.BuildNewIndex,
1420
label: <BuildNewIndexTabTrigger />,
15-
content: null,
1621
disabled: true,
1722
},
1823
{
1924
value: VectorIndexTab.UsePresetIndex,
2025
label: 'Use preset index',
21-
content: (
22-
<div data-testid="vector-inde-tabs--use-preset-index-content">
23-
TODO: Add content later
24-
</div>
25-
),
2626
},
2727
]
2828

29-
export const CreateIndexStepWrapper = (props: Partial<TabsProps>) => {
30-
const { tabs, defaultValue, ...rest } = props
29+
export interface CreateIndexStepWrapperProps extends ButtonGroupProps {
30+
tabs?: IndexStepTab[]
31+
defaultValue?: VectorIndexTab
32+
}
33+
34+
export const CreateIndexStepWrapper = (
35+
props: Partial<CreateIndexStepWrapperProps>,
36+
) => {
37+
const { tabs = VECTOR_INDEX_TABS, defaultValue, ...rest } = props
38+
39+
const [selectedTab, setSelectedTab] = useState<VectorIndexTab | null>(
40+
defaultValue ?? tabs.filter((tab) => !tab.disabled)[0]?.value ?? null,
41+
)
42+
43+
const isTabSelected = (value: VectorIndexTab) => selectedTab === value
3144

3245
return (
33-
<Tabs
34-
tabs={tabs ?? VECTOR_INDEX_TABS}
35-
defaultValue={defaultValue ?? VectorIndexTab.UsePresetIndex}
36-
variant="sub"
37-
{...rest}
38-
/>
46+
<StyledCreateIndexStepWrapper>
47+
<ButtonGroup {...rest}>
48+
{tabs.map((tab) => (
49+
<ButtonGroup.Button
50+
disabled={tab.disabled}
51+
isSelected={isTabSelected(tab.value)}
52+
onClick={() => setSelectedTab(tab.value)}
53+
key={`vector-index-tab-${tab.value}`}
54+
>
55+
{tab.label}
56+
</ButtonGroup.Button>
57+
))}
58+
</ButtonGroup>
59+
60+
{selectedTab === VectorIndexTab.BuildNewIndex && (
61+
<div data-testid="vector-index-tabs--build-new-index-content">
62+
TODO: Add content later
63+
</div>
64+
)}
65+
66+
{selectedTab === VectorIndexTab.UsePresetIndex && (
67+
<div data-testid="vector-index-tabs--use-preset-index-content">
68+
TODO: Add content later
69+
</div>
70+
)}
71+
</StyledCreateIndexStepWrapper>
3972
)
4073
}

0 commit comments

Comments
 (0)