refactor: 统一主体与镜头目录并优化筛选工具栏布局

This commit is contained in:
GouJ
2026-09-01 17:21:13 +08:00
parent a35f5fe82d
commit 70ab4ba48f
12 changed files with 496 additions and 251 deletions
+49 -1
View File
@@ -177,6 +177,10 @@ describe('内容级滚动下的生产反馈', () => {
expect(directory.get('.n-scrollbar-container').element).not.toBe(detail.get('.n-scrollbar-container').element)
const items = directory.findAll('.production-shot-link')
expect(items).toHaveLength(2)
expect(directory.get('.directory-heading').text()).toContain('生产镜头')
expect(directory.get('.directory-heading').element.closest('.n-scrollbar-container')).toBeNull()
expect(items[0]!.find('.directory-item-title').exists()).toBe(true)
expect(items[0]!.find('.directory-item-meta .directory-status').exists()).toBe(true)
await items[1]!.trigger('click')
await flushPromises()
expect(items[1]!.attributes('aria-current')).toBe('true')
@@ -232,9 +236,12 @@ describe('视觉风格与主体身份工作区', () => {
})
)
await mountAssets('identity', '?subjectId=subject-db-1')
const sidebar = wrapper!.get('.identity-directory')
expect(sidebar.get('.directory-filters').element.closest('.n-scrollbar-container')).toBeNull()
expect(sidebar.get('.identity-subject-list').findAll('.directory-item')).toHaveLength(2)
await wrapper!.findAll('.identity-subject-item')[1]!.trigger('click')
await flushPromises()
button('刷新主体目录').click()
await wrapper!.get('[aria-label="刷新主体目录"]').trigger('click')
await flushPromises()
expect(wrapper!.findAll('.identity-subject-item')[1]!.attributes('aria-pressed')).toBe('true')
})
@@ -631,6 +638,47 @@ describe('视觉风格与主体身份工作区', () => {
})
describe('工作台页面交互', () => {
it('形态筛选搜索、类型和勾选组合仍只过滤本地显示,控件与结果数处于同一工具栏', async () => {
const person = formFixture()
const scene = {
...formFixture(),
id: 'scene-form',
images: [],
subject: { ...person.subject, id: 'scene-subject', ref: '@SC0001', name: '旧书店', module: 'scene' }
}
const fetcher = vi.fn<typeof fetch>().mockImplementation(async () => jsonResponse([person, scene]))
vi.stubGlobal('fetch', fetcher)
await mountSubjectImages()
const filters = wrapper!.get('.form-image-filters')
expect(filters.get('.filter-result-count').text()).toBe('2 个形态')
expect(filters.find('input[aria-label="搜索形态图片"]').exists()).toBe(true)
expect(filters.findAll('.filter-toggles [role="checkbox"]')).toHaveLength(2)
await filters.findAll('.filter-toggles [role="checkbox"]')[0]!.trigger('click')
expect(wrapper!.findAll('.form-image-card')).toHaveLength(1)
expect(wrapper!.get('.form-image-card').text()).toContain('旧书店')
selectControl(wrapper!, 'aria-label', '筛选主体类型').vm.$emit('update:value', 'character')
await flushPromises()
expect(filters.get('.filter-result-count').text()).toBe('0 个形态')
selectControl(wrapper!, 'aria-label', '筛选主体类型').vm.$emit('update:value', 'all')
await filters.get('input[aria-label="搜索形态图片"]').setValue('旧书店')
expect(filters.get('.filter-result-count').text()).toBe('1 个形态')
await filters.findAll('.filter-toggles [role="checkbox"]')[1]!.trigger('click')
expect(filters.get('.filter-result-count').text()).toBe('0 个形态')
expect(fetcher.mock.calls.every(([, init]) => init?.method === 'GET')).toBe(true)
})
it('拆解导出按钮紧邻标签栏且保持空快照禁用状态', () => {
wrapper = mount(BreakdownPage, {
attachTo: document.body,
global: { provide: { [projectContextKey as symbol]: context() }, stubs: { RouterLink: true } }
})
const toolbar = wrapper.get('.result-toolbar')
expect(toolbar.find('[aria-label="拆解结果"]').exists()).toBe(true)
const exportButton = toolbar.get<HTMLButtonElement>(':scope > button')
expect(exportButton.text()).toBe('导出 JSON')
expect(exportButton.element.disabled).toBe(true)
})
it('形态图库自动显示后端已有图片,不需要再次生图;筛选只改变显示', async () => {
const fetcher = vi
.fn<typeof fetch>()