refactor(web): improve document actions and metadata handling

This commit refactors the document actions and metadata components to enhance code clarity and maintainability. Key changes include:

- Simplified the  hook by removing unnecessary type assertions.
- Streamlined the rendering logic in the  component by consolidating JSX elements.
- Updated dependencies in the  hook to ensure proper reactivity.

These adjustments aim to improve the overall structure and performance of the document management features.
This commit is contained in:
CodingOnStar
2026-01-30 10:53:11 +08:00
parent a25e4c1b3a
commit 932a37d734
4 changed files with 23 additions and 16 deletions

View File

@ -73,7 +73,7 @@ export const useDocumentActions = ({
return
const [e] = await asyncRunSafe<CommonResponse>(
opApi({ datasetId, documentIds: selectedIds }) as Promise<CommonResponse>,
opApi({ datasetId, documentIds: selectedIds }),
)
if (!e) {

View File

@ -37,7 +37,7 @@ export function useMetadataEditor({ docDetail }: UseMetadataEditorOptions) {
metadata: (docDetail?.doc_metadata || {}) as Record<string, string>,
})
}
}, [docDetail?.doc_type, docDetail?.doc_metadata, doc_type])
}, [docDetail, doc_type])
const confirmDocType = useCallback(() => {
if (!tempDocType)

View File

@ -73,17 +73,15 @@ const Metadata: FC<MetadataProps> = ({ docDetail, loading, onUpdate }) => {
<>
<TypeIcon iconName={metadataMap[metadataParams.documentType || 'book'].iconName || ''} className={s.iconShow} />
{metadataMap[metadataParams.documentType || 'book'].text}
{editStatus && (
<div className="ml-1 inline-flex items-center gap-1">
·
<div
onClick={openDocTypeSelector}
className="cursor-pointer hover:text-text-accent"
>
{t('operation.change', { ns: 'common' })}
</div>
<div className="ml-1 inline-flex items-center gap-1">
·
<div
onClick={openDocTypeSelector}
className="cursor-pointer hover:text-text-accent"
>
{t('operation.change', { ns: 'common' })}
</div>
)}
</div>
</>
)}
</div>

View File

@ -77,19 +77,22 @@ vi.mock('@/app/components/workflow/constants', () => ({
// ============================================================================
describe('useDSL', () => {
let mockLink: { href: string, download: string, click: ReturnType<typeof vi.fn> }
let mockLink: { href: string, download: string, click: ReturnType<typeof vi.fn>, style: { display: string }, remove: ReturnType<typeof vi.fn> }
let originalCreateElement: typeof document.createElement
let originalAppendChild: typeof document.body.appendChild
let mockCreateObjectURL: ReturnType<typeof vi.spyOn>
let mockRevokeObjectURL: ReturnType<typeof vi.spyOn>
beforeEach(() => {
vi.clearAllMocks()
// Create a proper mock link element
// Create a proper mock link element with all required properties for downloadBlob
mockLink = {
href: '',
download: '',
click: vi.fn(),
style: { display: '' },
remove: vi.fn(),
}
// Save original and mock selectively - only intercept 'a' elements
@ -101,8 +104,13 @@ describe('useDSL', () => {
return originalCreateElement(tagName)
}) as typeof document.createElement
mockCreateObjectURL = vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:test-url')
mockRevokeObjectURL = vi.spyOn(URL, 'revokeObjectURL').mockImplementation(() => {})
// Mock document.body.appendChild for downloadBlob
originalAppendChild = document.body.appendChild.bind(document.body)
document.body.appendChild = vi.fn(<T extends Node>(node: T): T => node) as typeof document.body.appendChild
// downloadBlob uses window.URL, not URL
mockCreateObjectURL = vi.spyOn(window.URL, 'createObjectURL').mockReturnValue('blob:test-url')
mockRevokeObjectURL = vi.spyOn(window.URL, 'revokeObjectURL').mockImplementation(() => {})
// Default store state
mockWorkflowStoreGetState.mockReturnValue({
@ -119,6 +127,7 @@ describe('useDSL', () => {
afterEach(() => {
document.createElement = originalCreateElement
document.body.appendChild = originalAppendChild
mockCreateObjectURL.mockRestore()
mockRevokeObjectURL.mockRestore()
vi.clearAllMocks()