feat(web): snippet version panel

This commit is contained in:
JzoNg
2026-03-29 15:26:59 +08:00
parent c41ba7d627
commit dccf8e723a
3 changed files with 68 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
import type { PanelProps } from '@/app/components/workflow/panel'
import type { SnippetInputField } from '@/models/snippet'
import { render, waitFor } from '@testing-library/react'
import SnippetWorkflowPanel from '../workflow-panel'
let capturedPanelProps: PanelProps | null = null
vi.mock('@/app/components/workflow/panel', () => ({
default: (props: PanelProps) => {
capturedPanelProps = props
return <div data-testid="workflow-panel">{props.components?.left}</div>
},
}))
const defaultFields: SnippetInputField[] = []
describe('SnippetWorkflowPanel', () => {
beforeEach(() => {
vi.clearAllMocks()
capturedPanelProps = null
})
// Verifies snippet panel wires version history support into the shared workflow panel.
describe('Rendering', () => {
it('should pass snippet version history panel props to the shared workflow panel', async () => {
render(
<SnippetWorkflowPanel
snippetId="snippet-1"
fields={defaultFields}
editingField={null}
isEditorOpen={false}
isInputPanelOpen={false}
onCloseInputPanel={vi.fn()}
onOpenEditor={vi.fn()}
onCloseEditor={vi.fn()}
onSubmitField={vi.fn()}
onRemoveField={vi.fn()}
onPrimarySortChange={vi.fn()}
onSecondarySortChange={vi.fn()}
/>,
)
await waitFor(() => {
expect(capturedPanelProps?.versionHistoryPanelProps?.getVersionListUrl).toBe('/snippets/snippet-1/workflows')
expect(capturedPanelProps?.versionHistoryPanelProps?.deleteVersionUrl?.('version-1')).toBe('/snippets/snippet-1/workflows/version-1')
expect(capturedPanelProps?.versionHistoryPanelProps?.restoreVersionUrl('version-1')).toBe('/snippets/snippet-1/workflows/version-1/restore')
expect(capturedPanelProps?.versionHistoryPanelProps?.updateVersionUrl?.('version-1')).toBe('/snippets/snippet-1/workflows/version-1')
expect(capturedPanelProps?.versionHistoryPanelProps?.latestVersionId).toBe('')
})
})
})
})

View File

@@ -56,6 +56,7 @@ const SnippetChildren = ({
/>
<SnippetWorkflowPanel
snippetId={snippetId}
fields={fields}
editingField={editingField}
isEditorOpen={isEditorOpen}

View File

@@ -8,6 +8,7 @@ import SnippetInputFieldEditor from './input-field-editor'
import SnippetInputFieldPanel from './panel'
type SnippetWorkflowPanelProps = {
snippetId: string
fields: SnippetInputField[]
editingField: SnippetInputField | null
isEditorOpen: boolean
@@ -59,6 +60,7 @@ const SnippetPanelOnLeft = ({
}
const SnippetWorkflowPanel = ({
snippetId,
fields,
editingField,
isEditorOpen,
@@ -71,11 +73,22 @@ const SnippetWorkflowPanel = ({
onPrimarySortChange,
onSecondarySortChange,
}: SnippetWorkflowPanelProps) => {
const versionHistoryPanelProps = useMemo(() => {
return {
getVersionListUrl: `/snippets/${snippetId}/workflows`,
deleteVersionUrl: (versionId: string) => `/snippets/${snippetId}/workflows/${versionId}`,
restoreVersionUrl: (versionId: string) => `/snippets/${snippetId}/workflows/${versionId}/restore`,
updateVersionUrl: (versionId: string) => `/snippets/${snippetId}/workflows/${versionId}`,
latestVersionId: '',
}
}, [snippetId])
const panelProps: PanelProps = useMemo(() => {
return {
components: {
left: (
<SnippetPanelOnLeft
snippetId={snippetId}
fields={fields}
editingField={editingField}
isEditorOpen={isEditorOpen}
@@ -90,6 +103,7 @@ const SnippetWorkflowPanel = ({
/>
),
},
versionHistoryPanelProps,
}
}, [
editingField,
@@ -103,6 +117,7 @@ const SnippetWorkflowPanel = ({
onRemoveField,
onSecondarySortChange,
onSubmitField,
versionHistoryPanelProps,
])
return <Panel {...panelProps} />