Skip to content

Commit f3853ef

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
fix(knowledge): keep initial tag ID input focused
1 parent 23c1780 commit f3853ef

2 files changed

Lines changed: 59 additions & 18 deletions

File tree

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.test.tsx

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ import { act, type ChangeEvent } from 'react'
55
import { createRoot, type Root } from 'react-dom/client'
66
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
77

8-
const { mockSetStoreValue } = vi.hoisted(() => ({
8+
const { mockSetStoreValue, mockStoreState } = vi.hoisted(() => ({
99
mockSetStoreValue: vi.fn(),
10+
mockStoreState: {
11+
value: null as string | null,
12+
},
1013
}))
1114

1215
const initialFilters = [
@@ -41,22 +44,34 @@ vi.mock(
4144

4245
vi.mock(
4346
'@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input',
44-
() => ({
45-
useSubBlockInput: () => ({
46-
fieldHelpers: {
47-
getFieldState: () => ({ showTags: false }),
48-
createFieldHandlers: (_key: string, _value: string, onChange: (value: string) => void) => ({
49-
onChange: (event: ChangeEvent<HTMLInputElement>) => onChange(event.target.value),
50-
onKeyDown: vi.fn(),
51-
onDrop: vi.fn(),
52-
onDragOver: vi.fn(),
53-
onFocus: vi.fn(),
54-
}),
55-
createTagSelectHandler: vi.fn(),
56-
hideFieldDropdowns: vi.fn(),
47+
async () => {
48+
const { useState } = await import('react')
49+
50+
return {
51+
useSubBlockInput: () => {
52+
const [, setFocusCount] = useState(0)
53+
54+
return {
55+
fieldHelpers: {
56+
getFieldState: () => ({ showTags: false }),
57+
createFieldHandlers: (
58+
_key: string,
59+
_value: string,
60+
onChange: (value: string) => void
61+
) => ({
62+
onChange: (event: ChangeEvent<HTMLInputElement>) => onChange(event.target.value),
63+
onKeyDown: vi.fn(),
64+
onDrop: vi.fn(),
65+
onDragOver: vi.fn(),
66+
onFocus: () => setFocusCount((count) => count + 1),
67+
}),
68+
createTagSelectHandler: vi.fn(),
69+
hideFieldDropdowns: vi.fn(),
70+
},
71+
}
5772
},
58-
}),
59-
})
73+
}
74+
}
6075
)
6176

6277
vi.mock(
@@ -90,7 +105,7 @@ vi.mock('@/hooks/kb/use-tag-selection', () => ({
90105
vi.mock(
91106
'@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value',
92107
() => ({
93-
useSubBlockValue: () => [JSON.stringify(initialFilters), mockSetStoreValue],
108+
useSubBlockValue: () => [mockStoreState.value, mockSetStoreValue],
94109
})
95110
)
96111

@@ -104,6 +119,7 @@ describe('KnowledgeTagFilters Tag ID editing', () => {
104119
container = document.createElement('div')
105120
document.body.appendChild(container)
106121
root = createRoot(container)
122+
mockStoreState.value = JSON.stringify(initialFilters)
107123
mockSetStoreValue.mockClear()
108124
})
109125

@@ -165,4 +181,28 @@ describe('KnowledgeTagFilters Tag ID editing', () => {
165181
})
166182
expect(resolvedFilter.valueTo).toBeUndefined()
167183
})
184+
185+
it('keeps a brand-new Tag ID input focused and accepts its first pasted value', async () => {
186+
mockStoreState.value = null
187+
const input = await renderTagFilters()
188+
expect(input).not.toBeNull()
189+
190+
await act(async () => {
191+
input?.focus()
192+
})
193+
194+
const focusedInput = container.querySelector<HTMLInputElement>(
195+
'input[placeholder="Enter tag ID"]'
196+
)
197+
expect(focusedInput).toBe(input)
198+
expect(document.activeElement).toBe(input)
199+
200+
const pastedFilter = await changeTagId(focusedInput as HTMLInputElement, 'tag-text')
201+
expect(pastedFilter).toMatchObject({
202+
tagId: 'tag-text',
203+
tagSlot: 'tag1',
204+
fieldType: 'text',
205+
operator: 'eq',
206+
})
207+
})
168208
})

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ export function KnowledgeTagFilters({
131131
})),
132132
[currentValue]
133133
)
134-
const filters: TagFilter[] = parsedFilters.length > 0 ? parsedFilters : [createDefaultFilter()]
134+
const defaultFilter = useMemo(createDefaultFilter, [])
135+
const filters: TagFilter[] = parsedFilters.length > 0 ? parsedFilters : [defaultFilter]
135136
const isReadOnly = isPreview || disabled
136137
const usesTagIds = subBlock.mode === 'advanced'
137138
const getResolvedTagDefinition = (filter: TagFilter) =>

0 commit comments

Comments
 (0)