Skip to content

Commit 7aefed5

Browse files
committed
fix(ui): align info icon and database alias in instance header
Remove vertical padding from db index button container and add inline-flex display to tooltip anchor for proper alignment. Add InstanceHeader.stories.tsx References: #RI-7835
1 parent 82a8e53 commit 7aefed5

File tree

3 files changed

+180
-1
lines changed

3 files changed

+180
-1
lines changed
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
import React, { useEffect } from 'react'
2+
import type { Meta, StoryObj } from '@storybook/react-vite'
3+
import { useDispatch } from 'react-redux'
4+
import { BuildType } from 'uiSrc/constants/env'
5+
import { ConnectionType, Instance } from 'uiSrc/slices/interfaces'
6+
7+
import InstanceHeader from './InstanceHeader'
8+
import { DBInstanceFactory } from 'uiSrc/mocks/factories/database/DBInstance.factory'
9+
import {
10+
getDatabaseConfigInfoSuccess,
11+
setConnectedInfoInstanceSuccess,
12+
setConnectedInstanceSuccess,
13+
} from 'uiSrc/slices/instances/instances'
14+
import { getServerInfoSuccess } from 'uiSrc/slices/app/info'
15+
import { setDbIndexState } from 'uiSrc/slices/app/context'
16+
import { fn } from 'storybook/test'
17+
18+
interface InstanceHeaderArgs {
19+
instance?: Partial<Instance>
20+
databases?: number
21+
buildType?: BuildType | null
22+
dbIndexDisabled?: boolean
23+
returnUrl?: string | null
24+
onChangeDbIndex?: (index: number) => void
25+
}
26+
27+
const StorePopulator = ({ args }: { args: InstanceHeaderArgs }) => {
28+
const dispatch = useDispatch()
29+
30+
useEffect(() => {
31+
// Build instance from factory with optional overrides
32+
const instance = DBInstanceFactory.build({
33+
db: 0,
34+
loading: false,
35+
...args.instance,
36+
})
37+
38+
dispatch(setConnectedInstanceSuccess(instance))
39+
40+
// Set instance info (includes databases count)
41+
dispatch(
42+
setConnectedInfoInstanceSuccess({
43+
version: instance.version ?? '7.0.0',
44+
server: {},
45+
databases: args.databases ?? 1,
46+
} as any),
47+
)
48+
49+
// Set instance overview (includes version)
50+
dispatch(
51+
getDatabaseConfigInfoSuccess({
52+
version: instance.version ?? '7.0.0',
53+
} as any),
54+
)
55+
56+
// Set server info (buildType)
57+
if (args.buildType) {
58+
dispatch(
59+
getServerInfoSuccess({
60+
buildType: args.buildType,
61+
} as any),
62+
)
63+
}
64+
65+
// Set db index disabled state
66+
if (args.dbIndexDisabled !== undefined) {
67+
dispatch(setDbIndexState(args.dbIndexDisabled))
68+
}
69+
}, [dispatch, args])
70+
71+
return null
72+
}
73+
74+
const meta: Meta<typeof InstanceHeader> = {
75+
component: InstanceHeader,
76+
decorators: [
77+
(Story, context) => {
78+
// storeArgs is a custom parameter (not built-in) used to pass data for Redux store setup
79+
const storeArgs =
80+
(context.parameters?.storeArgs as InstanceHeaderArgs) || {}
81+
82+
return (
83+
<>
84+
<StorePopulator args={storeArgs} />
85+
<Story />
86+
</>
87+
)
88+
},
89+
],
90+
args: {
91+
onChangeDbIndex: fn(),
92+
},
93+
}
94+
95+
export default meta
96+
97+
type Story = StoryObj<typeof meta>
98+
99+
export const Default: Story = {}
100+
101+
export const WithMultipleDatabases: Story = {
102+
parameters: {
103+
storeArgs: {
104+
databases: 16,
105+
instance: {
106+
db: 5,
107+
},
108+
} as InstanceHeaderArgs,
109+
},
110+
}
111+
112+
export const WithLongDatabaseName: Story = {
113+
parameters: {
114+
storeArgs: {
115+
instance: {
116+
name: 'Very Long Database Name That Should Truncate With Ellipsis',
117+
},
118+
} as InstanceHeaderArgs,
119+
},
120+
}
121+
122+
export const RedisStack: Story = {
123+
parameters: {
124+
storeArgs: {
125+
buildType: BuildType.RedisStack,
126+
instance: {
127+
name: 'Redis Stack Instance',
128+
modules: [
129+
{ name: 'search', version: 20400, semanticVersion: '2.4.0' },
130+
{ name: 'json', version: 20000, semanticVersion: '2.0.0' },
131+
],
132+
},
133+
} as InstanceHeaderArgs,
134+
},
135+
}
136+
137+
export const WithReturnUrl: Story = {
138+
parameters: {
139+
storeArgs: {
140+
returnUrl: '/some/path',
141+
} as InstanceHeaderArgs,
142+
},
143+
}
144+
145+
export const Loading: Story = {
146+
parameters: {
147+
storeArgs: {
148+
instance: {
149+
loading: true,
150+
},
151+
} as InstanceHeaderArgs,
152+
},
153+
}
154+
155+
export const DbIndexDisabled: Story = {
156+
parameters: {
157+
storeArgs: {
158+
databases: 16,
159+
instance: {
160+
db: 3,
161+
},
162+
dbIndexDisabled: true,
163+
} as InstanceHeaderArgs,
164+
},
165+
}
166+
167+
export const ClusterConnection: Story = {
168+
parameters: {
169+
storeArgs: {
170+
instance: {
171+
connectionType: ConnectionType.Cluster,
172+
name: 'Redis Cluster',
173+
host: 'cluster.example.com',
174+
port: 7000,
175+
},
176+
} as InstanceHeaderArgs,
177+
},
178+
}

redisinsight/ui/src/components/instance-header/InstanceHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ const InstanceHeader = ({ onChangeDbIndex }: Props) => {
218218
)}
219219
</FlexItem>
220220
{databases > 1 && (
221-
<FlexItem style={{ padding: '4px 0 4px 12px' }}>
221+
<FlexItem style={{ paddingLeft: 12 }}>
222222
<div
223223
style={{
224224
display: 'flex',

redisinsight/ui/src/components/instance-header/styles.module.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
.tooltipAnchor {
3434
max-width: 100%;
35+
display: inline-flex;
3536

3637
.infoIcon {
3738
transition: color ease .3s;

0 commit comments

Comments
 (0)