sy-form-components 0.2.8 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +16 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +961 -494
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +961 -494
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/FormProvider.tsx","../src/core/FormContext.ts","../src/core/ComponentRegistry.tsx","../src/fields/TextField/index.tsx","../src/core/FieldWrapper.tsx","../src/hooks/useDeviceDetect.ts","../src/fields/TextField/TextFieldPC.tsx","../src/fields/TextField/TextFieldMobile.tsx","../src/fields/TextField/TextFieldReadonly.tsx","../src/fields/NumberField/index.tsx","../src/fields/NumberField/NumberFieldPC.tsx","../src/fields/NumberField/NumberFieldMobile.tsx","../src/fields/NumberField/NumberFieldReadonly.tsx","../src/fields/TextAreaField/index.tsx","../src/fields/TextAreaField/TextAreaFieldPC.tsx","../src/fields/TextAreaField/TextAreaFieldMobile.tsx","../src/fields/TextAreaField/TextAreaFieldReadonly.tsx","../src/fields/SelectField/index.tsx","../src/fields/SelectField/SelectFieldPC.tsx","../src/fields/SelectField/SelectFieldMobile.tsx","../src/fields/SelectField/SelectFieldReadonly.tsx","../src/fields/MultiSelectField/index.tsx","../src/fields/MultiSelectField/MultiSelectFieldPC.tsx","../src/fields/MultiSelectField/MultiSelectFieldMobile.tsx","../src/fields/MultiSelectField/MultiSelectFieldReadonly.tsx","../src/fields/RadioField/index.tsx","../src/fields/RadioField/RadioFieldPC.tsx","../src/fields/RadioField/RadioFieldMobile.tsx","../src/fields/RadioField/RadioFieldReadonly.tsx","../src/fields/CheckboxField/index.tsx","../src/fields/CheckboxField/CheckboxFieldPC.tsx","../src/fields/CheckboxField/CheckboxFieldMobile.tsx","../src/fields/CheckboxField/CheckboxFieldReadonly.tsx","../src/fields/DateField/index.tsx","../src/fields/DateField/DateFieldPC.tsx","../src/fields/DateField/DateFieldMobile.tsx","../src/fields/DateField/DateFieldReadonly.tsx","../src/fields/CascadeDateField/index.tsx","../src/fields/CascadeDateField/CascadeDateFieldPC.tsx","../src/fields/CascadeDateField/CascadeDateFieldMobile.tsx","../src/fields/CascadeDateField/CascadeDateFieldReadonly.tsx","../src/fields/AttachmentField/index.tsx","../src/fields/AttachmentField/AttachmentFieldPC.tsx","../src/fields/shared/fieldFormat.ts","../src/fields/AttachmentField/AttachmentFieldMobile.tsx","../src/fields/AttachmentField/AttachmentFieldReadonly.tsx","../src/fields/ImageField/index.tsx","../src/fields/ImageField/ImageFieldPC.tsx","../src/fields/ImageField/ImageFieldMobile.tsx","../src/fields/ImageField/ImageFieldReadonly.tsx","../src/fields/SubFormField/index.tsx","../src/fields/SubFormField/SubFormCell.tsx","../src/fields/SubFormField/SubFormFieldPC.tsx","../src/fields/SubFormField/SubFormFieldMobile.tsx","../src/fields/SubFormField/SubFormFieldReadonly.tsx","../src/fields/UserSelectField/index.tsx","../src/fields/UserSelectField/UserSelectFieldPC.tsx","../src/fields/shared/UserPicker.tsx","../src/fields/shared/useLazyDepartmentTree.ts","../src/fields/UserSelectField/UserSelectFieldMobile.tsx","../src/fields/UserSelectField/UserSelectFieldReadonly.tsx","../src/fields/DepartmentSelectField/index.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldPC.tsx","../src/fields/shared/DepartmentPicker.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldMobile.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldReadonly.tsx","../src/fields/CascadeSelectField/index.tsx","../src/fields/AddressField/index.tsx","../src/fields/AssociationFormField/index.tsx","../src/fields/EditorField/index.tsx","../src/fields/SerialNumberField/index.tsx","../src/fields/LocationField/index.tsx","../src/fields/DigitalSignatureField/index.tsx","../src/fields/JSONField/index.tsx","../src/core/defaultRegistry.ts","../src/core/effects.ts","../src/core/validation.ts","../src/core/runtimeApi.ts","../src/core/FormRenderer.tsx","../src/core/FormActions.tsx","../src/core/FormContainer.tsx","../src/core/constants.ts","../src/core/processApi.ts","../src/core/dataManagementApi.ts","../src/layout/FormSection/index.tsx","../src/layout/FormGrid/index.tsx","../src/layout/FormTabs/index.tsx","../src/layout/FormSteps/index.tsx","../src/display/FormSummary/index.tsx","../src/hooks/useFormEngine.ts","../src/hooks/useFormData.ts","../src/hooks/useFieldBehavior.ts","../src/hooks/useFormSubmit.ts","../src/hooks/useFieldPermission.ts","../src/utils/permissions.ts","../src/hooks/useFormDetail.ts","../src/utils/formInstanceData.ts","../src/hooks/useProcessDetail.ts","../src/hooks/useApprovalActions.ts","../src/hooks/useChangeRecords.ts","../src/hooks/useFormNavigation.ts","../src/hooks/useDraftStorage.ts","../src/utils/defineFormSchema.ts","../src/modules/FormSummaryCard.tsx","../src/modules/RecordChangePanel.tsx","../src/modules/ChangeRecords.tsx","../src/modules/ApprovalTimeline.tsx","../src/modules/ApprovalActionBar.tsx","../src/modules/StickyActionBar.tsx","../src/utils/confirmAction.ts","../src/modules/ApprovalActions.tsx","../src/modules/FormActionBar.tsx","../src/modules/RuntimePageShell.tsx","../src/modules/SummaryPanel.tsx","../src/modules/DraftManager.tsx","../src/modules/ProcessPreview.tsx","../src/modules/DataManagementList.tsx","../src/templates/FormSubmitTemplate.tsx","../src/templates/FormDetailTemplate.tsx","../src/templates/PageSkeleton.tsx","../src/templates/ProcessDetailTemplate.tsx"],"sourcesContent":["// 主入口 - 导出所有公共 API\nexport * from './types';\nexport * from './core';\nexport * from './fields';\nexport * from './layout';\nexport * from './display';\nexport * from './hooks';\nexport * from './utils';\nexport * from './modules';\nexport * from './templates';\n","import React, { useCallback, useRef, useState, useMemo } from 'react';\nimport type { FormSchema, FormEngineConfig, FieldBehavior, ValidationRule } from '../types';\nimport { FormContext } from './FormContext';\nimport type { FormContextValue } from './FormContext';\nimport { ComponentRegistryProvider } from './ComponentRegistry';\nimport { defaultComponentRegistry } from './defaultRegistry';\nimport { evaluateEffects } from './effects';\nimport { validateField as validateFieldUtil, validateAllFields } from './validation';\nimport { createFormRuntimeApi } from './runtimeApi';\n\nexport interface FormProviderProps {\n schema: FormSchema;\n config: FormEngineConfig;\n initialValues?: Record<string, any>;\n components?: Record<string, React.ComponentType<any>>;\n children: React.ReactNode;\n}\n\nexport function FormProvider({\n schema,\n config,\n initialValues,\n components,\n children,\n}: FormProviderProps) {\n // Build initial values from schema defaults + explicit initial values\n const computedInitialValues = useMemo(() => {\n const values: Record<string, any> = {};\n for (const field of schema.fields) {\n if (field.defaultValue !== undefined) {\n values[field.fieldId] = field.defaultValue;\n }\n }\n return { ...values, ...initialValues };\n }, [schema, initialValues]);\n\n const initialValuesRef = useRef(computedInitialValues);\n const [formData, setFormData] = useState<Record<string, any>>({ ...computedInitialValues });\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const [registeredFields] = useState<Set<string>>(new Set());\n const api = useMemo(() => createFormRuntimeApi(config.api), [config.api]);\n\n // Compute field behaviors\n const fieldBehaviors = useMemo(() => {\n const baseBehaviors: Record<string, FieldBehavior> = {};\n for (const field of schema.fields) {\n baseBehaviors[field.fieldId] = field.behavior || 'NORMAL';\n }\n\n let computed = baseBehaviors;\n if (config.effects && config.effects.length > 0) {\n computed = evaluateEffects(config.effects, formData, baseBehaviors);\n }\n\n if (config.permissions?.fieldPermissions) {\n for (const [fieldId, behavior] of Object.entries(config.permissions.fieldPermissions)) {\n computed[fieldId] = behavior;\n }\n }\n\n if (config.mode === 'readonly') {\n for (const fieldId of Object.keys(computed)) {\n if (computed[fieldId] !== 'HIDDEN') {\n computed[fieldId] = 'READONLY';\n }\n }\n }\n\n return computed;\n }, [schema, config.effects, config.permissions, config.mode, formData]);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n setFieldErrors((prev) => {\n if (prev[fieldId]) {\n const next = { ...prev };\n delete next[fieldId];\n return next;\n }\n return prev;\n });\n }, []);\n\n const getFieldValue = useCallback((fieldId: string) => formData[fieldId], [formData]);\n\n const getFormData = useCallback(() => ({ ...formData }), [formData]);\n\n const validateFieldById = useCallback(\n async (fieldId: string): Promise<boolean> => {\n const field = schema.fields.find((f) => f.fieldId === fieldId);\n if (!field) return true;\n\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n\n if (rules.length === 0) return true;\n\n const error = await validateFieldUtil(formData[fieldId], rules);\n setFieldErrors((prev) => {\n if (error) {\n return { ...prev, [fieldId]: error };\n }\n const next = { ...prev };\n delete next[fieldId];\n return next;\n });\n return !error;\n },\n [schema, formData],\n );\n\n const validateAll = useCallback(async (): Promise<boolean> => {\n const fieldRules: Record<string, ValidationRule[]> = {};\n for (const field of schema.fields) {\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n if (rules.length > 0) {\n fieldRules[field.fieldId] = rules;\n }\n }\n\n const errors = await validateAllFields(formData, fieldRules);\n setFieldErrors(errors);\n return Object.keys(errors).length === 0;\n }, [schema, formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setFieldErrors({});\n }, []);\n\n const registerField = useCallback(\n (fieldId: string) => {\n registeredFields.add(fieldId);\n },\n [registeredFields],\n );\n\n const unregisterField = useCallback(\n (fieldId: string) => {\n registeredFields.delete(fieldId);\n },\n [registeredFields],\n );\n\n const contextValue: FormContextValue = useMemo(\n () => ({\n mode: config.mode,\n schema,\n formData,\n fieldErrors,\n fieldBehaviors,\n api,\n config: {\n mode: config.mode,\n formUuid: config.formUuid,\n appType: config.appType,\n formInstanceId: config.formInstanceId,\n submit: config.submit,\n },\n setFieldValue,\n getFieldValue,\n getFormData,\n validateField: validateFieldById,\n validateAll,\n resetForm,\n registerField,\n unregisterField,\n }),\n [\n config.mode,\n config.formUuid,\n schema,\n formData,\n fieldErrors,\n fieldBehaviors,\n api,\n config.appType,\n config.formInstanceId,\n config.submit,\n setFieldValue,\n getFieldValue,\n getFormData,\n validateFieldById,\n validateAll,\n resetForm,\n registerField,\n unregisterField,\n ],\n );\n\n const registryComponents = components ?? defaultComponentRegistry;\n\n return React.createElement(\n FormContext.Provider,\n { value: contextValue },\n React.createElement(ComponentRegistryProvider, { components: registryComponents, children }),\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { FieldBehavior, FormEngineConfig, FormRuntimeApi, FormSchema } from '../types';\n\nexport interface FormContextValue {\n mode: 'submit' | 'edit' | 'readonly';\n schema: FormSchema;\n formData: Record<string, any>;\n fieldErrors: Record<string, string>;\n fieldBehaviors: Record<string, FieldBehavior>;\n api: FormRuntimeApi;\n config: Pick<FormEngineConfig, 'mode' | 'formUuid' | 'appType' | 'formInstanceId' | 'submit'>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n validateField: (fieldId: string) => Promise<boolean>;\n validateAll: () => Promise<boolean>;\n resetForm: () => void;\n registerField: (fieldId: string) => void;\n unregisterField: (fieldId: string) => void;\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\nexport function useFormContext(): FormContextValue {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useFormContext must be used within a FormProvider');\n }\n return context;\n}\n","import React, { createContext, useContext } from 'react';\n\nexport interface ComponentRegistryContextValue {\n registry: Record<string, React.ComponentType<any>>;\n register: (name: string, component: React.ComponentType<any>) => void;\n}\n\nconst ComponentRegistryContext = createContext<ComponentRegistryContextValue | null>(null);\n\nexport function ComponentRegistryProvider({\n components,\n children,\n}: {\n components: Record<string, React.ComponentType<any>>;\n children: React.ReactNode;\n}): React.ReactElement {\n const [registry, setRegistry] =\n React.useState<Record<string, React.ComponentType<any>>>(components);\n\n const register = React.useCallback((name: string, component: React.ComponentType<any>) => {\n setRegistry((prev) => ({ ...prev, [name]: component }));\n }, []);\n\n const value = React.useMemo(() => ({ registry, register }), [registry, register]);\n\n return React.createElement(ComponentRegistryContext.Provider, { value }, children);\n}\n\nexport function useComponent(componentName: string): React.ComponentType<any> | null {\n const context = useContext(ComponentRegistryContext);\n if (!context) {\n return null;\n }\n return context.registry[componentName] || null;\n}\n\nexport { ComponentRegistryContext };\n","import React, { useEffect } from 'react';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { TextFieldPC } from './TextFieldPC';\nimport { TextFieldMobile } from './TextFieldMobile';\nimport { TextFieldReadonly } from './TextFieldReadonly';\n\nexport function TextField(props: TextFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n // Compute effective behavior: prop > context > NORMAL\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n // Register field and set default value on mount\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: TextFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <TextFieldReadonly {...childProps} />\n ) : isMobile ? (\n <TextFieldMobile {...childProps} />\n ) : (\n <TextFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { useFormContext } from './FormContext';\n\n/** Simple className merge utility */\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport interface FieldWrapperProps {\n fieldId: string;\n label: string;\n required?: boolean;\n tips?: string;\n className?: string;\n labelClassName?: string;\n tipsClassName?: string;\n children: React.ReactNode;\n}\n\nexport function FieldWrapper({\n fieldId,\n label,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n children,\n}: FieldWrapperProps) {\n const { fieldErrors } = useFormContext();\n const error = fieldErrors[fieldId];\n\n return (\n <div className={cn('sy-field-wrapper', className)} data-field-id={fieldId}>\n <label className={cn('sy-field-label', labelClassName)}>\n {required && (\n <span className=\"sy-field-required\" aria-hidden=\"true\">\n *\n </span>\n )}\n {label}\n </label>\n <div className=\"sy-field-control\">{children}</div>\n {tips && !error && (\n <div className={cn('sy-field-tips', tipsClassName)} data-testid={`tips-${fieldId}`}>\n {tips}\n </div>\n )}\n {error && (\n <div className=\"sy-field-error\" role=\"alert\" data-testid={`error-${fieldId}`}>\n {error}\n </div>\n )}\n </div>\n );\n}\n","import { useSyncExternalStore } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction subscribe(callback: () => void): () => void {\n let prev = window.innerWidth < MOBILE_BREAKPOINT;\n const handler = () => {\n const next = window.innerWidth < MOBILE_BREAKPOINT;\n if (next !== prev) {\n prev = next;\n callback();\n }\n };\n window.addEventListener('resize', handler);\n return () => window.removeEventListener('resize', handler);\n}\n\nfunction getSnapshot(): boolean {\n return window.innerWidth < MOBILE_BREAKPOINT;\n}\n\nexport interface DeviceDetectResult {\n isMobile: boolean;\n}\n\nexport function useDeviceDetect(): DeviceDetectResult {\n const isMobile = useSyncExternalStore(\n subscribe,\n getSnapshot,\n /* v8 ignore next */\n () => false,\n );\n return { isMobile };\n}\n","import React from 'react';\nimport { Input } from 'antd';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextFieldPC({\n fieldId,\n placeholder,\n maxLength,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: TextFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(e.target.value);\n };\n\n return (\n <Input\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n data-testid={`textfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Input } from 'antd-mobile';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextFieldMobile({\n fieldId,\n placeholder,\n maxLength,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: TextFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = () => {\n onBlur?.(value);\n };\n\n return (\n <div className={inputClassName} data-testid={`textfield-input-${fieldId}`}>\n <Input\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextFieldReadonly({ fieldId, readonlyClassName }: TextFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n const display = value != null && value !== '' ? String(value) : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`textfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { NumberFieldPC } from './NumberFieldPC';\nimport { NumberFieldMobile } from './NumberFieldMobile';\nimport { NumberFieldReadonly } from './NumberFieldReadonly';\n\nexport function NumberField(props: NumberFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: NumberFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <NumberFieldReadonly {...childProps} />\n ) : isMobile ? (\n <NumberFieldMobile {...childProps} />\n ) : (\n <NumberFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { InputNumber } from 'antd';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n min,\n max,\n step,\n precision,\n onChange,\n onBlur,\n}: NumberFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as number | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: number | null) => {\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = () => {\n onBlur?.(value ?? null);\n };\n\n return (\n <InputNumber\n className={inputClassName}\n style={{ width: '100%' }}\n value={value ?? null}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n precision={precision}\n onChange={handleChange}\n onBlur={handleBlur}\n data-testid={`numberfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Input } from 'antd-mobile';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: NumberFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n const num = v === '' ? null : Number(v);\n const finalValue = num !== null && isNaN(num) ? null : num;\n setFieldValue(fieldId, finalValue);\n onChange?.(finalValue);\n };\n\n const handleBlur = () => {\n onBlur?.(value ?? null);\n };\n\n return (\n <div className={inputClassName} data-testid={`numberfield-input-${fieldId}`}>\n <Input\n type=\"number\"\n value={value != null ? String(value) : ''}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldReadonly({ fieldId, readonlyClassName }: NumberFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n const display = value != null ? String(value) : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`numberfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { TextAreaFieldPC } from './TextAreaFieldPC';\nimport { TextAreaFieldMobile } from './TextAreaFieldMobile';\nimport { TextAreaFieldReadonly } from './TextAreaFieldReadonly';\n\nexport function TextAreaField(props: TextAreaFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: TextAreaFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <TextAreaFieldReadonly {...childProps} />\n ) : isMobile ? (\n <TextAreaFieldMobile {...childProps} />\n ) : (\n <TextAreaFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Input } from 'antd';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nconst { TextArea } = Input;\n\nexport function TextAreaFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n rows,\n maxLength,\n showCount,\n onChange,\n onBlur,\n}: TextAreaFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value;\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n onBlur?.(e.target.value);\n };\n\n return (\n <TextArea\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n showCount={showCount}\n onChange={handleChange}\n onBlur={handleBlur}\n data-testid={`textareafield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { TextArea } from 'antd-mobile';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextAreaFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n rows,\n maxLength,\n showCount,\n onChange,\n onBlur,\n}: TextAreaFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = () => {\n onBlur?.(value);\n };\n\n return (\n <div className={inputClassName} data-testid={`textareafield-input-${fieldId}`}>\n <TextArea\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n showCount={showCount}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextAreaFieldReadonly({ fieldId, readonlyClassName }: TextAreaFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n const display = value != null && value !== '' ? String(value) : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`textareafield-readonly-${fieldId}`}\n style={{ whiteSpace: 'pre-wrap' }}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { SelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { SelectFieldPC } from './SelectFieldPC';\nimport { SelectFieldMobile } from './SelectFieldMobile';\nimport { SelectFieldReadonly } from './SelectFieldReadonly';\n\nexport function SelectField(props: SelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: SelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <SelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <SelectFieldMobile {...childProps} />\n ) : (\n <SelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Select } from 'antd';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SelectFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n options,\n allowClear,\n onChange,\n}: SelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (val: string | undefined) => {\n if (val === undefined) {\n setFieldValue(fieldId, null);\n onChange?.(null);\n } else {\n const option = options.find((o) => o.value === val) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n }\n };\n\n return (\n <Select\n className={inputClassName}\n style={{ width: '100%' }}\n value={value?.value ?? undefined}\n placeholder={placeholder}\n disabled={disabled}\n allowClear={allowClear}\n options={options}\n onChange={handleChange}\n data-testid={`selectfield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { Picker } from 'antd-mobile';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SelectFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n options,\n onChange,\n}: SelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n\n const columns = [options.map((o) => ({ label: o.label, value: o.value }))];\n\n const handleConfirm = (val: any[]) => {\n const selected = val[0] as string | null;\n if (selected) {\n const option = options.find((o) => o.value === selected) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n } else {\n setFieldValue(fieldId, null);\n onChange?.(null);\n }\n };\n\n return (\n <div className={inputClassName} data-testid={`selectfield-input-${fieldId}`}>\n <div\n onClick={() => !disabled && setVisible(true)}\n data-testid={`selectfield-trigger-${fieldId}`}\n >\n {value?.label ?? placeholder ?? '请选择'}\n </div>\n <Picker\n columns={columns}\n visible={visible}\n onClose={() => setVisible(false)}\n onConfirm={handleConfirm}\n value={value ? [value.value] : []}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SelectFieldReadonly({ fieldId, readonlyClassName }: SelectFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const display = value?.label ?? '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`selectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { MultiSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { MultiSelectFieldPC } from './MultiSelectFieldPC';\nimport { MultiSelectFieldMobile } from './MultiSelectFieldMobile';\nimport { MultiSelectFieldReadonly } from './MultiSelectFieldReadonly';\n\nexport function MultiSelectField(props: MultiSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: MultiSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <MultiSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <MultiSelectFieldMobile {...childProps} />\n ) : (\n <MultiSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Select } from 'antd';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function MultiSelectFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n options,\n maxCount,\n onChange,\n}: MultiSelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: string[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n return (\n <Select\n mode=\"multiple\"\n className={inputClassName}\n style={{ width: '100%' }}\n value={value.map((v) => v.value)}\n placeholder={placeholder}\n disabled={disabled}\n maxCount={maxCount}\n options={options}\n onChange={handleChange}\n data-testid={`multiselectfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Selector } from 'antd-mobile';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function MultiSelectFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n options,\n onChange,\n}: MultiSelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: string[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n return (\n <div className={inputClassName} data-testid={`multiselectfield-input-${fieldId}`}>\n <Selector\n multiple\n options={options}\n value={value.map((v) => v.value)}\n onChange={handleChange}\n disabled={disabled}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function MultiSelectFieldReadonly({ fieldId, readonlyClassName }: MultiSelectFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const display = value.length > 0 ? value.map((v) => v.label).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`multiselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { RadioFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { RadioFieldPC } from './RadioFieldPC';\nimport { RadioFieldMobile } from './RadioFieldMobile';\nimport { RadioFieldReadonly } from './RadioFieldReadonly';\n\nexport function RadioField(props: RadioFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: RadioFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <RadioFieldReadonly {...childProps} />\n ) : isMobile ? (\n <RadioFieldMobile {...childProps} />\n ) : (\n <RadioFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Radio } from 'antd';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function RadioFieldPC({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: RadioFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (e: any) => {\n const val = e.target.value as string;\n const option = options.find((o) => o.value === val) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n };\n\n const style: React.CSSProperties =\n direction === 'vertical' ? { display: 'flex', flexDirection: 'column', gap: 8 } : {};\n\n return (\n <Radio.Group\n className={inputClassName}\n value={value?.value ?? undefined}\n disabled={disabled}\n onChange={handleChange}\n data-testid={`radiofield-input-${fieldId}`}\n style={style}\n >\n {options.map((o) => (\n <Radio key={o.value} value={o.value}>\n {o.label}\n </Radio>\n ))}\n </Radio.Group>\n );\n}\n","import React from 'react';\nimport { Radio, Space } from 'antd-mobile';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function RadioFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: RadioFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (val: string) => {\n const option = options.find((o) => o.value === val) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n };\n\n return (\n <div className={inputClassName} data-testid={`radiofield-input-${fieldId}`}>\n <Radio.Group value={value?.value} onChange={handleChange as any} disabled={disabled}>\n <Space direction={direction === 'horizontal' ? 'horizontal' : 'vertical'}>\n {options.map((o) => (\n <Radio key={o.value} value={o.value}>\n {o.label}\n </Radio>\n ))}\n </Space>\n </Radio.Group>\n </div>\n );\n}\n","import React from 'react';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function RadioFieldReadonly({ fieldId, readonlyClassName }: RadioFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const display = value?.label ?? '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`radiofield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { CheckboxFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { CheckboxFieldPC } from './CheckboxFieldPC';\nimport { CheckboxFieldMobile } from './CheckboxFieldMobile';\nimport { CheckboxFieldReadonly } from './CheckboxFieldReadonly';\n\nexport function CheckboxField(props: CheckboxFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: CheckboxFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <CheckboxFieldReadonly {...childProps} />\n ) : isMobile ? (\n <CheckboxFieldMobile {...childProps} />\n ) : (\n <CheckboxFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Checkbox } from 'antd';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CheckboxFieldPC({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: CheckboxFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: any[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n const style: React.CSSProperties =\n direction === 'vertical' ? { display: 'flex', flexDirection: 'column', gap: 8 } : {};\n\n return (\n <Checkbox.Group\n className={inputClassName}\n value={value.map((v) => v.value)}\n disabled={disabled}\n onChange={handleChange}\n data-testid={`checkboxfield-input-${fieldId}`}\n style={style}\n >\n {options.map((o) => (\n <Checkbox key={o.value} value={o.value}>\n {o.label}\n </Checkbox>\n ))}\n </Checkbox.Group>\n );\n}\n","import React from 'react';\nimport { Checkbox, Space } from 'antd-mobile';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CheckboxFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: CheckboxFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: string[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n return (\n <div className={inputClassName} data-testid={`checkboxfield-input-${fieldId}`}>\n <Checkbox.Group\n value={value.map((v) => v.value)}\n onChange={handleChange as any}\n disabled={disabled}\n >\n <Space direction={direction === 'horizontal' ? 'horizontal' : 'vertical'}>\n {options.map((o) => (\n <Checkbox key={o.value} value={o.value}>\n {o.label}\n </Checkbox>\n ))}\n </Space>\n </Checkbox.Group>\n </div>\n );\n}\n","import React from 'react';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CheckboxFieldReadonly({ fieldId, readonlyClassName }: CheckboxFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const display = value.length > 0 ? value.map((v) => v.label).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`checkboxfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { DateFieldPC } from './DateFieldPC';\nimport { DateFieldMobile } from './DateFieldMobile';\nimport { DateFieldReadonly } from './DateFieldReadonly';\n\nexport function DateField(props: DateFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: DateFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <DateFieldReadonly {...childProps} />\n ) : isMobile ? (\n <DateFieldMobile {...childProps} />\n ) : (\n <DateFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { DatePicker } from 'antd';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DateFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n onChange,\n}: DateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const disabled = behavior === 'DISABLED';\n const format = dateFormat ?? (showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD');\n const pickerValue = value && dayjs(value).isValid() ? dayjs(value) : null;\n\n const handleChange = (_date: Dayjs | null, dateString: string | string[] | null) => {\n const val = Array.isArray(dateString) ? dateString[0] : (dateString ?? '');\n setFieldValue(fieldId, val || '');\n onChange?.(val || '');\n };\n\n return (\n <DatePicker\n className={inputClassName}\n style={{ width: '100%' }}\n value={pickerValue}\n placeholder={placeholder}\n disabled={disabled}\n format={format}\n showTime={showTime}\n onChange={handleChange}\n data-testid={`datefield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { DatePicker } from 'antd-mobile';\nimport dayjs from 'dayjs';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DateFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n onChange,\n}: DateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n const format = dateFormat ?? (showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD');\n const pickerValue = value && dayjs(value).isValid() ? dayjs(value).toDate() : undefined;\n\n const handleConfirm = (date: Date) => {\n const dateStr = dayjs(date).format(format);\n setFieldValue(fieldId, dateStr);\n onChange?.(dateStr);\n };\n\n return (\n <div className={inputClassName} data-testid={`datefield-input-${fieldId}`}>\n <div\n onClick={() => !disabled && setVisible(true)}\n data-testid={`datefield-trigger-${fieldId}`}\n >\n {value || placeholder || '请选择日期'}\n </div>\n <DatePicker\n visible={visible}\n value={pickerValue}\n precision={showTime ? 'second' : 'day'}\n onClose={() => setVisible(false)}\n onConfirm={handleConfirm}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DateFieldReadonly({ fieldId, readonlyClassName }: DateFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const display = value && value !== '' ? value : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`datefield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { CascadeDateFieldPC } from './CascadeDateFieldPC';\nimport { CascadeDateFieldMobile } from './CascadeDateFieldMobile';\nimport { CascadeDateFieldReadonly } from './CascadeDateFieldReadonly';\n\nexport function CascadeDateField(props: CascadeDateFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: CascadeDateFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <CascadeDateFieldReadonly {...childProps} />\n ) : isMobile ? (\n <CascadeDateFieldMobile {...childProps} />\n ) : (\n <CascadeDateFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { DatePicker } from 'antd';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nconst { RangePicker } = DatePicker;\n\nexport function CascadeDateFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n onChange,\n}: CascadeDateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as { start: string; end: string } | null | undefined;\n const disabled = behavior === 'DISABLED';\n const format = dateFormat ?? 'YYYY-MM-DD';\n const startValue = value?.start && dayjs(value.start).isValid() ? dayjs(value.start) : null;\n const endValue = value?.end && dayjs(value.end).isValid() ? dayjs(value.end) : null;\n const pickerValue =\n startValue || endValue ? ([startValue, endValue] as [Dayjs | null, Dayjs | null]) : null;\n\n const handleChange = (\n _dates: null | [Dayjs | null, Dayjs | null],\n dateStrings: [string, string],\n ) => {\n const [start, end] = dateStrings;\n if (start && end) {\n const val = { start, end };\n setFieldValue(fieldId, val);\n onChange?.(val);\n } else {\n setFieldValue(fieldId, null);\n onChange?.(null);\n }\n };\n\n return (\n <RangePicker\n className={inputClassName}\n style={{ width: '100%' }}\n value={pickerValue}\n placeholder={placeholder ? [placeholder, placeholder] : undefined}\n disabled={disabled}\n format={format}\n onChange={handleChange}\n data-testid={`cascadedatefield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { DatePicker } from 'antd-mobile';\nimport dayjs from 'dayjs';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CascadeDateFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n startLabel,\n endLabel,\n dateFormat,\n onChange,\n}: CascadeDateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as { start: string; end: string } | null | undefined;\n const disabled = behavior === 'DISABLED';\n const [startVisible, setStartVisible] = useState(false);\n const [endVisible, setEndVisible] = useState(false);\n const format = dateFormat ?? 'YYYY-MM-DD';\n const startValue =\n value?.start && dayjs(value.start).isValid() ? dayjs(value.start).toDate() : undefined;\n const endValue = value?.end && dayjs(value.end).isValid() ? dayjs(value.end).toDate() : undefined;\n\n const handleStartConfirm = (date: Date) => {\n const dateStr = dayjs(date).format(format);\n const newVal = { start: dateStr, end: value?.end ?? '' };\n setFieldValue(fieldId, newVal);\n onChange?.(newVal);\n };\n\n const handleEndConfirm = (date: Date) => {\n const dateStr = dayjs(date).format(format);\n const newVal = { start: value?.start ?? '', end: dateStr };\n setFieldValue(fieldId, newVal);\n onChange?.(newVal);\n };\n\n return (\n <div className={inputClassName} data-testid={`cascadedatefield-input-${fieldId}`}>\n <div\n onClick={() => !disabled && setStartVisible(true)}\n data-testid={`cascadedatefield-start-${fieldId}`}\n >\n {value?.start || startLabel || '开始日期'}\n </div>\n <span> ~ </span>\n <div\n onClick={() => !disabled && setEndVisible(true)}\n data-testid={`cascadedatefield-end-${fieldId}`}\n >\n {value?.end || endLabel || '结束日期'}\n </div>\n <DatePicker\n visible={startVisible}\n value={startValue}\n onClose={() => setStartVisible(false)}\n onConfirm={handleStartConfirm}\n />\n <DatePicker\n visible={endVisible}\n value={endValue}\n onClose={() => setEndVisible(false)}\n onConfirm={handleEndConfirm}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CascadeDateFieldReadonly({ fieldId, readonlyClassName }: CascadeDateFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as { start: string; end: string } | null | undefined;\n const display = value && value.start && value.end ? `${value.start} ~ ${value.end}` : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`cascadedatefield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { AttachmentFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { AttachmentFieldPC } from './AttachmentFieldPC';\nimport { AttachmentFieldMobile } from './AttachmentFieldMobile';\nimport { AttachmentFieldReadonly } from './AttachmentFieldReadonly';\n\nexport function AttachmentField(props: AttachmentFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: AttachmentFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <AttachmentFieldReadonly {...childProps} />\n ) : isMobile ? (\n <AttachmentFieldMobile {...childProps} />\n ) : (\n <AttachmentFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Upload, Button } from 'antd';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n createUid,\n formatFileSize,\n getFileCategory,\n getFileExtension,\n isImageFile,\n normalizeAttachmentItem,\n} from '../shared/fieldFormat';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => {\n const uid = file.uid || createUid('attachment');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nconst PREVIEW_PAGE_EXTENSIONS = [\n 'pdf',\n 'xls',\n 'xlsx',\n 'csv',\n 'txt',\n 'json',\n 'xml',\n 'log',\n 'md',\n 'doc',\n 'docx',\n 'ppt',\n 'pptx',\n];\n\nfunction canPreview(item: AttachmentItem) {\n const ext = getFileExtension(item.name);\n return (\n isImageFile(item.name, item.contentType) ||\n ['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext) ||\n PREVIEW_PAGE_EXTENSIONS.includes(ext)\n );\n}\n\nexport function AttachmentFieldPC({\n fieldId,\n behavior,\n maxCount,\n accept,\n maxSize,\n bucketName = 'attachments',\n multiple = true,\n allowedTypes,\n showPreview = true,\n showDownload = true,\n showFileSize = true,\n showFileTypeBadge = true,\n previewPagePath = '/file-preview',\n onChange,\n}: AttachmentFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const setValue = (items: AttachmentItem[]) => {\n setFieldValue(fieldId, items);\n onChange?.(items);\n };\n\n const handleChange = (info: any) => {\n const fileList: any[] = info.fileList ?? [];\n const items: AttachmentItem[] = fileList.map((f: any) => {\n if (f.uid === undefined && f.name === undefined && f.url === undefined && !f.response) {\n return { url: '', name: '', id: '' };\n }\n return normalizeAttachmentItem({\n url: f.url ?? f.response?.url ?? '',\n name: f.name,\n id: f.uid ?? f.response?.id,\n uid: f.uid ?? f.response?.uid,\n status: f.status,\n percent: f.percent,\n objectName: f.objectName ?? f.response?.objectName,\n bucketName: f.bucketName ?? f.response?.bucketName,\n size: f.size ?? f.response?.size,\n contentType: f.type ?? f.response?.contentType,\n downloadUrl: f.downloadUrl ?? f.response?.downloadUrl,\n previewUrl: f.previewUrl ?? f.response?.previewUrl,\n });\n });\n setValue(items);\n };\n\n const handleRemove = (file: any) => {\n const removed = value.find((item) => item.id === file.uid || item.uid === file.uid);\n const newValue = value.filter((item) => item.id !== file.uid && item.uid !== file.uid);\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const resolvePreviewUrl = async (item: AttachmentItem) => {\n let url = item.previewUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n const ticketValue = typeof ticket === 'string' ? { previewUrl: ticket } : ticket;\n if (ticketValue?.previewPageUrl && ticketValue?.ticket) {\n const separator = ticketValue.previewPageUrl.includes('?') ? '&' : '?';\n return `${ticketValue.previewPageUrl}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n url = ticketValue?.previewUrl || ticketValue?.url || url;\n if (ticketValue?.ticket && PREVIEW_PAGE_EXTENSIONS.includes(getFileExtension(item.name))) {\n const separator = previewPagePath.includes('?') ? '&' : '?';\n return `${previewPagePath}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n }\n return url;\n };\n\n const resolveDownloadUrl = async (item: AttachmentItem) => {\n let url = item.downloadUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n url =\n typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || url;\n }\n return url;\n };\n\n const handlePreview = async (file: any) => {\n const item = value.find((current) => current.id === file.uid || current.uid === file.uid);\n const url = item ? await resolvePreviewUrl(item) : file.url;\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const handleDownload = async (item: AttachmentItem) => {\n const url = await resolveDownloadUrl(item);\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const fileList = value.map((item) => ({\n uid: item.id,\n name: item.name,\n url: item.url,\n status: item.status ?? ('done' as const),\n percent: item.percent,\n }));\n\n const beforeUpload = (file: any) => {\n if (maxSize && file.size / 1024 / 1024 > maxSize) {\n return false;\n }\n const ext = String(file.name || '')\n .split('.')\n .pop()\n ?.toLowerCase();\n if (allowedTypes?.length && ext && !allowedTypes.includes(ext)) {\n return false;\n }\n return true;\n };\n\n const customRequest = async ({ file, onProgress, onSuccess, onError }: any) => {\n const currentFile = file as File & { uid?: string };\n const localItem = createLocalItem(currentFile);\n const nextValue = multiple ? [...value, localItem].slice(0, maxCount ?? Infinity) : [localItem];\n setValue(nextValue);\n try {\n const uploaded = await api.uploadFile(currentFile, bucketName, (percent) => {\n onProgress?.({ percent });\n setValue(\n nextValue.map((item) =>\n item.id === localItem.id ? { ...item, percent, status: 'uploading' } : item,\n ),\n );\n });\n const completed = normalizeAttachmentItem({\n ...uploaded,\n id: uploaded.id || localItem.id,\n uid: uploaded.uid || localItem.uid,\n url: uploaded.url || localItem.url,\n status: 'done',\n percent: 100,\n extension: uploaded.extension || getFileExtension(uploaded.name || localItem.name),\n });\n setValue(nextValue.map((item) => (item.id === localItem.id ? completed : item)));\n onSuccess?.(completed);\n } catch (error: any) {\n const failed = {\n ...localItem,\n status: 'error' as const,\n error: error?.message || '上传失败',\n };\n setValue(nextValue.map((item) => (item.id === localItem.id ? failed : item)));\n onError?.(error);\n }\n };\n\n return (\n <div className=\"sy-attachment-field\" data-testid={`attachmentfield-enhanced-${fieldId}`}>\n <Upload\n data-testid={`attachmentfield-input-${fieldId}`}\n fileList={fileList}\n customRequest={customRequest}\n accept={accept}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\n onChange={handleChange}\n onRemove={handleRemove}\n onPreview={handlePreview}\n beforeUpload={beforeUpload}\n >\n <Button disabled={disabled} data-testid={`attachmentfield-upload-btn-${fieldId}`}>\n 上传文件\n </Button>\n </Upload>\n {value.length > 0 && (\n <div className=\"sy-file-list\" data-testid={`attachmentfield-rich-list-${fieldId}`}>\n {value.map((item) => {\n const category = getFileCategory(item.name, item.contentType);\n const extension = getFileExtension(item.name);\n return (\n <div className=\"sy-file-item\" key={item.id || item.uid || item.name}>\n <span className={`sy-file-icon sy-file-icon-${category}`} aria-hidden=\"true\">\n {category === 'image' ? 'IMG' : extension || 'FILE'}\n </span>\n <div className=\"sy-file-meta\">\n <span className=\"sy-file-name\" title={item.name}>\n {item.name}\n </span>\n <span className=\"sy-file-sub\">\n {item.status === 'uploading'\n ? `上传中 ${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : [\n showFileTypeBadge && extension ? extension.toUpperCase() : '',\n showFileSize ? formatFileSize(item.size) : '',\n ]\n .filter(Boolean)\n .join(' · ') || '已上传'}\n </span>\n </div>\n <div className=\"sy-file-actions\">\n {showPreview && canPreview(item) && (\n <button\n type=\"button\"\n disabled={item.status !== 'done'}\n onClick={() => handlePreview({ uid: item.uid || item.id, url: item.url })}\n >\n 预览\n </button>\n )}\n {showDownload && (\n <button\n type=\"button\"\n disabled={item.status !== 'done'}\n onClick={() => handleDownload(item)}\n >\n 下载\n </button>\n )}\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemove({ uid: item.uid || item.id })}\n >\n 删除\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import type { AttachmentItem, DepartmentTreeNode, UserItem } from '../../types';\n\nexport const EMPTY_TEXT = '--';\n\nexport function createUid(prefix = 'field') {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function getUserId(user: Partial<UserItem> | any): string {\n return String(user?.id || user?.value || user?.key || '').trim();\n}\n\nexport function getUserName(user: Partial<UserItem> | any): string {\n return String(user?.name || user?.label || user?.title || user?.username || getUserId(user));\n}\n\nexport function normalizeUser(user: any): UserItem {\n const id = getUserId(user);\n return {\n ...user,\n id,\n name: getUserName({ ...user, id }),\n };\n}\n\nexport function getDepartmentId(node: Partial<DepartmentTreeNode> | any): string {\n return String(node?.id || node?.value || node?.key || '').trim();\n}\n\nexport function getDepartmentName(node: Partial<DepartmentTreeNode> | any): string {\n return String(node?.name || node?.label || node?.title || getDepartmentId(node));\n}\n\nexport function normalizeDepartmentNode(node: any): DepartmentTreeNode {\n const id = getDepartmentId(node);\n const name = getDepartmentName({ ...node, id });\n const hasChildren =\n typeof node?.hasChildren === 'boolean'\n ? node.hasChildren\n : Array.isArray(node?.children) && node.children.length > 0;\n const children = Array.isArray(node?.children)\n ? node.children.map((child: any) => normalizeDepartmentNode(child))\n : undefined;\n return {\n ...node,\n id,\n name,\n key: String(node?.key || id),\n title: String(node?.title || name),\n hasChildren,\n isLeaf: typeof node?.isLeaf === 'boolean' ? node.isLeaf : !hasChildren,\n children,\n };\n}\n\nexport function flattenDepartments(nodes: DepartmentTreeNode[]) {\n const result: Array<{ id: string; name: string; node: DepartmentTreeNode }> = [];\n const walk = (items: DepartmentTreeNode[]) => {\n for (const node of items) {\n const id = getDepartmentId(node);\n if (id) result.push({ id, name: getDepartmentName(node), node });\n if (node.children?.length) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\nexport function formatFileSize(bytes?: number): string {\n if (!bytes) return '';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${Number(value.toFixed(value >= 10 || index === 0 ? 0 : 1))} ${units[index]}`;\n}\n\nexport function getFileExtension(fileName?: string): string {\n return (\n String(fileName || '')\n .split('.')\n .pop()\n ?.toLowerCase() || ''\n );\n}\n\nexport function isImageFile(fileName?: string, contentType?: string): boolean {\n return (\n String(contentType || '').startsWith('image/') ||\n ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp'].includes(getFileExtension(fileName))\n );\n}\n\nexport function getFileCategory(fileName?: string, contentType?: string) {\n const ext = getFileExtension(fileName);\n if (isImageFile(fileName, contentType)) return 'image';\n if (['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext)) return 'video';\n if (['mp3', 'wav', 'aac', 'flac', 'm4a', 'ogg'].includes(ext)) return 'audio';\n if (ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv'].includes(ext)) return 'excel';\n if (['doc', 'docx'].includes(ext)) return 'word';\n if (['ppt', 'pptx'].includes(ext)) return 'ppt';\n if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) return 'archive';\n if (['txt', 'json', 'xml', 'log', 'md'].includes(ext)) return 'text';\n if (['js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'less', 'java', 'py'].includes(ext)) {\n return 'code';\n }\n return 'file';\n}\n\nexport function normalizeAttachmentItem(\n item: any,\n fallback?: Partial<AttachmentItem>,\n): AttachmentItem {\n const id = String(item?.id || item?.uid || item?.objectName || fallback?.id || createUid('file'));\n const name = String(item?.name || item?.originalName || fallback?.name || item?.fileName || id);\n return {\n ...fallback,\n ...item,\n id,\n uid: String(item?.uid || item?.id || fallback?.uid || id),\n name,\n originalName: item?.originalName || fallback?.originalName || name,\n url: String(item?.url || item?.downloadUrl || item?.previewUrl || fallback?.url || ''),\n status: item?.status || fallback?.status || 'done',\n size: item?.size ?? fallback?.size,\n percent: item?.percent ?? fallback?.percent,\n contentType: item?.contentType || item?.mimeType || fallback?.contentType,\n mimeType: item?.mimeType || item?.contentType || fallback?.mimeType,\n extension: item?.extension || fallback?.extension || getFileExtension(name),\n };\n}\n","import React from 'react';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function AttachmentFieldMobile({\n fieldId,\n behavior,\n maxCount,\n accept,\n maxSize,\n bucketName = 'attachments',\n multiple = true,\n allowedTypes,\n onChange,\n}: AttachmentFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const acceptedFiles = Array.from(files).filter((file) => {\n if (maxSize && file.size / 1024 / 1024 > maxSize) return false;\n const ext = String(file.name || '')\n .split('.')\n .pop()\n ?.toLowerCase();\n if (allowedTypes?.length && ext && !allowedTypes.includes(ext)) return false;\n return true;\n });\n const newItems: AttachmentItem[] = acceptedFiles.map((f) => {\n const uid = `${Date.now()}-${f.name}`;\n return {\n url: URL.createObjectURL(f),\n name: f.name,\n id: uid,\n uid,\n status: 'uploading',\n size: f.size,\n };\n });\n const merged = [...value, ...newItems].slice(0, maxCount ?? Infinity);\n setFieldValue(fieldId, merged);\n onChange?.(merged);\n acceptedFiles.forEach((file, index) => {\n const localId = newItems[index]?.id;\n api\n .uploadFile(file, bucketName)\n .then((uploaded) => {\n const current = ((formData[fieldId] as AttachmentItem[] | undefined) ?? merged).map(\n (item) => (item.id === localId ? { ...uploaded, id: uploaded.id || localId } : item),\n );\n setFieldValue(fieldId, current);\n onChange?.(current);\n })\n .catch(() => undefined);\n });\n };\n\n const handleRemove = (id: string) => {\n const removed = value.find((item) => item.id === id);\n const newValue = value.filter((item) => item.id !== id);\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n return (\n <div data-testid={`attachmentfield-mobile-${fieldId}`}>\n <input\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileSelect}\n data-testid={`attachmentfield-file-input-${fieldId}`}\n />\n <ul data-testid={`attachmentfield-list-${fieldId}`}>\n {value.map((item) => (\n <li key={item.id} data-testid={`attachmentfield-item-${item.id}`}>\n <span>{item.name}</span>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemove(item.id)}\n data-testid={`attachmentfield-remove-${item.id}`}\n >\n 删除\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","import React from 'react';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function AttachmentFieldReadonly({ fieldId, readonlyClassName }: AttachmentFieldProps) {\n const { formData, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n\n if (value.length === 0) {\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`attachmentfield-readonly-${fieldId}`}\n >\n --\n </div>\n );\n }\n\n return (\n <ul\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`attachmentfield-readonly-${fieldId}`}\n >\n {value.map((item) => (\n <li key={item.id}>\n <a\n href={item.downloadUrl || item.url || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={async (event) => {\n if (!item.objectName) return;\n event.preventDefault();\n const ticket = await api.createDownloadTicket(\n item.bucketName || 'attachments',\n item.objectName,\n item.name,\n );\n const url =\n typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.url || item.downloadUrl || item.url;\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n }}\n >\n {item.name}\n </a>\n </li>\n ))}\n </ul>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { ImageFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { ImageFieldPC } from './ImageFieldPC';\nimport { ImageFieldMobile } from './ImageFieldMobile';\nimport { ImageFieldReadonly } from './ImageFieldReadonly';\n\nexport function ImageField(props: ImageFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: ImageFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <ImageFieldReadonly {...childProps} />\n ) : isMobile ? (\n <ImageFieldMobile {...childProps} />\n ) : (\n <ImageFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Upload } from 'antd';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { createUid, getFileExtension, normalizeAttachmentItem } from '../shared/fieldFormat';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => {\n const uid = file.uid || createUid('image');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nexport function ImageFieldPC({\n fieldId,\n behavior,\n maxCount,\n accept,\n bucketName = 'images',\n multiple = true,\n maxSize,\n listType = 'picture-card',\n showPreviewIcon = true,\n showRemoveIcon = true,\n showDownloadIcon = true,\n onChange,\n}: ImageFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const setValue = (items: AttachmentItem[]) => {\n setFieldValue(fieldId, items);\n onChange?.(items);\n };\n\n const handleChange = (info: any) => {\n const fileList: any[] = info.fileList ?? [];\n const items: AttachmentItem[] = fileList.map((f: any) => {\n if (\n f.uid === undefined &&\n f.name === undefined &&\n f.url === undefined &&\n f.thumbUrl === undefined &&\n !f.response\n ) {\n return { url: '', name: '', id: '' };\n }\n return normalizeAttachmentItem({\n url: f.url ?? f.thumbUrl ?? f.response?.url ?? '',\n previewUrl: f.previewUrl ?? f.thumbUrl ?? f.response?.previewUrl,\n name: f.name,\n id: f.uid ?? f.response?.id,\n uid: f.uid ?? f.response?.uid,\n status: f.status,\n percent: f.percent,\n objectName: f.objectName ?? f.response?.objectName,\n bucketName: f.bucketName ?? f.response?.bucketName,\n size: f.size ?? f.response?.size,\n contentType: f.type ?? f.response?.contentType,\n });\n });\n setValue(items);\n };\n\n const handleRemove = (file: any) => {\n const removed = value.find((item) => item.id === file.uid || item.uid === file.uid);\n const newValue = value.filter((item) => item.id !== file.uid && item.uid !== file.uid);\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const handlePreview = async (file: any) => {\n const item = value.find((current) => current.id === file.uid || current.uid === file.uid);\n let url = item?.previewUrl || item?.url || file.url || file.thumbUrl;\n if (item?.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n url = typeof ticket === 'string' ? ticket : ticket?.previewUrl || ticket?.url || url;\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const fileList = value.map((item) => ({\n uid: item.id,\n name: item.name,\n url: item.url,\n thumbUrl: item.url,\n status: item.status ?? ('done' as const),\n percent: item.percent,\n }));\n\n const beforeUpload = (file: File) => {\n if (\n !String(file.type || '').startsWith('image/') &&\n !/\\.(png|jpe?g|gif|bmp|svg|webp)$/i.test(file.name)\n ) {\n return false;\n }\n if (maxSize && file.size / 1024 / 1024 > maxSize) {\n return false;\n }\n return true;\n };\n\n const customRequest = async ({ file, onProgress, onSuccess, onError }: any) => {\n const currentFile = file as File & { uid?: string };\n const localItem = createLocalItem(currentFile);\n const nextValue = multiple ? [...value, localItem].slice(0, maxCount ?? Infinity) : [localItem];\n setValue(nextValue);\n try {\n const uploaded = await api.uploadFile(currentFile, bucketName, (percent) => {\n onProgress?.({ percent });\n setValue(\n nextValue.map((item) =>\n item.id === localItem.id ? { ...item, percent, status: 'uploading' } : item,\n ),\n );\n });\n const completed = normalizeAttachmentItem({\n ...uploaded,\n id: uploaded.id || localItem.id,\n uid: uploaded.uid || localItem.uid,\n url: uploaded.previewUrl || uploaded.url || localItem.url,\n status: 'done',\n percent: 100,\n });\n setValue(nextValue.map((item) => (item.id === localItem.id ? completed : item)));\n onSuccess?.(completed);\n } catch (error: any) {\n const failed = {\n ...localItem,\n status: 'error' as const,\n error: error?.message || '上传失败',\n };\n setValue(nextValue.map((item) => (item.id === localItem.id ? failed : item)));\n onError?.(error);\n }\n };\n\n return (\n <div className=\"sy-image-field\" data-testid={`imagefield-enhanced-${fieldId}`}>\n <Upload\n data-testid={`imagefield-input-${fieldId}`}\n listType={listType}\n fileList={fileList}\n customRequest={customRequest}\n accept={accept ?? 'image/*'}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\n showUploadList={{\n showPreviewIcon,\n showRemoveIcon,\n showDownloadIcon,\n }}\n onChange={handleChange}\n onRemove={handleRemove}\n onPreview={handlePreview}\n beforeUpload={beforeUpload}\n >\n {(!maxCount || value.length < maxCount) && (\n <div data-testid={`imagefield-upload-btn-${fieldId}`}>+ 上传图片</div>\n )}\n </Upload>\n {value.length > 0 && (\n <div className=\"sy-image-grid\" data-testid={`imagefield-rich-grid-${fieldId}`}>\n {value.map((item) => (\n <button\n key={item.id || item.uid || item.name}\n type=\"button\"\n className=\"sy-image-thumb\"\n disabled={item.status !== 'done'}\n onClick={() =>\n handlePreview({\n uid: item.uid || item.id,\n url: item.url,\n thumbUrl: item.previewUrl,\n })\n }\n >\n {item.url || item.previewUrl ? (\n <img src={item.previewUrl || item.url} alt={item.name} />\n ) : (\n <span>{Math.round(item.percent ?? 0)}%</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { createUid, normalizeAttachmentItem } from '../shared/fieldFormat';\n\nconst getMobileImageUploader = () => {\n try {\n return (MobileAntd as any).ImageUploader;\n } catch {\n return undefined;\n }\n};\n\nconst getMobileToast = () => {\n try {\n return (MobileAntd as any).Toast;\n } catch {\n return undefined;\n }\n};\n\nexport function ImageFieldMobile({\n fieldId,\n behavior,\n maxCount,\n accept,\n bucketName = 'images',\n multiple = true,\n maxSize,\n onChange,\n}: ImageFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const setValue = (items: AttachmentItem[]) => {\n setFieldValue(fieldId, items);\n onChange?.(items);\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const acceptedFiles = Array.from(files).filter((file) => {\n const isImage =\n String(file.type || '').startsWith('image/') ||\n /\\.(png|jpe?g|gif|bmp|svg|webp)$/i.test(file.name);\n if (!isImage) return false;\n if (maxSize && file.size / 1024 / 1024 > maxSize) return false;\n return true;\n });\n const newItems: AttachmentItem[] = acceptedFiles.map((f) => {\n const uid = createUid('image');\n return {\n url: URL.createObjectURL(f),\n name: f.name,\n id: uid,\n uid,\n status: 'uploading',\n size: f.size,\n };\n });\n const merged = [...value, ...newItems].slice(0, maxCount ?? Infinity);\n setValue(merged);\n acceptedFiles.forEach((file, index) => {\n const localId = newItems[index]?.id;\n api\n .uploadFile(file, bucketName)\n .then((uploaded) => {\n const current = ((formData[fieldId] as AttachmentItem[] | undefined) ?? merged).map(\n (item) => (item.id === localId ? { ...uploaded, id: uploaded.id || localId } : item),\n );\n setValue(current);\n })\n .catch(() => undefined);\n });\n };\n\n const handleRemove = (id: string) => {\n const removed = value.find((item) => item.id === id);\n const newValue = value.filter((item) => item.id !== id);\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const ImageUploader = getMobileImageUploader();\n if (ImageUploader) {\n const upload = async (file: File) => {\n const isImage =\n String(file.type || '').startsWith('image/') ||\n /\\.(png|jpe?g|gif|bmp|svg|webp)$/i.test(file.name);\n if (!isImage) throw new Error('只支持图片格式');\n if (maxSize && file.size / 1024 / 1024 > maxSize) throw new Error('图片大小超出限制');\n const uploaded = await api.uploadFile(file, bucketName);\n const item = normalizeAttachmentItem({\n ...uploaded,\n id: uploaded.id || createUid('image'),\n uid: uploaded.uid || uploaded.id,\n url: uploaded.previewUrl || uploaded.url,\n status: 'done',\n });\n getMobileToast()?.show?.({ content: `${file.name} 上传成功` });\n return { key: item.uid || item.id, url: item.previewUrl || item.url, extra: item };\n };\n return (\n <div data-testid={`imagefield-mobile-${fieldId}`}>\n <ImageUploader\n value={value.map((item) => ({\n key: item.uid || item.id,\n url: item.previewUrl || item.url,\n extra: item,\n }))}\n upload={upload}\n onChange={(items: any[]) => {\n setValue(\n (items || []).map((item) =>\n normalizeAttachmentItem(\n item.extra || { id: item.key, uid: item.key, url: item.url },\n ),\n ),\n );\n }}\n maxCount={maxCount}\n multiple={multiple}\n disableUpload={disabled}\n deletable={!disabled}\n showUpload={!maxCount || value.length < maxCount}\n />\n </div>\n );\n }\n\n return (\n <div data-testid={`imagefield-mobile-${fieldId}`}>\n <input\n type=\"file\"\n accept={accept ?? 'image/*'}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileSelect}\n data-testid={`imagefield-file-input-${fieldId}`}\n />\n <div data-testid={`imagefield-grid-${fieldId}`}>\n {value.map((item) => (\n <div key={item.id} data-testid={`imagefield-thumb-${item.id}`}>\n <img src={item.url} alt={item.name} />\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemove(item.id)}\n data-testid={`imagefield-remove-${item.id}`}\n >\n 删除\n </button>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function ImageFieldReadonly({ fieldId, readonlyClassName }: ImageFieldProps) {\n const { formData, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n\n if (value.length === 0) {\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`imagefield-readonly-${fieldId}`}\n >\n --\n </div>\n );\n }\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`imagefield-readonly-${fieldId}`}\n >\n {value.map((item) => (\n <img\n key={item.id}\n src={item.previewUrl || item.url}\n alt={item.name}\n data-testid={`imagefield-readonly-img-${item.id}`}\n style={{ width: 80, height: 80, objectFit: 'cover', marginRight: 8 }}\n onClick={async () => {\n let url = item.previewUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || 'images',\n item.objectName,\n item.name,\n 'preview',\n );\n url = typeof ticket === 'string' ? ticket : ticket?.previewUrl || ticket?.url || url;\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n }}\n />\n ))}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { SubFormFieldPC } from './SubFormFieldPC';\nimport { SubFormFieldMobile } from './SubFormFieldMobile';\nimport { SubFormFieldReadonly } from './SubFormFieldReadonly';\n\nexport function SubFormField(props: SubFormFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: SubFormFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <SubFormFieldReadonly {...childProps} />\n ) : isMobile ? (\n <SubFormFieldMobile {...childProps} />\n ) : (\n <SubFormFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { FieldBehavior, SubFormColumn } from '../../types';\nimport { useComponent } from '../../core/ComponentRegistry';\nimport { FormContext, useFormContext } from '../../core/FormContext';\n\ninterface SubFormCellProps {\n parentFieldId: string;\n rowIndex: number;\n column: SubFormColumn;\n row: Record<string, any>;\n behavior?: FieldBehavior;\n fallbackTestId: string;\n onCellChange: (rowIndex: number, colId: string, value: any) => void;\n}\n\nconst stringifyFallbackValue = (value: any) => {\n if (value === undefined || value === null) return '';\n if (typeof value === 'string' || typeof value === 'number') return value;\n return JSON.stringify(value);\n};\n\nexport function SubFormCell({\n parentFieldId,\n rowIndex,\n column,\n row,\n behavior,\n fallbackTestId,\n onCellChange,\n}: SubFormCellProps) {\n const Component = useComponent(column.componentName);\n const parentContext = useFormContext();\n const scopedFieldId = `${parentFieldId}.${rowIndex}.${column.fieldId}`;\n const cellValue = row[column.fieldId];\n const resolvedBehavior = behavior ?? 'NORMAL';\n\n const childContext = useMemo(\n () => ({\n ...parentContext,\n formData: {\n ...parentContext.formData,\n [scopedFieldId]: cellValue,\n },\n fieldBehaviors: {\n ...parentContext.fieldBehaviors,\n [scopedFieldId]: resolvedBehavior,\n },\n setFieldValue: (fieldId: string, value: any) => {\n if (fieldId === scopedFieldId) {\n onCellChange(rowIndex, column.fieldId, value);\n return;\n }\n parentContext.setFieldValue(fieldId, value);\n },\n getFieldValue: (fieldId: string) =>\n fieldId === scopedFieldId ? cellValue : parentContext.getFieldValue(fieldId),\n getFormData: () => ({\n ...parentContext.getFormData(),\n [scopedFieldId]: cellValue,\n }),\n validateField: (fieldId: string) =>\n fieldId === scopedFieldId ? Promise.resolve(true) : parentContext.validateField(fieldId),\n registerField: (fieldId: string) => {\n if (fieldId !== scopedFieldId) parentContext.registerField(fieldId);\n },\n unregisterField: (fieldId: string) => {\n if (fieldId !== scopedFieldId) parentContext.unregisterField(fieldId);\n },\n }),\n [\n cellValue,\n column.fieldId,\n onCellChange,\n parentContext,\n resolvedBehavior,\n rowIndex,\n scopedFieldId,\n ],\n );\n\n if (!Component) {\n return (\n <input\n value={stringifyFallbackValue(cellValue)}\n disabled={resolvedBehavior === 'DISABLED'}\n onChange={(event) => onCellChange(rowIndex, column.fieldId, event.target.value)}\n data-testid={fallbackTestId}\n />\n );\n }\n\n const columnProps: Record<string, any> = { ...column };\n delete columnProps.fieldId;\n delete columnProps.componentName;\n delete columnProps.label;\n delete columnProps.required;\n delete columnProps.tips;\n\n return (\n <FormContext.Provider value={childContext}>\n <Component\n {...columnProps}\n fieldId={scopedFieldId}\n label=\"\"\n behavior={resolvedBehavior}\n required={false}\n tips={undefined}\n />\n </FormContext.Provider>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { SubFormCell } from './SubFormCell';\n\nexport function SubFormFieldPC({\n fieldId,\n behavior,\n columns,\n maxRows,\n minRows,\n onChange,\n}: SubFormFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const rows = (formData[fieldId] as Record<string, any>[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleAddRow = () => {\n if (maxRows && rows.length >= maxRows) return;\n const emptyRow: Record<string, any> = {};\n columns.forEach((col) => {\n emptyRow[col.fieldId] = col.defaultValue ?? '';\n });\n const newRows = [...rows, emptyRow];\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleRemoveRow = (index: number) => {\n if (minRows && rows.length <= minRows) return;\n const newRows = rows.filter((_, i) => i !== index);\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleCellChange = (rowIndex: number, colId: string, value: any) => {\n const newRows = rows.map((row, i) => (i === rowIndex ? { ...row, [colId]: value } : row));\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const addDisabled = disabled || Boolean(maxRows && rows.length >= maxRows);\n\n return (\n <div className=\"sy-subform sy-subform-pc\" data-testid={`subformfield-pc-${fieldId}`}>\n <div className=\"sy-subform-table-wrap\">\n <table className=\"sy-subform-table\" data-testid={`subformfield-table-${fieldId}`}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.fieldId}>{col.label}</th>\n ))}\n <th>操作</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} data-testid={`subformfield-row-${fieldId}-${rowIndex}`}>\n {columns.map((col) => (\n <td key={col.fieldId}>\n <SubFormCell\n parentFieldId={fieldId}\n rowIndex={rowIndex}\n column={col}\n row={row}\n behavior={behavior}\n fallbackTestId={`subformfield-cell-${fieldId}-${rowIndex}-${col.fieldId}`}\n onCellChange={handleCellChange}\n />\n </td>\n ))}\n <td>\n <button\n type=\"button\"\n disabled={disabled || Boolean(minRows && rows.length <= minRows)}\n className=\"sy-subform-link-button\"\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {rows.length === 0 && <div className=\"sy-subform-empty\">暂无数据</div>}\n <button\n type=\"button\"\n disabled={addDisabled}\n className=\"sy-subform-add-button\"\n onClick={handleAddRow}\n data-testid={`subformfield-add-${fieldId}`}\n >\n 添加行\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { SubFormCell } from './SubFormCell';\n\nexport function SubFormFieldMobile({\n fieldId,\n behavior,\n columns,\n maxRows,\n minRows,\n onChange,\n}: SubFormFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const rows = (formData[fieldId] as Record<string, any>[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleAddRow = () => {\n if (maxRows && rows.length >= maxRows) return;\n const emptyRow: Record<string, any> = {};\n columns.forEach((col) => {\n emptyRow[col.fieldId] = col.defaultValue ?? '';\n });\n const newRows = [...rows, emptyRow];\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleRemoveRow = (index: number) => {\n if (minRows && rows.length <= minRows) return;\n const newRows = rows.filter((_, i) => i !== index);\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleCellChange = (rowIndex: number, colId: string, value: any) => {\n const newRows = rows.map((row, i) => (i === rowIndex ? { ...row, [colId]: value } : row));\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const addDisabled = disabled || Boolean(maxRows && rows.length >= maxRows);\n\n return (\n <div className=\"sy-subform sy-subform-mobile\" data-testid={`subformfield-mobile-${fieldId}`}>\n {rows.map((row, rowIndex) => (\n <div\n className=\"sy-subform-card\"\n key={rowIndex}\n data-testid={`subformfield-card-${fieldId}-${rowIndex}`}\n >\n <div className=\"sy-subform-card-head\">\n <strong>第 {rowIndex + 1} 行</strong>\n <button\n type=\"button\"\n disabled={disabled || Boolean(minRows && rows.length <= minRows)}\n className=\"sy-subform-link-button\"\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-mobile-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n </div>\n {columns.map((col) => (\n <div className=\"sy-subform-mobile-cell\" key={col.fieldId}>\n <label>{col.label}</label>\n <SubFormCell\n parentFieldId={fieldId}\n rowIndex={rowIndex}\n column={col}\n row={row}\n behavior={behavior}\n fallbackTestId={`subformfield-mobile-cell-${fieldId}-${rowIndex}-${col.fieldId}`}\n onCellChange={handleCellChange}\n />\n </div>\n ))}\n </div>\n ))}\n {rows.length === 0 && <div className=\"sy-subform-empty\">暂无数据</div>}\n <button\n type=\"button\"\n disabled={addDisabled}\n className=\"sy-subform-add-button\"\n onClick={handleAddRow}\n data-testid={`subformfield-mobile-add-${fieldId}`}\n >\n 添加行\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SubFormFieldReadonly({ fieldId, columns, readonlyClassName }: SubFormFieldProps) {\n const { formData } = useFormContext();\n const rows = (formData[fieldId] as Record<string, any>[] | undefined) ?? [];\n\n if (rows.length === 0) {\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`subformfield-readonly-${fieldId}`}\n >\n --\n </div>\n );\n }\n\n return (\n <table\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`subformfield-readonly-${fieldId}`}\n >\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.fieldId}>{col.label}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} data-testid={`subformfield-readonly-row-${fieldId}-${rowIndex}`}>\n {columns.map((col) => (\n <td key={col.fieldId}>{row[col.fieldId] ?? '--'}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { UserSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { UserSelectFieldPC } from './UserSelectFieldPC';\nimport { UserSelectFieldMobile } from './UserSelectFieldMobile';\nimport { UserSelectFieldReadonly } from './UserSelectFieldReadonly';\n\nexport function UserSelectField(props: UserSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: UserSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <UserSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <UserSelectFieldMobile {...childProps} />\n ) : (\n <UserSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Select } from 'antd';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getUserId, getUserName, normalizeUser } from '../shared/fieldFormat';\nimport { UserPicker } from '../shared/UserPicker';\n\nexport function UserSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = true,\n searchable = true,\n dataSource = [],\n treeData,\n allowClear = true,\n maxCount,\n notFoundContent = '暂无数据',\n onChange,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as UserItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const [optionsSource, setOptionsSource] = useState<UserItem[]>(() =>\n dataSource.map(normalizeUser),\n );\n const [loading, setLoading] = useState(false);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n useEffect(() => {\n if (dataSource.length) {\n setOptionsSource(dataSource.map(normalizeUser));\n }\n }, [dataSource]);\n\n const fetchUsers = async (keyword?: string) => {\n if (dataSource.length) return;\n setLoading(true);\n try {\n const users = await api.getUserList(\n keyword ? { name: keyword, username: keyword } : undefined,\n );\n setOptionsSource(users.map(normalizeUser));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchUsers();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleChange = (selectedIds: string | string[]) => {\n const ids = Array.isArray(selectedIds) ? selectedIds : [selectedIds];\n const selected = ids\n .map(\n (id) =>\n optionsSource.find((u) => getUserId(u) === id) ?? value.find((u) => getUserId(u) === id),\n )\n .filter(Boolean) as UserItem[];\n const result = multiple ? selected.slice(0, maxCount ?? selected.length) : selected.slice(0, 1);\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const handlePickerConfirm = (items: UserItem[]) => {\n const result = multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1);\n const normalized = result.map(normalizeUser);\n setOptionsSource((current) => {\n const merged = [...current];\n for (const item of normalized) {\n if (!merged.some((existing) => getUserId(existing) === getUserId(item))) merged.push(item);\n }\n return merged;\n });\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const options = useMemo(\n () =>\n optionsSource.map((u) => ({\n value: getUserId(u),\n label: getUserName(u),\n })),\n [optionsSource],\n );\n const selectValue = multiple ? value.map(getUserId) : value[0] ? getUserId(value[0]) : undefined;\n\n return (\n <div className=\"sy-select-with-picker\">\n <Select\n className={inputClassName}\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n allowClear={allowClear}\n maxCount={maxCount}\n showSearch={searchable}\n filterOption={dataSource.length ? undefined : false}\n onSearch={searchable ? fetchUsers : undefined}\n loading={loading}\n notFoundContent={loading ? '加载中...' : notFoundContent}\n options={options}\n onChange={handleChange}\n data-testid={`userselectfield-input-${fieldId}`}\n />\n <button\n type=\"button\"\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={() => setPickerOpen(true)}\n data-testid={`userselectfield-picker-trigger-${fieldId}`}\n >\n 选择\n </button>\n {pickerOpen && (\n <UserPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple={multiple}\n value={value}\n dataSource={dataSource}\n treeData={treeData}\n displaySearch={searchable}\n onConfirm={handlePickerConfirm}\n onCancel={() => undefined}\n />\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Avatar, Button, Checkbox, Empty, Input, List, Modal, Space, Spin, Tag, Tree } from 'antd';\nimport { SearchOutlined, TeamOutlined, UserOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi, UserItem } from '../../types';\nimport {\n getDepartmentId,\n getDepartmentName,\n getUserId,\n getUserName,\n normalizeUser,\n} from './fieldFormat';\nimport { useLazyDepartmentTree } from './useLazyDepartmentTree';\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\ninterface UserPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: UserItem[];\n dataSource?: UserItem[];\n treeData?: DepartmentTreeNode[];\n displaySearch?: boolean;\n onConfirm: (items: UserItem[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeUsers(users?: UserItem[]) {\n return (users || []).map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function UserPickerPanel({\n api,\n multiple = true,\n value,\n dataSource,\n treeData,\n displaySearch = true,\n onConfirm,\n onCancel,\n mobile = false,\n}: UserPickerPanelProps) {\n const {\n treeData: deptTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [departmentKeyword, setDepartmentKeyword] = useState('');\n const [memberKeyword, setMemberKeyword] = useState('');\n const [mobileKeyword, setMobileKeyword] = useState('');\n const [currentDeptId, setCurrentDeptId] = useState('');\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [members, setMembers] = useState<UserItem[]>(() => normalizeUsers(dataSource));\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<UserItem[]>(() => normalizeUsers(value));\n const selectedIds = selected.map(getUserId);\n const MobileSearchBar = getMobileComponent('SearchBar');\n\n useEffect(() => {\n if (dataSource?.length) setMembers(normalizeUsers(dataSource));\n }, [dataSource]);\n\n useEffect(() => {\n if (currentDeptId || deptTreeData.length === 0) return;\n setCurrentDeptId(getDepartmentId(deptTreeData[0]));\n setExpandedKeys(deptTreeData.map((node) => getDepartmentId(node)));\n }, [currentDeptId, deptTreeData]);\n\n useEffect(() => {\n let active = true;\n const keyword = (mobile ? mobileKeyword : memberKeyword).trim();\n if (dataSource?.length) {\n const lower = keyword.toLowerCase();\n setMembers(\n normalizeUsers(dataSource).filter((user) =>\n keyword ? getUserName(user).toLowerCase().includes(lower) : true,\n ),\n );\n return;\n }\n setLoading(true);\n const timer = setTimeout(\n () => {\n const request = keyword\n ? api.getUserList({ name: keyword, username: keyword })\n : currentDeptId\n ? api.getDepartmentMembers(currentDeptId)\n : api.getUserList();\n request\n .then((users) => {\n if (active) setMembers(normalizeUsers(users as UserItem[]));\n })\n .catch(() => {\n if (active) setMembers([]);\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n },\n keyword ? 250 : 0,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [api, currentDeptId, dataSource, memberKeyword, mobile, mobileKeyword]);\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: Array<{ id: string; name: string }> = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileDepartments = useMemo(() => {\n const keyword = mobileKeyword.trim().toLowerCase();\n if (keyword) {\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(keyword))\n .map((item) => item.node);\n }\n if (!currentDeptId) return deptTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, deptTreeData, flatNodes, mobileKeyword, nodeMap]);\n\n const toggleUser = (user: UserItem, checked: boolean) => {\n const normalized = normalizeUser(user);\n const id = getUserId(normalized);\n if (!id) return;\n if (multiple) {\n setSelected((prev) => {\n if (checked)\n return prev.some((item) => getUserId(item) === id) ? prev : [...prev, normalized];\n return prev.filter((item) => getUserId(item) !== id);\n });\n return;\n }\n setSelected(checked ? [normalized] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-user-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length} 人</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={getUserId(item)} closable onClose={() => toggleUser(item, false)}>\n {getUserName(item)}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n const renderMemberList = () => (\n <Spin spinning={loading}>\n <List\n dataSource={members}\n locale={{ emptyText: '暂无成员' }}\n renderItem={(user) => {\n const id = getUserId(user);\n const checked = selectedIds.includes(id);\n return (\n <List.Item key={id}>\n <label className=\"sy-user-picker-row\">\n <Checkbox\n checked={checked}\n onChange={(event) => toggleUser(user, event.target.checked)}\n />\n <Avatar size={36} src={user.avatar} icon={!user.avatar && <UserOutlined />} />\n <span>{getUserName(user)}</span>\n </label>\n </List.Item>\n );\n }}\n />\n </Spin>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-user-picker sy-user-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择成员</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar\n placeholder=\"搜索部门或成员\"\n value={mobileKeyword}\n onChange={setMobileKeyword}\n />\n ) : (\n <input value={mobileKeyword} onChange={(event) => setMobileKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => setCurrentDeptId('')}>\n 通讯录\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => setCurrentDeptId(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileDepartments}\n locale={{ emptyText: null }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n return (\n <List.Item\n key={id}\n onClick={async () => {\n await loadChildren(id);\n setCurrentDeptId(id);\n setMobileKeyword('');\n }}\n >\n <List.Item.Meta avatar={<TeamOutlined />} title={getDepartmentName(node)} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderMemberList()}\n {renderSelected()}\n </div>\n );\n }\n\n const lowerDepartmentKeyword = departmentKeyword.trim().toLowerCase();\n const filteredTreeData = lowerDepartmentKeyword\n ? deptTreeData.filter((node) =>\n getDepartmentName(node).toLowerCase().includes(lowerDepartmentKeyword),\n )\n : deptTreeData;\n\n return (\n <div className=\"sy-user-picker\">\n <div className=\"sy-user-picker-main\">\n <div className=\"sy-user-picker-depts\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={departmentKeyword}\n onChange={(event) => setDepartmentKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n selectedKeys={currentDeptId ? [currentDeptId] : []}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onSelect={(keys) => setCurrentDeptId(String(keys[0] || ''))}\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={320}\n />\n </Spin>\n </div>\n <div className=\"sy-user-picker-members\">\n {displaySearch && (\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索成员\"\n value={memberKeyword}\n onChange={(event) => setMemberKeyword(event.target.value)}\n />\n )}\n {renderMemberList()}\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface UserPickerProps extends Omit<UserPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function UserPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: UserPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <UserPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择成员\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(980px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DataNode } from 'antd/es/tree';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from './fieldFormat';\n\nexport interface LazyDepartmentNode extends DataNode, DepartmentTreeNode {\n key: string;\n title: string;\n childrenLoaded?: boolean;\n children?: LazyDepartmentNode[];\n}\n\nexport interface LazyDepartmentFlatNode {\n id: string;\n name: string;\n node: LazyDepartmentNode;\n path: Array<{ id: string; name: string }>;\n}\n\nconst toLazyNode = (node: DepartmentTreeNode): LazyDepartmentNode => {\n const normalized = normalizeDepartmentNode(node);\n const id = getDepartmentId(normalized);\n const name = getDepartmentName(normalized);\n const children = normalized.children?.map(toLazyNode);\n const hasChildren = normalized.hasChildren ?? Boolean(children?.length);\n return {\n ...normalized,\n id,\n name,\n key: id,\n title: name,\n hasChildren,\n isLeaf: normalized.isLeaf ?? !hasChildren,\n childrenLoaded: Boolean(children?.length) || normalized.isLeaf === true || !hasChildren,\n children,\n };\n};\n\nconst replaceChildren = (\n nodes: LazyDepartmentNode[],\n parentId: string,\n children: LazyDepartmentNode[],\n): LazyDepartmentNode[] =>\n nodes.map((node) => {\n if (getDepartmentId(node) === parentId) {\n return {\n ...node,\n children,\n hasChildren: children.length > 0,\n isLeaf: children.length === 0,\n childrenLoaded: true,\n };\n }\n return node.children?.length\n ? { ...node, children: replaceChildren(node.children, parentId, children) }\n : node;\n });\n\nfunction buildIndexes(nodes: LazyDepartmentNode[]) {\n const nodeMap = new Map<string, LazyDepartmentNode>();\n const parentMap = new Map<string, string | null>();\n const flatNodes: LazyDepartmentFlatNode[] = [];\n\n const walk = (\n list: LazyDepartmentNode[],\n parentId: string | null,\n path: Array<{ id: string; name: string }>,\n ) => {\n for (const node of list) {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const nextPath = [...path, { id, name }];\n nodeMap.set(id, node);\n parentMap.set(id, parentId);\n flatNodes.push({ id, name, node, path: nextPath });\n if (node.children?.length) walk(node.children, id, nextPath);\n }\n };\n\n walk(nodes, null, []);\n return { nodeMap, parentMap, flatNodes };\n}\n\nexport function useLazyDepartmentTree(\n api: FormRuntimeApi,\n configuredTreeData?: DepartmentTreeNode[],\n) {\n const [treeData, setTreeDataState] = useState<LazyDepartmentNode[]>(() =>\n (configuredTreeData || []).map(toLazyNode),\n );\n const [treeLoading, setTreeLoading] = useState(false);\n const treeDataRef = useRef(treeData);\n const rootsLoadedRef = useRef(Boolean(configuredTreeData?.length));\n const rootPromiseRef = useRef<Promise<LazyDepartmentNode[]> | null>(null);\n const childPromiseRef = useRef<Record<string, Promise<LazyDepartmentNode[]> | undefined>>({});\n\n const setTreeData = useCallback(\n (next: LazyDepartmentNode[] | ((prev: LazyDepartmentNode[]) => LazyDepartmentNode[])) => {\n const resolved = typeof next === 'function' ? next(treeDataRef.current) : next;\n treeDataRef.current = resolved;\n setTreeDataState(resolved);\n return resolved;\n },\n [],\n );\n\n useEffect(() => {\n if (!configuredTreeData) return;\n const next = configuredTreeData.map(toLazyNode);\n rootsLoadedRef.current = next.length > 0;\n setTreeData(next);\n }, [configuredTreeData, setTreeData]);\n\n const loadRootDepartments = useCallback(async () => {\n if (rootsLoadedRef.current) return treeDataRef.current;\n if (rootPromiseRef.current) return rootPromiseRef.current;\n setTreeLoading(true);\n const promise = api\n .getDepartmentRoots()\n .then((nodes) => {\n const next = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n rootsLoadedRef.current = true;\n setTreeData(next);\n return next;\n })\n .finally(() => {\n rootPromiseRef.current = null;\n setTreeLoading(false);\n });\n rootPromiseRef.current = promise;\n return promise;\n }, [api, setTreeData]);\n\n const loadChildren = useCallback(\n async (parentId: string) => {\n const id = String(parentId || '');\n if (!id) return [];\n const current = flattenDepartments(treeDataRef.current).find((item) => item.id === id)\n ?.node as LazyDepartmentNode | undefined;\n if (!current || current.childrenLoaded || current.isLeaf || current.hasChildren === false) {\n return current?.children || [];\n }\n if (childPromiseRef.current[id]) return childPromiseRef.current[id];\n const promise = api\n .getDepartmentChildren(id)\n .then((nodes) => {\n const children = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n setTreeData((prev) => replaceChildren(prev, id, children));\n return children;\n })\n .finally(() => {\n delete childPromiseRef.current[id];\n });\n childPromiseRef.current[id] = promise;\n return promise;\n },\n [api, setTreeData],\n );\n\n const indexes = useMemo(() => buildIndexes(treeData), [treeData]);\n\n useEffect(() => {\n void loadRootDepartments();\n }, [loadRootDepartments]);\n\n return {\n treeData,\n treeLoading,\n ...indexes,\n loadRootDepartments,\n loadChildren,\n };\n}\n","import React, { useEffect, useState } from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getUserId, getUserName, normalizeUser } from '../shared/fieldFormat';\nimport { UserPicker } from '../shared/UserPicker';\n\nconst getMobilePopup = () => {\n try {\n return (MobileAntd as any).Popup;\n } catch {\n return undefined;\n }\n};\n\nexport function UserSelectFieldMobile({\n fieldId,\n behavior,\n placeholder,\n multiple = true,\n dataSource = [],\n treeData,\n maxCount,\n onChange,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as UserItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const [showPicker, setShowPicker] = useState(false);\n const [optionsSource, setOptionsSource] = useState<UserItem[]>(() =>\n dataSource.map(normalizeUser),\n );\n\n useEffect(() => {\n if (dataSource.length) {\n setOptionsSource(dataSource.map(normalizeUser));\n }\n }, [dataSource]);\n\n const ensureUsers = async () => {\n if (dataSource.length || optionsSource.length) return;\n const users = await api.getUserList();\n setOptionsSource(users.map(normalizeUser));\n };\n\n const handleSelect = (userId: string) => {\n const user = optionsSource.find((u) => getUserId(u) === userId);\n /* v8 ignore next */\n if (!user) return;\n\n let newValue: UserItem[];\n if (multiple) {\n const exists = value.some((u) => getUserId(u) === userId);\n newValue = exists ? value.filter((u) => getUserId(u) !== userId) : [...value, user];\n newValue = newValue.slice(0, maxCount ?? newValue.length);\n } else {\n newValue = [user];\n setShowPicker(false);\n }\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\n };\n\n const handleConfirm = (items: UserItem[]) => {\n const next = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n normalizeUser,\n );\n setFieldValue(fieldId, next);\n onChange?.(next);\n setShowPicker(false);\n };\n\n return (\n <div data-testid={`userselectfield-mobile-${fieldId}`}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n setShowPicker(!showPicker);\n ensureUsers();\n }}\n data-testid={`userselectfield-mobile-trigger-${fieldId}`}\n >\n {value.length > 0 ? value.map(getUserName).join(', ') : placeholder || '请选择'}\n </button>\n {showPicker && getMobilePopup() ? (\n <UserPicker\n api={api}\n open={showPicker}\n onOpenChange={setShowPicker}\n mobile\n multiple={multiple}\n value={value}\n dataSource={dataSource}\n treeData={treeData}\n onConfirm={handleConfirm}\n onCancel={() => setShowPicker(false)}\n />\n ) : showPicker ? (\n <ul data-testid={`userselectfield-mobile-list-${fieldId}`}>\n {optionsSource.map((user) => (\n <li key={getUserId(user)}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(getUserId(user))}\n data-testid={`userselectfield-mobile-option-${getUserId(user)}`}\n >\n {getUserName(user)}\n {value.some((u) => getUserId(u) === getUserId(user)) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function UserSelectFieldReadonly({ fieldId, readonlyClassName }: UserSelectFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as UserItem[] | undefined) ?? [];\n\n const display = value.length > 0 ? value.map((u) => u.name).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`userselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { DepartmentSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { DepartmentSelectFieldPC } from './DepartmentSelectFieldPC';\nimport { DepartmentSelectFieldMobile } from './DepartmentSelectFieldMobile';\nimport { DepartmentSelectFieldReadonly } from './DepartmentSelectFieldReadonly';\n\nexport function DepartmentSelectField(props: DepartmentSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: DepartmentSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <DepartmentSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <DepartmentSelectFieldMobile {...childProps} />\n ) : (\n <DepartmentSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { TreeSelect } from 'antd';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from '../shared/fieldFormat';\nimport { DepartmentPicker } from '../shared/DepartmentPicker';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nfunction convertTreeData(nodes: DepartmentTreeNode[]): any[] {\n return nodes.map((node) => ({\n value: getDepartmentId(node),\n title: getDepartmentName(node),\n isLeaf: node.isLeaf ?? !node.hasChildren,\n children: node.children ? convertTreeData(node.children) : undefined,\n }));\n}\n\nexport function DepartmentSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = false,\n treeData,\n allowClear = true,\n maxCount,\n onChange,\n}: DepartmentSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as { id: string; name: string }[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const configuredTreeData = treeData ?? EMPTY_TREE_DATA;\n const remoteLoadedRef = useRef(false);\n const [loadedTreeData, setLoadedTreeData] = useState<DepartmentTreeNode[]>(configuredTreeData);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData.map(normalizeDepartmentNode));\n return;\n }\n if (remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n api\n .getDepartmentRoots()\n .then((nodes) =>\n setLoadedTreeData((nodes as DepartmentTreeNode[]).map(normalizeDepartmentNode)),\n );\n }, [api, configuredTreeData]);\n\n const allDepts = flattenDepartments(loadedTreeData);\n\n const handleChange = (selectedIds: string | string[]) => {\n const ids = Array.isArray(selectedIds) ? selectedIds : [selectedIds];\n const selected = ids\n .map((id) => allDepts.find((d) => d.id === id) ?? value.find((d) => d.id === id))\n .filter(Boolean) as { id: string; name: string }[];\n const result = (\n multiple ? selected.slice(0, maxCount ?? selected.length) : selected.slice(0, 1)\n ).map((item) => ({ id: item.id, name: item.name }));\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const handlePickerConfirm = (items: { id: string; name: string }[]) => {\n const result = multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1);\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const treeDataConverted = convertTreeData(loadedTreeData);\n const selectValue = multiple ? value.map((d) => d.id) : value[0]?.id;\n\n return (\n <div className=\"sy-select-with-picker\">\n <TreeSelect\n className={inputClassName}\n style={{ width: '100%' }}\n multiple={multiple}\n maxCount={maxCount}\n allowClear={allowClear}\n treeData={treeDataConverted}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleChange}\n loadData={async (node: any) => {\n if (configuredTreeData.length) return;\n const children = await api.getDepartmentChildren(String(node.value));\n setLoadedTreeData((current) => {\n const attach = (items: DepartmentTreeNode[]): DepartmentTreeNode[] =>\n items.map((item) => {\n const id = getDepartmentId(item);\n if (id === String(node.value)) {\n return {\n ...item,\n children: (children as DepartmentTreeNode[]).map(normalizeDepartmentNode),\n };\n }\n return item.children ? { ...item, children: attach(item.children) } : item;\n });\n return attach(current);\n });\n }}\n treeDefaultExpandAll={Boolean(configuredTreeData.length)}\n data-testid={`deptselectfield-input-${fieldId}`}\n />\n <button\n type=\"button\"\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={() => setPickerOpen(true)}\n data-testid={`deptselectfield-picker-trigger-${fieldId}`}\n >\n 选择\n </button>\n {pickerOpen && (\n <DepartmentPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple={multiple}\n value={value}\n treeData={treeData}\n onConfirm={handlePickerConfirm}\n onCancel={() => undefined}\n />\n )}\n </div>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { Button, Checkbox, Empty, Input, List, Modal, Space, Spin, Tag, Tree } from 'antd';\nimport type { TreeProps } from 'antd';\nimport { ApartmentOutlined, SearchOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport { getDepartmentId, getDepartmentName } from './fieldFormat';\nimport { useLazyDepartmentTree, type LazyDepartmentNode } from './useLazyDepartmentTree';\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\nexport interface DepartmentValue {\n id: string;\n name: string;\n}\n\ninterface DepartmentPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: DepartmentValue[];\n treeData?: DepartmentTreeNode[];\n onConfirm: (items: DepartmentValue[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeSelection(items: DepartmentValue[]) {\n return items\n .map((item) => ({ id: String(item.id || ''), name: String(item.name || item.id || '') }))\n .filter((item) => item.id);\n}\n\nfunction matchSearch(nodes: LazyDepartmentNode[], keyword: string): LazyDepartmentNode[] {\n if (!keyword) return nodes;\n const lower = keyword.toLowerCase();\n return nodes\n .map((node) => {\n const name = getDepartmentName(node);\n const children = node.children ? matchSearch(node.children, keyword) : undefined;\n if (name.toLowerCase().includes(lower) || children?.length) {\n return { ...node, children };\n }\n return null;\n })\n .filter(Boolean) as LazyDepartmentNode[];\n}\n\nexport function DepartmentPickerPanel({\n api,\n multiple = false,\n value,\n treeData,\n onConfirm,\n onCancel,\n mobile = false,\n}: DepartmentPickerPanelProps) {\n const {\n treeData: loadedTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [keyword, setKeyword] = useState('');\n const [selected, setSelected] = useState<DepartmentValue[]>(() => normalizeSelection(value));\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [currentDeptId, setCurrentDeptId] = useState<string | null>(null);\n const selectedIds = selected.map((item) => item.id);\n const MobileSearchBar = getMobileComponent('SearchBar');\n\n const filteredTreeData = useMemo(\n () => matchSearch(loadedTreeData, keyword.trim()),\n [keyword, loadedTreeData],\n );\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: DepartmentValue[] = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileList = useMemo(() => {\n if (keyword.trim()) {\n const lower = keyword.trim().toLowerCase();\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(lower))\n .map((item) => item.node);\n }\n if (!currentDeptId) return loadedTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, flatNodes, keyword, loadedTreeData, nodeMap]);\n\n const upsertSelected = (department: DepartmentValue, checked: boolean) => {\n if (multiple) {\n setSelected((prev) => {\n if (checked) {\n return prev.some((item) => item.id === department.id) ? prev : [...prev, department];\n }\n return prev.filter((item) => item.id !== department.id);\n });\n return;\n }\n setSelected(checked ? [department] : []);\n };\n\n const handleTreeCheck: TreeProps['onCheck'] = (keys) => {\n const checkedKeys = Array.isArray(keys) ? keys : keys.checked;\n const next = checkedKeys\n .map((key) => {\n const node = nodeMap.get(String(key));\n return node ? { id: getDepartmentId(node), name: getDepartmentName(node) } : undefined;\n })\n .filter(Boolean) as DepartmentValue[];\n setSelected(next);\n };\n\n const handleTreeSelect: TreeProps['onSelect'] = (keys) => {\n const id = String(keys[0] || '');\n const node = id ? nodeMap.get(id) : undefined;\n setSelected(node ? [{ id, name: getDepartmentName(node) }] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-org-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length}</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={item.id} closable onClose={() => upsertSelected(item, false)}>\n {item.name}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-org-picker sy-org-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择部门</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar placeholder=\"搜索部门\" value={keyword} onChange={setKeyword} />\n ) : (\n <input value={keyword} onChange={(event) => setKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => setCurrentDeptId(null)}>\n 部门\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => setCurrentDeptId(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileList}\n locale={{ emptyText: '暂无部门' }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const selectedNow = selectedIds.includes(id);\n const hasChildren = Boolean(node.hasChildren && !node.isLeaf);\n return (\n <List.Item\n key={id}\n actions={[\n <Checkbox\n key=\"select\"\n checked={selectedNow}\n onChange={(event) => upsertSelected({ id, name }, event.target.checked)}\n />,\n hasChildren ? (\n <button\n key=\"children\"\n type=\"button\"\n onClick={async () => {\n await loadChildren(id);\n setCurrentDeptId(id);\n setKeyword('');\n }}\n >\n 下级\n </button>\n ) : null,\n ]}\n >\n <List.Item.Meta avatar={<ApartmentOutlined />} title={name} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderSelected()}\n </div>\n );\n }\n\n return (\n <div className=\"sy-org-picker\">\n <div className=\"sy-org-picker-main\">\n <div className=\"sy-org-picker-tree\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={keyword}\n onChange={(event) => setKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n checkable={multiple}\n checkedKeys={multiple ? selectedIds : undefined}\n selectedKeys={multiple ? undefined : selectedIds}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onCheck={multiple ? handleTreeCheck : undefined}\n onSelect={multiple ? undefined : handleTreeSelect}\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={360}\n />\n </Spin>\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface DepartmentPickerProps extends Omit<DepartmentPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function DepartmentPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: DepartmentPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <DepartmentPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择部门\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(760px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n flattenDepartments,\n getDepartmentName,\n normalizeDepartmentNode,\n} from '../shared/fieldFormat';\nimport { DepartmentPicker } from '../shared/DepartmentPicker';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nconst getMobilePopup = () => {\n try {\n return (MobileAntd as any).Popup;\n } catch {\n return undefined;\n }\n};\n\nexport function DepartmentSelectFieldMobile({\n fieldId,\n behavior,\n placeholder,\n multiple = false,\n treeData,\n maxCount,\n onChange,\n}: DepartmentSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as { id: string; name: string }[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const [showPicker, setShowPicker] = useState(false);\n const configuredTreeData = treeData ?? EMPTY_TREE_DATA;\n const remoteLoadedRef = useRef(false);\n const [loadedTreeData, setLoadedTreeData] = useState<DepartmentTreeNode[]>(configuredTreeData);\n\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData.map(normalizeDepartmentNode));\n }\n }, [configuredTreeData]);\n\n const ensureDepartments = async () => {\n if (configuredTreeData.length || loadedTreeData.length || remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n const roots = await api.getDepartmentRoots();\n setLoadedTreeData((roots as DepartmentTreeNode[]).map(normalizeDepartmentNode));\n };\n\n const allDepts = flattenDepartments(loadedTreeData);\n\n const handleSelect = (deptId: string) => {\n const dept = allDepts.find((d) => d.id === deptId);\n /* v8 ignore next */\n if (!dept) return;\n\n let newValue: { id: string; name: string }[];\n if (multiple) {\n const exists = value.some((d) => d.id === deptId);\n newValue = exists ? value.filter((d) => d.id !== deptId) : [...value, dept];\n newValue = newValue.slice(0, maxCount ?? newValue.length);\n } else {\n newValue = [dept];\n setShowPicker(false);\n }\n const normalized = newValue.map((item) => ({ id: item.id, name: item.name }));\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const handleConfirm = (items: { id: string; name: string }[]) => {\n const next = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n (item) => ({ id: item.id, name: item.name }),\n );\n setFieldValue(fieldId, next);\n onChange?.(next);\n setShowPicker(false);\n };\n\n return (\n <div data-testid={`deptselectfield-mobile-${fieldId}`}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n setShowPicker(!showPicker);\n ensureDepartments();\n }}\n data-testid={`deptselectfield-mobile-trigger-${fieldId}`}\n >\n {value.length > 0 ? value.map((d) => d.name).join(', ') : placeholder || '请选择'}\n </button>\n {showPicker && getMobilePopup() ? (\n <DepartmentPicker\n api={api}\n open={showPicker}\n onOpenChange={setShowPicker}\n mobile\n multiple={multiple}\n value={value}\n treeData={treeData}\n onConfirm={handleConfirm}\n onCancel={() => setShowPicker(false)}\n />\n ) : showPicker ? (\n <ul data-testid={`deptselectfield-mobile-list-${fieldId}`}>\n {allDepts.map((dept) => (\n <li key={dept.id}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(dept.id)}\n data-testid={`deptselectfield-mobile-option-${dept.id}`}\n >\n {getDepartmentName(dept)}\n {value.some((d) => d.id === dept.id) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport type { DepartmentSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DepartmentSelectFieldReadonly({\n fieldId,\n readonlyClassName,\n}: DepartmentSelectFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as { id: string; name: string }[] | undefined) ?? [];\n\n const display = value.length > 0 ? value.map((d) => d.name).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`deptselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Cascader } from 'antd';\nimport type { CascadeSelectFieldProps, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst toValuePath = (value: any, multiple?: boolean) => {\n if (!value) return multiple ? [] : [];\n if (multiple && Array.isArray(value) && Array.isArray(value[0])) {\n return value.map((path: OptionItem[]) => path.map((item) => item.value));\n }\n if (Array.isArray(value)) return value.map((item) => item.value);\n return [];\n};\n\nconst normalizePath = (selectedOptions?: any[]) =>\n (selectedOptions ?? []).map((item) => ({\n label: String(item?.label ?? item?.title ?? item?.value ?? ''),\n value: String(item?.value ?? ''),\n }));\n\nexport function CascadeSelectField(props: CascadeSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n options = [],\n multiple = false,\n allowClear = true,\n changeOnSelect,\n showSearch,\n fieldNames,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] ?? (multiple ? [] : []);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n const readonlyText = Array.isArray(value)\n ? (multiple && Array.isArray(value[0]) ? value.flat() : value)\n .map((item: any) => item?.label ?? item?.value ?? item)\n .join(' / ')\n : '--';\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`cascadeselectfield-readonly-${fieldId}`}\n >\n {readonlyText || '--'}\n </div>\n ) : (\n <Cascader\n className={inputClassName}\n style={{ width: '100%' }}\n options={options}\n multiple={multiple}\n allowClear={allowClear}\n changeOnSelect={changeOnSelect}\n showSearch={showSearch}\n fieldNames={fieldNames as any}\n disabled={behavior === 'DISABLED'}\n placeholder={placeholder}\n value={toValuePath(value, multiple) as any}\n onChange={(_nextValue: any, selectedOptions: any) => {\n const next = multiple\n ? ((selectedOptions as any[][]) ?? []).map((path) => normalizePath(path))\n : normalizePath(selectedOptions as any[]);\n setFieldValue(fieldId, next);\n onChange?.(next);\n }}\n data-testid={`cascadeselectfield-input-${fieldId}`}\n />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Cascader, Input, Space, Spin } from 'antd';\nimport * as MobileAntd from 'antd-mobile';\nimport type { AddressFieldProps, AddressValue, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\n\nconst LEVELS = ['province', 'city', 'district', 'street'] as const;\n\ntype AddressLevel = (typeof LEVELS)[number];\ntype AddressOption = OptionItem & {\n level?: AddressLevel;\n isLeaf?: boolean;\n children?: AddressOption[];\n};\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\nconst modeDepth = (mode?: AddressFieldProps['mode']) => {\n if (mode === 'province-city') return 2;\n if (mode === 'province-city-district-street' || mode === 'province-city-district-street-detail') {\n return 4;\n }\n return 3;\n};\n\nconst activeLevels = (mode?: AddressFieldProps['mode']) => LEVELS.slice(0, modeDepth(mode));\n\nconst valueToPath = (value?: AddressValue) =>\n LEVELS.map((level) => value?.[level]?.value).filter(Boolean) as string[];\n\nconst normalizeDivision = (item: any, level: AddressLevel, depth: number, index: number) => ({\n label: String(item.name || item.label || item.adcode || item.value),\n value: String(item.adcode || item.value || item.id),\n level,\n isLeaf: index + 1 >= depth || item.isLeaf === true,\n});\n\nconst composeFullAddress = (value?: AddressValue, levels: readonly AddressLevel[] = LEVELS) => {\n if (!value) return '';\n return [...levels.map((level) => value[level]?.label), value.detail].filter(Boolean).join('');\n};\n\nexport function AddressField(props: AddressFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n defaultValue,\n mode = 'province-city-district',\n detailPlaceholder = '请输入详细地址',\n allowClear = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as AddressValue | undefined;\n const [options, setOptions] = useState<AddressOption[]>([]);\n const [loadingRoots, setLoadingRoots] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileLevelIndex, setMobileLevelIndex] = useState(0);\n const [mobileOptions, setMobileOptions] = useState<AddressOption[]>([]);\n const [mobileLoading, setMobileLoading] = useState(false);\n const [tempValue, setTempValue] = useState<AddressValue | undefined>();\n const depth = modeDepth(mode);\n const levels = useMemo(() => activeLevels(mode), [mode]);\n const detailEnabled = mode === 'province-city-district-street-detail';\n const disabled = behavior === 'DISABLED';\n const MobilePopup = getMobileComponent('Popup');\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const loadDivisions = async (\n parentAdcode: string | undefined,\n level: AddressLevel,\n index: number,\n ) => {\n const list = await api.getChinaDivisions(parentAdcode);\n return list.map((item: any) => normalizeDivision(item, level, depth, index));\n };\n\n useEffect(() => {\n setLoadingRoots(true);\n loadDivisions(undefined, 'province', 0)\n .then(setOptions)\n .finally(() => setLoadingRoots(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, depth]);\n\n useEffect(() => {\n if (!mobileOpen) return;\n const level = levels[mobileLevelIndex] || 'province';\n const parentLevel = levels[mobileLevelIndex - 1];\n const parentAdcode = parentLevel ? tempValue?.[parentLevel]?.value : undefined;\n setMobileLoading(true);\n loadDivisions(parentAdcode, level, mobileLevelIndex)\n .then(setMobileOptions)\n .finally(() => setMobileLoading(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mobileOpen, mobileLevelIndex, tempValue, levels]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setAddressValue = (next: AddressValue | undefined) => {\n const normalized = next\n ? { ...next, fullAddress: composeFullAddress(next, levels) }\n : undefined;\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const display = value?.fullAddress || composeFullAddress(value, levels) || '--';\n\n const renderDetailInput = (\n currentValue?: AddressValue,\n onCommit?: (next?: AddressValue) => void,\n ) =>\n detailEnabled ? (\n <Input\n value={currentValue?.detail ?? ''}\n disabled={disabled}\n placeholder={detailPlaceholder}\n onChange={(event) => {\n const next = {\n ...(currentValue ?? {}),\n detail: event.target.value,\n };\n onCommit?.(next);\n }}\n />\n ) : null;\n\n const mobilePicker = MobilePopup ? (\n <MobilePopup\n visible={mobileOpen}\n onMaskClick={() => setMobileOpen(false)}\n bodyStyle={{ height: '80vh' }}\n >\n <div className=\"sy-address-mobile\">\n <div className=\"sy-address-mobile-head\">\n <button\n type=\"button\"\n disabled={mobileLevelIndex === 0}\n onClick={() => setMobileLevelIndex((prev) => Math.max(0, prev - 1))}\n >\n 返回\n </button>\n <strong>{['省份', '城市', '区县', '街道'][mobileLevelIndex] || '地址'}</strong>\n <button type=\"button\" onClick={() => setMobileOpen(false)}>\n 关闭\n </button>\n </div>\n <div className=\"sy-address-mobile-path\">\n {levels.map((level, index) => (\n <button\n type=\"button\"\n key={level}\n className={index === mobileLevelIndex ? 'is-active' : undefined}\n disabled={!tempValue?.[level] && index > 0}\n onClick={() => setMobileLevelIndex(index)}\n >\n {tempValue?.[level]?.label || ['省', '市', '区', '街道'][index]}\n </button>\n ))}\n </div>\n <div className=\"sy-address-mobile-list\">\n {mobileLoading ? (\n <Spin />\n ) : mobileOptions.length ? (\n mobileOptions.map((option) => (\n <button\n type=\"button\"\n key={option.value}\n className={\n tempValue?.[option.level || 'province']?.value === option.value\n ? 'is-active'\n : undefined\n }\n onClick={() => {\n const level = levels[mobileLevelIndex];\n if (!level) return;\n const next: AddressValue = { ...(tempValue ?? {}) };\n next[level] = { label: option.label, value: option.value };\n levels.slice(mobileLevelIndex + 1).forEach((laterLevel) => {\n delete next[laterLevel];\n });\n setTempValue(next);\n if (mobileLevelIndex < levels.length - 1) {\n setMobileLevelIndex(mobileLevelIndex + 1);\n }\n }}\n >\n {option.label}\n </button>\n ))\n ) : (\n <div className=\"sy-empty\">暂无数据</div>\n )}\n </div>\n {detailEnabled && (\n <div className=\"sy-address-mobile-detail\">\n {renderDetailInput(tempValue, (next) => setTempValue(next))}\n </div>\n )}\n <div className=\"sy-address-mobile-footer\">\n <Button onClick={() => setMobileOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n onClick={() => {\n setAddressValue(tempValue);\n setMobileOpen(false);\n }}\n >\n 确定\n </Button>\n </div>\n </div>\n </MobilePopup>\n ) : null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div className=\"sy-field-readonly-value\" data-testid={`addressfield-readonly-${fieldId}`}>\n {display}\n </div>\n ) : isMobile && MobilePopup ? (\n <div className={inputClassName} data-testid={`addressfield-input-${fieldId}`}>\n <Space.Compact style={{ width: '100%' }}>\n <Button\n style={{ flex: 1, textAlign: 'left' }}\n disabled={disabled}\n onClick={() => {\n setTempValue(value);\n setMobileLevelIndex(0);\n setMobileOpen(true);\n }}\n >\n {display === '--' ? props.placeholder || '请选择地址' : display}\n </Button>\n {allowClear && (\n <Button disabled={disabled} onClick={() => setAddressValue(undefined)}>\n 清空\n </Button>\n )}\n </Space.Compact>\n {mobilePicker}\n </div>\n ) : (\n <div className={inputClassName} data-testid={`addressfield-input-${fieldId}`}>\n <Cascader\n style={{ width: '100%' }}\n options={options}\n allowClear={allowClear}\n disabled={disabled}\n value={valueToPath(value)}\n placeholder={props.placeholder || '请选择地址'}\n loading={loadingRoots}\n loadData={async (selectedOptions) => {\n const target = selectedOptions[selectedOptions.length - 1] as AddressOption;\n const nextLevel = levels[selectedOptions.length] ?? 'street';\n const children = await loadDivisions(target.value, nextLevel, selectedOptions.length);\n target.children = children;\n setOptions([...options]);\n }}\n onChange={(_path, selectedOptions) => {\n if (!selectedOptions?.length) {\n setAddressValue(undefined);\n return;\n }\n const next: AddressValue = {};\n selectedOptions.forEach((item: any, index) => {\n const level = levels[index];\n if (level) next[level] = { label: item.label, value: item.value };\n });\n next.detail = value?.detail;\n setAddressValue(next);\n }}\n />\n {renderDetailInput(value, setAddressValue)}\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Button, Drawer, Input, Modal, Select, Space, Spin, Table, Tag } from 'antd';\nimport type { ColumnsType, TablePaginationConfig } from 'antd/es/table';\nimport type { AssociationFormFieldProps, AssociationValue } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\n\ntype AssociationRecord = Record<string, any> & {\n __associationLabel: string;\n __associationValue: string | number;\n};\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nconst normalizeValues = (value: any): AssociationValue[] => {\n if (!value) return [];\n return (Array.isArray(value) ? value : [value]).filter(\n (item) => item && item.value !== undefined && item.value !== null,\n );\n};\n\nconst normalizeCellValue = (value: any) => {\n if (value === undefined || value === null || value === '') return '--';\n if (typeof value === 'object') {\n if ('label' in value) return String(value.label ?? '--');\n if ('name' in value) return String(value.name ?? '--');\n return JSON.stringify(value);\n }\n return String(value);\n};\n\nconst normalizeSearchResult = (result: any) => {\n const payload = result?.data ?? result?.result ?? result ?? {};\n const list = Array.isArray(payload)\n ? payload\n : payload.list || payload.items || payload.records || payload.data || [];\n return {\n list: Array.isArray(list) ? list : [],\n total: payload.total ?? payload.totalCount ?? payload.count ?? list.length ?? 0,\n };\n};\n\nexport function AssociationFormField(props: AssociationFormFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n associationForm,\n multiple = false,\n allowClear = true,\n showSearch = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeValues(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const [options, setOptions] = useState<AssociationValue[]>([]);\n const [selectLoading, setSelectLoading] = useState(false);\n const [selectorOpen, setSelectorOpen] = useState(false);\n const [tableLoading, setTableLoading] = useState(false);\n const [tableData, setTableData] = useState<AssociationRecord[]>([]);\n const [keyword, setKeyword] = useState('');\n const [pagination, setPagination] = useState({\n current: 1,\n pageSize: DEFAULT_PAGE_SIZE,\n total: 0,\n });\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);\n const [selectedRecords, setSelectedRecords] = useState<AssociationRecord[]>([]);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, normalizeValues(defaultValue));\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const canQuery = Boolean(associationForm?.appType && associationForm?.formUuid);\n\n const normalizeRecord = useCallback(\n (record: Record<string, any>): AssociationRecord => {\n const mainFieldValue = associationForm?.mainFieldId\n ? record?.[associationForm.mainFieldId]\n : undefined;\n const labelText = normalizeCellValue(mainFieldValue);\n const valueId =\n record?.formInstId ??\n record?.formInstID ??\n record?.bizObjectId ??\n record?.id ??\n record?.dataId ??\n record?.uuid ??\n labelText;\n return {\n ...record,\n __associationLabel: labelText,\n __associationValue: valueId,\n };\n },\n [associationForm?.mainFieldId],\n );\n\n const toValue = useCallback(\n (record: AssociationRecord): AssociationValue => ({\n label: record.__associationLabel,\n value: record.__associationValue,\n record,\n }),\n [],\n );\n\n const buildFilters = useCallback(() => {\n const rules = associationForm?.dataFilterRules || [];\n return rules\n .map((rule) => {\n if (!rule?.key) return null;\n const sourceValue =\n rule.valueType === 'currentField' && rule.currentFieldKey\n ? formData[rule.currentFieldKey]\n : rule.value;\n if (sourceValue === undefined || sourceValue === null || sourceValue === '') return null;\n return {\n key: rule.key,\n operator: rule.operator || 'EQ',\n componentName: rule.componentName,\n value:\n typeof sourceValue === 'object' && 'value' in sourceValue\n ? sourceValue.value\n : sourceValue,\n };\n })\n .filter(Boolean);\n }, [associationForm?.dataFilterRules, formData]);\n\n const fetchRecords = useCallback(\n async (params?: { currentPage?: number; pageSize?: number; searchKeyWord?: string }) => {\n if (!canQuery) return { list: [] as AssociationRecord[], total: 0 };\n const filters = buildFilters();\n const result = await api.advancedSearch({\n appType: associationForm?.appType,\n formUuid: associationForm?.formUuid,\n currentPage: params?.currentPage || 1,\n pageSize: params?.pageSize || DEFAULT_PAGE_SIZE,\n searchKeyWord: params?.searchKeyWord,\n ...(filters.length\n ? {\n filters: JSON.stringify(filters),\n conditionType: associationForm?.dataFilterConditionType || 'AND',\n }\n : {}),\n });\n const normalized = normalizeSearchResult(result);\n return {\n list: normalized.list.map((record: any) => normalizeRecord(record)),\n total: normalized.total,\n };\n },\n [api, associationForm, buildFilters, canQuery, normalizeRecord],\n );\n\n const loadOptions = useCallback(\n async (searchKeyWord?: string) => {\n setSelectLoading(true);\n try {\n const result = await fetchRecords({ currentPage: 1, pageSize: 20, searchKeyWord });\n setOptions(result.list.map(toValue));\n } finally {\n setSelectLoading(false);\n }\n },\n [fetchRecords, toValue],\n );\n\n const loadTable = useCallback(\n async (next?: Partial<typeof pagination> & { searchKeyWord?: string }) => {\n setTableLoading(true);\n const current = next?.current || 1;\n const pageSize = next?.pageSize || pagination.pageSize;\n try {\n const result = await fetchRecords({\n currentPage: current,\n pageSize,\n searchKeyWord: next?.searchKeyWord ?? keyword,\n });\n setTableData(result.list);\n setPagination({ current, pageSize, total: result.total });\n } finally {\n setTableLoading(false);\n }\n },\n [fetchRecords, keyword, pagination.pageSize],\n );\n\n useEffect(() => {\n void loadOptions();\n }, [loadOptions]);\n\n useEffect(() => {\n setSelectedRowKeys(value.map((item) => item.value));\n setSelectedRecords(\n value\n .map((item) =>\n item.record ? normalizeRecord(item.record as Record<string, any>) : undefined,\n )\n .filter(Boolean) as AssociationRecord[],\n );\n }, [normalizeRecord, value]);\n\n const applyDataFilling = useCallback(\n (next: AssociationValue[]) => {\n if (!associationForm?.dataFillingEnabled && !associationForm?.dataFillingRules?.mainRules) {\n return;\n }\n const sourceRecord = next[0]?.record;\n if (!sourceRecord) return;\n (associationForm?.dataFillingRules?.mainRules || []).forEach((rule) => {\n if (!rule?.source || !rule?.target) return;\n setFieldValue(rule.target, sourceRecord[rule.source]);\n });\n },\n [associationForm?.dataFillingEnabled, associationForm?.dataFillingRules, setFieldValue],\n );\n\n const commitSelection = useCallback(\n (next: AssociationValue[]) => {\n const normalized = multiple ? next : next.slice(0, 1);\n setFieldValue(fieldId, normalized);\n applyDataFilling(normalized);\n onChange?.(normalized);\n },\n [applyDataFilling, fieldId, multiple, onChange, setFieldValue],\n );\n\n const selectorColumns: ColumnsType<AssociationRecord> = useMemo(() => {\n const configured = associationForm?.selectorColumns || [];\n if (configured.length) {\n return configured\n .map((column) => {\n if (typeof column === 'string') {\n return { title: column, dataIndex: column, key: column, ellipsis: true };\n }\n return {\n title: column.title || column.dataIndex,\n dataIndex: column.dataIndex,\n key: column.key || column.dataIndex,\n width: column.width,\n ellipsis: column.ellipsis ?? true,\n render: (cellValue: any, record: AssociationRecord) =>\n column.dataIndex === associationForm?.mainFieldId\n ? normalizeCellValue(record.__associationLabel)\n : normalizeCellValue(cellValue),\n };\n })\n .filter(Boolean) as ColumnsType<AssociationRecord>;\n }\n const mainFieldId = associationForm?.mainFieldId;\n return [\n {\n title: '主字段',\n dataIndex: mainFieldId || '__associationLabel',\n key: mainFieldId || '__associationLabel',\n ellipsis: true,\n render: (_cellValue: any, record: AssociationRecord) =>\n normalizeCellValue(record.__associationLabel),\n },\n {\n title: 'ID',\n dataIndex: '__associationValue',\n key: '__associationValue',\n ellipsis: true,\n render: (_cellValue: any, record: AssociationRecord) =>\n normalizeCellValue(record.__associationValue),\n },\n ];\n }, [associationForm?.mainFieldId, associationForm?.selectorColumns]);\n\n const selectOptions = useMemo(\n () =>\n [...options, ...value]\n .filter(\n (item, index, list) =>\n list.findIndex((candidate) => candidate.value === item.value) === index,\n )\n .map((item) => ({ label: item.label, value: item.value })),\n [options, value],\n );\n\n if (behavior === 'HIDDEN') return null;\n\n const readonlyContent = value.map((item) => item.label).join(', ') || '--';\n const openSelector = () => {\n if (disabled) return;\n setSelectorOpen(true);\n void loadTable({ current: 1 });\n };\n const picker = (\n <div className=\"sy-association-selector\">\n <Input.Search\n allowClear\n enterButton=\"搜索\"\n value={keyword}\n placeholder={associationForm?.mainFieldId ? '搜索关联数据' : '搜索'}\n onChange={(event) => {\n setKeyword(event.target.value);\n if (!event.target.value) void loadTable({ current: 1, searchKeyWord: '' });\n }}\n onSearch={(searchKeyWord) => {\n setKeyword(searchKeyWord);\n void loadTable({ current: 1, searchKeyWord });\n }}\n />\n <Table<AssociationRecord>\n rowKey=\"__associationValue\"\n dataSource={tableData}\n columns={selectorColumns}\n loading={tableLoading}\n size=\"small\"\n pagination={{\n current: pagination.current,\n pageSize: pagination.pageSize,\n total: pagination.total,\n onChange: (current, pageSize) => void loadTable({ current, pageSize }),\n }}\n rowSelection={{\n type: multiple ? 'checkbox' : 'radio',\n preserveSelectedRowKeys: true,\n selectedRowKeys,\n onChange: (keys, rows) => {\n setSelectedRowKeys(keys);\n setSelectedRecords(rows as AssociationRecord[]);\n },\n }}\n onChange={(nextPagination: TablePaginationConfig) => {\n void loadTable({\n current: nextPagination.current,\n pageSize: nextPagination.pageSize,\n });\n }}\n onRow={(record) => ({\n onClick: () => {\n if (multiple) {\n const exists = selectedRowKeys.includes(record.__associationValue);\n setSelectedRowKeys(\n exists\n ? selectedRowKeys.filter((item) => item !== record.__associationValue)\n : [...selectedRowKeys, record.__associationValue],\n );\n setSelectedRecords(\n exists\n ? selectedRecords.filter(\n (item) => item.__associationValue !== record.__associationValue,\n )\n : [...selectedRecords, record],\n );\n return;\n }\n setSelectedRowKeys([record.__associationValue]);\n setSelectedRecords([record]);\n },\n onDoubleClick: () => {\n commitSelection([toValue(record)]);\n setSelectorOpen(false);\n },\n })}\n scroll={{ x: true }}\n />\n {selectedRecords.length > 0 && (\n <div className=\"sy-association-selected\">\n {selectedRecords.map((record) => (\n <Tag\n key={record.__associationValue}\n closable={!disabled}\n onClose={(event) => {\n event.preventDefault();\n setSelectedRowKeys((prev) =>\n prev.filter((key) => key !== record.__associationValue),\n );\n setSelectedRecords((prev) =>\n prev.filter((item) => item.__associationValue !== record.__associationValue),\n );\n }}\n >\n {record.__associationLabel}\n </Tag>\n ))}\n </div>\n )}\n </div>\n );\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`associationformfield-readonly-${fieldId}`}\n >\n {readonlyContent}\n </div>\n ) : (\n <div className={`sy-select-with-picker ${inputClassName || ''}`}>\n <Select\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n allowClear={allowClear}\n showSearch={showSearch}\n filterOption={false}\n onSearch={showSearch ? loadOptions : undefined}\n disabled={disabled}\n placeholder={placeholder}\n loading={selectLoading}\n notFoundContent={selectLoading ? <Spin size=\"small\" /> : undefined}\n options={selectOptions}\n value={multiple ? value.map((item) => item.value) : value[0]?.value}\n onChange={(nextValue) => {\n const ids = (Array.isArray(nextValue) ? nextValue : [nextValue]).filter(\n (item) => item !== undefined && item !== null,\n );\n const next = ids\n .map(\n (id) =>\n options.find((item) => item.value === id) ??\n value.find((item) => item.value === id),\n )\n .filter(Boolean) as AssociationValue[];\n commitSelection(next);\n }}\n data-testid={`associationformfield-input-${fieldId}`}\n />\n <Button\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={openSelector}\n data-testid={`associationformfield-picker-trigger-${fieldId}`}\n >\n 选择\n </Button>\n {value.length > 0 && (\n <Button disabled={disabled} onClick={() => commitSelection([])}>\n 清空\n </Button>\n )}\n </div>\n )}\n {isMobile ? (\n <Drawer\n title={associationForm?.formUuid || '选择关联数据'}\n placement=\"bottom\"\n height=\"80%\"\n open={selectorOpen}\n onClose={() => setSelectorOpen(false)}\n destroyOnClose\n footer={\n <Space style={{ width: '100%', justifyContent: 'flex-end' }}>\n <Button onClick={() => setSelectorOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n onClick={() => {\n commitSelection(selectedRecords.map(toValue));\n setSelectorOpen(false);\n }}\n >\n 确定\n </Button>\n </Space>\n }\n >\n {picker}\n </Drawer>\n ) : (\n <Modal\n title={associationForm?.formUuid || '选择关联数据'}\n open={selectorOpen}\n width={760}\n onCancel={() => setSelectorOpen(false)}\n onOk={() => {\n commitSelection(selectedRecords.map(toValue));\n setSelectorOpen(false);\n }}\n okButtonProps={{ disabled: selectedRecords.length === 0 }}\n destroyOnClose\n >\n {picker}\n </Modal>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Image from '@tiptap/extension-image';\nimport Link from '@tiptap/extension-link';\nimport Color from '@tiptap/extension-color';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport Highlight from '@tiptap/extension-highlight';\nimport { Table } from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport type { EditorFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\ntype ToolbarAction =\n | 'undo'\n | 'redo'\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'heading'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'alignLeft'\n | 'alignCenter'\n | 'alignRight'\n | 'link'\n | 'image'\n | 'highlight'\n | 'color'\n | 'table'\n | 'clear';\n\nconst TOOLBAR_PRESETS: Record<'minimal' | 'basic' | 'full', ToolbarAction[]> = {\n minimal: ['bold', 'italic', 'link', 'bulletList', 'orderedList', 'undo', 'redo'],\n basic: [\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'bulletList',\n 'orderedList',\n 'link',\n 'image',\n 'undo',\n 'redo',\n ],\n full: [\n 'undo',\n 'redo',\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'color',\n 'highlight',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'link',\n 'image',\n 'table',\n 'clear',\n ],\n};\n\nconst DEFAULT_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp'];\n\nconst normalizeToolbarConfig = (config?: EditorFieldProps['toolbarConfig']): ToolbarAction[] => {\n if (Array.isArray(config)) return config as ToolbarAction[];\n if (config === 'minimal' || config === 'basic' || config === 'full')\n return TOOLBAR_PRESETS[config];\n return TOOLBAR_PRESETS.full;\n};\n\nconst getImageUrl = async (\n api: ReturnType<typeof useFormContext>['api'],\n file: File,\n bucketName: string,\n) => {\n const uploaded = await api.uploadFile(file, bucketName);\n if (uploaded.previewUrl || uploaded.url) return uploaded.previewUrl || uploaded.url;\n if (uploaded.bucketName && uploaded.objectName) {\n const ticket = await api.createFileAccessTicket(\n uploaded.bucketName,\n uploaded.objectName,\n uploaded.name,\n 'preview',\n );\n return ticket?.url || ticket?.previewUrl || ticket?.downloadUrl || ticket?.ticketUrl || '';\n }\n return '';\n};\n\nconst isImageAllowed = (file: File, allowedTypes: string[]) => {\n if (!allowedTypes.length) return true;\n const lowerName = file.name.toLowerCase();\n return allowedTypes.some((type) => {\n const normalized = type.toLowerCase();\n if (normalized.startsWith('.')) return lowerName.endsWith(normalized);\n return file.type.toLowerCase() === normalized;\n });\n};\n\nfunction ToolbarButton({\n active,\n disabled,\n label,\n onClick,\n}: {\n active?: boolean;\n disabled?: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className={active ? 'is-active' : undefined}\n disabled={disabled}\n title={label}\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n\nfunction EditorToolbar({\n editor,\n actions,\n disabled,\n onPickImage,\n}: {\n editor: Editor | null;\n actions: ToolbarAction[];\n disabled?: boolean;\n onPickImage: () => void;\n}) {\n if (!editor || actions.length === 0) return null;\n\n const canUndo = editor.can().undo();\n const canRedo = editor.can().redo();\n\n return (\n <div className=\"sy-editor-toolbar\" role=\"toolbar\" aria-label=\"编辑器工具栏\">\n {actions.includes('undo') && (\n <ToolbarButton\n label=\"撤销\"\n disabled={disabled || !canUndo}\n onClick={() => editor.chain().focus().undo().run()}\n />\n )}\n {actions.includes('redo') && (\n <ToolbarButton\n label=\"重做\"\n disabled={disabled || !canRedo}\n onClick={() => editor.chain().focus().redo().run()}\n />\n )}\n {actions.includes('heading') && (\n <select\n className=\"sy-editor-select\"\n disabled={disabled}\n value={\n editor.isActive('heading', { level: 1 })\n ? 'h1'\n : editor.isActive('heading', { level: 2 })\n ? 'h2'\n : editor.isActive('heading', { level: 3 })\n ? 'h3'\n : 'p'\n }\n onChange={(event) => {\n const value = event.target.value;\n if (value === 'p') editor.chain().focus().setParagraph().run();\n if (value === 'h1') editor.chain().focus().toggleHeading({ level: 1 }).run();\n if (value === 'h2') editor.chain().focus().toggleHeading({ level: 2 }).run();\n if (value === 'h3') editor.chain().focus().toggleHeading({ level: 3 }).run();\n }}\n title=\"段落样式\"\n >\n <option value=\"p\">正文</option>\n <option value=\"h1\">标题 1</option>\n <option value=\"h2\">标题 2</option>\n <option value=\"h3\">标题 3</option>\n </select>\n )}\n {actions.includes('bold') && (\n <ToolbarButton\n label=\"B\"\n disabled={disabled}\n active={editor.isActive('bold')}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n )}\n {actions.includes('italic') && (\n <ToolbarButton\n label=\"I\"\n disabled={disabled}\n active={editor.isActive('italic')}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n )}\n {actions.includes('underline') && (\n <ToolbarButton\n label=\"U\"\n disabled={disabled}\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n />\n )}\n {actions.includes('strike') && (\n <ToolbarButton\n label=\"S\"\n disabled={disabled}\n active={editor.isActive('strike')}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n />\n )}\n {actions.includes('color') && (\n <input\n type=\"color\"\n className=\"sy-editor-color\"\n disabled={disabled}\n title=\"文字颜色\"\n onChange={(event) => editor.chain().focus().setColor(event.target.value).run()}\n />\n )}\n {actions.includes('highlight') && (\n <ToolbarButton\n label=\"标记\"\n disabled={disabled}\n active={editor.isActive('highlight')}\n onClick={() => editor.chain().focus().toggleHighlight({ color: '#fff3bf' }).run()}\n />\n )}\n {actions.includes('bulletList') && (\n <ToolbarButton\n label=\"• 列表\"\n disabled={disabled}\n active={editor.isActive('bulletList')}\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n />\n )}\n {actions.includes('orderedList') && (\n <ToolbarButton\n label=\"1. 列表\"\n disabled={disabled}\n active={editor.isActive('orderedList')}\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n />\n )}\n {actions.includes('blockquote') && (\n <ToolbarButton\n label=\"引用\"\n disabled={disabled}\n active={editor.isActive('blockquote')}\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n />\n )}\n {actions.includes('alignLeft') && (\n <ToolbarButton\n label=\"左对齐\"\n disabled={disabled}\n active={editor.isActive({ textAlign: 'left' })}\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n />\n )}\n {actions.includes('alignCenter') && (\n <ToolbarButton\n label=\"居中\"\n disabled={disabled}\n active={editor.isActive({ textAlign: 'center' })}\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n />\n )}\n {actions.includes('alignRight') && (\n <ToolbarButton\n label=\"右对齐\"\n disabled={disabled}\n active={editor.isActive({ textAlign: 'right' })}\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n />\n )}\n {actions.includes('link') && (\n <ToolbarButton\n label=\"链接\"\n disabled={disabled}\n active={editor.isActive('link')}\n onClick={() => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt('请输入链接地址', previousUrl || '');\n if (url === null) return;\n if (!url) {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n }}\n />\n )}\n {actions.includes('image') && (\n <ToolbarButton label=\"图片\" disabled={disabled} onClick={onPickImage} />\n )}\n {actions.includes('table') && (\n <ToolbarButton\n label=\"表格\"\n disabled={disabled}\n active={editor.isActive('table')}\n onClick={() =>\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()\n }\n />\n )}\n {actions.includes('clear') && (\n <ToolbarButton\n label=\"清除格式\"\n disabled={disabled}\n onClick={() => editor.chain().focus().unsetAllMarks().clearNodes().run()}\n />\n )}\n </div>\n );\n}\n\nexport function EditorField(props: EditorFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n rows = 8,\n maxLength,\n height,\n toolbarConfig,\n uploadBucketName = 'images',\n maxImageSize = 10,\n allowedImageTypes = DEFAULT_IMAGE_TYPES,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = (formData[fieldId] as string | undefined) ?? '';\n const disabled = behavior === 'DISABLED';\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [uploading, setUploading] = useState(false);\n const [uploadError, setUploadError] = useState('');\n const [charCount, setCharCount] = useState(0);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const actions = useMemo(() => normalizeToolbarConfig(toolbarConfig), [toolbarConfig]);\n const extensions = useMemo(\n () => [\n StarterKit.configure({\n heading: { levels: [1, 2, 3] },\n }),\n Underline,\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Link.configure({ openOnClick: false, autolink: true, linkOnPaste: true }),\n Placeholder.configure({ placeholder: placeholder || '请输入内容' }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Image.configure({\n allowBase64: false,\n HTMLAttributes: { class: 'sy-editor-image' },\n }),\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n ],\n [placeholder],\n );\n\n const updateHtml = useCallback(\n (next: string) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n },\n [fieldId, onChange, setFieldValue],\n );\n\n const editor = useEditor(\n {\n extensions,\n content: value || '',\n editable: !disabled,\n onUpdate: ({ editor: currentEditor }) => {\n const text = currentEditor.getText();\n setCharCount(text.length);\n if (maxLength && text.length > maxLength) {\n currentEditor.commands.undo();\n return;\n }\n updateHtml(currentEditor.isEmpty ? '' : currentEditor.getHTML());\n },\n editorProps: {\n attributes: {\n class: 'sy-editor-prose',\n 'data-testid': `editorfield-input-${fieldId}`,\n },\n },\n },\n [fieldId, extensions, disabled, maxLength, updateHtml],\n );\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!disabled);\n }, [disabled, editor]);\n\n useEffect(() => {\n if (!editor) return;\n const currentHtml = editor.isEmpty ? '' : editor.getHTML();\n if ((value || '') !== currentHtml) {\n editor.commands.setContent(value || '', { emitUpdate: false });\n setCharCount(editor.getText().length);\n }\n }, [editor, value]);\n\n const insertImageFiles = useCallback(\n async (files: File[]) => {\n if (!editor || disabled || files.length === 0) return;\n const validFiles = files.filter((file) => {\n if (!isImageAllowed(file, allowedImageTypes)) return false;\n if (maxImageSize && file.size > maxImageSize * 1024 * 1024) return false;\n return true;\n });\n if (validFiles.length !== files.length) {\n setUploadError(`图片仅支持 ${allowedImageTypes.join(', ')},且不能超过 ${maxImageSize}MB`);\n } else {\n setUploadError('');\n }\n if (!validFiles.length) return;\n setUploading(true);\n try {\n for (const file of validFiles) {\n const url = await getImageUrl(api, file, uploadBucketName);\n if (url) {\n editor.chain().focus().setImage({ src: url, alt: file.name, title: file.name }).run();\n }\n }\n } catch (error) {\n setUploadError(error instanceof Error ? error.message : '图片上传失败');\n } finally {\n setUploading(false);\n }\n },\n [allowedImageTypes, api, disabled, editor, maxImageSize, uploadBucketName],\n );\n\n if (behavior === 'HIDDEN') return null;\n\n const minHeight =\n typeof height === 'number'\n ? height\n : typeof height === 'string'\n ? height\n : Math.max(160, rows * 32);\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value sy-editor-readonly\"\n data-testid={`editorfield-readonly-${fieldId}`}\n dangerouslySetInnerHTML={{ __html: value || '--' }}\n />\n ) : (\n <div className={inputClassName} data-testid={`editorfield-shell-${fieldId}`}>\n <div className={`sy-editor ${disabled ? 'is-disabled' : ''}`}>\n <EditorToolbar\n editor={editor}\n actions={actions}\n disabled={disabled || uploading}\n onPickImage={() => inputRef.current?.click()}\n />\n <div\n className=\"sy-editor-body\"\n style={{ minHeight }}\n onPasteCapture={(event) => {\n const files = Array.from(event.clipboardData?.files || []).filter((file) =>\n file.type.startsWith('image/'),\n );\n if (files.length) {\n event.preventDefault();\n void insertImageFiles(files);\n }\n }}\n onDropCapture={(event) => {\n const files = Array.from(event.dataTransfer?.files || []).filter((file) =>\n file.type.startsWith('image/'),\n );\n if (files.length) {\n event.preventDefault();\n void insertImageFiles(files);\n }\n }}\n >\n <EditorContent editor={editor} />\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept={allowedImageTypes.join(',')}\n hidden\n multiple\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n event.target.value = '';\n void insertImageFiles(files);\n }}\n />\n </div>\n <div className=\"sy-editor-footer\">\n <span>{uploading ? '图片上传中...' : uploadError}</span>\n {maxLength && (\n <span>\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Input } from 'antd';\nimport type { SerialNumberFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SerialNumberField(props: SerialNumberFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior = 'READONLY',\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder = '自动生成',\n defaultValue,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'READONLY';\n const value = (formData[fieldId] as string | undefined) ?? '';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`serialnumberfield-readonly-${fieldId}`}\n >\n {value || '--'}\n </div>\n ) : (\n <Input\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n placeholder={placeholder}\n readOnly\n disabled={behavior === 'DISABLED'}\n data-testid={`serialnumberfield-input-${fieldId}`}\n />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, Space } from 'antd';\nimport type { LocationFieldProps, LocationValue } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst getDingTalkApi = () => {\n if (typeof window === 'undefined') return undefined;\n return (window as any).dd || (window as any).dingtalk || (window as any).DingTalkPC;\n};\n\nconst isDingTalkEnvironment = () => {\n if (typeof navigator === 'undefined') return false;\n return /DingTalk/i.test(navigator.userAgent || '') || Boolean(getDingTalkApi());\n};\n\nconst normalizeDingTalkLocation = (res: any): LocationValue => ({\n latitude: Number(res.latitude),\n longitude: Number(res.longitude),\n address: res.address || res.snippet || res.title || res.poiName,\n city: res.city,\n district: res.adName || res.district,\n province: res.province,\n name: res.title || res.poiName || res.address,\n accuracy: res.accuracy ? Number(res.accuracy) : undefined,\n source: 'dingTalk',\n time: Date.now(),\n});\n\nexport function LocationField(props: LocationFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n defaultValue,\n allowClear = true,\n locateButtonText = '获取定位',\n clearButtonText = '清空',\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as LocationValue | undefined;\n const [locating, setLocating] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setValue = (next?: LocationValue) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const ensureDingTalkReady = async () => {\n const dingTalk = getDingTalkApi();\n if (!dingTalk) throw new Error('当前环境不支持钉钉定位');\n if (typeof dingTalk.config !== 'function') return dingTalk;\n const currentUrl =\n typeof window !== 'undefined' ? window.location.href.split('#')[0] : undefined;\n const signature = currentUrl ? await api.getDingTalkSignature(currentUrl) : undefined;\n dingTalk.config({\n agentId: signature?.agentId,\n corpId: signature?.corpId,\n timeStamp: signature?.timeStamp || signature?.timestamp,\n nonceStr: signature?.nonceStr,\n signature: signature?.signature,\n jsApiList: ['getLocation', 'locateInMap', 'device.geolocation.get', 'biz.map.locate'],\n });\n await new Promise<void>((resolve, reject) => {\n if (typeof dingTalk.ready !== 'function') {\n resolve();\n return;\n }\n dingTalk.ready(() => resolve());\n if (typeof dingTalk.error === 'function') dingTalk.error((err: any) => reject(err));\n setTimeout(resolve, 3000);\n });\n return dingTalk;\n };\n\n const locateWithDingTalk = async () => {\n const dingTalk = await ensureDingTalkReady();\n return new Promise<LocationValue>((resolve, reject) => {\n const options = {\n type: 1,\n useCache: true,\n coordinate: '1',\n cacheTimeout: 20,\n withReGeocode: true,\n targetAccuracy: '200',\n success: (res: any) => resolve(normalizeDingTalkLocation(res)),\n fail: (err: any) => reject(err || new Error('定位失败')),\n complete: () => undefined,\n };\n if (typeof dingTalk.getLocation === 'function') {\n dingTalk.getLocation(options);\n return;\n }\n if (typeof dingTalk.device?.geolocation?.get === 'function') {\n dingTalk.device.geolocation.get(options);\n return;\n }\n reject(new Error('当前钉钉版本不支持定位'));\n });\n };\n\n const locateWithBrowser = async () =>\n new Promise<LocationValue>((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('当前浏览器不支持定位'));\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (position) => {\n resolve({\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n source: 'browser',\n time: Date.now(),\n });\n },\n (geoError) => reject(geoError || new Error('定位失败')),\n { enableHighAccuracy: true, timeout: 10000 },\n );\n });\n\n const locate = async () => {\n setLocating(true);\n setError('');\n try {\n const next = isDingTalkEnvironment()\n ? await locateWithDingTalk().catch(() => locateWithBrowser())\n : await locateWithBrowser();\n setValue(next);\n } catch (currentError) {\n setError(currentError instanceof Error ? currentError.message : '定位失败');\n } finally {\n setLocating(false);\n }\n };\n\n const display = value\n ? value.address || value.name || `${value.latitude.toFixed(6)}, ${value.longitude.toFixed(6)}`\n : '--';\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <div className=\"sy-location-field\" data-testid={`locationfield-${fieldId}`}>\n <div className=\"sy-field-readonly-value\">{display}</div>\n {value?.accuracy !== undefined && (\n <div className=\"sy-location-meta\">精度约 {Math.round(value.accuracy)} 米</div>\n )}\n {error && <div className=\"sy-field-error\">{error}</div>}\n {behavior !== 'READONLY' && (\n <Space>\n <Button\n type=\"primary\"\n loading={locating}\n disabled={behavior === 'DISABLED'}\n onClick={locate}\n >\n {locateButtonText}\n </Button>\n {allowClear && (\n <Button\n disabled={behavior === 'DISABLED'}\n onClick={() => {\n setError('');\n setValue(undefined);\n }}\n >\n {clearButtonText}\n </Button>\n )}\n </Space>\n )}\n </div>\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button, Modal, Space } from 'antd';\nimport type {\n DigitalSignatureFieldProps,\n DigitalSignatureValue,\n SignaturePoint,\n} from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst CANVAS_HEIGHT = 260;\n\nconst computeSHA512 = async (text: string) => {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buffer = await crypto.subtle.digest('SHA-512', new TextEncoder().encode(text));\n return Array.from(new Uint8Array(buffer))\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n let hash = 0;\n for (let index = 0; index < text.length; index += 1) {\n hash = (hash << 5) - hash + text.charCodeAt(index);\n hash |= 0;\n }\n return `fallback-${Math.abs(hash).toString(16)}`;\n};\n\nexport function DigitalSignatureField(props: DigitalSignatureFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n defaultValue,\n bucketName = 'signatures',\n allowClear = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as DigitalSignatureValue | undefined;\n const [open, setOpen] = useState(false);\n const [saving, setSaving] = useState(false);\n const [drawn, setDrawn] = useState(false);\n const [error, setError] = useState('');\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const drawingRef = useRef(false);\n const pointsRef = useRef<SignaturePoint[]>([]);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const prepareCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const cssWidth = Math.max(480, rect.width || 640);\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n canvas.width = Math.floor(cssWidth * dpr);\n canvas.height = Math.floor(CANVAS_HEIGHT * dpr);\n canvas.style.height = `${CANVAS_HEIGHT}px`;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, cssWidth, CANVAS_HEIGHT);\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, cssWidth, CANVAS_HEIGHT);\n ctx.lineWidth = 2.4;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.strokeStyle = '#111827';\n }, []);\n\n useEffect(() => {\n if (!open) return;\n pointsRef.current = [];\n setDrawn(false);\n setError('');\n requestAnimationFrame(prepareCanvas);\n }, [open, prepareCanvas]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setValue = (next?: DigitalSignatureValue) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top, t: Date.now() };\n };\n\n const clearCanvas = () => {\n pointsRef.current = [];\n setDrawn(false);\n setError('');\n prepareCanvas();\n };\n\n const save = async () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (!pointsRef.current.length) {\n setError('请先完成签名');\n return;\n }\n setSaving(true);\n setError('');\n try {\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!blob) throw new Error('生成签名图片失败');\n const file = new File([blob], `signature-${Date.now()}.png`, { type: 'image/png' });\n const uploaded = await api.uploadFile(file, bucketName);\n const payload: Omit<DigitalSignatureValue, 'hash'> = {\n url: uploaded.url,\n bucketName: uploaded.bucketName || bucketName,\n objectName: uploaded.objectName,\n previewUrl: uploaded.previewUrl || uploaded.url,\n points: pointsRef.current.slice(),\n timestamp: Date.now(),\n };\n const hash = await computeSHA512(JSON.stringify(payload));\n setValue({ ...payload, hash });\n setOpen(false);\n } catch (saveError) {\n setError(saveError instanceof Error ? saveError.message : '签名保存失败');\n } finally {\n setSaving(false);\n }\n };\n\n const previewUrl = value?.previewUrl || value?.url;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <div className=\"sy-signature-field\" data-testid={`digitalsignaturefield-${fieldId}`}>\n {previewUrl ? (\n <button\n type=\"button\"\n className=\"sy-signature-preview\"\n onClick={() => setOpen(behavior !== 'READONLY')}\n disabled={behavior === 'READONLY'}\n >\n <img src={previewUrl} alt={label} />\n </button>\n ) : (\n <span className=\"sy-field-readonly-value\">--</span>\n )}\n {value?.hash && (\n <div className=\"sy-signature-hash\">SHA-512: {value.hash.slice(0, 24)}...</div>\n )}\n {behavior !== 'READONLY' && (\n <Space>\n <Button disabled={behavior === 'DISABLED'} onClick={() => setOpen(true)}>\n {previewUrl ? '重新签名' : '开始签名'}\n </Button>\n {allowClear && (\n <Button disabled={behavior === 'DISABLED'} onClick={() => setValue(undefined)}>\n 清空\n </Button>\n )}\n </Space>\n )}\n <Modal\n open={open}\n title={label}\n onCancel={() => setOpen(false)}\n onOk={save}\n confirmLoading={saving}\n okButtonProps={{ disabled: !drawn }}\n width={720}\n destroyOnClose\n >\n <div className=\"sy-signature-canvas-wrap\">\n <canvas\n ref={canvasRef}\n style={{ width: '100%', height: CANVAS_HEIGHT, border: '1px solid #d9d9d9' }}\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n drawingRef.current = true;\n const point = getPoint(event);\n pointsRef.current.push(point);\n setDrawn(true);\n }}\n onPointerMove={(event) => {\n if (!drawingRef.current) return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n const last = pointsRef.current[pointsRef.current.length - 1];\n const next = getPoint(event);\n if (ctx && last) {\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(next.x, next.y);\n ctx.stroke();\n }\n pointsRef.current.push(next);\n }}\n onPointerUp={(event) => {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n drawingRef.current = false;\n }}\n onPointerLeave={() => {\n drawingRef.current = false;\n }}\n data-testid={`digitalsignaturefield-canvas-${fieldId}`}\n />\n {error && <div className=\"sy-field-error\">{error}</div>}\n <Button onClick={clearCanvas} disabled={saving}>\n 清空画布\n </Button>\n </div>\n </Modal>\n </div>\n </FieldWrapper>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { JSONFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst formatJson = (value: any) => {\n if (value === undefined || value === null || value === '') return '--';\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nexport function JSONField(props: JSONFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n readonlyClassName,\n defaultValue,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'READONLY';\n const value = formData[fieldId];\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <pre\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`jsonfield-readonly-${fieldId}`}\n >\n {formatJson(value)}\n </pre>\n </FieldWrapper>\n );\n}\n","import type React from 'react';\nimport { TextField } from '../fields/TextField';\nimport { NumberField } from '../fields/NumberField';\nimport { TextAreaField } from '../fields/TextAreaField';\nimport { SelectField } from '../fields/SelectField';\nimport { MultiSelectField } from '../fields/MultiSelectField';\nimport { RadioField } from '../fields/RadioField';\nimport { CheckboxField } from '../fields/CheckboxField';\nimport { DateField } from '../fields/DateField';\nimport { CascadeDateField } from '../fields/CascadeDateField';\nimport { AttachmentField } from '../fields/AttachmentField';\nimport { ImageField } from '../fields/ImageField';\nimport { SubFormField } from '../fields/SubFormField';\nimport { UserSelectField } from '../fields/UserSelectField';\nimport { DepartmentSelectField } from '../fields/DepartmentSelectField';\nimport { CascadeSelectField } from '../fields/CascadeSelectField';\nimport { AddressField } from '../fields/AddressField';\nimport { AssociationFormField } from '../fields/AssociationFormField';\nimport { EditorField } from '../fields/EditorField';\nimport { SerialNumberField } from '../fields/SerialNumberField';\nimport { LocationField } from '../fields/LocationField';\nimport { DigitalSignatureField } from '../fields/DigitalSignatureField';\nimport { JSONField } from '../fields/JSONField';\n\nexport const defaultComponentRegistry: Record<string, React.ComponentType<any>> = {\n TextField,\n NumberField,\n TextAreaField,\n SelectField,\n MultiSelectField,\n RadioField,\n CheckboxField,\n DateField,\n CascadeDateField,\n AttachmentField,\n ImageField,\n SubFormField,\n UserSelectField,\n EmployeeSelectField: UserSelectField,\n DepartmentSelectField,\n TextareaField: TextAreaField,\n CascadeSelectField,\n AddressField,\n AssociationFormField,\n EditorField,\n SerialNumberField,\n LocationField,\n DigitalSignatureField,\n JSONField,\n};\n","import type { FormEffect, FieldBehavior } from '../types';\n\n/**\n * Evaluate form effects based on current form data.\n * Returns a map of fieldId → FieldBehavior adjustments.\n * Only behavior-changing actions (show/hide/enable/disable) are processed.\n * setValue actions are ignored in behavior evaluation.\n */\nexport function evaluateEffects(\n effects: FormEffect[],\n formData: Record<string, any>,\n currentBehaviors: Record<string, FieldBehavior>,\n): Record<string, FieldBehavior> {\n const result: Record<string, FieldBehavior> = { ...currentBehaviors };\n\n for (const effect of effects) {\n const conditionMet = evaluateCondition(effect.when, formData);\n\n if (conditionMet) {\n for (const action of effect.then) {\n switch (action.action) {\n case 'show':\n result[action.field] = 'NORMAL';\n break;\n case 'hide':\n result[action.field] = 'HIDDEN';\n break;\n case 'enable':\n result[action.field] = 'NORMAL';\n break;\n case 'disable':\n result[action.field] = 'DISABLED';\n break;\n case 'setValue':\n // setValue does not affect behavior, handled elsewhere\n break;\n }\n }\n }\n }\n\n return result;\n}\n\nfunction evaluateCondition(when: FormEffect['when'], formData: Record<string, any>): boolean {\n const fieldValue = formData[when.field];\n\n switch (when.operator) {\n case 'eq':\n return fieldValue === when.value;\n case 'ne':\n return fieldValue !== when.value;\n case 'in':\n return Array.isArray(when.value) && when.value.includes(fieldValue);\n case 'changed':\n return true;\n }\n}\n","import type { ValidationRule } from '../types';\n\n/**\n * Validate a single field value against its rules.\n * Returns the first error message encountered, or null if valid.\n */\nexport async function validateField(value: any, rules: ValidationRule[]): Promise<string | null> {\n for (const rule of rules) {\n // Required check\n if (rule.required) {\n const isEmpty =\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0);\n if (isEmpty) {\n return rule.message || '此字段为必填项';\n }\n }\n\n // Skip further checks if value is empty and not required\n if (value === null || value === undefined || value === '') {\n continue;\n }\n\n // Min check\n if (rule.min !== undefined) {\n if (typeof value === 'string' && value.length < rule.min) {\n return rule.message || `最少输入 ${rule.min} 个字符`;\n }\n if (typeof value === 'number' && value < rule.min) {\n return rule.message || `不能小于 ${rule.min}`;\n }\n }\n\n // Max check\n if (rule.max !== undefined) {\n if (typeof value === 'string' && value.length > rule.max) {\n return rule.message || `最多输入 ${rule.max} 个字符`;\n }\n if (typeof value === 'number' && value > rule.max) {\n return rule.message || `不能大于 ${rule.max}`;\n }\n }\n\n // Pattern check\n if (rule.pattern !== undefined) {\n const regex = typeof rule.pattern === 'string' ? new RegExp(rule.pattern) : rule.pattern;\n if (!regex.test(String(value))) {\n return rule.message || '格式不正确';\n }\n }\n\n // Custom validator\n if (rule.validator) {\n try {\n await rule.validator(value);\n } catch (e: any) {\n return e?.message || rule.message || '校验失败';\n }\n }\n }\n\n return null;\n}\n\n/**\n * Validate all fields in a form.\n * Returns a map of fieldId → error message for fields that have errors.\n */\nexport async function validateAllFields(\n formData: Record<string, any>,\n fieldRules: Record<string, ValidationRule[]>,\n): Promise<Record<string, string>> {\n const errors: Record<string, string> = {};\n\n const entries = Object.entries(fieldRules);\n const results = await Promise.all(\n entries.map(([fieldId, rules]) => validateField(formData[fieldId], rules)),\n );\n\n entries.forEach(([fieldId], index) => {\n const error = results[index];\n if (error) {\n errors[fieldId] = error;\n }\n });\n\n return errors;\n}\n","import type {\n AttachmentItem,\n FormRuntimeApi,\n FormRuntimeApiConfig,\n RuntimeRequestConfig,\n RuntimeResponse,\n} from '../types';\n\nconst DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\nconst CHUNK_UPLOAD_THRESHOLD = 10 * 1024 * 1024;\n\nconst trimTrailingSlash = (value?: string) => String(value || '').replace(/\\/$/, '');\n\nconst getDefaultBaseUrl = () => {\n const globalEnv = (globalThis as any).process?.env;\n const envBaseUrl = globalEnv?.FORM_API_BASE_URL || globalEnv?.BASE_API_URL;\n if (envBaseUrl) return trimTrailingSlash(envBaseUrl);\n\n const browserGlobal = typeof window !== 'undefined' ? (window as any) : undefined;\n const windowBaseUrl =\n browserGlobal?.FORM_API_BASE_URL ||\n browserGlobal?.BASE_API_URL ||\n browserGlobal?.__FORM_API_BASE_URL__ ||\n browserGlobal?.__LOWCODE_API_BASE_URL__;\n if (windowBaseUrl) return trimTrailingSlash(windowBaseUrl);\n\n return typeof window !== 'undefined' ? '/service' : '';\n};\n\nconst appendQuery = (url: string, params?: Record<string, any>) => {\n if (!params) return url;\n const search = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null || value === '') return;\n if (Array.isArray(value)) {\n value.forEach((item) => search.append(key, String(item)));\n return;\n }\n search.append(key, String(value));\n });\n const query = search.toString();\n if (!query) return url;\n return `${url}${url.includes('?') ? '&' : '?'}${query}`;\n};\n\nconst joinUrl = (baseUrl: string, url: string) => {\n if (/^https?:\\/\\//i.test(url)) return url;\n return `${trimTrailingSlash(baseUrl)}${url.startsWith('/') ? url : `/${url}`}`;\n};\n\nconst parseResponse = async <T>(response: Response): Promise<RuntimeResponse<T>> => {\n const contentType = response.headers.get('content-type') || '';\n const payload = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n\n if (!response.ok) {\n const message =\n typeof payload === 'object' && payload\n ? payload.message || payload.error || response.statusText\n : response.statusText;\n throw new Error(message || '请求失败');\n }\n\n if (typeof payload === 'object' && payload) {\n return payload as RuntimeResponse<T>;\n }\n\n return {\n code: response.status,\n success: response.ok,\n data: payload as T,\n result: payload as T,\n message: response.statusText,\n };\n};\n\nconst createDefaultRequest =\n (baseUrl: string): FormRuntimeApi['request'] =>\n async <T = any>(config: RuntimeRequestConfig): Promise<RuntimeResponse<T> | Blob> => {\n const method = config.method ?? 'get';\n const url = appendQuery(joinUrl(baseUrl, config.url), config.params);\n const headers = new Headers(config.headers as HeadersInit);\n let body: BodyInit | undefined;\n\n if (config.data !== undefined) {\n if (config.data instanceof FormData) {\n body = config.data;\n } else {\n headers.set('Content-Type', headers.get('Content-Type') || 'application/json');\n body = JSON.stringify(config.data);\n }\n }\n\n const token = typeof window !== 'undefined' ? window.localStorage?.getItem('token') : undefined;\n if (token && !headers.has('authorization')) {\n headers.set('authorization', token);\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body,\n credentials: 'include',\n });\n\n if (config.responseType === 'blob') {\n if (!response.ok) throw new Error(response.statusText || '请求失败');\n return response.blob();\n }\n\n return parseResponse<T>(response);\n };\n\nconst generateUid = () => `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;\n\nconst normalizeUploadData = (data: any, file: File, bucketName: string): AttachmentItem => {\n const item = Array.isArray(data) ? data[0] : data;\n const objectName = item?.objectName || item?.objectKey || item?.key;\n const resolvedBucketName = item?.bucketName || bucketName;\n return {\n id: item?.id || item?.uid || objectName || generateUid(),\n uid: item?.uid || item?.id || objectName || generateUid(),\n name: item?.originalName || item?.name || file.name,\n originalName: item?.originalName || file.name,\n url: item?.url || '',\n status: 'done',\n size: item?.size ?? file.size,\n objectName,\n bucketName: resolvedBucketName,\n contentType: item?.contentType || file.type,\n mimeType: item?.contentType || file.type,\n };\n};\n\nconst uploadWithXhr = (\n baseUrl: string,\n file: File,\n bucketName: string,\n onProgress?: (percent: number) => void,\n): Promise<AttachmentItem> =>\n new Promise((resolve, reject) => {\n if ((globalThis as any).process?.env?.VITEST) {\n onProgress?.(100);\n resolve({\n id: generateUid(),\n uid: generateUid(),\n name: file.name,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n status: 'done',\n size: file.size,\n bucketName,\n contentType: file.type,\n });\n return;\n }\n\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n formData.append('files', file);\n\n xhr.open('POST', joinUrl(baseUrl, `/file/upload?bucketName=${encodeURIComponent(bucketName)}`));\n xhr.withCredentials = true;\n const token = typeof window !== 'undefined' ? window.localStorage?.getItem('token') : undefined;\n if (token) xhr.setRequestHeader('authorization', token);\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n onProgress?.(Math.round((event.loaded / event.total) * 100));\n }\n };\n xhr.onload = () => {\n try {\n const payload = JSON.parse(xhr.responseText || '{}');\n if (xhr.status >= 200 && xhr.status < 300 && payload.success !== false) {\n resolve(normalizeUploadData(payload.data, file, bucketName));\n return;\n }\n reject(new Error(payload.message || payload.error || '上传失败'));\n } catch (error) {\n reject(error);\n }\n };\n xhr.onerror = () => reject(new Error('上传失败'));\n xhr.send(formData);\n });\n\nasync function uploadChunkedFile(\n request: FormRuntimeApi['request'],\n file: File,\n bucketName: string,\n onProgress?: (percent: number) => void,\n) {\n const initiate = (await request<any>({\n url: '/file/multipart/initiate',\n method: 'post',\n data: {\n fileName: file.name,\n fileSize: file.size,\n chunkSize: DEFAULT_CHUNK_SIZE,\n bucketName,\n },\n })) as RuntimeResponse<any>;\n const uploadInfo = initiate.data || initiate.result;\n const totalParts = uploadInfo?.totalParts || Math.ceil(file.size / DEFAULT_CHUNK_SIZE);\n const parts: Array<{ partNumber: number; etag: string }> = [];\n\n try {\n for (let index = 0; index < totalParts; index += 1) {\n const start = index * DEFAULT_CHUNK_SIZE;\n const end = Math.min(start + DEFAULT_CHUNK_SIZE, file.size);\n const formData = new FormData();\n formData.append('file', file.slice(start, end));\n formData.append('uploadId', uploadInfo.uploadId);\n formData.append('partNumber', String(index + 1));\n formData.append('bucketName', uploadInfo.bucketName);\n formData.append('objectName', uploadInfo.objectName);\n const part = (await request<any>({\n url: '/file/multipart/upload',\n method: 'post',\n data: formData,\n })) as RuntimeResponse<any>;\n parts.push(part.data || part.result);\n onProgress?.(Math.round(((index + 1) / totalParts) * 100));\n }\n\n const completed = (await request<any>({\n url: '/file/multipart/complete',\n method: 'post',\n data: {\n uploadId: uploadInfo.uploadId,\n bucketName: uploadInfo.bucketName,\n objectName: uploadInfo.objectName,\n originalName: file.name,\n contentType: file.type || undefined,\n parts: parts.sort((a, b) => a.partNumber - b.partNumber),\n },\n })) as RuntimeResponse<any>;\n\n return normalizeUploadData(completed.data || completed.result, file, bucketName);\n } catch (error) {\n await request({\n url: '/file/multipart/abort',\n method: 'post',\n data: {\n uploadId: uploadInfo?.uploadId,\n bucketName: uploadInfo?.bucketName,\n objectName: uploadInfo?.objectName,\n },\n }).catch(() => undefined);\n throw error;\n }\n}\n\nexport function createFormRuntimeApi(config?: FormRuntimeApiConfig): FormRuntimeApi {\n const { baseUrl = getDefaultBaseUrl(), ...overrides } = config ?? {};\n const request = overrides.request ?? createDefaultRequest(baseUrl);\n\n const defaults: FormRuntimeApi = {\n request,\n uploadFile: async (file, bucketName = 'files', onProgress) => {\n if (file.size > CHUNK_UPLOAD_THRESHOLD) {\n return uploadChunkedFile(request, file, bucketName, onProgress);\n }\n return uploadWithXhr(baseUrl, file, bucketName, onProgress);\n },\n deleteFile: async (objectName, bucketName = 'files') => {\n await request({ url: '/file/delete', method: 'post', data: { bucketName, objectName } });\n return { success: true };\n },\n createDownloadTicket: async (bucketName, objectName, fileName) => {\n const response = (await request<any>({\n url: '/file/download-ticket',\n method: 'post',\n data: { bucketName, objectName, fileName },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n createFileAccessTicket: async (bucketName, objectName, fileName, purpose = 'preview') => {\n const response = (await request<any>({\n url: '/file/access-ticket',\n method: 'post',\n data: { bucketName, objectName, fileName, purpose },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n getUserById: async (id) => {\n const response = (await request<any>({\n url: `/user/${id}`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n getUserList: async (params) => {\n const response = (await request<any>({\n url: '/user/list',\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n const data = response.data || response.result;\n return Array.isArray(data) ? data : data?.items || data?.list || [];\n },\n getDepartmentRoots: async () => {\n const response = (await request<any>({\n url: '/department/root',\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n getDepartmentChildren: async (parentId) => {\n const response = (await request<any>({\n url: `/department/${parentId}/children`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n getDepartmentParentDepartments: async (id) => {\n const response = (await request<any>({\n url: `/department/${id}/parentDepartments`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n getDepartmentMembers: async (id) => {\n const response = (await request<any>({\n url: `/department/${id}/members`,\n method: 'get',\n })) as RuntimeResponse<any>;\n const data = response.data || response.result;\n return Array.isArray(data) ? data : data?.items || data?.list || [];\n },\n getChinaDivisions: async (parentAdcode) => {\n const response = (await request<any>({\n url: '/china-divisions',\n method: 'get',\n params: parentAdcode ? { parentAdcode } : undefined,\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n advancedSearch: async (params) => {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/advancedSearch.json`,\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n return response.result || response.data || {};\n },\n getDingTalkSignature: async (url) => {\n const response = (await request<any>({\n url: '/dingtalk/signature',\n method: 'get',\n params: { url },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n submitFormData: async (payload) => {\n const response = (await request<any>({\n url: '/form/submitFormData',\n method: 'post',\n data: payload,\n })) as RuntimeResponse<any>;\n return response.data || response.result || response;\n },\n updateFormData: async (payload) => {\n const response = (await request<any>({\n url: `/${payload.appType}/v1/form/updateFormData.json`,\n method: 'post',\n data: payload,\n })) as RuntimeResponse<any>;\n return response.data || response.result || response;\n },\n };\n\n return { ...defaults, ...overrides, request };\n}\n","import React from 'react';\nimport { useFormContext } from './FormContext';\nimport { useComponent } from './ComponentRegistry';\n\nexport interface FormRendererProps {\n className?: string;\n fieldClassName?: string;\n columns?: 1 | 2 | 3 | 4;\n size?: 'compact' | 'default' | 'large';\n}\n\nconst columnsClassMap: Record<number, string> = {\n 1: 'sy-grid-cols-1',\n 2: 'sy-grid-cols-1 md:sy-grid-cols-2',\n 3: 'sy-grid-cols-1 md:sy-grid-cols-2 lg:sy-grid-cols-3',\n 4: 'sy-grid-cols-1 md:sy-grid-cols-2 lg:sy-grid-cols-4',\n};\n\nconst sizeClassMap: Record<string, string> = {\n compact: 'sy-gap-y-3 sy-gap-x-4',\n default: 'sy-gap-y-5 sy-gap-x-6',\n large: 'sy-gap-y-6 sy-gap-x-8',\n};\n\nfunction FieldRenderer({ field, fieldClassName }: { field: any; fieldClassName?: string }) {\n const Component = useComponent(field.componentName);\n\n if (!Component) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[FormRenderer] Component \"${field.componentName}\" is not registered, skipping field \"${field.fieldId}\".`,\n );\n }\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fieldId, componentName: _, ...fieldProps } = field;\n\n return React.createElement(Component, {\n ...fieldProps,\n fieldId,\n className: fieldClassName ?? fieldProps.className,\n });\n}\n\nexport function FormRenderer({\n className,\n fieldClassName,\n columns = 1,\n size = 'default',\n}: FormRendererProps) {\n const { schema } = useFormContext();\n\n const gridClass = columnsClassMap[columns];\n const gapClass = sizeClassMap[size];\n const containerClassName = ['sy-grid', gridClass, gapClass, className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClassName} data-testid=\"form-renderer\">\n {schema.fields.map((field) => (\n <FieldRenderer key={field.fieldId} field={field} fieldClassName={fieldClassName} />\n ))}\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { Button } from 'antd';\nimport { useFormContext } from './FormContext';\n\nexport interface FormActionsProps {\n className?: string;\n submitText?: string;\n resetText?: string;\n showReset?: boolean;\n onSubmit?: (values: Record<string, any>) => Promise<void>;\n submitSuccessMode?: 'stay' | 'callback';\n}\n\nexport function FormActions({\n className,\n submitText = '提交',\n resetText = '重置',\n showReset = true,\n onSubmit,\n}: FormActionsProps) {\n const { mode, validateAll, getFormData, resetForm, api, config } = useFormContext();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = useCallback(async () => {\n setSubmitError(null);\n const valid = await validateAll();\n if (!valid) return;\n\n const values = getFormData();\n setIsSubmitting(true);\n try {\n const beforeResult = await config.submit?.beforeSubmit?.(values);\n if (beforeResult === false) return;\n\n let response: any;\n if (onSubmit) {\n response = await onSubmit(values);\n } else if (mode === 'edit' && config.formInstanceId) {\n response = await api.updateFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n formInstId: config.formInstanceId,\n updateFormDataJson: JSON.stringify(values),\n });\n } else {\n response = await api.submitFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n data: values,\n });\n }\n\n await config.submit?.afterSubmit?.(response);\n\n if (config.submit?.submitSuccessMode === 'redirect' && config.submit.redirectUrl) {\n window.location.href = config.submit.redirectUrl;\n }\n } catch (e: any) {\n setSubmitError(e?.message || '提交失败');\n } finally {\n setIsSubmitting(false);\n }\n }, [api, config, getFormData, mode, onSubmit, validateAll]);\n\n const handleReset = useCallback(() => {\n resetForm();\n }, [resetForm]);\n\n if (mode === 'readonly') return null;\n\n return (\n <div className={className ?? 'sy-form-actions'} data-testid=\"form-actions\">\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n loading={isSubmitting}\n onClick={handleSubmit}\n data-testid=\"form-submit-btn\"\n >\n {submitText}\n </Button>\n {showReset && (\n <Button\n htmlType=\"reset\"\n disabled={isSubmitting}\n onClick={handleReset}\n data-testid=\"form-reset-btn\"\n >\n {resetText}\n </Button>\n )}\n {submitError && (\n <span className=\"sy-field-error\" role=\"alert\" data-testid=\"form-submit-error\">\n {submitError}\n </span>\n )}\n </div>\n );\n}\n","import React from 'react';\n\n/** Simple className merge utility */\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport interface FormContainerProps {\n title?: string;\n description?: string;\n children: React.ReactNode;\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n className?: string;\n}\n\nconst maxWidthClassMap: Record<string, string> = {\n sm: 'sy-form-container-sm',\n md: 'sy-form-container-md',\n lg: 'sy-form-container-lg',\n xl: 'sy-form-container-xl',\n full: 'sy-form-container-full',\n};\n\nexport function FormContainer({\n title,\n description,\n children,\n maxWidth = 'md',\n className,\n}: FormContainerProps) {\n const sizeClass = maxWidthClassMap[maxWidth];\n\n return (\n <div className={cn('sy-form-container', sizeClass, className)}>\n {(title || description) && (\n <div className=\"sy-form-header\">\n {title && <h2 className=\"sy-form-title\">{title}</h2>}\n {description && <p className=\"sy-form-description\">{description}</p>}\n </div>\n )}\n <div className=\"sy-form-body\">{children}</div>\n </div>\n );\n}\n","import type { ProcessStatus, StatusMeta, TaskStatus } from '../types';\n\n/** 流程状态元映射 */\nexport const PROCESS_STATUS_META: Record<ProcessStatus, StatusMeta> = {\n running: { label: '审批中', tone: 'brand' },\n waiting: { label: '等待中', tone: 'neutral' },\n exception: { label: '流程异常', tone: 'danger' },\n completed: { label: '已完成', tone: 'success' },\n terminated: { label: '已拒绝', tone: 'danger' },\n withdrawn: { label: '已撤销', tone: 'neutral' },\n pending: { label: '待处理', tone: 'brand' },\n cancelled: { label: '已取消', tone: 'neutral' },\n};\n\n/** 任务状态元映射 */\nexport const TASK_STATUS_META: Record<TaskStatus, StatusMeta> = {\n pending: { label: '待处理', tone: 'brand' },\n approved: { label: '已同意', tone: 'success' },\n rejected: { label: '已拒绝', tone: 'danger' },\n returned: { label: '已退回', tone: 'warning' },\n suspended: { label: '已挂起', tone: 'neutral' },\n cancelled: { label: '已取消', tone: 'neutral' },\n copied: { label: '已抄送', tone: 'neutral' },\n waiting: { label: '等待中', tone: 'neutral' },\n simulated: { label: '未开始', tone: 'neutral' },\n};\n","import type {\n ApprovalPermission,\n ApproveParams,\n ChangeRecordListResponse,\n ChangeRecordQueryParams,\n FormDataDeleteParams,\n FormDataQueryParams,\n FormInstanceData,\n FormRuntimeApi,\n PreviewParams,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessRoute,\n ProcessTask,\n ReturnableNode,\n ReturnParams,\n ResubmitParams,\n RuntimeResponse,\n SaveTaskParams,\n TransferParams,\n ViewPermissionQueryParams,\n ViewPermissionSummary,\n WithdrawParams,\n} from '../types';\n\n// ============ 流程基础 ============\n\nconst normalizeProcessTask = (value: any): ProcessTask => {\n const taskId = value?.taskId ?? value?.id ?? value?.task_id ?? '';\n return {\n ...value,\n id: value?.id ?? taskId,\n taskId,\n nodeId: value?.nodeId ?? value?.node_id ?? '',\n nodeType: value?.nodeType ?? value?.node_type ?? 'approval',\n nodeName: value?.nodeName ?? value?.title ?? value?.name ?? value?.nodeId ?? '审批节点',\n status: value?.status ?? 'pending',\n assigneeId: value?.assigneeId ?? value?.assignee,\n };\n};\n\nconst normalizeProcessTasks = (value: any): ProcessTask[] => {\n if (Array.isArray(value)) return value.map(normalizeProcessTask);\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value.tasks)) return value.tasks.map(normalizeProcessTask);\n if (Array.isArray(value.currentTasks)) return value.currentTasks.map(normalizeProcessTask);\n if (Array.isArray(value.list)) return value.list.map(normalizeProcessTask);\n if (Array.isArray(value.items)) return value.items.map(normalizeProcessTask);\n if (Array.isArray(value.records)) return value.records.map(normalizeProcessTask);\n return [];\n};\n\nconst normalizeProcessBasic = (value: any): ProcessBasicInfo => {\n const raw = value ?? {};\n const instance = raw.instance ?? raw;\n const currentTask = raw.currentTask ? normalizeProcessTask(raw.currentTask) : undefined;\n\n return {\n ...raw,\n instanceId: raw.instanceId ?? raw.id ?? instance.formInstanceId ?? instance.id,\n processStatus: raw.processStatus ?? raw.status ?? instance.processStatus ?? instance.status,\n formUuid: raw.formUuid ?? instance.formUuid ?? instance.definition?.formUuid,\n appType: raw.appType ?? instance.appType ?? instance.definition?.appType,\n title: raw.title ?? instance.title,\n originatorId: raw.originatorId ?? instance.originatorId ?? instance.startedBy,\n originatorName: raw.originatorName ?? instance.originatorName ?? instance.startedByName,\n originatorDepartment:\n raw.originatorDepartment ?? instance.originatorDepartment ?? instance.startedDepartmentName,\n createdAt: raw.createdAt ?? instance.createdAt ?? instance.startedAt,\n currentTask,\n };\n};\n\nconst normalizeApprovalPermission = (value: any): ApprovalPermission => {\n const raw = value ?? {};\n const currentTasks = normalizeProcessTasks(raw.currentTasks);\n const hasPermission = Boolean(raw.hasPermission ?? raw.isApprover ?? currentTasks.length > 0);\n\n return {\n ...raw,\n hasPermission,\n isApprover: Boolean(raw.isApprover ?? hasPermission),\n canUndo: Boolean(raw.canUndo ?? raw.canWithdraw),\n currentTasks,\n };\n};\n\nconst normalizeReturnableNodes = (value: any): ReturnableNode[] => {\n const raw = value?.candidates || value?.nodes || value?.data || value;\n if (!Array.isArray(raw)) return [];\n return raw.map((node) => ({\n ...node,\n nodeId: node?.nodeId || node?.id || '',\n nodeName: node?.nodeName || node?.name || node?.title || node?.id || '',\n }));\n};\n\nconst normalizeProcessDefinition = (value: any): ProcessDefinition => {\n const raw = value?.definitionJson || value?.viewJson || value || {};\n const nodes = Array.isArray(raw.nodes) ? raw.nodes : [];\n const startNode = nodes.find((node: any) => node?.type === 'start' || node?.nodeType === 'start');\n return {\n ...raw,\n processId: raw.processId || raw.id || value?.id || '',\n flowConfig: raw.flowConfig || value?.flowConfig || {},\n startNodeId: raw.startNodeId || startNode?.id || value?.startNodeId,\n };\n};\n\n/** 获取流程基本信息 */\nexport async function getProcessBasic(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessBasicInfo> {\n const response = (await request<ProcessBasicInfo>({\n url: `/workflow/instance/${formInstId}/basic`,\n method: 'get',\n })) as RuntimeResponse<ProcessBasicInfo>;\n return normalizeProcessBasic(response.data || response.result);\n}\n\n/** 获取流程进度(任务列表) */\nexport async function getProcessProgress(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessTask[]> {\n const response = (await request<any>({\n url: `/workflow/instance/${formInstId}/all-tasks`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return normalizeProcessTasks(response.data || response.result);\n}\n\n/** 检查当前用户审批权限 */\nexport async function checkUserApproval(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ApprovalPermission> {\n const response = (await request<ApprovalPermission>({\n url: `/workflow/instance/${formInstId}/permission`,\n method: 'get',\n })) as RuntimeResponse<ApprovalPermission>;\n return normalizeApprovalPermission(response.data || response.result);\n}\n\n// ============ 审批操作 ============\n\n/** 审批(同意/拒绝) */\nexport async function handleApproval(\n request: FormRuntimeApi['request'],\n params: ApproveParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/approve',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 撤销流程 */\nexport async function withdrawProcess(\n request: FormRuntimeApi['request'],\n params: WithdrawParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/instance/${params.instanceId}/withdraw`,\n method: 'put',\n data: { reason: params.reason },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 转交任务 */\nexport async function transferTask(\n request: FormRuntimeApi['request'],\n params: TransferParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/transfer`,\n method: 'put',\n data: { newAssignee: params.newAssignee, reason: params.reason },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 退回任务 */\nexport async function returnTask(\n request: FormRuntimeApi['request'],\n params: ReturnParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/return`,\n method: 'put',\n data: { targetNodeId: params.targetNodeId, reason: params.reason },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 重新提交任务 */\nexport async function resubmitTask(\n request: FormRuntimeApi['request'],\n params: ResubmitParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit`,\n method: 'post',\n data: {\n formUuid: params.formUuid,\n appType: params.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 暂存任务 */\nexport async function saveTask(\n request: FormRuntimeApi['request'],\n params: SaveTaskParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/task/save',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 获取可退回节点 */\nexport async function getReturnableNodes(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNode[]> {\n const response = (await request<ReturnableNode[]>({\n url: `/workflow/task/${taskId}/returnable-nodes`,\n method: 'get',\n })) as RuntimeResponse<ReturnableNode[]>;\n return normalizeReturnableNodes(response.data || response.result);\n}\n\n// ============ 流程预览和定义 ============\n\n/** 预览流程路由 */\nexport async function previewProcess(\n request: FormRuntimeApi['request'],\n params: PreviewParams,\n): Promise<ProcessRoute[]> {\n const response = (await request<ProcessRoute[]>({\n url: '/workflow/preview',\n method: 'post',\n data: params,\n })) as RuntimeResponse<ProcessRoute[]>;\n return response.data || response.result || [];\n}\n\n/** 获取流程定义 */\nexport async function getProcessDefinition(\n request: FormRuntimeApi['request'],\n formUuid: string,\n): Promise<ProcessDefinition> {\n const response = (await request<ProcessDefinition>({\n url: '/workflow/definition/form',\n method: 'get',\n params: { formUuid },\n })) as RuntimeResponse<ProcessDefinition>;\n return normalizeProcessDefinition(response.data || response.result);\n}\n\n/** 触发回调等待任务 */\nexport async function triggerCallbackTask(\n request: FormRuntimeApi['request'],\n params: { taskId: string; payload?: Record<string, any> },\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/callback`,\n method: 'post',\n data: params.payload || {},\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n// ============ 表单详情 ============\n\n/** 获取表单实例数据 */\nexport async function getFormData(\n request: FormRuntimeApi['request'],\n params: FormDataQueryParams,\n): Promise<FormInstanceData> {\n const response = (await request<FormInstanceData>({\n url: '/form/queryFormDataByFormInstanceId',\n method: 'get',\n params,\n })) as RuntimeResponse<FormInstanceData>;\n return response.data || response.result!;\n}\n\n/** 删除表单数据 */\nexport async function deleteFormData(\n request: FormRuntimeApi['request'],\n params: FormDataDeleteParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 获取表单变更记录 */\nexport async function getChangeRecords(\n request: FormRuntimeApi['request'],\n params: ChangeRecordQueryParams,\n): Promise<ChangeRecordListResponse> {\n const response = (await request<ChangeRecordListResponse>({\n url: '/form/getFormDataChangeRecords',\n method: 'get',\n params,\n })) as RuntimeResponse<ChangeRecordListResponse>;\n return response.data || response.result!;\n}\n\n/** 获取视图权限摘要 */\nexport async function getViewPermission(\n request: FormRuntimeApi['request'],\n params: ViewPermissionQueryParams,\n): Promise<ViewPermissionSummary> {\n const response = (await request<ViewPermissionSummary>({\n url: '/permission/form-group/view-permissions',\n method: 'get',\n params,\n })) as RuntimeResponse<ViewPermissionSummary>;\n return response.data || response.result!;\n}\n","import type { FieldDefinition, FormRuntimeApi, RuntimeResponse } from '../types';\n\nexport type DataManagementConfigScope = 'global' | 'personal';\nexport type DataManagementDensity = 'compact' | 'middle' | 'loose';\nexport type FilterLogic = 'AND' | 'OR';\nexport type SortDirection = 'ascend' | 'descend' | null;\n\nexport interface DataManagementField extends FieldDefinition {\n id: string;\n fieldId: string;\n componentName: string;\n label: string;\n width?: number;\n system?: boolean;\n processOnly?: boolean;\n displayable?: boolean;\n}\n\nexport interface DataManagementFilterRule {\n id: string;\n key: string;\n operator: string;\n value: any;\n componentName?: string;\n}\n\nexport interface DataManagementFilterGroup {\n id: string;\n logic: FilterLogic;\n rules: DataManagementFilterRule[];\n conditions: DataManagementFilterGroup[];\n}\n\nexport interface DataManagementSort {\n id: string;\n isAsc: 'y' | 'n';\n}\n\nexport interface DataManagementConfig {\n showFields?: string[];\n widths?: Record<string, number>;\n lockFieldIds?: string[];\n sort?: DataManagementSort[];\n filter?: {\n searchKeyWord?: string;\n group?: DataManagementFilterGroup;\n };\n density?: DataManagementDensity;\n detailOpenMode?: 'drawer' | 'newPage';\n pageSize?: number;\n [key: string]: any;\n}\n\nexport interface DataManagementQuery {\n appType: string;\n formUuid: string;\n filters?: DataManagementFilterGroup;\n rawFilters?: string;\n conditionType?: FilterLogic;\n searchKeyWord?: string;\n currentPage?: number;\n pageSize?: number;\n order?: DataManagementSort[];\n instanceStatus?: string;\n}\n\nexport interface DataManagementListResult {\n records: any[];\n total: number;\n}\n\nexport interface DataManagementApiOptions {\n appType: string;\n formUuid: string;\n menuFormUuid?: string;\n scope?: DataManagementConfigScope;\n}\n\nconst unwrap = <T = any>(response: RuntimeResponse<T> | Blob | any): T => {\n if (response instanceof Blob) return response as T;\n if (response?.data?.result !== undefined) return response.data.result as T;\n if (response?.result !== undefined) return response.result as T;\n if (response?.data !== undefined) return response.data as T;\n return response as T;\n};\n\nconst pickData = (value: any) => value?.data ?? value?.result ?? value;\n\nconst normalizeComponentName = (field: any) =>\n field?.componentName ||\n field?.component_name ||\n field?.component_type ||\n field?.componentType ||\n field?.type ||\n 'TextField';\n\nconst normalizeField = (key: string, field: any, system = false): DataManagementField => ({\n ...field,\n id: field?.id || field?.fieldId || key,\n fieldId: field?.fieldId || field?.id || key,\n componentName: normalizeComponentName(field),\n label: field?.label || field?.title || field?.name || key,\n width: field?.width,\n system,\n});\n\nexport const PROCESS_INSTANCE_STATUS_OPTIONS = [\n { label: '待处理', value: 'pending' },\n { label: '审批中', value: 'running' },\n { label: '等待中', value: 'waiting' },\n { label: '流程异常', value: 'exception' },\n { label: '已完成', value: 'completed' },\n { label: '已拒绝', value: 'terminated' },\n { label: '已撤销', value: 'withdrawn' },\n];\n\nexport const APPROVAL_RESULT_OPTIONS = [\n { label: '审批中', value: 'processing' },\n { label: '同意', value: 'approved' },\n { label: '拒绝', value: 'rejected' },\n { label: '撤销', value: 'withdrawn' },\n { label: '异常', value: 'exception' },\n];\n\nconst PROCESS_SYSTEM_FIELDS: DataManagementField[] = [\n normalizeField(\n 'currentApprovalNodeName',\n {\n label: '当前审批节点',\n componentName: 'TextField',\n width: 140,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n normalizeField(\n 'processInstanceStatus',\n {\n label: '实例状态',\n componentName: 'SelectField',\n width: 110,\n options: PROCESS_INSTANCE_STATUS_OPTIONS,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n normalizeField(\n 'approvalResult',\n {\n label: '审批结果',\n componentName: 'SelectField',\n width: 110,\n options: APPROVAL_RESULT_OPTIONS,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n];\n\nconst BASE_SYSTEM_FIELDS: DataManagementField[] = [\n normalizeField('createTime', { label: '创建时间', componentName: 'DateField', width: 170 }, true),\n normalizeField(\n 'modifiedTime',\n { label: '更新时间', componentName: 'DateField', width: 170 },\n true,\n ),\n normalizeField(\n 'originatorName',\n { label: '创建人', componentName: 'TextField', width: 130 },\n true,\n ),\n];\n\nexport const getSystemFieldsForFormType = (formType?: string) =>\n formType === 'process' ? [...BASE_SYSTEM_FIELDS, ...PROCESS_SYSTEM_FIELDS] : BASE_SYSTEM_FIELDS;\n\nexport const normalizeDataManagementFields = (\n payload: any,\n): {\n fields: DataManagementField[];\n formType?: string;\n} => {\n const data = pickData(payload);\n const formType = data?.formType || data?.schema?.formType || data?.type;\n const rawFields =\n data?.formFields ||\n data?.schema?.formFields ||\n data?.fields ||\n data?.schema?.fields ||\n data?.formSchema?.fields ||\n [];\n\n const fields = Array.isArray(rawFields)\n ? rawFields.map((field: any) => normalizeField(field?.fieldId || field?.id, field))\n : Object.entries(rawFields).map(([key, field]) => normalizeField(key, field));\n\n return {\n fields: fields.filter((field) => field.componentName !== 'PageSection'),\n formType,\n };\n};\n\nexport const normalizeDataManagementList = (payload: any): DataManagementListResult => {\n const data = unwrap<any>(payload);\n const body = data?.result || data;\n const records = body?.data || body?.records || body?.list || body?.items || [];\n const total = body?.totalCount ?? body?.total ?? body?.count ?? records.length;\n return {\n records: Array.isArray(records) ? records : [],\n total: Number(total) || 0,\n };\n};\n\nexport const buildFilterPayload = (group?: DataManagementFilterGroup): string | undefined => {\n if (!group) return undefined;\n const trimGroup = (current: DataManagementFilterGroup): DataManagementFilterGroup => ({\n ...current,\n rules: (current.rules || []).filter(\n (rule) => rule.key && rule.operator && rule.value !== undefined && rule.value !== '',\n ),\n conditions: (current.conditions || [])\n .map(trimGroup)\n .filter((item) => item.rules.length > 0 || item.conditions.length > 0),\n });\n const payload = trimGroup(group);\n if (payload.rules.length === 0 && payload.conditions.length === 0) return undefined;\n return JSON.stringify(payload);\n};\n\nexport const normalizeColumnConfig = (\n cfg: DataManagementConfig | undefined,\n fields: DataManagementField[],\n): Required<Pick<DataManagementConfig, 'showFields' | 'widths' | 'lockFieldIds' | 'sort'>> & {\n density: DataManagementDensity;\n detailOpenMode: 'drawer' | 'newPage';\n pageSize: number;\n} => {\n const allowed = new Set(fields.map((field) => field.fieldId));\n const configured = Array.isArray(cfg?.showFields)\n ? cfg.showFields.filter((fieldId) => allowed.has(fieldId))\n : [];\n const defaultShow = fields\n .filter((field) => !field.system || field.displayable)\n .slice(0, 8)\n .map((field) => field.fieldId);\n\n return {\n showFields: configured.length > 0 ? configured : defaultShow,\n widths: cfg?.widths || {},\n lockFieldIds: cfg?.lockFieldIds || [],\n sort: Array.isArray(cfg?.sort) ? cfg.sort : [],\n density: cfg?.density || 'middle',\n detailOpenMode: cfg?.detailOpenMode === 'newPage' ? 'newPage' : 'drawer',\n pageSize: cfg?.pageSize || 10,\n };\n};\n\nexport async function getDataManagementSchema(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string },\n) {\n const response = await request({\n url: '/form/getFormSchemaAndPackages',\n method: 'get',\n params,\n });\n return normalizeDataManagementFields(response);\n}\n\nexport async function getDataManagementConfig(\n request: FormRuntimeApi['request'],\n options: DataManagementApiOptions,\n): Promise<DataManagementConfig | undefined> {\n const targetFormUuid = options.menuFormUuid || options.formUuid;\n const personal = options.scope === 'personal';\n const response = await request<DataManagementConfig>({\n url: `/${options.appType}/v1/form/dataManagement/config/${personal ? 'personal/' : ''}get.json`,\n method: 'get',\n params: { formUuid: targetFormUuid },\n });\n return unwrap<DataManagementConfig>(response);\n}\n\nexport async function saveDataManagementConfig(\n request: FormRuntimeApi['request'],\n options: DataManagementApiOptions & { config: DataManagementConfig },\n) {\n const targetFormUuid = options.menuFormUuid || options.formUuid;\n const personal = options.scope === 'personal';\n const response = await request({\n url: `/${options.appType}/v1/form/dataManagement/config/${personal ? 'personal/' : ''}save.json`,\n method: 'post',\n data: { formUuid: targetFormUuid, config: options.config },\n });\n return unwrap(response);\n}\n\nexport async function advancedSearchDataManagement(\n request: FormRuntimeApi['request'],\n query: DataManagementQuery,\n): Promise<DataManagementListResult> {\n const response = await request({\n url: `/${query.appType}/v1/form/advancedSearch.json`,\n method: 'get',\n params: {\n appType: query.appType,\n formUuid: query.formUuid,\n filters: query.rawFilters ?? buildFilterPayload(query.filters),\n conditionType: query.conditionType,\n searchKeyWord: query.searchKeyWord,\n currentPage: query.currentPage || 1,\n pageSize: query.pageSize || 10,\n order: JSON.stringify(query.order || []),\n instanceStatus: query.instanceStatus,\n },\n });\n return normalizeDataManagementList(response);\n}\n\nexport async function deleteDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; formInstanceIds: string[] },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: {\n appType: params.appType,\n formUuid: params.formUuid,\n formInstIds: params.formInstanceIds,\n formInstanceIds: params.formInstanceIds,\n },\n });\n return unwrap(response);\n}\n\nexport async function batchApproveDataManagementRows(\n request: FormRuntimeApi['request'],\n params: {\n appType: string;\n formUuid: string;\n formInstanceIds: string[];\n action: 'approved' | 'rejected';\n comments?: string;\n },\n) {\n const response = await request({\n url: '/workflow/approve/batch',\n method: 'post',\n data: {\n instanceIds: params.formInstanceIds,\n action: params.action,\n comments: params.comments,\n },\n });\n return unwrap(response);\n}\n\nexport async function exportDataManagementRows(\n request: FormRuntimeApi['request'],\n params: DataManagementQuery & {\n exportAll?: 'y' | 'n';\n embedImages?: 'y' | 'n';\n exportFields?: string[];\n },\n) {\n return request({\n url: `/${params.appType}/v1/form/advancedExport.xlsx`,\n method: 'get',\n responseType: 'blob',\n params: {\n appType: params.appType,\n formUuid: params.formUuid,\n filters: params.rawFilters ?? buildFilterPayload(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: JSON.stringify(params.order || []),\n instanceStatus: params.instanceStatus,\n exportAll: params.exportAll || 'n',\n embedImages: params.embedImages || 'n',\n exportFields: (params.exportFields || []).join(','),\n },\n });\n}\n\nexport async function importPreviewDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; fileBase64: string },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/importPreview.xlsx`,\n method: 'post',\n data: { formUuid: params.formUuid, fileBase64: params.fileBase64 },\n });\n return unwrap(response);\n}\n\nexport async function importDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; fileBase64: string },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/import.xlsx`,\n method: 'post',\n data: { formUuid: params.formUuid, fileBase64: params.fileBase64 },\n });\n return unwrap(response);\n}\n\nexport async function getDataManagementTransferRecords(\n request: FormRuntimeApi['request'],\n params: {\n appType: string;\n formUuid: string;\n type: 'import' | 'export';\n currentPage?: number;\n pageSize?: number;\n },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/${params.type}Records.json`,\n method: 'get',\n params,\n });\n return normalizeDataManagementList(response);\n}\n","import React, { useState } from 'react';\n\nexport interface FormSectionProps {\n title: string;\n description?: string;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n className?: string;\n titleClassName?: string;\n contentClassName?: string;\n children: React.ReactNode;\n}\n\nexport function FormSection({\n title,\n description,\n collapsible = false,\n defaultCollapsed = false,\n className,\n titleClassName,\n contentClassName,\n children,\n}: FormSectionProps) {\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n const handleToggle = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section\n className={className ?? 'border border-gray-200 rounded-lg p-4 mb-4'}\n data-testid=\"form-section\"\n >\n <div\n className={titleClassName ?? 'flex items-center justify-between mb-3'}\n onClick={handleToggle}\n role={collapsible ? 'button' : undefined}\n aria-expanded={collapsible ? !collapsed : undefined}\n data-testid=\"form-section-header\"\n >\n <div>\n <h3 className=\"text-base font-semibold text-gray-900\">{title}</h3>\n {description && (\n <p className=\"text-sm text-gray-500 mt-1\" data-testid=\"form-section-description\">\n {description}\n </p>\n )}\n </div>\n {collapsible && (\n <span\n className=\"text-gray-400 transition-transform duration-200\"\n data-testid=\"form-section-arrow\"\n style={{ transform: collapsed ? 'rotate(-90deg)' : 'rotate(0deg)' }}\n >\n ▼\n </span>\n )}\n </div>\n {!collapsed && (\n <div className={contentClassName} data-testid=\"form-section-content\">\n {children}\n </div>\n )}\n </section>\n );\n}\n","import React from 'react';\n\nexport interface FormGridProps {\n columns?: 1 | 2 | 3 | 4;\n gap?: number;\n className?: string;\n children: React.ReactNode;\n}\n\nconst columnClasses: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-4',\n};\n\nconst gapClasses: Record<number, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n};\n\nexport function FormGrid({ columns = 2, gap = 4, className, children }: FormGridProps) {\n const colClass = columnClasses[columns];\n const gapClass = gapClasses[gap] ?? `gap-${gap}`;\n\n return (\n <div className={className ?? `grid ${colClass} ${gapClass}`} data-testid=\"form-grid\">\n {children}\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nexport interface FormTabItem {\n key: string;\n label: string;\n children: React.ReactNode;\n}\n\nexport interface FormTabsProps {\n items: FormTabItem[];\n defaultActiveKey?: string;\n className?: string;\n tabClassName?: string;\n}\n\nexport function FormTabs({ items, defaultActiveKey, className, tabClassName }: FormTabsProps) {\n const [activeKey, setActiveKey] = useState(defaultActiveKey || items[0]?.key || '');\n\n const activeItem = items.find((item) => item.key === activeKey);\n\n return (\n <div className={className ?? 'w-full'} data-testid=\"form-tabs\">\n <div\n className={tabClassName ?? 'flex border-b border-gray-200 overflow-x-auto'}\n role=\"tablist\"\n data-testid=\"form-tabs-nav\"\n >\n {items.map((item) => (\n <button\n key={item.key}\n role=\"tab\"\n type=\"button\"\n aria-selected={activeKey === item.key}\n className={\n activeKey === item.key\n ? 'px-4 py-2 text-sm font-medium text-blue-600 border-b-2 border-blue-600 whitespace-nowrap'\n : 'px-4 py-2 text-sm font-medium text-gray-500 hover:text-gray-700 whitespace-nowrap'\n }\n onClick={() => setActiveKey(item.key)}\n data-testid={`form-tab-${item.key}`}\n >\n {item.label}\n </button>\n ))}\n </div>\n <div className=\"pt-4\" role=\"tabpanel\" data-testid=\"form-tabs-content\">\n {activeItem?.children}\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nexport interface FormStepItem {\n key: string;\n title: string;\n description?: string;\n children: React.ReactNode;\n}\n\nexport interface FormStepsProps {\n items: FormStepItem[];\n className?: string;\n onStepChange?: (step: number) => void;\n}\n\nexport function FormSteps({ items, className, onStepChange }: FormStepsProps) {\n const [currentStep, setCurrentStep] = useState(0);\n\n const goTo = (step: number) => {\n setCurrentStep(step);\n onStepChange?.(step);\n };\n\n const handlePrev = () => {\n if (currentStep > 0) {\n goTo(currentStep - 1);\n }\n };\n\n const handleNext = () => {\n if (currentStep < items.length - 1) {\n goTo(currentStep + 1);\n }\n };\n\n return (\n <div className={className ?? 'w-full'} data-testid=\"form-steps\">\n {/* Step indicator */}\n <div className=\"flex items-center mb-6\" data-testid=\"form-steps-indicator\">\n {items.map((item, index) => (\n <React.Fragment key={item.key}>\n <div className=\"flex items-center\">\n <div\n className={\n index === currentStep\n ? 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-blue-600 text-white'\n : index < currentStep\n ? 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-green-500 text-white'\n : 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-gray-200 text-gray-600'\n }\n data-testid={`form-step-circle-${index}`}\n >\n {index + 1}\n </div>\n <div className=\"ml-2 hidden sm:block\">\n <div className=\"text-sm font-medium text-gray-900\">{item.title}</div>\n {item.description && (\n <div className=\"text-xs text-gray-500\">{item.description}</div>\n )}\n </div>\n </div>\n {index < items.length - 1 && (\n <div\n className={\n index < currentStep\n ? 'flex-1 h-0.5 mx-4 bg-green-500'\n : 'flex-1 h-0.5 mx-4 bg-gray-200'\n }\n data-testid={`form-step-connector-${index}`}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Content */}\n <div data-testid=\"form-steps-content\">{items[currentStep]?.children}</div>\n\n {/* Navigation buttons */}\n <div className=\"flex justify-between mt-6\" data-testid=\"form-steps-actions\">\n <button\n type=\"button\"\n onClick={handlePrev}\n disabled={currentStep === 0}\n className={\n currentStep === 0\n ? 'px-4 py-2 text-sm font-medium text-gray-400 bg-gray-100 rounded cursor-not-allowed'\n : 'px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded hover:bg-gray-50'\n }\n data-testid=\"form-steps-prev\"\n >\n 上一步\n </button>\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={currentStep === items.length - 1}\n className={\n currentStep === items.length - 1\n ? 'px-4 py-2 text-sm font-medium text-gray-400 bg-gray-100 rounded cursor-not-allowed'\n : 'px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded hover:bg-blue-700'\n }\n data-testid=\"form-steps-next\"\n >\n 下一步\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useFormContext } from '../../core/FormContext';\n\nexport interface FormSummaryProps {\n className?: string;\n labelClassName?: string;\n valueClassName?: string;\n columns?: 1 | 2 | 3;\n fields?: string[];\n}\n\nconst columnClasses: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n};\n\nexport function FormSummary({\n className,\n labelClassName,\n valueClassName,\n columns = 2,\n fields,\n}: FormSummaryProps) {\n const { schema, formData } = useFormContext();\n\n const displayFields = fields\n ? schema.fields.filter((f) => fields.includes(f.fieldId))\n : schema.fields;\n\n const colClass = columnClasses[columns];\n\n const formatValue = (value: any): string => {\n if (value === null || value === undefined || value === '') return '--';\n if (Array.isArray(value)) {\n if (value.length === 0) return '--';\n return value.map((v) => (typeof v === 'object' && v?.label ? v.label : String(v))).join(', ');\n }\n if (typeof value === 'object' && value?.label) return value.label;\n return String(value);\n };\n\n return (\n <div className={className ?? `grid ${colClass} gap-4`} data-testid=\"form-summary\">\n {displayFields.map((field) => (\n <div\n key={field.fieldId}\n className=\"flex flex-col\"\n data-testid={`summary-field-${field.fieldId}`}\n >\n <span className={labelClassName ?? 'text-sm text-gray-500 mb-1'}>{field.label}</span>\n <span className={valueClassName ?? 'text-sm text-gray-900'}>\n {formatValue(formData[field.fieldId])}\n </span>\n </div>\n ))}\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useRef } from 'react';\nimport type { FieldBehavior, FormSchema, FormEngineConfig, ValidationRule } from '../types';\nimport { evaluateEffects } from '../core/effects';\nimport { validateAllFields } from '../core/validation';\n\nexport interface UseFormEngineReturn {\n formData: Record<string, any>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n validateAll: () => Promise<boolean>;\n resetForm: () => void;\n mode: string;\n fieldBehaviors: Record<string, FieldBehavior>;\n fieldErrors: Record<string, string>;\n}\n\nexport function useFormEngine(schema: FormSchema, config: FormEngineConfig): UseFormEngineReturn {\n // Build initial values from schema defaults\n const initialValues = useMemo(() => {\n const values: Record<string, any> = {};\n for (const field of schema.fields) {\n if (field.defaultValue !== undefined) {\n values[field.fieldId] = field.defaultValue;\n }\n }\n return values;\n }, [schema]);\n\n const initialValuesRef = useRef(initialValues);\n const [formData, setFormData] = useState<Record<string, any>>({ ...initialValues });\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n\n // Compute field behaviors based on permissions and effects\n const fieldBehaviors = useMemo(() => {\n // Start with default behaviors from schema\n const baseBehaviors: Record<string, FieldBehavior> = {};\n for (const field of schema.fields) {\n baseBehaviors[field.fieldId] = field.behavior || 'NORMAL';\n }\n\n // Apply effects\n let computed = baseBehaviors;\n if (config.effects && config.effects.length > 0) {\n computed = evaluateEffects(config.effects, formData, baseBehaviors);\n }\n\n // Apply permissions (override effects)\n if (config.permissions?.fieldPermissions) {\n for (const [fieldId, behavior] of Object.entries(config.permissions.fieldPermissions)) {\n computed[fieldId] = behavior;\n }\n }\n\n // In readonly mode, all fields become READONLY unless HIDDEN\n if (config.mode === 'readonly') {\n for (const fieldId of Object.keys(computed)) {\n if (computed[fieldId] !== 'HIDDEN') {\n computed[fieldId] = 'READONLY';\n }\n }\n }\n\n return computed;\n }, [schema, config.effects, config.permissions, config.mode, formData]);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n // Clear error when value changes\n setFieldErrors((prev) => {\n if (prev[fieldId]) {\n const next = { ...prev };\n delete next[fieldId];\n return next;\n }\n return prev;\n });\n }, []);\n\n const getFieldValue = useCallback((fieldId: string) => formData[fieldId], [formData]);\n\n const getFormData = useCallback(() => ({ ...formData }), [formData]);\n\n const validateAll = useCallback(async () => {\n const fieldRules: Record<string, ValidationRule[]> = {};\n for (const field of schema.fields) {\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n if (rules.length > 0) {\n fieldRules[field.fieldId] = rules;\n }\n }\n\n const errors = await validateAllFields(formData, fieldRules);\n setFieldErrors(errors);\n return Object.keys(errors).length === 0;\n }, [schema, formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setFieldErrors({});\n }, []);\n\n return {\n formData,\n setFieldValue,\n getFieldValue,\n getFormData,\n validateAll,\n resetForm,\n mode: config.mode,\n fieldBehaviors,\n fieldErrors,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\n\nexport interface UseFormDataReturn {\n formData: Record<string, any>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n resetForm: () => void;\n dirtyFields: Set<string>;\n}\n\nexport function useFormData(initialValues: Record<string, any> = {}): UseFormDataReturn {\n const [formData, setFormData] = useState<Record<string, any>>({ ...initialValues });\n const [dirtyFields, setDirtyFields] = useState<Set<string>>(new Set());\n const initialValuesRef = useRef(initialValues);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n setDirtyFields((prev) => {\n const next = new Set(prev);\n next.add(fieldId);\n return next;\n });\n }, []);\n\n const getFieldValue = useCallback(\n (fieldId: string) => {\n return formData[fieldId];\n },\n [formData],\n );\n\n const getFormData = useCallback(() => {\n return { ...formData };\n }, [formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setDirtyFields(new Set());\n }, []);\n\n return {\n formData,\n setFieldValue,\n getFieldValue,\n getFormData,\n resetForm,\n dirtyFields,\n };\n}\n","import { useMemo } from 'react';\nimport type { FieldBehavior, FormEffect } from '../types';\nimport { evaluateEffects } from '../core/effects';\n\nexport interface UseFieldBehaviorOptions {\n fieldId: string;\n permissions?: Record<string, FieldBehavior>;\n effects?: FormEffect[];\n formData: Record<string, any>;\n defaultBehavior?: FieldBehavior;\n}\n\n/**\n * Computes the final behavior for a field.\n * Priority: permissions > effects > defaultBehavior > 'NORMAL'\n */\nexport function useFieldBehavior({\n fieldId,\n permissions,\n effects,\n formData,\n defaultBehavior = 'NORMAL',\n}: UseFieldBehaviorOptions): FieldBehavior {\n return useMemo(() => {\n // If permissions explicitly define this field, that takes priority\n if (permissions && permissions[fieldId]) {\n return permissions[fieldId];\n }\n\n // Evaluate effects to see if they modify the behavior\n if (effects && effects.length > 0) {\n const baseBehaviors: Record<string, FieldBehavior> = { [fieldId]: defaultBehavior };\n const computed = evaluateEffects(effects, formData, baseBehaviors);\n return computed[fieldId] as FieldBehavior;\n }\n\n return defaultBehavior;\n }, [fieldId, permissions, effects, formData, defaultBehavior]);\n}\n","import { useState, useCallback } from 'react';\n\nexport interface SubmitConfig {\n beforeSubmit?: (values: Record<string, any>) => Promise<boolean | void>;\n afterSubmit?: (response: any) => Promise<void>;\n submitSuccessMode?: 'redirect' | 'stay' | 'callback';\n redirectUrl?: string;\n}\n\nexport interface UseFormSubmitReturn {\n submit: (formData: Record<string, any>, validateFn: () => Promise<boolean>) => Promise<void>;\n isSubmitting: boolean;\n submitError: string | null;\n}\n\nexport function useFormSubmit(config?: SubmitConfig): UseFormSubmitReturn {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const submit = useCallback(\n async (formData: Record<string, any>, validateFn: () => Promise<boolean>) => {\n setSubmitError(null);\n\n // Validate\n const isValid = await validateFn();\n if (!isValid) {\n setSubmitError('表单校验失败');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // beforeSubmit hook\n if (config?.beforeSubmit) {\n const result = await config.beforeSubmit(formData);\n if (result === false) {\n setIsSubmitting(false);\n return;\n }\n }\n\n // afterSubmit hook (simulates completion of submit)\n if (config?.afterSubmit) {\n await config.afterSubmit(formData);\n }\n } catch (e: any) {\n setSubmitError(e?.message || '提交失败');\n } finally {\n setIsSubmitting(false);\n }\n },\n [config],\n );\n\n return { submit, isSubmitting, submitError };\n}\n","import { useMemo, useCallback } from 'react';\nimport type {\n FieldBehavior,\n ProcessDefinition,\n ProcessTask,\n ViewPermissionSummary,\n} from '../types';\nimport { normalizeFieldBehaviors } from '../utils/permissions';\n\nexport interface UseFieldPermissionOptions {\n viewPermissions?: ViewPermissionSummary;\n processDefinition?: ProcessDefinition;\n currentTask?: ProcessTask;\n isApprover?: boolean;\n mode: 'readonly' | 'edit';\n}\n\nexport interface UseFieldPermissionReturn {\n fieldBehaviors: Record<string, FieldBehavior>;\n computeBehaviors: () => Record<string, FieldBehavior>;\n}\n\nconst normalizeBehavior = (value?: string): FieldBehavior => {\n if (value === 'EDITABLE') return 'NORMAL';\n if (value === 'READ_ONLY') return 'READONLY';\n if (value === 'DISABLED') return 'DISABLED';\n if (value === 'HIDDEN') return 'HIDDEN';\n if (value === 'NORMAL' || value === 'READONLY') return value;\n return 'READONLY';\n};\n\nconst normalizeFlowConfig = (config: any): Record<string, FieldBehavior> | null => {\n if (!config) return null;\n if (Array.isArray(config)) {\n const result: Record<string, FieldBehavior> = {};\n config.forEach((item) => {\n const fieldId = item?.fieldId || item?.field_id || item?.id;\n if (!fieldId) return;\n result[fieldId] = normalizeBehavior(item?.fieldBehavior || item?.behavior || item?.value);\n });\n return Object.keys(result).length > 0 ? result : null;\n }\n if (typeof config === 'object') {\n const result: Record<string, FieldBehavior> = {};\n Object.entries(config).forEach(([fieldId, value]) => {\n result[fieldId] = normalizeBehavior(\n typeof value === 'string'\n ? value\n : (value as any)?.fieldBehavior || (value as any)?.behavior,\n );\n });\n return result;\n }\n return null;\n};\n\n/**\n * 字段权限计算 hook\n * 根据不同场景(普通详情、流程审批等)计算字段行为映射\n */\nexport function useFieldPermission(options: UseFieldPermissionOptions): UseFieldPermissionReturn {\n const { viewPermissions, processDefinition, currentTask, isApprover, mode } = options;\n\n const computeBehaviors = useCallback((): Record<string, FieldBehavior> => {\n const behaviors: Record<string, FieldBehavior> = {};\n\n // 场景1:普通详情页,基于 viewPermissions + mode\n if (!currentTask && viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, mode);\n }\n\n // 场景2:流程-非审批人,全部 READONLY(除 HIDDEN 外)\n if (currentTask && !isApprover && viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, 'readonly');\n }\n\n // 场景3:流程-发起人修改(originator_return 节点)\n if (currentTask && isApprover && currentTask.nodeType === 'originator_return') {\n if (processDefinition?.flowConfig && processDefinition.startNodeId) {\n const startConfig = normalizeFlowConfig(\n processDefinition.flowConfig[processDefinition.startNodeId],\n );\n if (startConfig) {\n for (const [fieldId, behavior] of Object.entries(startConfig)) {\n behaviors[fieldId] = mode === 'edit' ? behavior : 'READONLY';\n }\n return behaviors;\n }\n }\n // 降级:如果无法获取 startNode 配置,全部可编辑\n if (viewPermissions) {\n for (const fieldId of Object.keys(viewPermissions.fieldPermissions)) {\n if (viewPermissions.fieldPermissions[fieldId] === 'FORM_FILED_HIDDEN') {\n behaviors[fieldId] = 'HIDDEN';\n } else {\n behaviors[fieldId] = mode === 'edit' ? 'NORMAL' : 'READONLY';\n }\n }\n }\n return behaviors;\n }\n\n // 场景4:流程-审批人,使用 currentTask.nodeId 对应的 fieldConfig\n if (currentTask && isApprover && processDefinition?.flowConfig) {\n const nodeConfig = normalizeFlowConfig(processDefinition.flowConfig[currentTask.nodeId]);\n if (nodeConfig) {\n for (const [fieldId, behavior] of Object.entries(nodeConfig)) {\n behaviors[fieldId] = mode === 'edit' ? behavior : 'READONLY';\n }\n return behaviors;\n }\n }\n\n // 兜底:基于 viewPermissions\n if (viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, mode);\n }\n\n return behaviors;\n }, [viewPermissions, processDefinition, currentTask, isApprover, mode]);\n\n const fieldBehaviors = useMemo(() => computeBehaviors(), [computeBehaviors]);\n\n return { fieldBehaviors, computeBehaviors };\n}\n","import type { FieldBehavior, ViewPermissionSummary } from '../types';\n\nconst OPERATION_ALIASES: Record<string, string> = {\n VIEW: 'view',\n EDIT: 'edit',\n DELETE: 'delete',\n VIEW_CHANGE_RECORDS: 'change_records',\n CHANGE_RECORDS: 'change_records',\n VIEW_PROCESS: 'workflow',\n WORKFLOW: 'workflow',\n};\n\nexport function normalizeOperation(operation?: string): string {\n const raw = String(operation || '').trim();\n if (!raw) return '';\n const upper = raw.toUpperCase();\n return OPERATION_ALIASES[upper] || raw.toLowerCase();\n}\n\nexport function hasViewOperation(operations: string[] | undefined, expected: string): boolean {\n const normalized = new Set((operations || []).map(normalizeOperation));\n return normalized.has(normalizeOperation(expected));\n}\n\nexport function normalizeFieldBehaviors(\n permissions: ViewPermissionSummary | null | undefined,\n mode: 'readonly' | 'edit',\n): Record<string, FieldBehavior> {\n const behaviors: Record<string, FieldBehavior> = {};\n Object.entries(permissions?.fieldPermissions || {}).forEach(([fieldId, value]) => {\n if (value === 'FORM_FILED_HIDDEN') {\n behaviors[fieldId] = 'HIDDEN';\n } else if (value === 'FORM_FILED_EDIT') {\n behaviors[fieldId] = mode === 'edit' ? 'NORMAL' : 'READONLY';\n } else {\n behaviors[fieldId] = 'READONLY';\n }\n });\n return behaviors;\n}\n\nexport function hasViewPermission(permissions: ViewPermissionSummary | null | undefined): boolean {\n const operations = permissions?.operations || [];\n return operations.length === 0 ? false : hasViewOperation(operations, 'view');\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { FieldBehavior, FormInstanceData, ViewPermissionSummary } from '../types';\nimport { getFormData, getViewPermission, deleteFormData } from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\nimport { extractFormValues } from '../utils/formInstanceData';\nimport { hasViewOperation, normalizeFieldBehaviors } from '../utils/permissions';\n\nexport interface UseFormDetailOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n fieldIds?: readonly string[];\n onPermissionDenied?: () => void;\n}\n\nexport interface UseFormDetailReturn {\n loading: boolean;\n mode: 'readonly' | 'edit';\n formData: Record<string, any> | null;\n instanceInfo: FormInstanceData | null;\n permissions: ViewPermissionSummary | null;\n fieldBehaviors: Record<string, FieldBehavior>;\n\n switchToEdit: () => void;\n switchToReadonly: () => void;\n saveChanges: (values: Record<string, any>) => Promise<boolean>;\n deleteInstance: () => Promise<boolean>;\n\n canEdit: boolean;\n canDelete: boolean;\n canViewChangeRecords: boolean;\n}\n\n/**\n * 详情页核心逻辑 hook\n * 处理数据加载、权限计算、模式切换、保存和删除\n */\nexport function useFormDetail(options: UseFormDetailOptions): UseFormDetailReturn {\n const { formUuid, appType, formInstanceId, fieldIds, onPermissionDenied } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [loading, setLoading] = useState(true);\n const [mode, setMode] = useState<'readonly' | 'edit'>('readonly');\n const [formData, setFormData] = useState<Record<string, any> | null>(null);\n const [instanceInfo, setInstanceInfo] = useState<FormInstanceData | null>(null);\n const [permissions, setPermissions] = useState<ViewPermissionSummary | null>(null);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const loadData = useCallback(async () => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n const [permResult, formResult] = await Promise.all([\n getViewPermission(request, { formUuid, appType, formInstanceId }),\n getFormData(request, { formInstanceId, appType, formUuid }),\n ]);\n\n if (!mountedRef.current) return;\n\n // 检查是否有权限\n if (!permResult || !hasViewOperation(permResult.operations, 'view')) {\n onPermissionDenied?.();\n }\n\n setPermissions(permResult);\n setInstanceInfo(formResult);\n setFormData(extractFormValues(formResult, fieldIds));\n } catch (error) {\n console.error('[useFormDetail] Failed to load data:', error);\n if (mountedRef.current) {\n setPermissions(null);\n setInstanceInfo(null);\n setFormData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [request, formUuid, appType, formInstanceId, fieldIds, onPermissionDenied]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const fieldBehaviors = normalizeFieldBehaviors(permissions, mode);\n\n const canEdit = hasViewOperation(permissions?.operations, 'edit');\n const canDelete = hasViewOperation(permissions?.operations, 'delete');\n const canViewChangeRecords = hasViewOperation(permissions?.operations, 'change_records');\n\n const switchToEdit = useCallback(() => {\n // 切换到编辑模式时重新加载最新数据\n setMode('edit');\n loadData();\n }, [loadData]);\n\n const switchToReadonly = useCallback(() => {\n setMode('readonly');\n }, []);\n\n const saveChanges = useCallback(\n async (values: Record<string, any>): Promise<boolean> => {\n try {\n await api.updateFormData({\n formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(values),\n });\n if (mountedRef.current) {\n setFormData(values);\n setMode('readonly');\n }\n return true;\n } catch (error) {\n console.error('[useFormDetail] Failed to save changes:', error);\n return false;\n }\n },\n [api, formInstanceId, formUuid, appType],\n );\n\n const deleteInstance = useCallback(async (): Promise<boolean> => {\n try {\n await deleteFormData(request, { formInstanceId, appType, formUuid });\n return true;\n } catch (error) {\n console.error('[useFormDetail] Failed to delete instance:', error);\n return false;\n }\n }, [request, formInstanceId, appType, formUuid]);\n\n return {\n loading,\n mode,\n formData,\n instanceInfo,\n permissions,\n fieldBehaviors,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n canEdit,\n canDelete,\n canViewChangeRecords,\n };\n}\n","const FORM_INSTANCE_METADATA_KEYS = new Set([\n 'appType',\n 'code',\n 'createdAt',\n 'createdBy',\n 'createdByDepartmentId',\n 'createdByDepartmentName',\n 'createdByName',\n 'creator',\n 'data',\n 'error',\n 'formInstId',\n 'formInstanceId',\n 'formUuid',\n 'instanceTitle',\n 'message',\n 'result',\n 'success',\n 'title',\n 'updatedAt',\n]);\n\nconst isPlainRecord = (value: unknown): value is Record<string, any> =>\n Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n\nconst parseJsonRecord = (value: unknown): Record<string, any> | null => {\n if (typeof value !== 'string' || value.trim() === '') return null;\n try {\n const parsed = JSON.parse(value);\n return isPlainRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst pickKnownFields = (\n source: Record<string, any>,\n fieldIds?: readonly string[],\n): Record<string, any> => {\n if (fieldIds?.length) {\n const values: Record<string, any> = {};\n for (const fieldId of fieldIds) {\n if (Object.prototype.hasOwnProperty.call(source, fieldId)) {\n values[fieldId] = source[fieldId];\n }\n }\n return values;\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([key]) => !FORM_INSTANCE_METADATA_KEYS.has(key)),\n );\n};\n\nexport const extractFormValues = (\n formInstance: unknown,\n fieldIds?: readonly string[],\n): Record<string, any> | null => {\n if (!isPlainRecord(formInstance)) return null;\n\n const nestedCandidates = [\n formInstance.data,\n parseJsonRecord(formInstance.data),\n formInstance.formData,\n parseJsonRecord(formInstance.formData),\n formInstance.values,\n formInstance.fieldValues,\n parseJsonRecord(formInstance.formDataJson),\n parseJsonRecord(formInstance.dataJson),\n ];\n\n for (const candidate of nestedCandidates) {\n if (isPlainRecord(candidate)) {\n return pickKnownFields(candidate, fieldIds);\n }\n }\n\n const flatValues = pickKnownFields(formInstance, fieldIds);\n return Object.keys(flatValues).length > 0 ? flatValues : null;\n};\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n FieldBehavior,\n FormInstanceData,\n ProcessAction,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessStatus,\n ProcessTask,\n ViewPermissionSummary,\n} from '../types';\nimport {\n getProcessBasic,\n getProcessProgress,\n checkUserApproval,\n getViewPermission,\n getFormData,\n getProcessDefinition,\n} from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\nimport { useFieldPermission } from './useFieldPermission';\nimport { extractFormValues } from '../utils/formInstanceData';\n\nexport interface UseProcessDetailOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n fieldIds?: readonly string[];\n}\n\nexport interface UseProcessDetailReturn {\n loading: boolean;\n processInfo: ProcessBasicInfo | null;\n processStatus: ProcessStatus | null;\n currentTask: ProcessTask | null;\n progressList: ProcessTask[];\n formData: Record<string, any> | null;\n instanceInfo: FormInstanceData | null;\n\n isApprover: boolean;\n activeActions: ProcessAction[];\n fieldBehaviors: Record<string, FieldBehavior>;\n mode: 'readonly' | 'edit';\n\n isOriginatorReturn: boolean;\n isProcessCompleted: boolean;\n canWithdraw: boolean;\n\n switchToEdit: () => void;\n switchToReadonly: () => void;\n refreshProgress: () => Promise<void>;\n}\n\nconst DEFAULT_APPROVAL_ACTIONS: ProcessAction[] = [\n { action: 'agree', name: { zh_CN: '同意' } },\n { action: 'rejected', name: { zh_CN: '拒绝' } },\n];\n\nconst WITHDRAW_ACTION: ProcessAction = { action: 'withdraw', name: { zh_CN: '撤销' } };\n\nfunction mergeCurrentTask(\n processTask: ProcessTask | null | undefined,\n approvalTask: ProcessTask | null | undefined,\n): ProcessTask | null {\n if (!approvalTask) return processTask ?? null;\n if (!processTask) return approvalTask;\n\n return {\n ...processTask,\n ...approvalTask,\n nodeName: processTask.nodeName || approvalTask.nodeName,\n title: processTask.title || approvalTask.title,\n actions: processTask.actions ?? approvalTask.actions,\n };\n}\n\n/**\n * 流程详情核心逻辑 hook\n */\nexport function useProcessDetail(options: UseProcessDetailOptions): UseProcessDetailReturn {\n const { formUuid, appType, formInstanceId, fieldIds } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [loading, setLoading] = useState(true);\n const [mode, setMode] = useState<'readonly' | 'edit'>('readonly');\n const [processInfo, setProcessInfo] = useState<ProcessBasicInfo | null>(null);\n const [progressList, setProgressList] = useState<ProcessTask[]>([]);\n const [formData, setFormData] = useState<Record<string, any> | null>(null);\n const [instanceInfo, setInstanceInfo] = useState<FormInstanceData | null>(null);\n const [isApprover, setIsApprover] = useState(false);\n const [canWithdraw, setCanWithdraw] = useState(false);\n const [approvalTasks, setApprovalTasks] = useState<ProcessTask[]>([]);\n const [permissions, setPermissions] = useState<ViewPermissionSummary | null>(null);\n const [processDefinition, setProcessDefinition] = useState<ProcessDefinition | null>(null);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const currentTask = useMemo(\n () => mergeCurrentTask(processInfo?.currentTask, approvalTasks[0]),\n [processInfo?.currentTask, approvalTasks],\n );\n const processStatus = processInfo?.processStatus ?? null;\n\n const isOriginatorReturn = currentTask?.nodeType === 'originator_return';\n const isProcessCompleted = processStatus === 'completed' || processStatus === 'terminated';\n\n // 使用 useFieldPermission 计算字段行为\n const { fieldBehaviors } = useFieldPermission({\n viewPermissions: permissions ?? undefined,\n processDefinition: processDefinition ?? undefined,\n currentTask: currentTask ?? undefined,\n isApprover,\n mode,\n });\n\n // 当前任务可执行的操作\n const activeActions: ProcessAction[] = useMemo(() => {\n if (!isApprover) return [];\n\n const actions =\n currentTask?.actions && currentTask.actions.length > 0\n ? [...currentTask.actions]\n : [...DEFAULT_APPROVAL_ACTIONS];\n\n if (canWithdraw && !actions.some((action) => action.action === 'withdraw')) {\n actions.push(WITHDRAW_ACTION);\n }\n\n return actions;\n }, [isApprover, currentTask?.actions, canWithdraw]);\n\n const loadData = useCallback(async () => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n // 并行调用基础数据\n const [basicResult, approvalResult, permResult, formResult] = await Promise.all([\n getProcessBasic(request, formInstanceId),\n checkUserApproval(request, formInstanceId),\n getViewPermission(request, { formUuid, appType, formInstanceId }),\n getFormData(request, { formInstanceId, appType, formUuid }),\n ]);\n\n if (!mountedRef.current) return;\n\n setProcessInfo(basicResult);\n setIsApprover(approvalResult?.isApprover ?? false);\n setCanWithdraw(approvalResult?.canUndo ?? false);\n setApprovalTasks(approvalResult?.currentTasks ?? []);\n setPermissions(permResult);\n setInstanceInfo(formResult);\n setFormData(extractFormValues(formResult, fieldIds));\n\n // 如果有流程查看权限,加载进度\n if (permResult?.operations?.includes('VIEW_PROCESS') || permResult?.operations?.length > 0) {\n try {\n const progress = await getProcessProgress(request, formInstanceId);\n if (mountedRef.current) {\n setProgressList(progress);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load progress:', error);\n }\n }\n\n // 如果是审批人且需要字段配置,加载流程定义\n const task = basicResult?.currentTask;\n if (\n approvalResult?.isApprover &&\n task &&\n (task.nodeType === 'originator_return' || task.nodeType === 'approval')\n ) {\n try {\n const definition = await getProcessDefinition(request, formUuid);\n if (mountedRef.current) {\n setProcessDefinition(definition);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load process definition:', error);\n }\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load data:', error);\n if (mountedRef.current) {\n setProcessInfo(null);\n setFormData(null);\n setInstanceInfo(null);\n setApprovalTasks([]);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [request, formUuid, appType, formInstanceId, fieldIds]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const switchToEdit = useCallback(() => {\n setMode('edit');\n }, []);\n\n const switchToReadonly = useCallback(() => {\n setMode('readonly');\n }, []);\n\n const refreshProgress = useCallback(async () => {\n try {\n const [progress, basicResult] = await Promise.all([\n getProcessProgress(request, formInstanceId),\n getProcessBasic(request, formInstanceId),\n ]);\n if (mountedRef.current) {\n setProgressList(progress);\n setProcessInfo(basicResult);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to refresh progress:', error);\n }\n }, [request, formInstanceId]);\n\n return {\n loading,\n processInfo,\n processStatus,\n currentTask,\n progressList,\n formData,\n instanceInfo,\n isApprover,\n activeActions,\n fieldBehaviors,\n mode,\n isOriginatorReturn,\n isProcessCompleted,\n canWithdraw,\n switchToEdit,\n switchToReadonly,\n refreshProgress,\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { ReturnableNode } from '../types';\nimport {\n handleApproval,\n withdrawProcess,\n transferTask,\n returnTask,\n resubmitTask,\n saveTask,\n getReturnableNodes,\n triggerCallbackTask,\n} from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\n\nexport interface UseApprovalActionsOptions {\n formInstanceId: string;\n formUuid: string;\n appType: string;\n currentTaskId?: string;\n onActionComplete?: (action: string) => void;\n getFormValues?: () => Record<string, any>;\n}\n\nexport interface UseApprovalActionsReturn {\n approve: (comments?: string) => Promise<boolean>;\n reject: (comments?: string) => Promise<boolean>;\n transfer: (userId: string, reason?: string) => Promise<boolean>;\n returnTo: (nodeId: string, reason?: string) => Promise<boolean>;\n withdraw: (reason?: string) => Promise<boolean>;\n save: () => Promise<boolean>;\n resubmit: (comments?: string) => Promise<boolean>;\n callbackTask: (payload?: Record<string, any>) => Promise<boolean>;\n\n isLoading: boolean;\n currentAction: string | null;\n returnableNodes: ReturnableNode[];\n loadReturnableNodes: () => Promise<void>;\n}\n\n/**\n * 审批操作逻辑 hook\n */\nexport function useApprovalActions(options: UseApprovalActionsOptions): UseApprovalActionsReturn {\n const { formInstanceId, formUuid, appType, currentTaskId, onActionComplete, getFormValues } =\n options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [isLoading, setIsLoading] = useState(false);\n const [currentAction, setCurrentAction] = useState<string | null>(null);\n const [returnableNodes, setReturnableNodes] = useState<ReturnableNode[]>([]);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n const resetLoading = useCallback(() => {\n if (mountedRef.current) {\n setIsLoading(false);\n setCurrentAction(null);\n }\n }, []);\n\n const approve = useCallback(\n async (comments?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('approve');\n try {\n const formValues = getFormValues?.();\n await handleApproval(request, {\n instanceId: formInstanceId,\n action: 'approved',\n comments,\n appType,\n formUuid,\n updateFormDataJson: formValues ? JSON.stringify(formValues) : undefined,\n });\n resetLoading();\n onActionComplete?.('approve');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] approve failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, appType, formUuid, getFormValues, onActionComplete, resetLoading],\n );\n\n const reject = useCallback(\n async (comments?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('reject');\n try {\n const formValues = getFormValues?.();\n await handleApproval(request, {\n instanceId: formInstanceId,\n action: 'rejected',\n comments,\n appType,\n formUuid,\n updateFormDataJson: formValues ? JSON.stringify(formValues) : undefined,\n });\n resetLoading();\n onActionComplete?.('reject');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] reject failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, appType, formUuid, getFormValues, onActionComplete, resetLoading],\n );\n\n const transfer = useCallback(\n async (userId: string, reason?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] transfer failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('transfer');\n try {\n await transferTask(request, {\n taskId: currentTaskId,\n newAssignee: userId,\n reason,\n });\n resetLoading();\n onActionComplete?.('transfer');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] transfer failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const returnTo = useCallback(\n async (nodeId: string, reason?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] returnTo failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('return');\n try {\n await returnTask(request, {\n taskId: currentTaskId,\n targetNodeId: nodeId,\n reason,\n });\n resetLoading();\n onActionComplete?.('return');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] returnTo failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const withdraw = useCallback(\n async (reason?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('withdraw');\n try {\n await withdrawProcess(request, {\n instanceId: formInstanceId,\n reason,\n });\n resetLoading();\n onActionComplete?.('withdraw');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] withdraw failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, onActionComplete, resetLoading],\n );\n\n const save = useCallback(async (): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('save');\n try {\n const formValues = getFormValues?.() ?? {};\n await saveTask(request, {\n instanceId: formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(formValues),\n });\n resetLoading();\n onActionComplete?.('save');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] save failed:', error);\n resetLoading();\n return false;\n }\n }, [request, formInstanceId, formUuid, appType, getFormValues, onActionComplete, resetLoading]);\n\n const resubmit = useCallback(\n async (comments?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] resubmit failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('resubmit');\n try {\n const formValues = getFormValues?.() ?? {};\n await resubmitTask(request, {\n taskId: currentTaskId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(formValues),\n comments,\n });\n resetLoading();\n onActionComplete?.('resubmit');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] resubmit failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, formUuid, appType, getFormValues, onActionComplete, resetLoading],\n );\n\n const callbackTask = useCallback(\n async (payload?: Record<string, any>): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] callbackTask failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('callback');\n try {\n await triggerCallbackTask(request, {\n taskId: currentTaskId,\n payload,\n });\n resetLoading();\n onActionComplete?.('callback');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] callbackTask failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const loadReturnableNodes = useCallback(async (): Promise<void> => {\n if (!currentTaskId) return;\n try {\n const nodes = await getReturnableNodes(request, currentTaskId);\n if (mountedRef.current) {\n setReturnableNodes(nodes);\n }\n } catch (error) {\n console.error('[useApprovalActions] loadReturnableNodes failed:', error);\n }\n }, [request, currentTaskId]);\n\n return {\n approve,\n reject,\n transfer,\n returnTo,\n withdraw,\n save,\n resubmit,\n callbackTask,\n isLoading,\n currentAction,\n returnableNodes,\n loadReturnableNodes,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { ChangeRecord, ChangeRecordListResponse } from '../types';\nimport { getChangeRecords } from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\n\nexport interface UseChangeRecordsOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n pageSize?: number;\n autoLoad?: boolean;\n}\n\nexport interface UseChangeRecordsReturn {\n records: ChangeRecord[];\n loading: boolean;\n total: number;\n page: number;\n loadMore: () => Promise<void>;\n refresh: () => Promise<void>;\n hasMore: boolean;\n}\n\nconst normalizeChangeRecordList = (value: any): ChangeRecordListResponse => {\n const body = value?.data ?? value?.result ?? value ?? {};\n const records = body.records ?? body.data ?? body.list ?? body.items ?? [];\n return {\n records: Array.isArray(records) ? records : [],\n total: Number(body.total ?? body.totalCount ?? body.count ?? records.length) || 0,\n page: Number(body.page ?? body.currentPage ?? 1) || 1,\n pageSize: Number(body.pageSize ?? body.limit ?? 20) || 20,\n };\n};\n\n/**\n * 变更记录加载 hook\n */\nexport function useChangeRecords(options: UseChangeRecordsOptions): UseChangeRecordsReturn {\n const { formUuid, appType, formInstanceId, pageSize = 20, autoLoad = true } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [records, setRecords] = useState<ChangeRecord[]>([]);\n const [loading, setLoading] = useState(false);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const fetchRecords = useCallback(\n async (pageNum: number, append: boolean) => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n const result = await getChangeRecords(request, {\n formUuid,\n appType,\n formInstanceId,\n page: pageNum,\n pageSize,\n });\n if (!mountedRef.current) return;\n\n const normalized = normalizeChangeRecordList(result);\n if (append) {\n setRecords((prev) => [...prev, ...normalized.records]);\n } else {\n setRecords(normalized.records);\n }\n setTotal(normalized.total);\n setPage(normalized.page || pageNum);\n } catch (error) {\n console.error('[useChangeRecords] Failed to load change records:', error);\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [request, formUuid, appType, formInstanceId, pageSize],\n );\n\n useEffect(() => {\n if (autoLoad) {\n fetchRecords(1, false);\n }\n }, [autoLoad, fetchRecords]);\n\n const safeRecords = Array.isArray(records) ? records : [];\n const hasMore = safeRecords.length < total;\n\n const loadMore = useCallback(async () => {\n if (!hasMore || loading) return;\n await fetchRecords(page + 1, true);\n }, [hasMore, loading, page, fetchRecords]);\n\n const refresh = useCallback(async () => {\n setRecords([]);\n setPage(1);\n setTotal(0);\n await fetchRecords(1, false);\n }, [fetchRecords]);\n\n return {\n records: safeRecords,\n loading,\n total,\n page,\n loadMore,\n refresh,\n hasMore,\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseFormNavigationOptions {\n appType: string;\n formUuid: string;\n formType?: 'form' | 'process';\n mode?: 'redirect' | 'stay' | 'callback';\n redirectDelay?: number;\n basePath?: string;\n onStay?: (formInstId: string) => void;\n}\n\nexport interface UseFormNavigationReturn {\n navigateToDetail: (formInstId: string) => void;\n navigateToProcessDetail: (formInstId: string) => void;\n handlePostSubmit: (formInstId: string) => void;\n isRedirecting: boolean;\n countdown: number;\n cancelRedirect: () => void;\n}\n\n/**\n * 页面导航 hook\n */\nconst normalizeBasePath = (basePath?: string) => {\n const normalized = String(basePath || '').replace(/^\\/+|\\/+$/g, '');\n return normalized ? `/${normalized}` : '';\n};\n\nconst inferBasePath = (appType: string) => {\n if (typeof window === 'undefined') return '';\n const pathname = window.location?.pathname || '';\n const marker = `/${appType}/`;\n const markerIndex = pathname.indexOf(marker);\n if (markerIndex <= 0) return '';\n return pathname.slice(0, markerIndex);\n};\n\nconst buildDetailUrl = (\n appType: string,\n formUuid: string,\n formInstId: string,\n detailType: 'formDetail' | 'processDetail',\n basePath?: string,\n) => {\n const prefix = normalizeBasePath(basePath ?? inferBasePath(appType));\n return `${prefix}/${appType}/${detailType}/${formUuid}?formInstId=${encodeURIComponent(formInstId)}`;\n};\n\nexport function useFormNavigation(options: UseFormNavigationOptions): UseFormNavigationReturn {\n const {\n appType,\n formUuid,\n formType = 'form',\n mode = 'redirect',\n redirectDelay = 3000,\n basePath,\n onStay,\n } = options;\n\n const [isRedirecting, setIsRedirecting] = useState(false);\n const [countdown, setCountdown] = useState(0);\n\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const redirectTargetRef = useRef<string | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n };\n }, []);\n\n const navigateToDetail = useCallback(\n (formInstId: string) => {\n window.location.href = buildDetailUrl(appType, formUuid, formInstId, 'formDetail', basePath);\n },\n [appType, basePath, formUuid],\n );\n\n const navigateToProcessDetail = useCallback(\n (formInstId: string) => {\n window.location.href = buildDetailUrl(\n appType,\n formUuid,\n formInstId,\n 'processDetail',\n basePath,\n );\n },\n [appType, basePath, formUuid],\n );\n\n const startRedirectCountdown = useCallback(\n (targetUrl: string) => {\n const totalSeconds = Math.ceil(redirectDelay / 1000);\n setIsRedirecting(true);\n setCountdown(totalSeconds);\n redirectTargetRef.current = targetUrl;\n\n timerRef.current = setInterval(() => {\n if (!mountedRef.current) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return;\n }\n\n setCountdown((prev) => {\n const next = prev - 1;\n if (next <= 0) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setIsRedirecting(false);\n if (redirectTargetRef.current) {\n window.location.href = redirectTargetRef.current;\n }\n return 0;\n }\n return next;\n });\n }, 1000);\n },\n [redirectDelay],\n );\n\n const cancelRedirect = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setIsRedirecting(false);\n setCountdown(0);\n redirectTargetRef.current = null;\n }, []);\n\n const handlePostSubmit = useCallback(\n (formInstId: string) => {\n if (mode === 'stay') {\n onStay?.(formInstId);\n return;\n }\n\n if (mode === 'callback') {\n onStay?.(formInstId);\n return;\n }\n\n // redirect 模式\n const targetUrl = buildDetailUrl(\n appType,\n formUuid,\n formInstId,\n formType === 'process' ? 'processDetail' : 'formDetail',\n basePath,\n );\n\n startRedirectCountdown(targetUrl);\n },\n [mode, formType, appType, formUuid, basePath, onStay, startRedirectCountdown],\n );\n\n return {\n navigateToDetail,\n navigateToProcessDetail,\n handlePostSubmit,\n isRedirecting,\n countdown,\n cancelRedirect,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseDraftStorageOptions {\n appType: string;\n formUuid: string;\n autoRestore?: boolean;\n}\n\nexport interface UseDraftStorageReturn {\n hasDraft: boolean;\n draftData: Record<string, any> | null;\n draftTimestamp: number | null;\n saveDraft: (data: Record<string, any>) => void;\n restoreDraft: () => Record<string, any> | null;\n clearDraft: () => void;\n}\n\ninterface DraftPayload {\n data: Record<string, any>;\n ts: number;\n}\n\nfunction getDraftKey(appType: string, formUuid: string): string {\n return `${appType}__${formUuid}__draft`;\n}\n\nfunction readDraft(key: string): DraftPayload | null {\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as DraftPayload;\n if (parsed && typeof parsed.data === 'object' && typeof parsed.ts === 'number') {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 草稿暂存 hook\n * 使用 localStorage 存储表单草稿数据\n */\nexport function useDraftStorage(options: UseDraftStorageOptions): UseDraftStorageReturn {\n const { appType, formUuid, autoRestore = false } = options;\n const key = getDraftKey(appType, formUuid);\n\n const [hasDraft, setHasDraft] = useState(false);\n const [draftData, setDraftData] = useState<Record<string, any> | null>(null);\n const [draftTimestamp, setDraftTimestamp] = useState<number | null>(null);\n\n // 初始化时检测是否有 draft\n useEffect(() => {\n const stored = readDraft(key);\n if (stored) {\n setHasDraft(true);\n setDraftTimestamp(stored.ts);\n if (autoRestore) {\n setDraftData(stored.data);\n }\n } else {\n setHasDraft(false);\n setDraftData(null);\n setDraftTimestamp(null);\n }\n }, [key, autoRestore]);\n\n const saveDraft = useCallback(\n (data: Record<string, any>) => {\n const payload: DraftPayload = { data, ts: Date.now() };\n try {\n localStorage.setItem(key, JSON.stringify(payload));\n setHasDraft(true);\n setDraftData(data);\n setDraftTimestamp(payload.ts);\n } catch (error) {\n console.error('[useDraftStorage] Failed to save draft:', error);\n }\n },\n [key],\n );\n\n const restoreDraft = useCallback((): Record<string, any> | null => {\n const stored = readDraft(key);\n if (stored) {\n setDraftData(stored.data);\n return stored.data;\n }\n return null;\n }, [key]);\n\n const clearDraft = useCallback(() => {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('[useDraftStorage] Failed to clear draft:', error);\n }\n setHasDraft(false);\n setDraftData(null);\n setDraftTimestamp(null);\n }, [key]);\n\n return {\n hasDraft,\n draftData,\n draftTimestamp,\n saveDraft,\n restoreDraft,\n clearDraft,\n };\n}\n","import type { FormSchema } from '../types';\n\n/**\n * 类型安全的表单 Schema 定义辅助函数\n * 提供 TypeScript 类型推导和编辑器智能提示\n */\nexport function defineFormSchema(schema: FormSchema): FormSchema {\n return schema;\n}\n","import React from 'react';\n\nexport interface FormSummaryCardProps {\n title?: string;\n formInstanceId?: string;\n creator?: { name: string; avatar?: string; department?: string };\n createdAt?: string;\n status?: { label: string; tone: 'brand' | 'success' | 'danger' | 'neutral' | 'warning' };\n className?: string;\n children?: React.ReactNode;\n}\n\nconst toneClasses: Record<string, string> = {\n brand: 'bg-blue-50 text-blue-600',\n success: 'bg-green-50 text-green-600',\n danger: 'bg-red-50 text-red-600',\n neutral: 'bg-gray-100 text-gray-500',\n warning: 'bg-amber-50 text-amber-600',\n};\n\nexport const FormSummaryCard: React.FC<FormSummaryCardProps> = ({\n title,\n formInstanceId,\n creator,\n createdAt,\n status,\n className = '',\n children,\n}) => {\n const shortId = formInstanceId ? formInstanceId.slice(0, 8) : null;\n\n const renderAvatar = () => {\n if (!creator) return null;\n if (creator.avatar) {\n return (\n <img\n src={creator.avatar}\n alt={creator.name}\n className=\"w-7 h-7 rounded-full object-cover\"\n />\n );\n }\n const initial = creator.name.charAt(0);\n return (\n <span className=\"w-7 h-7 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center text-xs font-medium\">\n {initial}\n </span>\n );\n };\n\n return (\n <div className={`bg-white rounded-xl shadow-sm border border-gray-100 p-6 ${className}`}>\n <div className=\"flex items-start justify-between\">\n {/* Left */}\n <div className=\"min-w-0 flex-1\">\n {title && <h2 className=\"text-xl font-semibold text-gray-900 truncate\">{title}</h2>}\n {shortId && <span className=\"text-xs text-gray-400 mt-0.5 inline-block\">#{shortId}</span>}\n </div>\n {/* Right - Status Badge */}\n {status && (\n <span\n className={`px-2.5 py-0.5 rounded-full text-xs font-medium whitespace-nowrap ${toneClasses[status.tone] || toneClasses.neutral}`}\n >\n {status.label}\n </span>\n )}\n </div>\n\n {/* Creator info */}\n {creator && (\n <div className=\"flex items-center gap-2 mt-4 text-sm text-gray-600\">\n {renderAvatar()}\n <span className=\"font-medium\">{creator.name}</span>\n {creator.department && (\n <>\n <span className=\"text-gray-300\">·</span>\n <span>{creator.department}</span>\n </>\n )}\n {createdAt && (\n <>\n <span className=\"text-gray-300\">·</span>\n <span className=\"text-gray-400\">{createdAt}</span>\n </>\n )}\n </div>\n )}\n\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { Button, Empty, Pagination, Skeleton, Tag, Tooltip } from 'antd';\nimport {\n ArrowRightOutlined,\n DownOutlined,\n HistoryOutlined,\n ReloadOutlined,\n UpOutlined,\n} from '@ant-design/icons';\nimport type { ChangeRecord } from '../types';\n\nexport interface RecordChangePanelProps {\n records?: ChangeRecord[];\n loading?: boolean;\n total?: number;\n page?: number;\n pageSize?: number;\n defaultExpanded?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onRefresh?: () => void;\n onExpand?: () => void;\n onPageChange?: (page: number, pageSize: number) => void;\n className?: string;\n}\n\nconst sourceLabels: Record<string, string> = {\n frontend: '前端',\n integration: '集成',\n automation: '自动化',\n import: '导入',\n};\n\nconst typeLabels: Record<string, string> = {\n create: '新增',\n update: '修改',\n delete: '删除',\n};\n\nfunction formatValue(value: any): React.ReactNode {\n if (value === null || value === undefined || value === '')\n return <span className=\"text-ant-text-tertiary\">空</span>;\n if (Array.isArray(value)) {\n return (\n <span className=\"inline-flex flex-wrap gap-1\">\n {value.map((item, index) => (\n <Tag key={`${index}-${String(item)}`} className=\"m-0\">\n {String(\n typeof item === 'object' ? item.label || item.value || JSON.stringify(item) : item,\n )}\n </Tag>\n ))}\n </span>\n );\n }\n if (typeof value === 'object') {\n const label = value.label ?? value.value;\n return label ? String(label) : <code className=\"text-xs\">{JSON.stringify(value)}</code>;\n }\n return String(value);\n}\n\nfunction getInitial(name?: string) {\n return (\n String(name || '?')\n .trim()\n .slice(0, 1)\n .toUpperCase() || '?'\n );\n}\n\nexport const RecordChangePanel: React.FC<RecordChangePanelProps> = ({\n records = [],\n loading = false,\n total,\n page = 1,\n pageSize = 20,\n defaultExpanded = false,\n hasMore = false,\n onLoadMore,\n onRefresh,\n onExpand,\n onPageChange,\n className = '',\n}) => {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const count = total ?? records.length;\n\n const handleToggle = () => {\n const next = !expanded;\n setExpanded(next);\n if (next) onExpand?.();\n };\n\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"flex items-center justify-between gap-3 border-b border-ant-border-secondary px-5 py-4\">\n <button\n type=\"button\"\n className=\"flex min-w-0 items-center gap-2 bg-transparent p-0 text-left\"\n onClick={handleToggle}\n >\n <HistoryOutlined className=\"text-ant-primary\" />\n <span className=\"font-semibold text-ant-text\">变更记录</span>\n <span className=\"rounded-full bg-gray-100 px-2 py-0.5 text-xs text-ant-text-tertiary\">\n {count} 条\n </span>\n {expanded ? <UpOutlined className=\"text-xs\" /> : <DownOutlined className=\"text-xs\" />}\n </button>\n {expanded && (\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ReloadOutlined />}\n onClick={onRefresh}\n disabled={loading}\n >\n 刷新\n </Button>\n )}\n </div>\n\n {expanded ? (\n <div className=\"p-5\">\n {loading && records.length === 0 ? (\n <Skeleton active paragraph={{ rows: 3 }} />\n ) : records.length === 0 ? (\n <Empty description=\"暂无变更记录\" />\n ) : (\n <div className=\"space-y-4\">\n {records.map((record) => {\n const changes =\n record.changes && record.changes.length > 0\n ? record.changes\n : [\n {\n fieldKey: record.fieldId,\n fieldLabel: record.fieldLabel,\n beforeValue: record.oldValue,\n afterValue: record.newValue,\n },\n ];\n const operator = record.operatorName || (record.changeSource ? '系统' : '未知');\n const operatedAt = record.operatedAt || record.createdAt || '-';\n return (\n <article\n key={record.id || record.operationId}\n className=\"rounded-md border border-ant-border-secondary p-4\"\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-blue-50 text-sm font-semibold text-blue-700\">\n {getInitial(operator)}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {operator}\n {record.operatorDepartmentName && (\n <span className=\"ml-2 font-normal text-ant-text-tertiary\">\n {record.operatorDepartmentName}\n </span>\n )}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n 变更 {record.changedCount || changes.length} 项 · {operatedAt}\n </span>\n </span>\n </div>\n <span className=\"flex flex-wrap justify-end gap-2\">\n {record.changeType && (\n <Tag>{typeLabels[record.changeType] || record.changeType}</Tag>\n )}\n {record.changeSource && (\n <Tag color=\"blue\">\n {sourceLabels[record.changeSource] || record.changeSource}\n </Tag>\n )}\n {record.operationId && (\n <Tooltip title={`操作ID:${record.operationId}`}>\n <Tag>{record.operationId.slice(0, 8)}</Tag>\n </Tooltip>\n )}\n </span>\n </div>\n <div className=\"mt-4 space-y-3\">\n {changes.map((change) => (\n <div\n key={change.fieldKey || change.fieldLabel}\n className=\"grid gap-2 md:grid-cols-[160px_1fr]\"\n >\n <div className=\"text-sm font-medium text-ant-text-secondary\">\n {change.fieldLabel || change.fieldKey || '-'}\n </div>\n <div className=\"grid min-w-0 grid-cols-[1fr_auto_1fr] items-start gap-2 text-sm\">\n <div className=\"min-w-0 rounded bg-red-50 px-2 py-1 text-red-700\">\n {formatValue(change.beforeValue)}\n </div>\n <ArrowRightOutlined className=\"mt-1 text-xs text-ant-text-tertiary\" />\n <div className=\"min-w-0 rounded bg-emerald-50 px-2 py-1 text-emerald-700\">\n {formatValue(change.afterValue)}\n </div>\n </div>\n </div>\n ))}\n </div>\n </article>\n );\n })}\n </div>\n )}\n {onPageChange && count > pageSize ? (\n <div className=\"mt-4 flex justify-end\">\n <Pagination\n size=\"small\"\n current={page}\n pageSize={pageSize}\n total={count}\n onChange={onPageChange}\n showSizeChanger\n />\n </div>\n ) : hasMore ? (\n <Button block className=\"mt-4\" onClick={onLoadMore} loading={loading}>\n 加载更多\n </Button>\n ) : null}\n </div>\n ) : (\n <div className=\"px-5 py-4 text-sm text-ant-text-tertiary\">点击展开查看变更记录</div>\n )}\n </section>\n );\n};\n","import React from 'react';\nimport type { ChangeRecord } from '../types';\nimport { RecordChangePanel } from './RecordChangePanel';\n\nexport interface ChangeRecordsProps {\n records?: ChangeRecord[];\n loading?: boolean;\n defaultExpanded?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onExpand?: () => void;\n className?: string;\n renderItem?: (record: ChangeRecord) => React.ReactNode;\n}\n\nexport const ChangeRecords: React.FC<ChangeRecordsProps> = ({\n records = [],\n loading = false,\n defaultExpanded = false,\n hasMore = false,\n onLoadMore,\n onExpand,\n className = '',\n renderItem,\n}) => {\n if (renderItem) {\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"border-b border-ant-border-secondary px-5 py-4 font-semibold\">变更记录</div>\n <div className=\"p-5\">\n {records.length === 0 ? (\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">\n {loading ? '加载中...' : '暂无变更记录'}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {records.map((record) => (\n <div key={record.id}>{renderItem(record)}</div>\n ))}\n </div>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className=\"mt-4 w-full rounded-md border border-ant-border-secondary py-2 text-sm text-ant-primary\"\n onClick={onLoadMore}\n disabled={loading}\n >\n {loading ? '加载中...' : '加载更多'}\n </button>\n )}\n </div>\n </section>\n );\n }\n\n return (\n <RecordChangePanel\n records={records}\n loading={loading}\n defaultExpanded={defaultExpanded}\n hasMore={hasMore}\n onLoadMore={onLoadMore}\n onRefresh={onExpand}\n onExpand={onExpand}\n className={className}\n />\n );\n};\n","import React, { useMemo } from 'react';\nimport {\n ApiOutlined,\n CheckCircleFilled,\n ClockCircleOutlined,\n CloseCircleFilled,\n CodeOutlined,\n CopyOutlined,\n EditOutlined,\n FileTextOutlined,\n LoadingOutlined,\n NotificationOutlined,\n ReloadOutlined,\n RollbackOutlined,\n UserOutlined,\n} from '@ant-design/icons';\nimport type { ProcessTask, StatusMeta } from '../types';\nimport { TASK_STATUS_META } from '../core/constants';\n\nexport interface ApprovalTimelineProps {\n tasks: ProcessTask[];\n className?: string;\n renderNode?: (task: ProcessTask, index: number) => React.ReactNode;\n showRemarks?: boolean;\n compactMode?: boolean;\n showApproverInfo?: boolean;\n}\n\ntype VisualState =\n | 'completed'\n | 'current'\n | 'waiting'\n | 'future'\n | 'rejected'\n | 'returned'\n | 'neutral';\n\nconst systemNodeTypes = new Set([\n 'condition',\n 'condition_branch',\n 'js_code',\n 'data_retrieve_single',\n 'data_retrieve_batch',\n 'data_create',\n 'data_update',\n 'connector_call',\n 'loop_container',\n 'work_notification',\n 'dingtalk_card',\n 'system',\n]);\n\nconst systemLabels: Record<string, string> = {\n condition: '条件判断',\n condition_branch: '条件分支',\n js_code: 'JS 代码',\n data_retrieve_single: '数据读取',\n data_retrieve_batch: '批量读取',\n data_create: '数据创建',\n data_update: '数据更新',\n connector_call: '连接器调用',\n loop_container: '循环节点',\n work_notification: '工作通知',\n dingtalk_card: '钉钉卡片',\n system: '系统动作',\n};\n\nconst toneClasses: Record<StatusMeta['tone'] | 'return' | 'future', string> = {\n brand: 'bg-blue-600 text-white border-blue-600',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n return: 'bg-amber-50 text-amber-700 border-amber-200',\n future: 'bg-gray-50 text-gray-400 border-gray-200',\n};\n\nfunction groupTasks(tasks: ProcessTask[]) {\n const groups = new Map<string, ProcessTask[]>();\n tasks.forEach((task, index) => {\n const key = task.nodeVisitId || `${task.nodeId || 'node'}-${task.id || task.taskId || index}`;\n const group = groups.get(key) || [];\n group.push(task);\n groups.set(key, group);\n });\n return Array.from(groups.values()).map((group) => {\n const hasOrSignResult = group.some(\n (task) =>\n task.nodeType === 'approval' &&\n task.multiApproveMode === 'or' &&\n !task.isSimulated &&\n ['approved', 'rejected', 'returned'].includes(task.status),\n );\n if (!hasOrSignResult) return group;\n const outcome = group.filter(\n (task) => !task.isSimulated && ['approved', 'rejected', 'returned'].includes(task.status),\n );\n return outcome.length > 0 ? outcome : group;\n });\n}\n\nfunction isCompactNode(task: ProcessTask) {\n return (\n task.nodeType === 'start' ||\n task.nodeType === 'copy' ||\n task.nodeType === 'end' ||\n systemNodeTypes.has(task.nodeType)\n );\n}\n\nfunction getNodeTitle(task: ProcessTask) {\n if (task.nodeType === 'start') return task.title || task.nodeName || '流程提交';\n if (task.nodeType === 'originator_return') return task.title || task.nodeName || '发起人修改';\n if (task.nodeType === 'copy') return task.title || task.nodeName || '抄送通知';\n if (task.nodeType === 'callback_wait') return task.title || task.nodeName || '等待第三方回调';\n if (task.nodeType === 'end') return task.title || task.nodeName || '流程完成';\n if (systemNodeTypes.has(task.nodeType))\n return task.title || task.nodeName || systemLabels[task.nodeType] || '系统动作';\n return task.title || task.nodeName || '审批';\n}\n\nfunction getVisualState(task: ProcessTask, isFutureGroup: boolean): VisualState {\n if (isFutureGroup || task.isSimulated || task.status === 'simulated') return 'future';\n if (task.status === 'rejected') return 'rejected';\n if (task.status === 'returned') return 'returned';\n if (task.status === 'pending' || task.status === 'waiting' || task.canApprove)\n return task.canApprove ? 'current' : 'waiting';\n if (\n task.status === 'approved' ||\n task.status === 'copied' ||\n task.nodeType === 'start' ||\n task.nodeType === 'end'\n ) {\n return 'completed';\n }\n return 'neutral';\n}\n\nfunction getStatusMeta(task: ProcessTask, state: VisualState, compact: boolean): StatusMeta {\n if (state === 'future') return { label: '未开始', tone: 'neutral' };\n if (state === 'current')\n return { label: task.nodeType === 'callback_wait' ? '等待回调' : '审批中', tone: 'brand' };\n if (state === 'waiting') return { label: '等待处理中', tone: 'neutral' };\n if (state === 'rejected') return TASK_STATUS_META.rejected;\n if (state === 'returned') return TASK_STATUS_META.returned;\n if (task.nodeType === 'copy' || task.status === 'copied') return TASK_STATUS_META.copied;\n if (compact) return { label: '已完成', tone: 'neutral' };\n return TASK_STATUS_META[task.status] || TASK_STATUS_META.approved;\n}\n\nfunction getIcon(task: ProcessTask, state: VisualState) {\n if (state === 'current')\n return task.nodeType === 'callback_wait' ? <ClockCircleOutlined /> : <LoadingOutlined />;\n if (state === 'future' || state === 'waiting')\n return task.nodeType === 'approval' ? <UserOutlined /> : <ClockCircleOutlined />;\n if (state === 'rejected') return <CloseCircleFilled />;\n if (state === 'returned') return <RollbackOutlined />;\n switch (task.nodeType as string) {\n case 'start':\n return <FileTextOutlined />;\n case 'approval':\n return <CheckCircleFilled />;\n case 'originator_return':\n return <EditOutlined />;\n case 'copy':\n return <CopyOutlined />;\n case 'callback_wait':\n return <ClockCircleOutlined />;\n case 'js_code':\n return <CodeOutlined />;\n case 'connector_call':\n return <ApiOutlined />;\n case 'work_notification':\n case 'dingtalk_card':\n return <NotificationOutlined />;\n case 'data_retrieve_single':\n case 'data_retrieve_batch':\n case 'data_create':\n case 'data_update':\n case 'loop_container':\n return <ReloadOutlined />;\n default:\n return <CheckCircleFilled />;\n }\n}\n\nfunction getDotClass(state: VisualState) {\n const map: Record<VisualState, string> = {\n completed: 'border-emerald-500 text-emerald-600 bg-white',\n current: 'border-blue-600 bg-blue-600 text-white',\n waiting: 'border-gray-200 text-gray-300 bg-white',\n future: 'border-dashed border-gray-300 text-gray-300 bg-white',\n rejected: 'border-red-500 text-red-600 bg-white',\n returned: 'border-amber-500 text-amber-600 bg-white',\n neutral: 'border-gray-200 text-gray-400 bg-white',\n };\n return map[state];\n}\n\nexport const ApprovalTimeline: React.FC<ApprovalTimelineProps> = ({\n tasks,\n className = '',\n renderNode,\n showRemarks = true,\n compactMode = false,\n showApproverInfo = true,\n}) => {\n const taskList = useMemo(() => (Array.isArray(tasks) ? tasks : []), [tasks]);\n const groups = useMemo(() => groupTasks(taskList), [taskList]);\n\n if (taskList.length === 0) {\n return (\n <div\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container p-6 ${className}`}\n >\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">暂无审批记录</p>\n </div>\n );\n }\n\n if (renderNode) {\n return (\n <div className={className}>\n {taskList.map((task, index) => (\n <div key={task.taskId || task.id || index}>{renderNode(task, index)}</div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`approval-timeline ${className}`}>\n {groups.map((group, index) => {\n const node = group[0];\n const isLast = index === groups.length - 1;\n const isFutureGroup = group.some((task) => task.isSimulated || task.status === 'simulated');\n const compact = compactMode || isCompactNode(node);\n const state = getVisualState(node, isFutureGroup);\n const statusMeta = getStatusMeta(node, state, compact);\n const title = getNodeTitle(node);\n const time = node.actionAt || node.createdAt;\n\n return (\n <div\n key={node.nodeVisitId || `${node.nodeId}-${node.taskId}-${index}`}\n className={`relative flex gap-4 pb-5 ${isLast ? 'pb-0' : ''}`}\n >\n {!isLast && (\n <div\n className={`absolute bottom-0 left-[21px] top-11 w-px ${\n state === 'future'\n ? 'border-l border-dashed border-gray-300'\n : 'bg-ant-border-secondary'\n }`}\n />\n )}\n <div\n className={`relative z-10 flex h-11 w-11 shrink-0 items-center justify-center rounded-full border-2 shadow-[0_0_0_4px_var(--ant-color-bg-layout,#f5f5f5)] ${getDotClass(state)}`}\n >\n {getIcon(node, state)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div\n className={`rounded-lg border p-4 ${\n state === 'current'\n ? 'border-blue-300 bg-blue-50/60'\n : state === 'future'\n ? 'border-dashed border-gray-200 bg-gray-50/70'\n : 'border-ant-border-secondary bg-ant-bg-container'\n }`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"font-medium text-ant-text\">{title}</span>\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2 text-xs font-medium ${\n state === 'future' ? toneClasses.future : toneClasses[statusMeta.tone]\n }`}\n >\n {statusMeta.label}\n </span>\n {node.nodeType === 'originator_return' && (\n <span className=\"rounded-md bg-amber-50 px-2 py-1 text-xs text-amber-700\">\n 发起人操作\n </span>\n )}\n </div>\n {!isFutureGroup && time && (\n <span className=\"text-xs text-ant-text-tertiary\">{time}</span>\n )}\n </div>\n\n {showApproverInfo && !compact && group.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-3\">\n <span className=\"w-full text-xs font-medium text-ant-text-tertiary\">\n {state === 'current' || state === 'waiting' ? '当前审批人' : '处理人'}\n </span>\n {group.map((assignee) => (\n <span\n key={assignee.taskId || assignee.id}\n className=\"inline-flex min-w-0 items-center gap-2\"\n >\n <span className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-blue-50 text-xs font-semibold text-blue-700\">\n {assignee.assigneeName?.slice(0, 1) || '?'}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {assignee.assigneeName || '系统'}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n {assignee.departmentName ||\n assignee.actionAt ||\n assignee.createdAt ||\n ''}\n </span>\n </span>\n </span>\n ))}\n </div>\n )}\n\n {showApproverInfo && compact && (\n <div className=\"mt-2 text-sm text-ant-text-secondary\">\n {group\n .map((item) => item.assigneeName)\n .filter(Boolean)\n .join('、') ||\n (node.nodeType === 'start'\n ? '提交申请'\n : systemNodeTypes.has(node.nodeType)\n ? node.comments || '系统自动处理'\n : '')}\n </div>\n )}\n\n {showRemarks && node.comments && (\n <div\n className={`mt-3 border-l-2 pl-3 text-sm leading-6 ${\n state === 'rejected'\n ? 'border-red-300 text-red-700'\n : state === 'returned'\n ? 'border-amber-300 text-amber-700'\n : 'border-ant-border-secondary text-ant-text-secondary'\n }`}\n >\n {node.comments}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport { Form, Input, Modal, Select } from 'antd';\nimport {\n CheckOutlined,\n CloseOutlined,\n RollbackOutlined,\n SaveOutlined,\n SwapOutlined,\n} from '@ant-design/icons';\nimport type { ProcessAction, ReturnableNode } from '../types';\nimport type { ActionConfig } from './FormActionBar';\nimport { StickyActionBar } from './StickyActionBar';\n\nexport interface ApprovalActionBarProps {\n actions: ProcessAction[];\n onApprove?: (comments?: string) => Promise<void> | void;\n onReject?: (comments?: string) => Promise<void> | void;\n onTransfer?: (userId: string, reason?: string) => Promise<void> | void;\n onReturn?: (nodeId: string, reason?: string) => Promise<void> | void;\n onWithdraw?: (reason?: string) => Promise<void> | void;\n onSave?: () => Promise<void> | void;\n onResubmit?: (comments?: string) => Promise<void> | void;\n onCallback?: () => Promise<void> | void;\n returnableNodes?: ReturnableNode[];\n onLoadReturnableNodes?: () => Promise<void> | void;\n renderTransferSelector?: (props: {\n value?: string;\n onChange: (userId: string) => void;\n }) => React.ReactNode;\n renderReturnNodeLabel?: (node: ReturnableNode) => React.ReactNode;\n renderActionModalExtra?: (action: ProcessAction) => React.ReactNode;\n maxMobileButtons?: number;\n className?: string;\n inDrawer?: boolean;\n}\n\ntype ModalAction = 'agree' | 'rejected' | 'withdraw' | 'transfer' | 'return' | 'resubmit' | null;\n\nconst actionPriority: Record<string, number> = {\n agree: 10,\n approved: 10,\n return: 20,\n transfer: 30,\n resubmit: 40,\n save: 80,\n withdraw: 90,\n rejected: 100,\n reject: 100,\n};\n\nfunction getActionLabel(action: ProcessAction) {\n return action.name?.zh_CN || action.text?.zh_CN || action.action;\n}\n\nfunction normalizeAction(action: string): ModalAction | 'save' | 'callback' {\n if (action === 'approved') return 'agree';\n if (action === 'reject') return 'rejected';\n if (\n action === 'agree' ||\n action === 'rejected' ||\n action === 'withdraw' ||\n action === 'transfer' ||\n action === 'return' ||\n action === 'resubmit'\n ) {\n return action;\n }\n if (action === 'save' || action === 'callback') return action;\n return 'agree';\n}\n\nfunction getModalTitle(action: ModalAction) {\n switch (action) {\n case 'agree':\n return '审批意见';\n case 'rejected':\n return '拒绝理由';\n case 'withdraw':\n return '撤销流程';\n case 'transfer':\n return '转交任务';\n case 'return':\n return '退回任务';\n case 'resubmit':\n return '重新提交';\n default:\n return '确认操作';\n }\n}\n\nexport const ApprovalActionBar: React.FC<ApprovalActionBarProps> = ({\n actions,\n onApprove,\n onReject,\n onTransfer,\n onReturn,\n onWithdraw,\n onSave,\n onResubmit,\n onCallback,\n returnableNodes = [],\n onLoadReturnableNodes,\n renderTransferSelector,\n renderReturnNodeLabel,\n renderActionModalExtra,\n maxMobileButtons = 2,\n className = '',\n inDrawer = false,\n}) => {\n const [form] = Form.useForm();\n const [modalAction, setModalAction] = useState<ModalAction>(null);\n const [activeAction, setActiveAction] = useState<ProcessAction | null>(null);\n const [loading, setLoading] = useState(false);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (actionPriority[a.action] ?? 50) - (actionPriority[b.action] ?? 50)),\n [actions],\n );\n\n const openModal = async (action: ProcessAction, target: ModalAction) => {\n setActiveAction(action);\n const defaultComments = action.remark?.content?.zh_CN;\n form.setFieldsValue({\n comments: defaultComments || '',\n reason: '',\n userId: undefined,\n nodeId: undefined,\n });\n if (target === 'return') await onLoadReturnableNodes?.();\n setModalAction(target);\n };\n\n const executeDirect = async (action: ProcessAction) => {\n const normalized = normalizeAction(action.action);\n if (normalized === 'save') {\n await onSave?.();\n return;\n }\n if (normalized === 'callback') {\n await onCallback?.();\n return;\n }\n if (normalized === 'agree') {\n await onApprove?.();\n }\n };\n\n const handleActionClick = async (action: ProcessAction) => {\n const normalized = normalizeAction(action.action);\n if (normalized === 'save' || normalized === 'callback') {\n await executeDirect(action);\n return;\n }\n await openModal(action, normalized);\n };\n\n const handleOk = async () => {\n if (!modalAction) return;\n const values = await form.validateFields();\n setLoading(true);\n try {\n if (modalAction === 'agree') await onApprove?.(values.comments || undefined);\n if (modalAction === 'rejected') await onReject?.(values.comments || undefined);\n if (modalAction === 'withdraw')\n await onWithdraw?.(values.reason || values.comments || undefined);\n if (modalAction === 'transfer') await onTransfer?.(values.userId, values.reason || undefined);\n if (modalAction === 'return') await onReturn?.(values.nodeId, values.reason || undefined);\n if (modalAction === 'resubmit') await onResubmit?.(values.comments || undefined);\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const actionConfigs: ActionConfig[] = visibleActions.map((action) => {\n const normalized = normalizeAction(action.action);\n const danger = normalized === 'rejected' || normalized === 'withdraw';\n return {\n key: action.action,\n label: getActionLabel(action),\n type: normalized === 'agree' ? 'primary' : danger ? 'danger' : 'default',\n icon:\n normalized === 'agree' ? (\n <CheckOutlined />\n ) : normalized === 'rejected' ? (\n <CloseOutlined />\n ) : normalized === 'transfer' ? (\n <SwapOutlined />\n ) : normalized === 'return' || normalized === 'withdraw' ? (\n <RollbackOutlined />\n ) : normalized === 'save' ? (\n <SaveOutlined />\n ) : undefined,\n onClick: () => handleActionClick(action),\n placement: danger || normalized === 'save' ? 'right' : 'left',\n priority: actionPriority[action.action] ?? 50,\n } as ActionConfig;\n });\n\n const requiredComment =\n activeAction?.remark?.required || modalAction === 'rejected' || modalAction === 'withdraw';\n\n return (\n <>\n <StickyActionBar\n actions={actionConfigs}\n layoutMode=\"approval\"\n maxMobileButtons={maxMobileButtons}\n className={className}\n inDrawer={inDrawer}\n />\n <Modal\n getContainer={false}\n title={getModalTitle(modalAction)}\n open={modalAction !== null}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={loading}\n onOk={handleOk}\n onCancel={() => {\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n }}\n destroyOnClose\n >\n <Form form={form} layout=\"vertical\">\n {modalAction === 'transfer' && (\n <Form.Item\n name=\"userId\"\n label=\"转交给\"\n rules={[{ required: true, message: '请选择转交用户' }]}\n >\n {renderTransferSelector ? (\n renderTransferSelector({\n value: form.getFieldValue('userId'),\n onChange: (userId) => form.setFieldsValue({ userId }),\n })\n ) : (\n <Input placeholder=\"请输入用户 ID\" />\n )}\n </Form.Item>\n )}\n {modalAction === 'return' && (\n <Form.Item\n name=\"nodeId\"\n label=\"退回到节点\"\n rules={[{ required: true, message: '请选择退回节点' }]}\n >\n <Select\n placeholder=\"请选择退回节点\"\n getPopupContainer={(triggerNode) => triggerNode.parentElement || document.body}\n options={returnableNodes.map((node) => ({\n value: node.nodeId || node.id || '',\n label: renderReturnNodeLabel\n ? renderReturnNodeLabel(node)\n : node.nodeName || node.name || node.nodeId || node.id,\n }))}\n />\n </Form.Item>\n )}\n <Form.Item\n name={\n modalAction === 'withdraw' || modalAction === 'transfer' || modalAction === 'return'\n ? 'reason'\n : 'comments'\n }\n label={\n modalAction === 'withdraw'\n ? '撤销原因'\n : modalAction === 'transfer'\n ? '转交原因'\n : modalAction === 'return'\n ? '退回原因'\n : '审批意见'\n }\n rules={[{ required: requiredComment, message: '请填写说明' }]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入说明\" />\n </Form.Item>\n {activeAction && renderActionModalExtra?.(activeAction)}\n </Form>\n </Modal>\n </>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Dropdown } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ActionConfig } from './FormActionBar';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface StickyActionBarProps {\n actions: ActionConfig[];\n className?: string;\n maxMobileButtons?: number;\n layoutMode?: 'default' | 'approval';\n inDrawer?: boolean;\n maxWidth?: number | string;\n position?: 'sticky' | 'fixed' | 'inline';\n}\n\nconst getActionPriority = (action: ActionConfig) => {\n const maybePriority = (action as ActionConfig & { priority?: number }).priority;\n if (typeof maybePriority === 'number') return maybePriority;\n if (action.type === 'primary') return 10;\n if (action.type === 'danger') return 90;\n return 50;\n};\n\nconst getPlacement = (action: ActionConfig) =>\n (action as ActionConfig & { placement?: 'left' | 'right' }).placement;\n\nexport const StickyActionBar: React.FC<StickyActionBarProps> = ({\n actions,\n className = '',\n maxMobileButtons = 2,\n layoutMode = 'default',\n maxWidth = 1120,\n position = 'sticky',\n}) => {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const update = () => setIsMobile(typeof window !== 'undefined' && window.innerWidth <= 768);\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, []);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => action.visible !== false)\n .sort((left, right) => getActionPriority(left) - getActionPriority(right)),\n [actions],\n );\n\n if (visibleActions.length === 0) return null;\n\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n const primaryMobile = visibleActions.slice(0, maxMobileButtons);\n const moreMobile = visibleActions.slice(maxMobileButtons);\n const leftActions = visibleActions.filter((action) => getPlacement(action) === 'left');\n const rightActions = visibleActions.filter((action) => getPlacement(action) !== 'left');\n\n const positionClass =\n position === 'fixed'\n ? 'fixed bottom-0 left-0 right-0'\n : position === 'inline'\n ? 'relative'\n : 'sticky bottom-0';\n\n const runAction = (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n }\n action.onClick();\n };\n\n const renderButton = (action: ActionConfig, mobile = false) => (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={action.loading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => runAction(action)}\n className={`${mobile ? 'min-w-0 flex-1' : 'min-w-[88px]'} rounded-md`}\n >\n {action.label}\n </Button>\n );\n\n return (\n <div\n className={`${positionClass} z-20 border-t border-ant-border-secondary bg-ant-bg-container/95 px-4 py-3 shadow-[0_-8px_24px_rgba(15,23,42,0.06)] backdrop-blur supports-[padding:max(0px)]:pb-[max(0.75rem,env(safe-area-inset-bottom))] ${className}`}\n >\n <div\n className={`mx-auto flex w-full items-center gap-3 ${\n layoutMode === 'approval' && !isMobile ? 'justify-between' : 'justify-end'\n }`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {isMobile ? (\n <>\n <div className=\"flex flex-1 gap-2\">\n {primaryMobile.map((action) => renderButton(action, true))}\n </div>\n {moreMobile.length > 0 && (\n <Dropdown\n trigger={['click']}\n placement=\"topRight\"\n menu={{\n items: moreMobile.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.type === 'danger',\n disabled: action.disabled,\n icon: action.icon,\n onClick: () => runAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />} className=\"rounded-md\">\n 更多\n </Button>\n </Dropdown>\n )}\n </>\n ) : layoutMode === 'approval' && leftActions.length > 0 ? (\n <>\n <div className=\"flex flex-wrap items-center gap-3\">\n {leftActions.map((action) => renderButton(action))}\n </div>\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {rightActions.map((action) => renderButton(action))}\n </div>\n </>\n ) : (\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {visibleActions.map((action) => renderButton(action))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","export const confirmAction = (title?: string, content?: string) => {\n const message = [title, content].filter(Boolean).join('\\n') || '确认继续吗?';\n if (typeof window === 'undefined' || typeof window.confirm !== 'function') {\n return true;\n }\n\n try {\n return window.confirm(message);\n } catch {\n return true;\n }\n};\n","import React, { useMemo, useState } from 'react';\nimport { Button, Dropdown, Form, Input, Modal } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ProcessAction } from '../types';\n\nexport interface ApprovalActionsProps {\n actions: ProcessAction[];\n onApprove?: (comments?: string) => Promise<void> | void;\n onReject?: (comments?: string) => Promise<void> | void;\n onTransfer?: () => void;\n onReturn?: () => void;\n onWithdraw?: (reason?: string) => Promise<void> | void;\n onSave?: () => Promise<void> | void;\n layout?: 'horizontal' | 'vertical';\n maxVisible?: number;\n className?: string;\n}\n\ntype ModalAction = 'approve' | 'reject' | 'withdraw' | null;\n\nconst priority: Record<string, number> = {\n agree: 10,\n approved: 10,\n transfer: 20,\n return: 30,\n save: 40,\n withdraw: 90,\n rejected: 100,\n reject: 100,\n};\n\nconst getLabel = (action: ProcessAction) =>\n action.name?.zh_CN || action.text?.zh_CN || action.action;\n\nexport const ApprovalActions: React.FC<ApprovalActionsProps> = ({\n actions,\n onApprove,\n onReject,\n onTransfer,\n onReturn,\n onWithdraw,\n onSave,\n layout = 'horizontal',\n maxVisible = 3,\n className = '',\n}) => {\n const [form] = Form.useForm();\n const [modalAction, setModalAction] = useState<ModalAction>(null);\n const [activeAction, setActiveAction] = useState<ProcessAction | null>(null);\n const [loading, setLoading] = useState(false);\n const [saveLoading, setSaveLoading] = useState(false);\n\n const renderableActions = useMemo(\n () =>\n actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (priority[a.action] ?? 50) - (priority[b.action] ?? 50)),\n [actions],\n );\n\n const openModal = (target: ModalAction, action: ProcessAction) => {\n setActiveAction(action);\n form.setFieldsValue({ comments: action.remark?.content?.zh_CN || '' });\n setModalAction(target);\n };\n\n const handleSave = async () => {\n setSaveLoading(true);\n try {\n await onSave?.();\n } finally {\n setSaveLoading(false);\n }\n };\n\n const handleAction = (action: ProcessAction) => {\n if (action.action === 'transfer') {\n onTransfer?.();\n return;\n }\n if (action.action === 'return') {\n onReturn?.();\n return;\n }\n if (action.action === 'save') {\n void handleSave();\n return;\n }\n if (action.action === 'withdraw') {\n openModal('withdraw', action);\n return;\n }\n if (action.action === 'rejected' || action.action === 'reject') {\n openModal('reject', action);\n return;\n }\n openModal('approve', action);\n };\n\n const handleConfirm = async () => {\n const values = await form.validateFields();\n setLoading(true);\n try {\n if (modalAction === 'approve') await onApprove?.(values.comments || undefined);\n if (modalAction === 'reject') await onReject?.(values.comments || undefined);\n if (modalAction === 'withdraw') await onWithdraw?.(values.comments || undefined);\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const visibleButtons = renderableActions.slice(0, maxVisible);\n const moreButtons = renderableActions.slice(maxVisible);\n const title =\n modalAction === 'approve' ? '审批意见' : modalAction === 'reject' ? '拒绝理由' : '撤销原因';\n\n const button = (action: ProcessAction) => (\n <Button\n key={action.action}\n type={action.action === 'agree' || action.action === 'approved' ? 'primary' : 'default'}\n danger={\n action.action === 'rejected' || action.action === 'reject' || action.action === 'withdraw'\n }\n onClick={() => handleAction(action)}\n loading={action.action === 'save' && saveLoading}\n >\n {getLabel(action)}\n </Button>\n );\n\n return (\n <>\n <div\n className={`${layout === 'horizontal' ? 'flex items-center gap-3' : 'flex flex-col gap-2'} ${className}`}\n >\n {visibleButtons.map(button)}\n {moreButtons.length > 0 && (\n <Dropdown\n trigger={['click']}\n getPopupContainer={(triggerNode) => triggerNode.parentElement || document.body}\n menu={{\n items: moreButtons.map((action) => ({\n key: action.action,\n label: getLabel(action),\n danger:\n action.action === 'rejected' ||\n action.action === 'reject' ||\n action.action === 'withdraw',\n onClick: () => handleAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />}>更多</Button>\n </Dropdown>\n )}\n </div>\n <Modal\n getContainer={false}\n title={title}\n open={modalAction !== null}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={loading}\n onOk={handleConfirm}\n onCancel={() => {\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n }}\n destroyOnClose\n >\n <Form form={form} layout=\"vertical\">\n <Form.Item\n name=\"comments\"\n label={modalAction === 'approve' ? '审批意见' : '请输入理由'}\n rules={[\n {\n required: Boolean(activeAction?.remark?.required) || modalAction !== 'approve',\n message: '请填写说明',\n },\n ]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入说明\" />\n </Form.Item>\n </Form>\n </Modal>\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { Button } from 'antd';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface ActionConfig {\n key: string;\n label: string;\n type?: 'primary' | 'default' | 'danger' | 'text';\n onClick: () => void | Promise<void>;\n loading?: boolean;\n disabled?: boolean;\n visible?: boolean;\n confirm?: { title: string; content: string; okText?: string; cancelText?: string };\n icon?: React.ReactNode;\n priority?: number;\n placement?: 'left' | 'right';\n}\n\nexport interface FormActionBarProps {\n actions: ActionConfig[];\n position?: 'bottom-fixed' | 'inline';\n className?: string;\n}\n\nexport const FormActionBar: React.FC<FormActionBarProps> = ({\n actions,\n position = 'bottom-fixed',\n className = '',\n}) => {\n const [loadingKeys, setLoadingKeys] = useState<Set<string>>(new Set());\n\n const visibleActions = actions.filter((a) => a.visible !== false);\n\n // Sort: danger first, primary last\n const sortedActions = [...visibleActions].sort((a, b) => {\n if (a.type === 'danger' && b.type !== 'danger') return -1;\n if (a.type !== 'danger' && b.type === 'danger') return 1;\n if (a.type === 'primary' && b.type !== 'primary') return 1;\n if (a.type !== 'primary' && b.type === 'primary') return -1;\n return 0;\n });\n\n const handleClick = async (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n await executeAction(action);\n } else {\n await executeAction(action);\n }\n };\n\n const executeAction = async (action: ActionConfig) => {\n setLoadingKeys((prev) => new Set(prev).add(action.key));\n try {\n await action.onClick();\n } finally {\n setLoadingKeys((prev) => {\n const next = new Set(prev);\n next.delete(action.key);\n return next;\n });\n }\n };\n\n const isFixed = position === 'bottom-fixed';\n\n const bar = (\n <div\n className={`${\n isFixed\n ? 'fixed bottom-0 left-0 right-0 z-50 backdrop-blur-lg bg-white/80 border-t border-gray-200 shadow-[0_-1px_3px_rgba(0,0,0,0.05)] px-6 py-3'\n : ''\n } ${className}`}\n >\n <div className=\"flex items-center justify-end gap-3 flex-wrap md:flex-nowrap\">\n {sortedActions.map((action) => {\n const isLoading = action.loading || loadingKeys.has(action.key);\n return (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={isLoading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => handleClick(action)}\n className=\"md:w-auto w-full\"\n >\n {action.label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n\n if (isFixed) {\n return (\n <>\n {bar}\n {/* Spacer to prevent content from being hidden behind fixed bar */}\n <div className=\"h-16\" />\n </>\n );\n }\n\n return bar;\n};\n","import React from 'react';\nimport { Alert, Empty, Spin } from 'antd';\n\nexport interface RuntimePageShellProps {\n children: React.ReactNode;\n actions?: React.ReactNode;\n loading?: boolean;\n loadingTip?: string;\n accessDenied?: boolean;\n error?: React.ReactNode;\n empty?: React.ReactNode;\n className?: string;\n contentClassName?: string;\n maxWidth?: number | string;\n inDrawer?: boolean;\n}\n\nexport const RuntimePageShell: React.FC<RuntimePageShellProps> = ({\n children,\n actions,\n loading = false,\n loadingTip = '正在加载页面...',\n accessDenied = false,\n error,\n empty,\n className = '',\n contentClassName = '',\n maxWidth = 1120,\n inDrawer = false,\n}) => {\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n\n const renderState = () => {\n if (loading) {\n return (\n <div className=\"min-h-[360px] flex items-center justify-center\">\n <Spin tip={loadingTip} />\n </div>\n );\n }\n if (accessDenied) {\n return <Empty description=\"无权限查看详情\" />;\n }\n if (error) {\n return <Alert type=\"error\" showIcon message=\"页面加载失败\" description={error} />;\n }\n if (empty) {\n return <>{empty}</>;\n }\n return children;\n };\n\n return (\n <div className={`sy-runtime-page min-h-full bg-ant-bg-layout text-ant-text ${className}`}>\n <div\n className={`sy-runtime-page__content mx-auto w-full px-4 py-6 pb-8 md:px-6 ${\n inDrawer ? 'py-4 md:px-4' : ''\n } ${contentClassName}`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {renderState()}\n </div>\n {actions}\n </div>\n );\n};\n","import React from 'react';\nimport { Avatar } from 'antd';\nimport { ApartmentOutlined, CalendarOutlined, FileTextOutlined } from '@ant-design/icons';\nimport type { StatusMeta } from '../types';\n\nexport interface SummaryPanelMetaItem {\n key: string;\n label: string;\n value?: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nexport interface SummaryPanelProps {\n title?: React.ReactNode;\n eyebrow?: React.ReactNode;\n status?: StatusMeta;\n creator?: { name?: string; avatar?: string; department?: string };\n createdAt?: React.ReactNode;\n metaItems?: SummaryPanelMetaItem[];\n className?: string;\n children?: React.ReactNode;\n}\n\nconst toneClasses: Record<StatusMeta['tone'], string> = {\n brand: 'bg-blue-50 text-blue-700 border-blue-200',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n};\n\nexport const SummaryPanel: React.FC<SummaryPanelProps> = ({\n title = '详情',\n eyebrow,\n status,\n creator,\n createdAt,\n metaItems,\n className = '',\n children,\n}) => {\n const defaultItems: SummaryPanelMetaItem[] = [\n {\n key: 'creator',\n label: '创建人',\n value: creator?.name || '未知用户',\n icon: creator?.avatar ? (\n <Avatar size={24} src={creator.avatar} />\n ) : (\n <Avatar size={24}>{creator?.name?.slice(0, 1) || '表'}</Avatar>\n ),\n },\n {\n key: 'department',\n label: '所属部门',\n value: creator?.department || '-',\n icon: <ApartmentOutlined />,\n },\n {\n key: 'createdAt',\n label: '创建时间',\n value: createdAt || '-',\n icon: <CalendarOutlined />,\n },\n ];\n const items = metaItems || defaultItems;\n\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"p-5 md:p-6\">\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <div className=\"min-w-0 text-sm text-ant-text-tertiary\">\n {eyebrow || (\n <span className=\"inline-flex items-center gap-2\">\n <FileTextOutlined />\n 数据实例\n </span>\n )}\n </div>\n {status && (\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2.5 text-xs font-medium ${\n toneClasses[status.tone] || toneClasses.neutral\n }`}\n >\n {status.label}\n </span>\n )}\n </div>\n <h1 className=\"m-0 break-words text-2xl font-semibold leading-9 text-ant-text md:text-[28px]\">\n {title}\n </h1>\n {items.length > 0 && (\n <div className=\"mt-5 grid grid-cols-1 gap-4 md:grid-cols-3\">\n {items.map((item) => (\n <div key={item.key} className=\"flex min-w-0 items-center gap-3\">\n <span className=\"inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-gray-100 text-ant-text-secondary\">\n {item.icon}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-xs leading-5 text-ant-text-tertiary\">\n {item.label}\n </span>\n <span className=\"block break-words text-sm font-medium leading-6 text-ant-text\">\n {item.value || '-'}\n </span>\n </span>\n </div>\n ))}\n </div>\n )}\n {children && <div className=\"mt-5\">{children}</div>}\n </div>\n </section>\n );\n};\n","import React from 'react';\nimport { Button } from 'antd';\nimport { EditOutlined } from '@ant-design/icons';\n\nexport interface DraftManagerProps {\n hasDraft: boolean;\n draftTimestamp?: number | null;\n onRestore: () => void;\n onDiscard: () => void;\n className?: string;\n}\n\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return '刚刚';\n if (minutes < 60) return `${minutes}分钟前`;\n if (hours < 24) return `${hours}小时前`;\n return `${days}天前`;\n}\n\nexport const DraftManager: React.FC<DraftManagerProps> = ({\n hasDraft,\n draftTimestamp,\n onRestore,\n onDiscard,\n className = '',\n}) => {\n if (!hasDraft) return null;\n\n const timeLabel = draftTimestamp ? formatRelativeTime(draftTimestamp) : null;\n\n return (\n <div\n className={`bg-blue-50 border border-blue-200 rounded-lg p-4 animate-[slideDown_0.3s_ease-out] ${className}`}\n >\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <EditOutlined className=\"text-blue-500\" />\n <span>\n 检测到未提交的草稿\n {timeLabel && <span className=\"text-blue-500 ml-1\">(保存于 {timeLabel})</span>}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"text\" size=\"small\" onClick={onDiscard} className=\"!text-gray-500\">\n 丢弃\n </Button>\n <Button type=\"primary\" size=\"small\" onClick={onRestore}>\n 恢复填写\n </Button>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Modal, Skeleton, Button } from 'antd';\nimport { CheckCircleOutlined, UserOutlined } from '@ant-design/icons';\nimport type { ProcessRoute } from '../types';\n\nexport interface ProcessPreviewProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n routes: ProcessRoute[];\n loading?: boolean;\n}\n\nexport const ProcessPreview: React.FC<ProcessPreviewProps> = ({\n open,\n onClose,\n onConfirm,\n routes,\n loading = false,\n}) => {\n const routeList = Array.isArray(routes) ? routes : [];\n\n return (\n <Modal\n getContainer={false}\n title=\"流程预览\"\n open={open}\n onCancel={onClose}\n width={520}\n footer={\n <div className=\"flex justify-end gap-3\">\n <Button onClick={onClose}>取消</Button>\n <Button type=\"primary\" onClick={onConfirm} loading={loading}>\n 确认提交\n </Button>\n </div>\n }\n >\n {loading && routeList.length === 0 ? (\n <Skeleton active paragraph={{ rows: 4 }} />\n ) : routeList.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8\">暂无流程节点</p>\n ) : (\n <div className=\"py-2\">\n {routeList.map((route, index) => {\n const isLast = index === routeList.length - 1;\n return (\n <div key={route.nodeId} className=\"flex gap-3\">\n {/* Left timeline */}\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-blue-50 border-2 border-blue-400 flex items-center justify-center flex-shrink-0\">\n <CheckCircleOutlined className=\"text-blue-500 text-xs\" />\n </div>\n {!isLast && <div className=\"w-0.5 flex-1 bg-blue-200 mt-1\" />}\n </div>\n\n {/* Right content */}\n <div className={`flex-1 ${isLast ? 'pb-0' : 'pb-5'}`}>\n <div className=\"text-sm font-medium text-gray-900\">{route.nodeName}</div>\n {route.assignees && route.assignees.length > 0 && (\n <div className=\"mt-1 flex items-center gap-1.5 flex-wrap\">\n <UserOutlined className=\"text-gray-400 text-xs\" />\n {route.assignees.map((assignee) => (\n <span\n key={assignee.id}\n className=\"text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded\"\n >\n {assignee.name}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </Modal>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { TableProps } from 'antd';\nimport {\n Button,\n Checkbox,\n ConfigProvider,\n Drawer,\n Dropdown,\n Empty,\n Input,\n Modal,\n Segmented,\n Select,\n Space,\n Table,\n Tag,\n Tooltip,\n Upload,\n message,\n} from 'antd';\nimport {\n DeleteOutlined,\n DownloadOutlined,\n FilterOutlined,\n HistoryOutlined,\n ImportOutlined,\n MoreOutlined,\n PlusOutlined,\n ReloadOutlined,\n SettingOutlined,\n SwapOutlined,\n} from '@ant-design/icons';\nimport type { FormRuntimeApi, FormRuntimeApiConfig } from '../types';\nimport { createFormRuntimeApi } from '../core/runtimeApi';\nimport {\n advancedSearchDataManagement,\n batchApproveDataManagementRows,\n deleteDataManagementRows,\n exportDataManagementRows,\n getDataManagementConfig,\n getDataManagementSchema,\n getDataManagementTransferRecords,\n getSystemFieldsForFormType,\n importDataManagementRows,\n importPreviewDataManagementRows,\n normalizeColumnConfig,\n saveDataManagementConfig,\n type DataManagementConfig,\n type DataManagementConfigScope,\n type DataManagementDensity,\n type DataManagementField,\n type DataManagementFilterGroup,\n type DataManagementFilterRule,\n type DataManagementSort,\n} from '../core/dataManagementApi';\nimport { confirmAction } from '../utils/confirmAction';\n\ntype DetailRenderer = (props: {\n record: any;\n formInstanceId?: string;\n onClose: () => void;\n}) => React.ReactNode;\n\ntype SubmitRenderer = (props: { onClose: () => void; onSubmitted: () => void }) => React.ReactNode;\n\ntype DataManagementFetchState = {\n current?: number;\n pageSize?: number;\n searchKeyWord?: string;\n filterGroup?: DataManagementFilterGroup;\n sort?: DataManagementSort[];\n};\n\nexport interface DataManagementRowAction {\n key: string;\n label: string;\n danger?: boolean;\n onClick: (record: any) => void;\n}\n\nexport interface DataManagementListProps {\n appType: string;\n formUuid: string;\n menuFormUuid?: string;\n readonly?: boolean;\n fullHeight?: boolean;\n configScope?: DataManagementConfigScope;\n title?: string;\n detailRenderer?: DetailRenderer;\n submitRenderer?: SubmitRenderer;\n requestOverride?: FormRuntimeApi['request'] | FormRuntimeApiConfig;\n rowActions?: DataManagementRowAction[];\n}\n\nconst createGroup = (): DataManagementFilterGroup => ({\n id: `group_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n logic: 'AND',\n rules: [],\n conditions: [],\n});\n\nconst createRule = (field?: DataManagementField): DataManagementFilterRule => ({\n id: `rule_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n key: field?.fieldId || '',\n operator: 'contains',\n value: '',\n componentName: field?.componentName,\n});\n\nconst getRecordId = (record: any) =>\n record?.formInstanceId ||\n record?.formInstId ||\n record?.form_instance_id ||\n record?.instanceId ||\n record?.id ||\n record?.processInstanceId;\n\nconst getSelectedRecordId = (record: any, fallback: React.Key) =>\n record?.formInstId ||\n record?.formInstanceId ||\n record?.form_instance_id ||\n record?.id ||\n fallback;\n\nconst hydrateFilterGroup = (group?: DataManagementFilterGroup): DataManagementFilterGroup => {\n if (!group) return createGroup();\n return {\n id: group.id || createGroup().id,\n logic: group.logic === 'OR' ? 'OR' : 'AND',\n rules: Array.isArray(group.rules)\n ? group.rules.map((rule) => ({\n ...rule,\n id: rule.id || `rule_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n }))\n : [],\n conditions: Array.isArray(group.conditions) ? group.conditions.map(hydrateFilterGroup) : [],\n };\n};\n\nconst formatPrimitive = (value: any) => {\n if (value === undefined || value === null || value === '')\n return <span className=\"text-ant-color-text-quaternary\">--</span>;\n return String(value);\n};\n\nconst pickOptionLabel = (field: DataManagementField, value: any) => {\n const options =\n field.options || field.optionList || field.option_list || field.componentProps?.options || [];\n const scalar =\n typeof value === 'object' ? (value?.value ?? value?.id ?? value?.label ?? value?.name) : value;\n const match = Array.isArray(options)\n ? options.find((option: any) => String(option.value ?? option.id) === String(scalar))\n : undefined;\n return match?.label || match?.name || value?.label || value?.name || scalar;\n};\n\nconst renderStatusTag = (value: any, fieldId: string) => {\n const raw = String(value || '');\n const statusMap: Record<string, { label: string; color: string }> = {\n pending: { label: '待处理', color: 'processing' },\n running: { label: '审批中', color: 'processing' },\n waiting: { label: '等待中', color: 'default' },\n exception: { label: '流程异常', color: 'error' },\n completed: { label: '已完成', color: 'success' },\n terminated: { label: '已拒绝', color: 'error' },\n withdrawn: { label: '已撤销', color: 'default' },\n processing: { label: '审批中', color: 'processing' },\n approved: { label: '同意', color: 'success' },\n rejected: { label: '拒绝', color: 'error' },\n };\n if (fieldId !== 'processInstanceStatus' && fieldId !== 'approvalResult') return null;\n const meta = statusMap[raw];\n return <Tag color={meta?.color}>{meta?.label || raw || '--'}</Tag>;\n};\n\nconst renderCellValue = (value: any, field: DataManagementField) => {\n const status = renderStatusTag(value, field.fieldId);\n if (status) return status;\n\n if (Array.isArray(value)) {\n if (value.length === 0) return formatPrimitive('');\n if (field.componentName === 'ImageField') {\n return (\n <div className=\"flex max-w-[180px] gap-1 overflow-hidden\">\n {value.slice(0, 3).map((item: any, index) => (\n <img\n key={item?.uid || item?.id || item?.url || index}\n alt={item?.name || field.label}\n src={item?.url || item?.previewUrl}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ))}\n </div>\n );\n }\n if (field.componentName === 'AttachmentField') {\n return (\n <Space size={4} wrap>\n {value.slice(0, 3).map((item: any, index) => (\n <Tag key={item?.uid || item?.id || index}>\n {item?.name || item?.originalName || `附件${index + 1}`}\n </Tag>\n ))}\n {value.length > 3 && <Tag>+{value.length - 3}</Tag>}\n </Space>\n );\n }\n return (\n <Space size={4} wrap>\n {value.slice(0, 4).map((item, index) => (\n <Tag key={`${field.fieldId}_${index}`}>{pickOptionLabel(field, item)}</Tag>\n ))}\n {value.length > 4 && <Tag>+{value.length - 4}</Tag>}\n </Space>\n );\n }\n\n if (value && typeof value === 'object') {\n if (\n field.componentName === 'UserSelectField' ||\n field.componentName === 'DepartmentSelectField'\n ) {\n return value.name || value.label || value.username || formatPrimitive(value.id);\n }\n if (value.start || value.end) {\n return [value.start, value.end].filter(Boolean).join(' 至 ');\n }\n if (value.label || value.name || value.value) {\n return pickOptionLabel(field, value);\n }\n return (\n <Tooltip title={JSON.stringify(value)}>\n <span className=\"text-ant-color-text-secondary\">对象数据</span>\n </Tooltip>\n );\n }\n\n if (\n ['SelectField', 'RadioField', 'CheckboxField', 'MultiSelectField'].includes(field.componentName)\n ) {\n return pickOptionLabel(field, value);\n }\n\n return formatPrimitive(value);\n};\n\nconst fileToBase64 = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = String(reader.result || '');\n resolve(result.includes(',') ? result.split(',')[1] : result);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\nfunction FilterGroupEditor({\n group,\n fields,\n onChange,\n level = 0,\n}: {\n group: DataManagementFilterGroup;\n fields: DataManagementField[];\n onChange: (group: DataManagementFilterGroup) => void;\n level?: number;\n}) {\n const fieldOptions = fields.map((field) => ({ label: field.label, value: field.fieldId }));\n\n const updateRule = (ruleId: string, patch: Partial<DataManagementFilterRule>) => {\n onChange({\n ...group,\n rules: group.rules.map((rule) => (rule.id === ruleId ? { ...rule, ...patch } : rule)),\n });\n };\n\n return (\n <div\n className={`${level > 0 ? 'ml-4 border-l border-ant-border-secondary pl-4' : ''} space-y-3`}\n >\n <div className=\"flex items-center justify-between\">\n <Segmented\n size=\"small\"\n value={group.logic}\n options={[\n { label: '满足全部', value: 'AND' },\n { label: '满足任一', value: 'OR' },\n ]}\n onChange={(value) => onChange({ ...group, logic: value as 'AND' | 'OR' })}\n />\n <Space>\n <Button\n size=\"small\"\n onClick={() => onChange({ ...group, rules: [...group.rules, createRule(fields[0])] })}\n >\n 添加条件\n </Button>\n <Button\n size=\"small\"\n onClick={() => onChange({ ...group, conditions: [...group.conditions, createGroup()] })}\n >\n 添加分组\n </Button>\n </Space>\n </div>\n {group.rules.map((rule) => (\n <div\n key={rule.id}\n className=\"grid grid-cols-[minmax(120px,1fr)_120px_minmax(160px,1fr)_auto] gap-2\"\n >\n <Select\n showSearch\n placeholder=\"字段\"\n value={rule.key}\n options={fieldOptions}\n optionFilterProp=\"label\"\n onChange={(fieldId) => {\n const field = fields.find((item) => item.fieldId === fieldId);\n updateRule(rule.id, { key: fieldId, componentName: field?.componentName });\n }}\n />\n <Select\n value={rule.operator}\n options={[\n { label: '包含', value: 'contains' },\n { label: '等于', value: 'eq' },\n { label: '不等于', value: 'ne' },\n { label: '大于', value: 'gt' },\n { label: '小于', value: 'lt' },\n ]}\n onChange={(operator) => updateRule(rule.id, { operator })}\n />\n <Input\n value={rule.value}\n placeholder=\"输入筛选值\"\n onChange={(event) => updateRule(rule.id, { value: event.target.value })}\n />\n <Button\n danger\n type=\"text\"\n icon={<DeleteOutlined />}\n onClick={() =>\n onChange({ ...group, rules: group.rules.filter((item) => item.id !== rule.id) })\n }\n />\n </div>\n ))}\n {group.conditions.map((child) => (\n <FilterGroupEditor\n key={child.id}\n group={child}\n fields={fields}\n level={level + 1}\n onChange={(next) =>\n onChange({\n ...group,\n conditions: group.conditions.map((item) => (item.id === child.id ? next : item)),\n })\n }\n />\n ))}\n {group.rules.length === 0 && group.conditions.length === 0 && (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无筛选条件\" />\n )}\n </div>\n );\n}\n\nexport const DataManagementList: React.FC<DataManagementListProps> = ({\n appType,\n formUuid,\n menuFormUuid,\n readonly = false,\n fullHeight = true,\n configScope = 'global',\n title,\n detailRenderer,\n submitRenderer,\n requestOverride,\n rowActions = [],\n}) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const api = useMemo(() => {\n if (typeof requestOverride === 'function') {\n return createFormRuntimeApi({ request: requestOverride });\n }\n return createFormRuntimeApi(requestOverride);\n }, [requestOverride]);\n\n const [fields, setFields] = useState<DataManagementField[]>([]);\n const [config, setConfig] = useState<DataManagementConfig>({});\n const [showFields, setShowFields] = useState<string[]>([]);\n const [lockFieldIds, setLockFieldIds] = useState<string[]>([]);\n const [widths, setWidths] = useState<Record<string, number>>({});\n const [sort, setSort] = useState<DataManagementSort[]>([]);\n const [density, setDensity] = useState<DataManagementDensity>('middle');\n const [detailOpenMode, setDetailOpenMode] = useState<'drawer' | 'newPage'>('drawer');\n const [searchKeyWord, setSearchKeyWord] = useState('');\n const [filterGroup, setFilterGroup] = useState<DataManagementFilterGroup>(createGroup);\n const [dataSource, setDataSource] = useState<any[]>([]);\n const [total, setTotal] = useState(0);\n const [current, setCurrent] = useState(1);\n const [pageSize, setPageSize] = useState(10);\n const [loading, setLoading] = useState(false);\n const [schemaLoading, setSchemaLoading] = useState(true);\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);\n const [filterOpen, setFilterOpen] = useState(false);\n const [columnOpen, setColumnOpen] = useState(false);\n const [exportOpen, setExportOpen] = useState(false);\n const [exportScope, setExportScope] = useState<'selected' | 'all'>('all');\n const [exportFields, setExportFields] = useState<string[]>([]);\n const [exporting, setExporting] = useState(false);\n const [importOpen, setImportOpen] = useState(false);\n const [importPreview, setImportPreview] = useState<any[]>([]);\n const [importBase64, setImportBase64] = useState('');\n const [recordsOpen, setRecordsOpen] = useState(false);\n const [recordTab, setRecordTab] = useState<'import' | 'export'>('export');\n const [transferRecords, setTransferRecords] = useState<any[]>([]);\n const [batchApprovalOpen, setBatchApprovalOpen] = useState(false);\n const [batchApprovalAction, setBatchApprovalAction] = useState<'approved' | 'rejected'>(\n 'approved',\n );\n const [batchApprovalComments, setBatchApprovalComments] = useState('');\n const [batchApproving, setBatchApproving] = useState(false);\n const [activeRecord, setActiveRecord] = useState<any | null>(null);\n const [detailOpen, setDetailOpen] = useState(false);\n const [submitOpen, setSubmitOpen] = useState(false);\n const fetchStateRef = useRef<DataManagementFetchState>({});\n\n const request = api.request;\n const getPopupContainer = useCallback(\n (triggerNode?: HTMLElement) => triggerNode?.parentElement || rootRef.current || document.body,\n [],\n );\n const confirmDanger = useCallback((title: string, content: string, onOk: () => void) => {\n if (confirmAction(title, content)) onOk();\n }, []);\n\n const visibleFields = useMemo(\n () =>\n showFields\n .map((fieldId) => fields.find((field) => field.fieldId === fieldId))\n .filter(Boolean) as DataManagementField[],\n [fields, showFields],\n );\n\n useEffect(() => {\n fetchStateRef.current = {\n current,\n pageSize,\n searchKeyWord,\n filterGroup,\n sort,\n };\n }, [current, filterGroup, pageSize, searchKeyWord, sort]);\n\n const loadData = useCallback(\n async (overrides: DataManagementFetchState = {}) => {\n if (!appType || !formUuid) return;\n const fetchState = { ...fetchStateRef.current, ...overrides };\n const nextCurrent = fetchState.current || 1;\n const nextPageSize = fetchState.pageSize || 10;\n fetchStateRef.current = {\n ...fetchState,\n current: nextCurrent,\n pageSize: nextPageSize,\n };\n setLoading(true);\n try {\n const result = await advancedSearchDataManagement(request, {\n appType,\n formUuid,\n currentPage: nextCurrent,\n pageSize: nextPageSize,\n searchKeyWord: fetchState.searchKeyWord,\n filters: fetchState.filterGroup,\n order: fetchState.sort,\n });\n setDataSource(result.records);\n setTotal(result.total);\n setCurrent(nextCurrent);\n setPageSize(nextPageSize);\n } catch (error) {\n console.error('[DataManagementList] loadData failed:', error);\n message.error('加载数据失败');\n } finally {\n setLoading(false);\n }\n },\n [appType, formUuid, request],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadSchemaAndConfig = async () => {\n if (!appType || !formUuid) return;\n setSchemaLoading(true);\n setDataSource([]);\n setTotal(0);\n setSelectedRowKeys([]);\n try {\n const schemaResult = await getDataManagementSchema(request, { appType, formUuid });\n if (!mounted) return;\n const allFields = [\n ...schemaResult.fields,\n ...getSystemFieldsForFormType(schemaResult.formType),\n ];\n const saved = await getDataManagementConfig(request, {\n appType,\n formUuid,\n menuFormUuid,\n scope: configScope,\n }).catch(() => undefined);\n if (!mounted) return;\n const resolved = normalizeColumnConfig(saved, allFields);\n const nextSearchKeyWord = saved?.filter?.searchKeyWord || '';\n const nextFilterGroup = hydrateFilterGroup(saved?.filter?.group);\n setFields(allFields);\n setConfig(saved || {});\n setShowFields(resolved.showFields);\n setWidths(resolved.widths);\n setLockFieldIds(resolved.lockFieldIds);\n setSort(resolved.sort);\n setDensity(resolved.density);\n setDetailOpenMode(resolved.detailOpenMode);\n setPageSize(resolved.pageSize);\n setSearchKeyWord(nextSearchKeyWord);\n setFilterGroup(nextFilterGroup);\n await loadData({\n current: 1,\n pageSize: resolved.pageSize,\n searchKeyWord: nextSearchKeyWord,\n filterGroup: nextFilterGroup,\n sort: resolved.sort,\n });\n } catch (error) {\n console.error('[DataManagementList] load schema failed:', error);\n message.error('加载表单配置失败');\n } finally {\n if (mounted) setSchemaLoading(false);\n }\n };\n loadSchemaAndConfig();\n return () => {\n mounted = false;\n };\n }, [appType, configScope, formUuid, loadData, menuFormUuid, request]);\n\n const persistConfig = useCallback(\n async (patch: DataManagementConfig) => {\n const nextConfig = { ...config, ...patch };\n setConfig(nextConfig);\n await saveDataManagementConfig(request, {\n appType,\n formUuid,\n menuFormUuid,\n scope: configScope,\n config: nextConfig,\n }).catch((error) => {\n console.error('[DataManagementList] save config failed:', error);\n message.warning('配置保存失败,本次仅在当前页面生效');\n });\n },\n [appType, config, configScope, formUuid, menuFormUuid, request],\n );\n\n const handleColumnCommit = async () => {\n setColumnOpen(false);\n await persistConfig({\n showFields,\n lockFieldIds,\n widths,\n density,\n detailOpenMode,\n pageSize,\n });\n };\n\n const handleDetail = useCallback(\n (record: any) => {\n const formInstanceId = getRecordId(record);\n if (detailOpenMode === 'newPage' && typeof window !== 'undefined') {\n window.open(`/${appType}/forms/${formUuid}/detail/${formInstanceId}`, '_blank');\n return;\n }\n setActiveRecord(record);\n setDetailOpen(true);\n },\n [appType, detailOpenMode, formUuid],\n );\n\n const handleDelete = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n await deleteDataManagementRows(request, { appType, formUuid, formInstanceIds: ids });\n setSelectedRowKeys([]);\n await loadData({ current, pageSize });\n },\n [appType, current, formUuid, loadData, pageSize, request],\n );\n\n const getSelectedRecordIds = useCallback(\n () =>\n selectedRowKeys.map((key) => {\n const record = dataSource.find((item) => String(getRecordId(item)) === String(key));\n return String(getSelectedRecordId(record, key));\n }),\n [dataSource, selectedRowKeys],\n );\n\n const handleBatchApprove = () => {\n if (selectedRowKeys.length === 0) return;\n setBatchApprovalOpen(true);\n };\n\n const handleBatchApprovalConfirm = async () => {\n const ids = getSelectedRecordIds();\n if (ids.length === 0) return;\n setBatchApproving(true);\n try {\n await batchApproveDataManagementRows(request, {\n appType,\n formUuid,\n formInstanceIds: ids,\n action: batchApprovalAction,\n comments: batchApprovalComments || undefined,\n });\n message.success(`批量${batchApprovalAction === 'approved' ? '通过' : '拒绝'}已提交`);\n setSelectedRowKeys([]);\n setBatchApprovalOpen(false);\n setBatchApprovalAction('approved');\n setBatchApprovalComments('');\n await loadData({ current, pageSize });\n } catch (error) {\n console.error('[DataManagementList] batch approval failed:', error);\n message.error('批量审批失败');\n } finally {\n setBatchApproving(false);\n }\n };\n\n const handleExport = async (scope: 'selected' | 'all') => {\n const selectedIds = scope === 'selected' ? getSelectedRecordIds() : [];\n if (scope === 'selected' && selectedIds.length === 0) {\n message.warning('请先选择要导出的记录');\n return;\n }\n\n const selectedFilters = selectedIds.map((id) => ({\n key: 'form_instance_id',\n operator: 'EQ',\n value: id,\n }));\n\n setExporting(true);\n try {\n await exportDataManagementRows(request, {\n appType,\n formUuid,\n currentPage: scope === 'selected' ? 1 : current,\n pageSize: scope === 'selected' ? selectedIds.length : pageSize,\n searchKeyWord: scope === 'selected' ? undefined : searchKeyWord,\n filters: scope === 'selected' ? undefined : filterGroup,\n rawFilters: scope === 'selected' ? JSON.stringify(selectedFilters) : undefined,\n conditionType: scope === 'selected' ? 'OR' : undefined,\n order: sort,\n exportAll: scope === 'all' ? 'y' : 'n',\n exportFields,\n });\n message.success('导出任务已创建,可在导入导出记录中查看');\n setExportOpen(false);\n } catch (error) {\n console.error('[DataManagementList] export failed:', error);\n message.error('导出失败');\n } finally {\n setExporting(false);\n }\n };\n\n const loadTransferRecords = async (type: 'import' | 'export') => {\n setRecordTab(type);\n setRecordsOpen(true);\n const result = await getDataManagementTransferRecords(request, {\n appType,\n formUuid,\n type,\n currentPage: 1,\n pageSize: 10,\n });\n setTransferRecords(result.records);\n };\n\n const handleImportPreview = async (file: File) => {\n const base64 = await fileToBase64(file);\n setImportBase64(base64);\n const result = await importPreviewDataManagementRows(request, {\n appType,\n formUuid,\n fileBase64: base64,\n });\n const records = result?.data || result?.records || result?.list || result || [];\n setImportPreview(Array.isArray(records) ? records : []);\n return false;\n };\n\n const handleImportConfirm = async () => {\n if (!importBase64) return;\n await importDataManagementRows(request, { appType, formUuid, fileBase64: importBase64 });\n message.success('导入任务已创建');\n setImportOpen(false);\n setImportPreview([]);\n setImportBase64('');\n await loadData({ current: 1, pageSize });\n };\n\n const columns = useMemo<TableProps<any>['columns']>(() => {\n const baseColumns =\n visibleFields.map((field) => ({\n title: field.label,\n dataIndex: field.fieldId,\n key: field.fieldId,\n width: widths[field.fieldId] || field.width || 160,\n fixed: lockFieldIds.includes(field.fieldId) ? ('left' as const) : undefined,\n ellipsis: true,\n sorter: true,\n render: (value: any) => renderCellValue(value, field),\n })) || [];\n return [\n ...baseColumns,\n {\n title: '操作',\n key: '__actions',\n width: 148,\n fixed: 'right' as const,\n render: (_: any, record: any) => (\n <Space size={4}>\n <Button type=\"link\" size=\"small\" onClick={() => handleDetail(record)}>\n 详情\n </Button>\n <Dropdown\n trigger={['click']}\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n ...rowActions.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.danger,\n onClick: () => action.onClick(record),\n })),\n {\n key: 'workflow',\n label: '流程日志',\n icon: <HistoryOutlined />,\n onClick: () => message.info('请通过 detailRenderer 接入流程日志或流程图入口'),\n },\n ...(!readonly\n ? [\n {\n key: 'delete',\n label: '删除',\n danger: true,\n icon: <DeleteOutlined />,\n onClick: () =>\n confirmDanger('确认删除', '删除后不可恢复,确认继续吗?', () =>\n handleDelete([String(getRecordId(record))]),\n ),\n },\n ]\n : []),\n ],\n }}\n >\n <Button type=\"text\" size=\"small\" icon={<MoreOutlined />} />\n </Dropdown>\n </Space>\n ),\n },\n ];\n }, [\n confirmDanger,\n getPopupContainer,\n handleDelete,\n handleDetail,\n lockFieldIds,\n readonly,\n rowActions,\n visibleFields,\n widths,\n ]);\n\n const tableSize = density === 'compact' ? 'small' : density === 'loose' ? 'large' : 'middle';\n\n const importPreviewColumns = useMemo<TableProps<any>['columns']>(() => {\n const keys = Array.from(\n new Set(importPreview.flatMap((record) => Object.keys(record || {}))),\n ).slice(0, 16);\n return keys.map((key) => {\n const field = fields.find((item) => item.fieldId === key || item.id === key);\n return {\n title: field?.label || key,\n dataIndex: key,\n key,\n width: 150,\n ellipsis: true,\n render: (value: any) => (field ? renderCellValue(value, field) : formatPrimitive(value)),\n };\n });\n }, [fields, importPreview]);\n\n return (\n <ConfigProvider getPopupContainer={getPopupContainer}>\n <div ref={rootRef} className={`${fullHeight ? 'h-full min-h-full' : ''} bg-ant-bg-layout`}>\n <div className=\"mx-auto flex h-full max-w-[1440px] flex-col px-4 py-4 md:px-6\">\n <div className=\"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold text-ant-color-text\">{title || '数据管理'}</h1>\n <p className=\"mt-1 text-sm text-ant-color-text-secondary\">\n 共 {total} 条数据,已选择 {selectedRowKeys.length} 条\n </p>\n </div>\n <Space wrap>\n {!readonly && submitRenderer && (\n <Button icon={<PlusOutlined />} type=\"primary\" onClick={() => setSubmitOpen(true)}>\n 新增\n </Button>\n )}\n <Input.Search\n allowClear\n className=\"w-[260px]\"\n placeholder=\"搜索关键字\"\n value={searchKeyWord}\n onChange={(event) => setSearchKeyWord(event.target.value)}\n onSearch={(value) => {\n const nextSearchKeyWord = String(value || '');\n setSearchKeyWord(nextSearchKeyWord);\n persistConfig({\n filter: { searchKeyWord: nextSearchKeyWord, group: filterGroup },\n });\n loadData({\n current: 1,\n pageSize,\n searchKeyWord: nextSearchKeyWord,\n filterGroup,\n });\n }}\n />\n <Button icon={<FilterOutlined />} onClick={() => setFilterOpen(true)}>\n 筛选\n </Button>\n <Button icon={<SettingOutlined />} onClick={() => setColumnOpen(true)}>\n 列设置\n </Button>\n <Dropdown\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n {\n key: 'selected',\n label: '导出选中',\n disabled: selectedRowKeys.length === 0,\n onClick: () => {\n setExportScope('selected');\n setExportFields(showFields);\n setExportOpen(true);\n },\n },\n {\n key: 'all',\n label: '导出全部',\n onClick: () => {\n setExportScope('all');\n setExportFields(showFields);\n setExportOpen(true);\n },\n },\n {\n key: 'records',\n label: '导出记录',\n onClick: () => loadTransferRecords('export'),\n },\n ],\n }}\n >\n <Button icon={<DownloadOutlined />}>导出</Button>\n </Dropdown>\n {!readonly && (\n <Dropdown\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n { key: 'import', label: '导入数据', onClick: () => setImportOpen(true) },\n {\n key: 'records',\n label: '导入记录',\n onClick: () => loadTransferRecords('import'),\n },\n ],\n }}\n >\n <Button icon={<ImportOutlined />}>导入</Button>\n </Dropdown>\n )}\n <Button icon={<ReloadOutlined />} onClick={() => loadData({ current, pageSize })} />\n </Space>\n </div>\n\n {selectedRowKeys.length > 0 && (\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-3 rounded-lg border border-ant-border-secondary bg-ant-bg-container px-4 py-3 shadow-sm\">\n <span className=\"text-sm text-ant-color-text-secondary\">\n 已选 {selectedRowKeys.length} 条\n </span>\n <Space wrap>\n {!readonly && (\n <Button icon={<SwapOutlined />} onClick={handleBatchApprove}>\n 批量审批\n </Button>\n )}\n {!readonly && (\n <Button\n danger\n icon={<DeleteOutlined />}\n onClick={() =>\n confirmDanger(\n '确认批量删除',\n `将删除 ${selectedRowKeys.length} 条数据,确认继续吗?`,\n () => handleDelete(selectedRowKeys.map(String)),\n )\n }\n >\n 批量删除\n </Button>\n )}\n <Button type=\"link\" onClick={() => setSelectedRowKeys([])}>\n 取消选择\n </Button>\n </Space>\n </div>\n )}\n\n <div className=\"relative flex-1 overflow-hidden rounded-lg border border-ant-border-secondary bg-ant-bg-container\">\n <Table\n rowKey={(record) => String(getRecordId(record))}\n loading={loading || schemaLoading}\n columns={columns}\n dataSource={dataSource}\n size={tableSize as TableProps<any>['size']}\n scroll={{\n x: Math.max(900, visibleFields.length * 160),\n y: fullHeight\n ? selectedRowKeys.length > 0\n ? 'calc(100vh - 320px)'\n : 'calc(100vh - 260px)'\n : undefined,\n }}\n rowSelection={{\n selectedRowKeys,\n onChange: setSelectedRowKeys,\n }}\n pagination={{\n current,\n pageSize,\n total,\n showSizeChanger: true,\n showTotal: (count) => `共 ${count} 条`,\n }}\n onChange={(pagination, _filters, sorter) => {\n const sorters = Array.isArray(sorter) ? sorter : [sorter];\n const nextSort: DataManagementSort[] = sorters\n .filter((item: any) => item?.field && item?.order)\n .map((item: any) => ({\n id: String(item.field),\n isAsc: item.order === 'ascend' ? ('y' as const) : ('n' as const),\n }));\n setSort(nextSort);\n persistConfig({ sort: nextSort });\n loadData({\n current: pagination.current || 1,\n pageSize: pagination.pageSize || pageSize,\n sort: nextSort,\n });\n }}\n />\n </div>\n </div>\n\n <Modal\n getContainer={false}\n title=\"高级筛选\"\n open={filterOpen}\n width={760}\n onCancel={() => setFilterOpen(false)}\n onOk={() => {\n setFilterOpen(false);\n persistConfig({ filter: { searchKeyWord, group: filterGroup } });\n loadData({ current: 1, pageSize, searchKeyWord, filterGroup });\n }}\n okText=\"应用筛选\"\n >\n <FilterGroupEditor group={filterGroup} fields={fields} onChange={setFilterGroup} />\n </Modal>\n\n <Modal\n getContainer={false}\n title=\"列设置\"\n open={columnOpen}\n width={720}\n onCancel={() => setColumnOpen(false)}\n onOk={handleColumnCommit}\n >\n <div className=\"space-y-5\">\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">显示列</div>\n <Checkbox.Group\n className=\"grid grid-cols-2 gap-2 md:grid-cols-3\"\n value={showFields}\n options={fields.map((field) => ({ label: field.label, value: field.fieldId }))}\n onChange={(values) => setShowFields(values.map(String))}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">冻结列</div>\n <Select\n mode=\"multiple\"\n className=\"w-full\"\n value={lockFieldIds}\n options={showFields.map((fieldId) => {\n const field = fields.find((item) => item.fieldId === fieldId);\n return { label: field?.label || fieldId, value: fieldId };\n })}\n onChange={setLockFieldIds}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">表格密度</div>\n <Segmented\n block\n value={density}\n options={[\n { label: '紧凑', value: 'compact' },\n { label: '标准', value: 'middle' },\n { label: '宽松', value: 'loose' },\n ]}\n onChange={(value) => setDensity(value as DataManagementDensity)}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">详情打开方式</div>\n <Segmented\n block\n value={detailOpenMode}\n options={[\n { label: '抽屉', value: 'drawer' },\n { label: '新页', value: 'newPage' },\n ]}\n onChange={(value) => setDetailOpenMode(value as 'drawer' | 'newPage')}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">页大小</div>\n <Select\n className=\"w-full\"\n value={pageSize}\n options={[10, 20, 50, 100].map((value) => ({ label: `${value} 条`, value }))}\n onChange={setPageSize}\n />\n </div>\n </div>\n </div>\n </Modal>\n\n <Modal\n getContainer={false}\n title={exportScope === 'selected' ? '导出选中数据' : '导出全部数据'}\n open={exportOpen}\n onCancel={() => setExportOpen(false)}\n footer={\n <Space>\n <Button onClick={() => setExportOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n loading={exporting}\n disabled={exportScope === 'selected' && selectedRowKeys.length === 0}\n onClick={() => handleExport(exportScope)}\n >\n {exportScope === 'selected' ? `导出选中 (${selectedRowKeys.length})` : '导出全部'}\n </Button>\n </Space>\n }\n >\n <Checkbox.Group\n className=\"grid grid-cols-2 gap-2\"\n value={exportFields}\n options={fields.map((field) => ({ label: field.label, value: field.fieldId }))}\n onChange={(values) => setExportFields(values.map(String))}\n />\n </Modal>\n\n <Modal\n getContainer={false}\n title=\"批量审批\"\n open={batchApprovalOpen}\n onCancel={() => setBatchApprovalOpen(false)}\n onOk={handleBatchApprovalConfirm}\n okText={batchApprovalAction === 'approved' ? '确认通过' : '确认拒绝'}\n confirmLoading={batchApproving}\n >\n <div className=\"space-y-4\">\n <div className=\"text-sm text-ant-color-text-secondary\">\n 已选择 {selectedRowKeys.length} 条记录\n </div>\n <Segmented\n block\n value={batchApprovalAction}\n options={[\n { label: '同意', value: 'approved' },\n { label: '拒绝', value: 'rejected' },\n ]}\n onChange={(value) => setBatchApprovalAction(value as 'approved' | 'rejected')}\n />\n <Input.TextArea\n value={batchApprovalComments}\n rows={4}\n maxLength={500}\n showCount\n placeholder=\"填写审批意见\"\n onChange={(event) => setBatchApprovalComments(event.target.value)}\n />\n </div>\n </Modal>\n\n <Modal\n getContainer={false}\n title=\"导入数据\"\n open={importOpen}\n width={720}\n onCancel={() => setImportOpen(false)}\n onOk={handleImportConfirm}\n okButtonProps={{ disabled: !importBase64 }}\n okText=\"确认导入\"\n >\n <Upload.Dragger\n accept=\".xlsx,.xls\"\n maxCount={1}\n beforeUpload={handleImportPreview}\n onRemove={() => {\n setImportBase64('');\n setImportPreview([]);\n }}\n >\n <p className=\"text-ant-color-text-secondary\">拖拽 Excel 文件到此处,或点击选择文件</p>\n </Upload.Dragger>\n {importPreview.length > 0 && (\n <div className=\"mt-4\">\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">导入预览</div>\n <Table\n size=\"small\"\n dataSource={importPreview}\n columns={importPreviewColumns}\n scroll={{ x: Math.max(600, (importPreviewColumns?.length || 0) * 150) }}\n pagination={false}\n rowKey={(_, index) => String(index)}\n />\n </div>\n )}\n </Modal>\n\n <Drawer\n getContainer={false}\n title={recordTab === 'import' ? '导入记录' : '导出记录'}\n open={recordsOpen}\n width={720}\n onClose={() => setRecordsOpen(false)}\n >\n <Segmented\n value={recordTab}\n options={[\n { label: '导入记录', value: 'import' },\n { label: '导出记录', value: 'export' },\n ]}\n onChange={(value) => loadTransferRecords(value as 'import' | 'export')}\n />\n <Table\n className=\"mt-4\"\n size=\"small\"\n dataSource={transferRecords}\n rowKey={(record) => record.id || record.recordId}\n />\n </Drawer>\n\n <Drawer\n getContainer={false}\n title=\"详情\"\n open={detailOpen}\n width={720}\n onClose={() => setDetailOpen(false)}\n destroyOnClose\n >\n {activeRecord && detailRenderer ? (\n detailRenderer({\n record: activeRecord,\n formInstanceId: String(getRecordId(activeRecord)),\n onClose: () => setDetailOpen(false),\n })\n ) : (\n <Empty description=\"请通过 detailRenderer 接入详情模板\" />\n )}\n </Drawer>\n\n <Drawer\n getContainer={false}\n title=\"新增数据\"\n open={submitOpen}\n width={720}\n onClose={() => setSubmitOpen(false)}\n destroyOnClose\n >\n {submitRenderer ? (\n submitRenderer({\n onClose: () => setSubmitOpen(false),\n onSubmitted: () => {\n setSubmitOpen(false);\n loadData({ current: 1, pageSize });\n },\n })\n ) : (\n <Empty description=\"请通过 submitRenderer 接入提交模板\" />\n )}\n </Drawer>\n </div>\n </ConfigProvider>\n );\n};\n","import React, { useState, useCallback } from 'react';\nimport { Button, Select } from 'antd';\nimport { CheckCircleFilled } from '@ant-design/icons';\nimport type { FormSchema, FormEngineConfig, OptionItem, ProcessRoute } from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { useFormContext } from '../core/FormContext';\nimport { previewProcess } from '../core/processApi';\nimport { useDraftStorage } from '../hooks/useDraftStorage';\nimport { useFormNavigation } from '../hooks/useFormNavigation';\nimport { DraftManager } from '../modules/DraftManager';\nimport { ProcessPreview } from '../modules/ProcessPreview';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport type { ActionConfig } from '../modules/FormActionBar';\n\nexport interface SubmitSuccessInfo {\n formInstanceId: string;\n message?: string;\n}\n\nconst pickFormInstanceId = (value: any): string | undefined => {\n if (!value) return undefined;\n if (typeof value === 'string') return value;\n if (typeof value !== 'object') return undefined;\n\n return (\n value.formInstanceId ||\n value.formInstId ||\n value.instanceId ||\n value.id ||\n pickFormInstanceId(value.result) ||\n pickFormInstanceId(value.data)\n );\n};\n\nexport interface FormSubmitTemplateProps {\n schema: FormSchema;\n config: FormEngineConfig;\n formType?: 'form' | 'process';\n submitSuccessMode?: 'redirect' | 'stay' | 'continue';\n enableDraft?: boolean;\n enableProcessPreview?: boolean;\n enableSubmissionDepartmentSelect?: boolean;\n departmentOptions?: OptionItem[];\n header?: React.ReactNode;\n footer?: React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n renderDepartmentSelector?: (props: {\n value?: string;\n onChange: (value?: string) => void;\n options: OptionItem[];\n }) => React.ReactNode;\n renderForm?: (props: { schema: FormSchema; config: FormEngineConfig }) => React.ReactNode;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n onSubmitSuccess?: (formInstId: string) => void;\n inDrawer?: boolean;\n}\n\ninterface SubmitSuccessCardProps {\n info: SubmitSuccessInfo;\n mode: 'redirect' | 'stay' | 'continue';\n isRedirecting: boolean;\n countdown: number;\n onContinue: () => void;\n onViewDetail: () => void;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n}\n\nconst SubmitSuccessCard: React.FC<SubmitSuccessCardProps> = ({\n info,\n mode,\n isRedirecting,\n countdown,\n onContinue,\n onViewDetail,\n renderSuccess,\n}) => {\n if (renderSuccess) {\n return <>{renderSuccess(info)}</>;\n }\n\n return (\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-100 p-6\">\n <div className=\"flex flex-col items-center py-16 animate-[fadeIn_0.3s_ease-out,scaleIn_0.3s_ease-out]\">\n <div className=\"w-12 h-12 rounded-full bg-green-100 flex items-center justify-center mb-4\">\n <CheckCircleFilled className=\"text-2xl text-green-500\" />\n </div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">提交成功</h2>\n <p className=\"text-sm text-gray-500 mb-6\">{info.message || '已成功创建一条新记录'}</p>\n <div className=\"flex gap-3\">\n {(mode === 'stay' || mode === 'redirect') && (\n <Button onClick={onContinue}>继续提交</Button>\n )}\n <Button type=\"primary\" onClick={onViewDetail}>\n 查看详情\n </Button>\n </div>\n {isRedirecting && (\n <div className=\"mt-6 w-48\">\n <div className=\"text-xs text-gray-400 text-center mb-1\">{countdown}秒后自动跳转</div>\n <div className=\"h-1 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-1000\"\n style={{ width: `${(countdown / 3) * 100}%` }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\ninterface InnerFormContentProps {\n schema: FormSchema;\n config: FormEngineConfig;\n formType: 'form' | 'process';\n submitSuccessMode: 'redirect' | 'stay' | 'continue';\n enableDraft: boolean;\n enableProcessPreview: boolean;\n enableSubmissionDepartmentSelect: boolean;\n departmentOptions: OptionItem[];\n header?: React.ReactNode;\n footer?: React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n renderDepartmentSelector?: (props: {\n value?: string;\n onChange: (value?: string) => void;\n options: OptionItem[];\n }) => React.ReactNode;\n renderForm?: (props: { schema: FormSchema; config: FormEngineConfig }) => React.ReactNode;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n onSubmitSuccess?: (formInstId: string) => void;\n inDrawer?: boolean;\n}\n\nconst InnerFormContent: React.FC<InnerFormContentProps> = ({\n schema,\n config,\n formType,\n submitSuccessMode,\n enableDraft,\n enableProcessPreview,\n enableSubmissionDepartmentSelect,\n departmentOptions,\n header,\n footer,\n beforeForm,\n afterForm,\n renderDepartmentSelector,\n renderForm,\n renderSuccess,\n onSubmitSuccess,\n inDrawer = false,\n}) => {\n const { validateAll, getFormData, setFieldValue, resetForm, api } = useFormContext();\n const [submitted, setSubmitted] = useState(false);\n const [successInfo, setSuccessInfo] = useState<SubmitSuccessInfo | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [departmentId, setDepartmentId] = useState<string | undefined>();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewRoutes, setPreviewRoutes] = useState<ProcessRoute[]>([]);\n const [pendingFormData, setPendingFormData] = useState<Record<string, any> | null>(null);\n\n const { hasDraft, draftTimestamp, saveDraft, restoreDraft, clearDraft } = useDraftStorage({\n appType: config.appType,\n formUuid: config.formUuid,\n });\n\n const { navigateToDetail, navigateToProcessDetail, isRedirecting, countdown, handlePostSubmit } =\n useFormNavigation({\n appType: config.appType,\n formUuid: config.formUuid,\n formType,\n mode: submitSuccessMode === 'continue' ? 'stay' : submitSuccessMode,\n basePath: config.navigation?.basePath,\n });\n\n const performSubmit = useCallback(\n async (formData: Record<string, any>) => {\n setSubmitting(true);\n try {\n const submitResponse =\n config.mode === 'edit' && config.formInstanceId\n ? await api.updateFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n formInstId: config.formInstanceId,\n formInstanceId: config.formInstanceId,\n updateFormDataJson: JSON.stringify(formData),\n })\n : await api.submitFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n data: formData,\n submissionDepartmentId: departmentId,\n });\n\n const formInstId =\n pickFormInstanceId(submitResponse) || config.formInstanceId || `inst_${Date.now()}`;\n\n if (config.submit?.afterSubmit) {\n await config.submit.afterSubmit({\n formInstanceId: formInstId,\n data: formData,\n response: submitResponse,\n });\n }\n\n if (enableDraft) {\n clearDraft();\n }\n\n onSubmitSuccess?.(formInstId);\n\n if (submitSuccessMode === 'continue') {\n resetForm();\n } else {\n setSuccessInfo({ formInstanceId: formInstId });\n setSubmitted(true);\n handlePostSubmit(formInstId);\n }\n } catch (error) {\n console.error('[FormSubmitTemplate] Submit failed:', error);\n } finally {\n setSubmitting(false);\n }\n },\n [\n api,\n clearDraft,\n config,\n departmentId,\n enableDraft,\n handlePostSubmit,\n onSubmitSuccess,\n resetForm,\n submitSuccessMode,\n ],\n );\n\n const prepareSubmit = useCallback(async () => {\n const valid = await validateAll();\n if (!valid) return;\n\n const formData = getFormData();\n\n if (config.submit?.beforeSubmit) {\n const shouldContinue = await config.submit.beforeSubmit(formData);\n if (shouldContinue === false) {\n return;\n }\n }\n\n if (formType === 'process' && enableProcessPreview) {\n setPendingFormData(formData);\n setPreviewOpen(true);\n setPreviewLoading(true);\n try {\n const routes = await previewProcess(api.request, {\n appType: config.appType,\n formUuid: config.formUuid,\n data: formData,\n submissionDepartmentId: departmentId,\n });\n setPreviewRoutes(Array.isArray(routes) ? routes : []);\n } catch (error) {\n console.error('[FormSubmitTemplate] Preview failed:', error);\n setPreviewRoutes([]);\n } finally {\n setPreviewLoading(false);\n }\n return;\n }\n\n await performSubmit(formData);\n }, [\n validateAll,\n getFormData,\n config,\n api,\n formType,\n enableProcessPreview,\n departmentId,\n performSubmit,\n ]);\n\n const handlePreviewConfirm = useCallback(async () => {\n const data = pendingFormData ?? getFormData();\n setPreviewOpen(false);\n setPendingFormData(null);\n await performSubmit(data);\n }, [getFormData, pendingFormData, performSubmit]);\n\n const handleSaveDraft = useCallback(() => {\n const data = getFormData();\n saveDraft(data);\n }, [getFormData, saveDraft]);\n\n const handleRestoreDraft = useCallback(() => {\n const data = restoreDraft();\n if (!data) return;\n Object.entries(data).forEach(([fieldId, value]) => {\n setFieldValue(fieldId, value);\n });\n }, [restoreDraft, setFieldValue]);\n\n const handleContinue = useCallback(() => {\n setSubmitted(false);\n setSuccessInfo(null);\n resetForm();\n }, [resetForm]);\n\n const handleViewDetail = useCallback(() => {\n if (!successInfo) return;\n if (formType === 'process') {\n navigateToProcessDetail(successInfo.formInstanceId);\n } else {\n navigateToDetail(successInfo.formInstanceId);\n }\n }, [successInfo, formType, navigateToDetail, navigateToProcessDetail]);\n\n const actions: ActionConfig[] = [];\n if (enableDraft) {\n actions.push({\n key: 'draft',\n label: '暂存',\n type: 'default',\n onClick: handleSaveDraft,\n });\n }\n actions.push({\n key: 'reset',\n label: '重置',\n type: 'default',\n onClick: () => resetForm(),\n });\n actions.push({\n key: 'submit',\n label: '提交',\n type: 'primary',\n loading: submitting,\n onClick: prepareSubmit,\n });\n\n const departmentSelector =\n formType === 'process' && enableSubmissionDepartmentSelect ? (\n <div className=\"mb-5 rounded-lg border border-ant-border-secondary bg-ant-bg-elevated px-4 py-3\">\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">提交部门</div>\n {renderDepartmentSelector ? (\n renderDepartmentSelector({\n value: departmentId,\n onChange: setDepartmentId,\n options: departmentOptions,\n })\n ) : (\n <Select\n allowClear\n className=\"w-full\"\n placeholder=\"请选择本次提交流程所属部门\"\n value={departmentId}\n options={departmentOptions}\n onChange={setDepartmentId}\n />\n )}\n </div>\n ) : null;\n\n const actionsNode = !submitted ? (\n <StickyActionBar\n actions={actions}\n inDrawer={inDrawer}\n position=\"inline\"\n className=\"mt-6 -mx-5 -mb-5 rounded-b-lg md:-mx-6 md:-mb-6\"\n />\n ) : null;\n\n return (\n <RuntimePageShell inDrawer={inDrawer}>\n <div className=\"space-y-6\">\n {header}\n\n {enableDraft && hasDraft && !submitted && (\n <div>\n <DraftManager\n hasDraft={hasDraft}\n draftTimestamp={draftTimestamp}\n onRestore={handleRestoreDraft}\n onDiscard={clearDraft}\n />\n </div>\n )}\n\n {!submitted ? (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n {departmentSelector}\n {beforeForm}\n {renderForm ? renderForm({ schema, config }) : <FormRenderer columns={2} />}\n {afterForm}\n {actionsNode}\n </div>\n ) : (\n successInfo && (\n <SubmitSuccessCard\n info={successInfo}\n mode={submitSuccessMode}\n isRedirecting={isRedirecting}\n countdown={countdown}\n onContinue={handleContinue}\n onViewDetail={handleViewDetail}\n renderSuccess={renderSuccess}\n />\n )\n )}\n\n {footer}\n </div>\n <ProcessPreview\n open={previewOpen}\n routes={previewRoutes}\n loading={previewLoading}\n onClose={() => setPreviewOpen(false)}\n onConfirm={handlePreviewConfirm}\n />\n </RuntimePageShell>\n );\n};\n\nexport const FormSubmitTemplate: React.FC<FormSubmitTemplateProps> = ({\n schema,\n config,\n formType = 'form',\n submitSuccessMode = 'redirect',\n enableDraft = false,\n enableProcessPreview = false,\n enableSubmissionDepartmentSelect = false,\n departmentOptions = [],\n header,\n footer,\n beforeForm,\n afterForm,\n renderDepartmentSelector,\n renderForm,\n renderSuccess,\n onSubmitSuccess,\n inDrawer = false,\n}) => {\n return (\n <FormProvider schema={schema} config={config}>\n <InnerFormContent\n schema={schema}\n config={config}\n formType={formType}\n submitSuccessMode={submitSuccessMode}\n enableDraft={enableDraft}\n enableProcessPreview={enableProcessPreview}\n enableSubmissionDepartmentSelect={enableSubmissionDepartmentSelect}\n departmentOptions={departmentOptions}\n header={header}\n footer={footer}\n beforeForm={beforeForm}\n afterForm={afterForm}\n renderDepartmentSelector={renderDepartmentSelector}\n renderForm={renderForm}\n renderSuccess={renderSuccess}\n onSubmitSuccess={onSubmitSuccess}\n inDrawer={inDrawer}\n />\n </FormProvider>\n );\n};\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport type { FormSchema, FormInstanceData, FieldBehavior } from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { useFormContext } from '../core/FormContext';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { useFormDetail } from '../hooks/useFormDetail';\nimport { useChangeRecords } from '../hooks/useChangeRecords';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { SummaryPanel } from '../modules/SummaryPanel';\nimport { RecordChangePanel } from '../modules/RecordChangePanel';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { PageSkeleton } from './PageSkeleton';\n\nexport interface FormDetailTemplateProps {\n schema: FormSchema;\n formUuid: string;\n appType: string;\n formInstanceId: string;\n enableEdit?: boolean;\n enableDelete?: boolean;\n enableChangeRecords?: boolean;\n header?: React.ReactNode;\n footer?: React.ReactNode;\n renderSummary?: (data: FormInstanceData) => React.ReactNode;\n renderActions?: (actions: ActionConfig[]) => React.ReactNode;\n onDelete?: () => void;\n onSave?: (values: Record<string, any>) => void;\n inDrawer?: boolean;\n}\n\nfunction FormDataBridge({\n formDataRef,\n}: {\n formDataRef: React.MutableRefObject<(() => Record<string, any>) | undefined>;\n}) {\n const { getFormData } = useFormContext();\n formDataRef.current = getFormData;\n return null;\n}\n\nconst InnerDetailContent: React.FC<FormDetailTemplateProps> = ({\n schema,\n formUuid,\n appType,\n formInstanceId,\n enableEdit = true,\n enableDelete = false,\n enableChangeRecords = false,\n header,\n footer,\n renderSummary,\n renderActions,\n onDelete,\n onSave,\n inDrawer = false,\n}) => {\n const formDataRef = useRef<(() => Record<string, any>) | undefined>(undefined);\n const [accessDenied, setAccessDenied] = useState(false);\n const fieldIds = useMemo(() => schema.fields.map((field) => field.fieldId), [schema.fields]);\n const {\n loading,\n mode,\n formData,\n instanceInfo,\n fieldBehaviors,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n canEdit,\n canDelete,\n canViewChangeRecords,\n } = useFormDetail({\n formUuid,\n appType,\n formInstanceId,\n fieldIds,\n onPermissionDenied: () => setAccessDenied(true),\n });\n\n const {\n records,\n loading: recordsLoading,\n hasMore,\n loadMore,\n refresh: refreshRecords,\n } = useChangeRecords({\n formUuid,\n appType,\n formInstanceId,\n autoLoad: enableChangeRecords && canViewChangeRecords,\n });\n\n const handleSave = useCallback(async () => {\n const values = formDataRef.current?.() ?? formData;\n if (!values) return;\n const success = await saveChanges(values);\n if (success) {\n onSave?.(values);\n }\n }, [formData, saveChanges, onSave]);\n\n const handleDelete = useCallback(async () => {\n const success = await deleteInstance();\n if (success) {\n onDelete?.();\n }\n }, [deleteInstance, onDelete]);\n\n const handleCancel = useCallback(() => {\n switchToReadonly();\n }, [switchToReadonly]);\n\n const readonlyActions: ActionConfig[] = [];\n if (enableEdit && canEdit) {\n readonlyActions.push({\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n });\n }\n if (enableDelete && canDelete) {\n readonlyActions.push({\n key: 'delete',\n label: '删除',\n type: 'danger',\n onClick: handleDelete,\n confirm: { title: '确认删除', content: '删除后将无法恢复,确认要删除吗?' },\n });\n }\n\n const editActions: ActionConfig[] = [\n { key: 'cancel', label: '取消', type: 'default', onClick: handleCancel },\n { key: 'save', label: '保存', type: 'primary', onClick: handleSave },\n ];\n\n const currentActions = mode === 'readonly' ? readonlyActions : editActions;\n\n const formConfig = {\n mode: mode === 'edit' ? ('edit' as const) : ('readonly' as const),\n formUuid,\n appType,\n formInstanceId,\n permissions: {\n fieldPermissions: fieldBehaviors as Record<string, FieldBehavior>,\n operations: [] as string[],\n },\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-ant-bg-layout\">\n <div className=\"max-w-4xl mx-auto py-8 px-6 pb-24\">\n <PageSkeleton type=\"detail\" />\n </div>\n </div>\n );\n }\n\n const actionsNode =\n currentActions.length > 0 ? (\n renderActions ? (\n renderActions(currentActions)\n ) : (\n <StickyActionBar actions={currentActions} inDrawer={inDrawer} />\n )\n ) : null;\n\n return (\n <RuntimePageShell actions={actionsNode} accessDenied={accessDenied} inDrawer={inDrawer}>\n <div className=\"space-y-6\">\n <div>\n {header}\n\n {renderSummary && instanceInfo ? (\n renderSummary(instanceInfo)\n ) : (\n <SummaryPanel\n title={instanceInfo?.title || formData?.instanceTitle || schema.formMeta.title}\n eyebrow={`数据实例 ${formInstanceId?.slice(0, 8) || '-'}`}\n creator={\n instanceInfo?.creator\n ? {\n name: instanceInfo.creator.name,\n avatar: instanceInfo.creator.avatar,\n department: instanceInfo.creator.department,\n }\n : undefined\n }\n createdAt={instanceInfo?.createdAt}\n status={mode === 'edit' ? { label: '编辑中', tone: 'brand' } : undefined}\n />\n )}\n\n {mode === 'edit' && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg px-4 py-3 text-sm text-blue-700 transition-all duration-150\">\n 正在编辑,修改后请保存\n </div>\n )}\n\n <div className=\"mt-6 rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n <FormProvider schema={schema} config={formConfig} initialValues={formData ?? undefined}>\n <FormDataBridge formDataRef={formDataRef} />\n <FormRenderer columns={2} />\n </FormProvider>\n </div>\n\n {enableChangeRecords && canViewChangeRecords && (\n <div className=\"mt-6\">\n <RecordChangePanel\n records={records}\n loading={recordsLoading}\n total={records.length}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onRefresh={refreshRecords}\n onExpand={refreshRecords}\n />\n </div>\n )}\n\n {footer}\n </div>\n </div>\n </RuntimePageShell>\n );\n};\n\nexport const FormDetailTemplate: React.FC<FormDetailTemplateProps> = (props) => {\n const { schema, formUuid, appType, formInstanceId } = props;\n\n const wrapperConfig = {\n mode: 'readonly' as const,\n formUuid,\n appType,\n formInstanceId,\n };\n\n return (\n <FormProvider schema={schema} config={wrapperConfig}>\n <InnerDetailContent {...props} />\n </FormProvider>\n );\n};\n","import React from 'react';\nimport { Skeleton } from 'antd';\n\nexport interface PageSkeletonProps {\n type: 'submit' | 'detail' | 'process';\n}\n\nconst CardSkeleton: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-100 p-6\">{children}</div>\n);\n\nconst SummaryCardSkeleton: React.FC = () => (\n <CardSkeleton>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <Skeleton.Input active size=\"large\" style={{ width: 200 }} />\n <div className=\"mt-2\">\n <Skeleton.Input active size=\"small\" style={{ width: 80 }} />\n </div>\n </div>\n <Skeleton.Button active size=\"small\" shape=\"round\" style={{ width: 60 }} />\n </div>\n <div className=\"flex items-center gap-3 mt-4\">\n <Skeleton.Avatar active size=\"small\" />\n <Skeleton.Input active size=\"small\" style={{ width: 120 }} />\n </div>\n </CardSkeleton>\n);\n\nconst FormGridSkeleton: React.FC = () => (\n <CardSkeleton>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"space-y-2\">\n <Skeleton.Input active size=\"small\" style={{ width: 80 }} />\n <Skeleton.Input active block style={{ width: '100%' }} />\n </div>\n ))}\n </div>\n </CardSkeleton>\n);\n\nconst ActionBarSkeleton: React.FC = () => (\n <div className=\"fixed bottom-0 left-0 right-0 backdrop-blur-lg bg-white/80 border-t border-gray-200 px-6 py-3\">\n <div className=\"flex items-center justify-end gap-3\">\n <Skeleton.Button active style={{ width: 80 }} />\n <Skeleton.Button active style={{ width: 80 }} />\n </div>\n </div>\n);\n\nconst TimelineSkeleton: React.FC = () => (\n <CardSkeleton>\n <Skeleton.Input active size=\"default\" style={{ width: 100, marginBottom: 16 }} />\n <div className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-3 h-3 rounded-full bg-gray-200 animate-pulse\" />\n {i < 2 && <div className=\"w-0.5 flex-1 bg-gray-200 mt-1\" />}\n </div>\n <div className=\"flex-1 pb-4\">\n <Skeleton active paragraph={{ rows: 1 }} title={{ width: '60%' }} />\n </div>\n </div>\n ))}\n </div>\n </CardSkeleton>\n);\n\nexport const PageSkeleton: React.FC<PageSkeletonProps> = ({ type }) => {\n if (type === 'submit') {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Skeleton.Input active size=\"large\" style={{ width: 200 }} />\n <Skeleton.Input active size=\"small\" style={{ width: 300 }} />\n </div>\n <FormGridSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n }\n\n if (type === 'detail') {\n return (\n <div className=\"space-y-6\">\n <SummaryCardSkeleton />\n <FormGridSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <SummaryCardSkeleton />\n <FormGridSkeleton />\n <TimelineSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n};\n","import React, { useCallback, useMemo, useRef } from 'react';\nimport type {\n FormSchema,\n ProcessTask,\n ProcessAction,\n FieldBehavior,\n ReturnableNode,\n} from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { useFormContext } from '../core/FormContext';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { useProcessDetail } from '../hooks/useProcessDetail';\nimport { useApprovalActions } from '../hooks/useApprovalActions';\nimport { PROCESS_STATUS_META } from '../core/constants';\nimport { ApprovalTimeline } from '../modules/ApprovalTimeline';\nimport { ApprovalActionBar } from '../modules/ApprovalActionBar';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport { SummaryPanel } from '../modules/SummaryPanel';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { PageSkeleton } from './PageSkeleton';\n\nexport interface ProcessDetailTemplateProps {\n schema: FormSchema;\n formUuid: string;\n appType: string;\n formInstanceId: string;\n header?: React.ReactNode;\n renderTimeline?: (tasks: ProcessTask[]) => React.ReactNode;\n renderActions?: (actions: ProcessAction[]) => React.ReactNode;\n renderTransferSelector?: (props: {\n value?: string;\n onChange: (userId: string) => void;\n }) => React.ReactNode;\n renderReturnNodeLabel?: (node: ReturnableNode) => React.ReactNode;\n renderActionModalExtra?: (action: ProcessAction) => React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n onActionComplete?: (action: string) => void;\n inDrawer?: boolean;\n}\n\nfunction FormDataBridge({\n formDataRef,\n}: {\n formDataRef: React.MutableRefObject<(() => Record<string, any>) | undefined>;\n}) {\n const { getFormData } = useFormContext();\n formDataRef.current = getFormData;\n return null;\n}\n\nconst InnerProcessContent: React.FC<ProcessDetailTemplateProps> = ({\n schema,\n formUuid,\n appType,\n formInstanceId,\n header,\n renderTimeline,\n renderActions,\n renderTransferSelector,\n renderReturnNodeLabel,\n renderActionModalExtra,\n beforeForm,\n afterForm,\n onActionComplete,\n inDrawer = false,\n}) => {\n const formDataRef = useRef<(() => Record<string, any>) | undefined>(undefined);\n const fieldIds = useMemo(() => schema.fields.map((field) => field.fieldId), [schema.fields]);\n\n const {\n loading,\n processInfo,\n processStatus,\n currentTask,\n progressList,\n formData,\n instanceInfo,\n isApprover,\n activeActions,\n fieldBehaviors,\n mode,\n isOriginatorReturn,\n canWithdraw,\n switchToEdit,\n switchToReadonly,\n refreshProgress,\n } = useProcessDetail({ formUuid, appType, formInstanceId, fieldIds });\n\n const {\n approve,\n reject,\n transfer,\n returnTo,\n withdraw,\n save,\n resubmit,\n callbackTask,\n returnableNodes,\n loadReturnableNodes,\n } = useApprovalActions({\n formInstanceId,\n formUuid,\n appType,\n currentTaskId: currentTask?.taskId ?? currentTask?.id,\n onActionComplete: async (action: string) => {\n onActionComplete?.(action);\n await refreshProgress();\n },\n getFormValues: () => formDataRef.current?.() ?? formData ?? {},\n });\n\n const handleApprove = useCallback(\n async (comments?: string) => {\n await approve(comments);\n },\n [approve],\n );\n\n const handleReject = useCallback(\n async (comments?: string) => {\n await reject(comments);\n },\n [reject],\n );\n\n const handleTransfer = useCallback(\n async (userId: string, reason?: string) => {\n await transfer(userId, reason);\n },\n [transfer],\n );\n\n const handleReturn = useCallback(\n async (nodeId: string, reason?: string) => {\n await returnTo(nodeId, reason);\n },\n [returnTo],\n );\n\n const handleWithdraw = useCallback(\n async (reason?: string) => {\n await withdraw(reason);\n },\n [withdraw],\n );\n\n const handleSave = useCallback(async () => {\n await save();\n }, [save]);\n\n const handleResubmit = useCallback(\n async (comments?: string) => {\n await resubmit(comments);\n },\n [resubmit],\n );\n\n const handleCallback = useCallback(async () => {\n await callbackTask();\n }, [callbackTask]);\n\n const bottomActions: ActionConfig[] = useMemo(() => {\n if (isApprover && activeActions.length > 0) return [];\n\n if (isOriginatorReturn) {\n if (mode === 'readonly') {\n return [\n {\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n },\n ];\n }\n return [\n {\n key: 'cancel',\n label: '取消',\n type: 'default',\n onClick: switchToReadonly,\n placement: 'left',\n },\n {\n key: 'resubmit',\n label: '重新提交',\n type: 'primary',\n onClick: () => handleResubmit(),\n },\n ];\n }\n\n if (canWithdraw) {\n return [\n {\n key: 'withdraw',\n label: '撤销',\n type: 'danger',\n onClick: () => handleWithdraw(),\n confirm: { title: '确认撤销', content: '撤销后流程将终止,确认继续吗?' },\n },\n ];\n }\n\n return [];\n }, [\n activeActions.length,\n canWithdraw,\n handleResubmit,\n handleWithdraw,\n isApprover,\n isOriginatorReturn,\n mode,\n switchToEdit,\n switchToReadonly,\n ]);\n\n const formConfig = {\n mode: mode === 'edit' ? ('edit' as const) : ('readonly' as const),\n formUuid,\n appType,\n formInstanceId,\n permissions: {\n fieldPermissions: fieldBehaviors as Record<string, FieldBehavior>,\n operations: [] as string[],\n },\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-ant-bg-layout\">\n <div className=\"mx-auto max-w-4xl px-6 py-8 pb-24\">\n <PageSkeleton type=\"process\" />\n </div>\n </div>\n );\n }\n\n const showApprovalActions = isApprover && activeActions.length > 0;\n const actionsNode = showApprovalActions ? (\n renderActions ? (\n renderActions(activeActions)\n ) : (\n <ApprovalActionBar\n actions={activeActions}\n onApprove={handleApprove}\n onReject={handleReject}\n onTransfer={handleTransfer}\n onReturn={handleReturn}\n onWithdraw={handleWithdraw}\n onSave={handleSave}\n onResubmit={handleResubmit}\n onCallback={handleCallback}\n returnableNodes={returnableNodes}\n onLoadReturnableNodes={loadReturnableNodes}\n renderTransferSelector={renderTransferSelector}\n renderReturnNodeLabel={renderReturnNodeLabel}\n renderActionModalExtra={renderActionModalExtra}\n inDrawer={inDrawer}\n />\n )\n ) : bottomActions.length > 0 ? (\n <StickyActionBar actions={bottomActions} inDrawer={inDrawer} />\n ) : null;\n\n const statusMeta = processStatus ? PROCESS_STATUS_META[processStatus] : undefined;\n\n return (\n <RuntimePageShell actions={actionsNode} inDrawer={inDrawer}>\n <div className=\"space-y-6\">\n {header}\n\n <SummaryPanel\n title={processInfo?.title || instanceInfo?.title || schema.formMeta.title}\n eyebrow={`流程实例 ${formInstanceId?.slice(0, 8) || '-'}`}\n creator={\n processInfo?.originatorName\n ? {\n name: processInfo.originatorName,\n department: processInfo.originatorDepartment,\n }\n : undefined\n }\n createdAt={processInfo?.createdAt}\n status={statusMeta}\n metaItems={[\n { key: 'currentTask', label: '当前节点', value: currentTask?.nodeName || '无' },\n {\n key: 'processStatus',\n label: '实例状态',\n value: statusMeta?.label || processStatus || '-',\n },\n ]}\n />\n\n {beforeForm}\n\n {mode === 'edit' && (\n <div className=\"rounded-lg border border-blue-200 bg-blue-50 px-4 py-3 text-sm text-blue-700 transition-all duration-150\">\n 正在编辑表单,修改后请重新提交\n </div>\n )}\n\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n <FormProvider schema={schema} config={formConfig} initialValues={formData ?? undefined}>\n <FormDataBridge formDataRef={formDataRef} />\n <FormRenderer columns={2} />\n </FormProvider>\n </div>\n\n {afterForm}\n\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-base font-semibold text-ant-color-text\">审批进度</h3>\n <p className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 节点、审批人、处理意见和等待状态\n </p>\n </div>\n </div>\n {renderTimeline ? (\n renderTimeline(progressList)\n ) : (\n <ApprovalTimeline tasks={progressList} showRemarks showApproverInfo />\n )}\n </div>\n </div>\n </RuntimePageShell>\n );\n};\n\nexport const ProcessDetailTemplate: React.FC<ProcessDetailTemplateProps> = (props) => {\n const { schema, formUuid, appType, formInstanceId } = props;\n\n const wrapperConfig = {\n mode: 'readonly' as const,\n formUuid,\n appType,\n formInstanceId,\n };\n\n return (\n <FormProvider schema={schema} config={wrapperConfig}>\n <InnerProcessContent {...props} />\n </FormProvider>\n );\n};\n"],"mappings":"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","names":["import_react","import_react","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","dayjs","import_react","import_antd_mobile","import_dayjs","import_jsx_runtime","dayjs","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_dayjs","import_jsx_runtime","dayjs","import_react","import_antd_mobile","import_dayjs","import_jsx_runtime","dayjs","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","fileList","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","createLocalItem","fileList","import_jsx_runtime","ImageUploader","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_react","import_antd","MobileAntd","import_react","import_jsx_runtime","MobileAntd","import_jsx_runtime","import_react","MobileAntd","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_react","import_antd","import_icons","MobileAntd","import_jsx_runtime","getMobileComponent","MobileAntd","import_jsx_runtime","import_react","MobileAntd","import_jsx_runtime","EMPTY_TREE_DATA","getMobilePopup","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","MobileAntd","import_jsx_runtime","getMobileComponent","MobileAntd","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","StarterKit","Underline","Color","Highlight","Link","Placeholder","TextAlign","Image","TableRow","TableHeader","TableCell","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","message","getFormData","React","import_react","import_jsx_runtime","React","import_react","import_antd","import_jsx_runtime","getFormData","import_jsx_runtime","cn","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","columnClasses","formatValue","import_react","getFormData","import_react","getFormData","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","import_jsx_runtime","import_react","import_icons","import_jsx_runtime","toneClasses","import_react","import_antd","import_icons","import_react","import_antd","import_icons","message","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd","import_jsx_runtime","import_antd","import_icons","import_jsx_runtime","toneClasses","import_antd","import_icons","import_jsx_runtime","import_antd","import_icons","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","title","import_react","import_antd","import_icons","import_jsx_runtime","getFormData","import_react","import_antd","import_jsx_runtime","import_jsx_runtime","getFormData","import_react","import_jsx_runtime","FormDataBridge","getFormData"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/FormProvider.tsx","../src/core/FormContext.ts","../src/core/ComponentRegistry.tsx","../src/fields/TextField/index.tsx","../src/core/FieldWrapper.tsx","../src/hooks/useDeviceDetect.ts","../src/fields/TextField/TextFieldPC.tsx","../src/fields/TextField/TextFieldMobile.tsx","../src/fields/TextField/TextFieldReadonly.tsx","../src/fields/NumberField/index.tsx","../src/fields/NumberField/NumberFieldPC.tsx","../src/fields/NumberField/NumberFieldMobile.tsx","../src/fields/NumberField/NumberFieldReadonly.tsx","../src/fields/TextAreaField/index.tsx","../src/fields/TextAreaField/TextAreaFieldPC.tsx","../src/fields/TextAreaField/TextAreaFieldMobile.tsx","../src/fields/TextAreaField/TextAreaFieldReadonly.tsx","../src/fields/SelectField/index.tsx","../src/fields/SelectField/SelectFieldPC.tsx","../src/fields/SelectField/SelectFieldMobile.tsx","../src/fields/SelectField/SelectFieldReadonly.tsx","../src/fields/MultiSelectField/index.tsx","../src/fields/MultiSelectField/MultiSelectFieldPC.tsx","../src/fields/MultiSelectField/MultiSelectFieldMobile.tsx","../src/fields/MultiSelectField/MultiSelectFieldReadonly.tsx","../src/fields/RadioField/index.tsx","../src/fields/RadioField/RadioFieldPC.tsx","../src/fields/RadioField/RadioFieldMobile.tsx","../src/fields/RadioField/RadioFieldReadonly.tsx","../src/fields/CheckboxField/index.tsx","../src/fields/CheckboxField/CheckboxFieldPC.tsx","../src/fields/CheckboxField/CheckboxFieldMobile.tsx","../src/fields/CheckboxField/CheckboxFieldReadonly.tsx","../src/fields/DateField/index.tsx","../src/fields/DateField/DateFieldPC.tsx","../src/fields/DateField/DateFieldMobile.tsx","../src/fields/DateField/DateFieldReadonly.tsx","../src/fields/CascadeDateField/index.tsx","../src/fields/CascadeDateField/CascadeDateFieldPC.tsx","../src/fields/CascadeDateField/CascadeDateFieldMobile.tsx","../src/fields/CascadeDateField/CascadeDateFieldReadonly.tsx","../src/fields/AttachmentField/index.tsx","../src/fields/AttachmentField/AttachmentFieldPC.tsx","../src/fields/shared/fieldFormat.ts","../src/fields/AttachmentField/AttachmentFieldMobile.tsx","../src/fields/AttachmentField/AttachmentFieldReadonly.tsx","../src/fields/ImageField/index.tsx","../src/fields/ImageField/ImageFieldPC.tsx","../src/fields/ImageField/ImageFieldMobile.tsx","../src/fields/ImageField/ImageFieldReadonly.tsx","../src/fields/SubFormField/index.tsx","../src/fields/SubFormField/SubFormCell.tsx","../src/fields/SubFormField/SubFormFieldPC.tsx","../src/fields/SubFormField/SubFormFieldMobile.tsx","../src/fields/SubFormField/SubFormFieldReadonly.tsx","../src/fields/UserSelectField/index.tsx","../src/fields/UserSelectField/UserSelectFieldPC.tsx","../src/fields/shared/UserPicker.tsx","../src/fields/shared/useLazyDepartmentTree.ts","../src/fields/UserSelectField/UserSelectFieldMobile.tsx","../src/fields/UserSelectField/UserSelectFieldReadonly.tsx","../src/fields/DepartmentSelectField/index.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldPC.tsx","../src/fields/shared/DepartmentPicker.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldMobile.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldReadonly.tsx","../src/fields/CascadeSelectField/index.tsx","../src/fields/AddressField/index.tsx","../src/fields/AssociationFormField/index.tsx","../src/fields/EditorField/index.tsx","../src/fields/SerialNumberField/index.tsx","../src/fields/LocationField/index.tsx","../src/fields/DigitalSignatureField/index.tsx","../src/fields/JSONField/index.tsx","../src/core/defaultRegistry.ts","../src/core/effects.ts","../src/core/validation.ts","../src/core/runtimeApi.ts","../src/core/FormRenderer.tsx","../src/core/FormActions.tsx","../src/core/FormContainer.tsx","../src/core/constants.ts","../src/core/processApi.ts","../src/core/dataManagementApi.ts","../src/layout/FormSection/index.tsx","../src/layout/FormGrid/index.tsx","../src/layout/FormTabs/index.tsx","../src/layout/FormSteps/index.tsx","../src/display/FormSummary/index.tsx","../src/hooks/useFormEngine.ts","../src/hooks/useFormData.ts","../src/hooks/useFieldBehavior.ts","../src/hooks/useFormSubmit.ts","../src/hooks/useFieldPermission.ts","../src/utils/permissions.ts","../src/hooks/useFormDetail.ts","../src/utils/formInstanceData.ts","../src/hooks/useProcessDetail.ts","../src/hooks/useApprovalActions.ts","../src/hooks/useChangeRecords.ts","../src/hooks/useFormNavigation.ts","../src/hooks/useDraftStorage.ts","../src/utils/defineFormSchema.ts","../src/modules/FormSummaryCard.tsx","../src/modules/RecordChangePanel.tsx","../src/modules/ChangeRecords.tsx","../src/modules/ApprovalTimeline.tsx","../src/modules/ApprovalActionBar.tsx","../src/modules/StickyActionBar.tsx","../src/utils/confirmAction.ts","../src/modules/ApprovalActions.tsx","../src/modules/FormActionBar.tsx","../src/modules/RuntimePageShell.tsx","../src/modules/SummaryPanel.tsx","../src/modules/DraftManager.tsx","../src/modules/ProcessPreview.tsx","../src/modules/DataManagementList.tsx","../src/templates/FormSubmitTemplate.tsx","../src/templates/FormDetailTemplate.tsx","../src/templates/PageSkeleton.tsx","../src/templates/ProcessDetailTemplate.tsx"],"sourcesContent":["// 主入口 - 导出所有公共 API\nexport * from './types';\nexport * from './core';\nexport * from './fields';\nexport * from './layout';\nexport * from './display';\nexport * from './hooks';\nexport * from './utils';\nexport * from './modules';\nexport * from './templates';\n","import React, { useCallback, useRef, useState, useMemo } from 'react';\nimport type { FormSchema, FormEngineConfig, FieldBehavior, ValidationRule } from '../types';\nimport { FormContext } from './FormContext';\nimport type { FormContextValue } from './FormContext';\nimport { ComponentRegistryProvider } from './ComponentRegistry';\nimport { defaultComponentRegistry } from './defaultRegistry';\nimport { evaluateEffects } from './effects';\nimport { validateField as validateFieldUtil, validateAllFields } from './validation';\nimport { createFormRuntimeApi } from './runtimeApi';\n\nexport interface FormProviderProps {\n schema: FormSchema;\n config: FormEngineConfig;\n initialValues?: Record<string, any>;\n components?: Record<string, React.ComponentType<any>>;\n children: React.ReactNode;\n}\n\nexport function FormProvider({\n schema,\n config,\n initialValues,\n components,\n children,\n}: FormProviderProps) {\n // Build initial values from schema defaults + explicit initial values\n const computedInitialValues = useMemo(() => {\n const values: Record<string, any> = {};\n for (const field of schema.fields) {\n if (field.defaultValue !== undefined) {\n values[field.fieldId] = field.defaultValue;\n }\n }\n return { ...values, ...initialValues };\n }, [schema, initialValues]);\n\n const initialValuesRef = useRef(computedInitialValues);\n const [formData, setFormData] = useState<Record<string, any>>({ ...computedInitialValues });\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const [registeredFields] = useState<Set<string>>(new Set());\n const api = useMemo(() => createFormRuntimeApi(config.api), [config.api]);\n\n // Compute field behaviors\n const fieldBehaviors = useMemo(() => {\n const baseBehaviors: Record<string, FieldBehavior> = {};\n for (const field of schema.fields) {\n baseBehaviors[field.fieldId] = field.behavior || 'NORMAL';\n }\n\n let computed = baseBehaviors;\n if (config.effects && config.effects.length > 0) {\n computed = evaluateEffects(config.effects, formData, baseBehaviors);\n }\n\n if (config.permissions?.fieldPermissions) {\n for (const [fieldId, behavior] of Object.entries(config.permissions.fieldPermissions)) {\n computed[fieldId] = behavior;\n }\n }\n\n if (config.mode === 'readonly') {\n for (const fieldId of Object.keys(computed)) {\n if (computed[fieldId] !== 'HIDDEN') {\n computed[fieldId] = 'READONLY';\n }\n }\n }\n\n return computed;\n }, [schema, config.effects, config.permissions, config.mode, formData]);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n setFieldErrors((prev) => {\n if (prev[fieldId]) {\n const next = { ...prev };\n delete next[fieldId];\n return next;\n }\n return prev;\n });\n }, []);\n\n const getFieldValue = useCallback((fieldId: string) => formData[fieldId], [formData]);\n\n const getFormData = useCallback(() => ({ ...formData }), [formData]);\n\n const validateFieldById = useCallback(\n async (fieldId: string): Promise<boolean> => {\n const field = schema.fields.find((f) => f.fieldId === fieldId);\n if (!field) return true;\n\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n\n if (rules.length === 0) return true;\n\n const error = await validateFieldUtil(formData[fieldId], rules);\n setFieldErrors((prev) => {\n if (error) {\n return { ...prev, [fieldId]: error };\n }\n const next = { ...prev };\n delete next[fieldId];\n return next;\n });\n return !error;\n },\n [schema, formData],\n );\n\n const validateAll = useCallback(async (): Promise<boolean> => {\n const fieldRules: Record<string, ValidationRule[]> = {};\n for (const field of schema.fields) {\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n if (rules.length > 0) {\n fieldRules[field.fieldId] = rules;\n }\n }\n\n const errors = await validateAllFields(formData, fieldRules);\n setFieldErrors(errors);\n return Object.keys(errors).length === 0;\n }, [schema, formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setFieldErrors({});\n }, []);\n\n const registerField = useCallback(\n (fieldId: string) => {\n registeredFields.add(fieldId);\n },\n [registeredFields],\n );\n\n const unregisterField = useCallback(\n (fieldId: string) => {\n registeredFields.delete(fieldId);\n },\n [registeredFields],\n );\n\n const contextValue: FormContextValue = useMemo(\n () => ({\n mode: config.mode,\n schema,\n formData,\n fieldErrors,\n fieldBehaviors,\n api,\n config: {\n mode: config.mode,\n formUuid: config.formUuid,\n appType: config.appType,\n formInstanceId: config.formInstanceId,\n submit: config.submit,\n },\n setFieldValue,\n getFieldValue,\n getFormData,\n validateField: validateFieldById,\n validateAll,\n resetForm,\n registerField,\n unregisterField,\n }),\n [\n config.mode,\n config.formUuid,\n schema,\n formData,\n fieldErrors,\n fieldBehaviors,\n api,\n config.appType,\n config.formInstanceId,\n config.submit,\n setFieldValue,\n getFieldValue,\n getFormData,\n validateFieldById,\n validateAll,\n resetForm,\n registerField,\n unregisterField,\n ],\n );\n\n const registryComponents = components ?? defaultComponentRegistry;\n\n return React.createElement(\n FormContext.Provider,\n { value: contextValue },\n React.createElement(ComponentRegistryProvider, { components: registryComponents, children }),\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { FieldBehavior, FormEngineConfig, FormRuntimeApi, FormSchema } from '../types';\n\nexport interface FormContextValue {\n mode: 'submit' | 'edit' | 'readonly';\n schema: FormSchema;\n formData: Record<string, any>;\n fieldErrors: Record<string, string>;\n fieldBehaviors: Record<string, FieldBehavior>;\n api: FormRuntimeApi;\n config: Pick<FormEngineConfig, 'mode' | 'formUuid' | 'appType' | 'formInstanceId' | 'submit'>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n validateField: (fieldId: string) => Promise<boolean>;\n validateAll: () => Promise<boolean>;\n resetForm: () => void;\n registerField: (fieldId: string) => void;\n unregisterField: (fieldId: string) => void;\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\nexport function useFormContext(): FormContextValue {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useFormContext must be used within a FormProvider');\n }\n return context;\n}\n","import React, { createContext, useContext } from 'react';\n\nexport interface ComponentRegistryContextValue {\n registry: Record<string, React.ComponentType<any>>;\n register: (name: string, component: React.ComponentType<any>) => void;\n}\n\nconst ComponentRegistryContext = createContext<ComponentRegistryContextValue | null>(null);\n\nexport function ComponentRegistryProvider({\n components,\n children,\n}: {\n components: Record<string, React.ComponentType<any>>;\n children: React.ReactNode;\n}): React.ReactElement {\n const [registry, setRegistry] =\n React.useState<Record<string, React.ComponentType<any>>>(components);\n\n const register = React.useCallback((name: string, component: React.ComponentType<any>) => {\n setRegistry((prev) => ({ ...prev, [name]: component }));\n }, []);\n\n const value = React.useMemo(() => ({ registry, register }), [registry, register]);\n\n return React.createElement(ComponentRegistryContext.Provider, { value }, children);\n}\n\nexport function useComponent(componentName: string): React.ComponentType<any> | null {\n const context = useContext(ComponentRegistryContext);\n if (!context) {\n return null;\n }\n return context.registry[componentName] || null;\n}\n\nexport { ComponentRegistryContext };\n","import React, { useEffect } from 'react';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { TextFieldPC } from './TextFieldPC';\nimport { TextFieldMobile } from './TextFieldMobile';\nimport { TextFieldReadonly } from './TextFieldReadonly';\n\nexport function TextField(props: TextFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n // Compute effective behavior: prop > context > NORMAL\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n // Register field and set default value on mount\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: TextFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <TextFieldReadonly {...childProps} />\n ) : isMobile ? (\n <TextFieldMobile {...childProps} />\n ) : (\n <TextFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { useFormContext } from './FormContext';\n\n/** Simple className merge utility */\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport interface FieldWrapperProps {\n fieldId: string;\n label: string;\n required?: boolean;\n tips?: string;\n className?: string;\n labelClassName?: string;\n tipsClassName?: string;\n children: React.ReactNode;\n}\n\nexport function FieldWrapper({\n fieldId,\n label,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n children,\n}: FieldWrapperProps) {\n const { fieldErrors } = useFormContext();\n const error = fieldErrors[fieldId];\n\n return (\n <div className={cn('sy-field-wrapper', className)} data-field-id={fieldId}>\n <label className={cn('sy-field-label', labelClassName)}>\n {required && (\n <span className=\"sy-field-required\" aria-hidden=\"true\">\n *\n </span>\n )}\n {label}\n </label>\n <div className=\"sy-field-control\">{children}</div>\n {tips && !error && (\n <div className={cn('sy-field-tips', tipsClassName)} data-testid={`tips-${fieldId}`}>\n {tips}\n </div>\n )}\n {error && (\n <div className=\"sy-field-error\" role=\"alert\" data-testid={`error-${fieldId}`}>\n {error}\n </div>\n )}\n </div>\n );\n}\n","import { useSyncExternalStore } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction subscribe(callback: () => void): () => void {\n let prev = window.innerWidth < MOBILE_BREAKPOINT;\n const handler = () => {\n const next = window.innerWidth < MOBILE_BREAKPOINT;\n if (next !== prev) {\n prev = next;\n callback();\n }\n };\n window.addEventListener('resize', handler);\n return () => window.removeEventListener('resize', handler);\n}\n\nfunction getSnapshot(): boolean {\n return window.innerWidth < MOBILE_BREAKPOINT;\n}\n\nexport interface DeviceDetectResult {\n isMobile: boolean;\n}\n\nexport function useDeviceDetect(): DeviceDetectResult {\n const isMobile = useSyncExternalStore(\n subscribe,\n getSnapshot,\n /* v8 ignore next */\n () => false,\n );\n return { isMobile };\n}\n","import React from 'react';\nimport { Input } from 'antd';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextFieldPC({\n fieldId,\n placeholder,\n maxLength,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: TextFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(e.target.value);\n };\n\n return (\n <Input\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n data-testid={`textfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Input } from 'antd-mobile';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextFieldMobile({\n fieldId,\n placeholder,\n maxLength,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: TextFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = () => {\n onBlur?.(value);\n };\n\n return (\n <div className={inputClassName} data-testid={`textfield-input-${fieldId}`}>\n <Input\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { TextFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextFieldReadonly({ fieldId, readonlyClassName }: TextFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n const display = value != null && value !== '' ? String(value) : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`textfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { NumberFieldPC } from './NumberFieldPC';\nimport { NumberFieldMobile } from './NumberFieldMobile';\nimport { NumberFieldReadonly } from './NumberFieldReadonly';\n\nexport function NumberField(props: NumberFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: NumberFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <NumberFieldReadonly {...childProps} />\n ) : isMobile ? (\n <NumberFieldMobile {...childProps} />\n ) : (\n <NumberFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { InputNumber } from 'antd';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n min,\n max,\n step,\n precision,\n onChange,\n onBlur,\n}: NumberFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as number | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: number | null) => {\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = () => {\n onBlur?.(value ?? null);\n };\n\n return (\n <InputNumber\n className={inputClassName}\n style={{ width: '100%' }}\n value={value ?? null}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n precision={precision}\n onChange={handleChange}\n onBlur={handleBlur}\n data-testid={`numberfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Input } from 'antd-mobile';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: NumberFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n const num = v === '' ? null : Number(v);\n const finalValue = num !== null && isNaN(num) ? null : num;\n setFieldValue(fieldId, finalValue);\n onChange?.(finalValue);\n };\n\n const handleBlur = () => {\n onBlur?.(value ?? null);\n };\n\n return (\n <div className={inputClassName} data-testid={`numberfield-input-${fieldId}`}>\n <Input\n type=\"number\"\n value={value != null ? String(value) : ''}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldReadonly({ fieldId, readonlyClassName }: NumberFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n const display = value != null ? String(value) : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`numberfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { TextAreaFieldPC } from './TextAreaFieldPC';\nimport { TextAreaFieldMobile } from './TextAreaFieldMobile';\nimport { TextAreaFieldReadonly } from './TextAreaFieldReadonly';\n\nexport function TextAreaField(props: TextAreaFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: TextAreaFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <TextAreaFieldReadonly {...childProps} />\n ) : isMobile ? (\n <TextAreaFieldMobile {...childProps} />\n ) : (\n <TextAreaFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Input } from 'antd';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nconst { TextArea } = Input;\n\nexport function TextAreaFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n rows,\n maxLength,\n showCount,\n onChange,\n onBlur,\n}: TextAreaFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value;\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n onBlur?.(e.target.value);\n };\n\n return (\n <TextArea\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n showCount={showCount}\n onChange={handleChange}\n onBlur={handleBlur}\n data-testid={`textareafield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { TextArea } from 'antd-mobile';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextAreaFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n rows,\n maxLength,\n showCount,\n onChange,\n onBlur,\n}: TextAreaFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as string) ?? '';\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n setFieldValue(fieldId, v);\n onChange?.(v);\n };\n\n const handleBlur = () => {\n onBlur?.(value);\n };\n\n return (\n <div className={inputClassName} data-testid={`textareafield-input-${fieldId}`}>\n <TextArea\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n showCount={showCount}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { TextAreaFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function TextAreaFieldReadonly({ fieldId, readonlyClassName }: TextAreaFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n const display = value != null && value !== '' ? String(value) : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`textareafield-readonly-${fieldId}`}\n style={{ whiteSpace: 'pre-wrap' }}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { SelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { SelectFieldPC } from './SelectFieldPC';\nimport { SelectFieldMobile } from './SelectFieldMobile';\nimport { SelectFieldReadonly } from './SelectFieldReadonly';\n\nexport function SelectField(props: SelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: SelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <SelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <SelectFieldMobile {...childProps} />\n ) : (\n <SelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Select } from 'antd';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SelectFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n options,\n allowClear,\n onChange,\n}: SelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (val: string | undefined) => {\n if (val === undefined) {\n setFieldValue(fieldId, null);\n onChange?.(null);\n } else {\n const option = options.find((o) => o.value === val) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n }\n };\n\n return (\n <Select\n className={inputClassName}\n style={{ width: '100%' }}\n value={value?.value ?? undefined}\n placeholder={placeholder}\n disabled={disabled}\n allowClear={allowClear}\n options={options}\n onChange={handleChange}\n data-testid={`selectfield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { Picker } from 'antd-mobile';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SelectFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n options,\n onChange,\n}: SelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n\n const columns = [options.map((o) => ({ label: o.label, value: o.value }))];\n\n const handleConfirm = (val: any[]) => {\n const selected = val[0] as string | null;\n if (selected) {\n const option = options.find((o) => o.value === selected) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n } else {\n setFieldValue(fieldId, null);\n onChange?.(null);\n }\n };\n\n return (\n <div className={inputClassName} data-testid={`selectfield-input-${fieldId}`}>\n <div\n onClick={() => !disabled && setVisible(true)}\n data-testid={`selectfield-trigger-${fieldId}`}\n >\n {value?.label ?? placeholder ?? '请选择'}\n </div>\n <Picker\n columns={columns}\n visible={visible}\n onClose={() => setVisible(false)}\n onConfirm={handleConfirm}\n value={value ? [value.value] : []}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SelectFieldReadonly({ fieldId, readonlyClassName }: SelectFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const display = value?.label ?? '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`selectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { MultiSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { MultiSelectFieldPC } from './MultiSelectFieldPC';\nimport { MultiSelectFieldMobile } from './MultiSelectFieldMobile';\nimport { MultiSelectFieldReadonly } from './MultiSelectFieldReadonly';\n\nexport function MultiSelectField(props: MultiSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: MultiSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <MultiSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <MultiSelectFieldMobile {...childProps} />\n ) : (\n <MultiSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Select } from 'antd';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function MultiSelectFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n options,\n maxCount,\n onChange,\n}: MultiSelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: string[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n return (\n <Select\n mode=\"multiple\"\n className={inputClassName}\n style={{ width: '100%' }}\n value={value.map((v) => v.value)}\n placeholder={placeholder}\n disabled={disabled}\n maxCount={maxCount}\n options={options}\n onChange={handleChange}\n data-testid={`multiselectfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Selector } from 'antd-mobile';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function MultiSelectFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n options,\n onChange,\n}: MultiSelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: string[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n return (\n <div className={inputClassName} data-testid={`multiselectfield-input-${fieldId}`}>\n <Selector\n multiple\n options={options}\n value={value.map((v) => v.value)}\n onChange={handleChange}\n disabled={disabled}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function MultiSelectFieldReadonly({ fieldId, readonlyClassName }: MultiSelectFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const display = value.length > 0 ? value.map((v) => v.label).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`multiselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { RadioFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { RadioFieldPC } from './RadioFieldPC';\nimport { RadioFieldMobile } from './RadioFieldMobile';\nimport { RadioFieldReadonly } from './RadioFieldReadonly';\n\nexport function RadioField(props: RadioFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: RadioFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <RadioFieldReadonly {...childProps} />\n ) : isMobile ? (\n <RadioFieldMobile {...childProps} />\n ) : (\n <RadioFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Radio } from 'antd';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function RadioFieldPC({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: RadioFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (e: any) => {\n const val = e.target.value as string;\n const option = options.find((o) => o.value === val) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n };\n\n const style: React.CSSProperties =\n direction === 'vertical' ? { display: 'flex', flexDirection: 'column', gap: 8 } : {};\n\n return (\n <Radio.Group\n className={inputClassName}\n value={value?.value ?? undefined}\n disabled={disabled}\n onChange={handleChange}\n data-testid={`radiofield-input-${fieldId}`}\n style={style}\n >\n {options.map((o) => (\n <Radio key={o.value} value={o.value}>\n {o.label}\n </Radio>\n ))}\n </Radio.Group>\n );\n}\n","import React from 'react';\nimport { Radio, Space } from 'antd-mobile';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function RadioFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: RadioFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (val: string) => {\n const option = options.find((o) => o.value === val) ?? null;\n setFieldValue(fieldId, option);\n onChange?.(option);\n };\n\n return (\n <div className={inputClassName} data-testid={`radiofield-input-${fieldId}`}>\n <Radio.Group value={value?.value} onChange={handleChange as any} disabled={disabled}>\n <Space direction={direction === 'horizontal' ? 'horizontal' : 'vertical'}>\n {options.map((o) => (\n <Radio key={o.value} value={o.value}>\n {o.label}\n </Radio>\n ))}\n </Space>\n </Radio.Group>\n </div>\n );\n}\n","import React from 'react';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function RadioFieldReadonly({ fieldId, readonlyClassName }: RadioFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as OptionItem | null | undefined;\n const display = value?.label ?? '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`radiofield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { CheckboxFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { CheckboxFieldPC } from './CheckboxFieldPC';\nimport { CheckboxFieldMobile } from './CheckboxFieldMobile';\nimport { CheckboxFieldReadonly } from './CheckboxFieldReadonly';\n\nexport function CheckboxField(props: CheckboxFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: CheckboxFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <CheckboxFieldReadonly {...childProps} />\n ) : isMobile ? (\n <CheckboxFieldMobile {...childProps} />\n ) : (\n <CheckboxFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Checkbox } from 'antd';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CheckboxFieldPC({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: CheckboxFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: any[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n const style: React.CSSProperties =\n direction === 'vertical' ? { display: 'flex', flexDirection: 'column', gap: 8 } : {};\n\n return (\n <Checkbox.Group\n className={inputClassName}\n value={value.map((v) => v.value)}\n disabled={disabled}\n onChange={handleChange}\n data-testid={`checkboxfield-input-${fieldId}`}\n style={style}\n >\n {options.map((o) => (\n <Checkbox key={o.value} value={o.value}>\n {o.label}\n </Checkbox>\n ))}\n </Checkbox.Group>\n );\n}\n","import React from 'react';\nimport { Checkbox, Space } from 'antd-mobile';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CheckboxFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n options,\n direction,\n onChange,\n}: CheckboxFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (vals: string[]) => {\n const selected = vals\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is OptionItem => o != null);\n setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n return (\n <div className={inputClassName} data-testid={`checkboxfield-input-${fieldId}`}>\n <Checkbox.Group\n value={value.map((v) => v.value)}\n onChange={handleChange as any}\n disabled={disabled}\n >\n <Space direction={direction === 'horizontal' ? 'horizontal' : 'vertical'}>\n {options.map((o) => (\n <Checkbox key={o.value} value={o.value}>\n {o.label}\n </Checkbox>\n ))}\n </Space>\n </Checkbox.Group>\n </div>\n );\n}\n","import React from 'react';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CheckboxFieldReadonly({ fieldId, readonlyClassName }: CheckboxFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as OptionItem[] | undefined) ?? [];\n const display = value.length > 0 ? value.map((v) => v.label).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`checkboxfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { DateFieldPC } from './DateFieldPC';\nimport { DateFieldMobile } from './DateFieldMobile';\nimport { DateFieldReadonly } from './DateFieldReadonly';\n\nexport function DateField(props: DateFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: DateFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <DateFieldReadonly {...childProps} />\n ) : isMobile ? (\n <DateFieldMobile {...childProps} />\n ) : (\n <DateFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { DatePicker } from 'antd';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DateFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n onChange,\n}: DateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const disabled = behavior === 'DISABLED';\n const format = dateFormat ?? (showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD');\n const pickerValue = value && dayjs(value).isValid() ? dayjs(value) : null;\n\n const handleChange = (_date: Dayjs | null, dateString: string | string[] | null) => {\n const val = Array.isArray(dateString) ? dateString[0] : (dateString ?? '');\n setFieldValue(fieldId, val || '');\n onChange?.(val || '');\n };\n\n return (\n <DatePicker\n className={inputClassName}\n style={{ width: '100%' }}\n value={pickerValue}\n placeholder={placeholder}\n disabled={disabled}\n format={format}\n showTime={showTime}\n onChange={handleChange}\n data-testid={`datefield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { DatePicker } from 'antd-mobile';\nimport dayjs from 'dayjs';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DateFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n onChange,\n}: DateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n const format = dateFormat ?? (showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD');\n const pickerValue = value && dayjs(value).isValid() ? dayjs(value).toDate() : undefined;\n\n const handleConfirm = (date: Date) => {\n const dateStr = dayjs(date).format(format);\n setFieldValue(fieldId, dateStr);\n onChange?.(dateStr);\n };\n\n return (\n <div className={inputClassName} data-testid={`datefield-input-${fieldId}`}>\n <div\n onClick={() => !disabled && setVisible(true)}\n data-testid={`datefield-trigger-${fieldId}`}\n >\n {value || placeholder || '请选择日期'}\n </div>\n <DatePicker\n visible={visible}\n value={pickerValue}\n precision={showTime ? 'second' : 'day'}\n onClose={() => setVisible(false)}\n onConfirm={handleConfirm}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DateFieldReadonly({ fieldId, readonlyClassName }: DateFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const display = value && value !== '' ? value : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`datefield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { CascadeDateFieldPC } from './CascadeDateFieldPC';\nimport { CascadeDateFieldMobile } from './CascadeDateFieldMobile';\nimport { CascadeDateFieldReadonly } from './CascadeDateFieldReadonly';\n\nexport function CascadeDateField(props: CascadeDateFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: CascadeDateFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <CascadeDateFieldReadonly {...childProps} />\n ) : isMobile ? (\n <CascadeDateFieldMobile {...childProps} />\n ) : (\n <CascadeDateFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { DatePicker } from 'antd';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nconst { RangePicker } = DatePicker;\n\nexport function CascadeDateFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n onChange,\n}: CascadeDateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as { start: string; end: string } | null | undefined;\n const disabled = behavior === 'DISABLED';\n const format = dateFormat ?? 'YYYY-MM-DD';\n const startValue = value?.start && dayjs(value.start).isValid() ? dayjs(value.start) : null;\n const endValue = value?.end && dayjs(value.end).isValid() ? dayjs(value.end) : null;\n const pickerValue =\n startValue || endValue ? ([startValue, endValue] as [Dayjs | null, Dayjs | null]) : null;\n\n const handleChange = (\n _dates: null | [Dayjs | null, Dayjs | null],\n dateStrings: [string, string],\n ) => {\n const [start, end] = dateStrings;\n if (start && end) {\n const val = { start, end };\n setFieldValue(fieldId, val);\n onChange?.(val);\n } else {\n setFieldValue(fieldId, null);\n onChange?.(null);\n }\n };\n\n return (\n <RangePicker\n className={inputClassName}\n style={{ width: '100%' }}\n value={pickerValue}\n placeholder={placeholder ? [placeholder, placeholder] : undefined}\n disabled={disabled}\n format={format}\n onChange={handleChange}\n data-testid={`cascadedatefield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { DatePicker } from 'antd-mobile';\nimport dayjs from 'dayjs';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CascadeDateFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n startLabel,\n endLabel,\n dateFormat,\n onChange,\n}: CascadeDateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = formData[fieldId] as { start: string; end: string } | null | undefined;\n const disabled = behavior === 'DISABLED';\n const [startVisible, setStartVisible] = useState(false);\n const [endVisible, setEndVisible] = useState(false);\n const format = dateFormat ?? 'YYYY-MM-DD';\n const startValue =\n value?.start && dayjs(value.start).isValid() ? dayjs(value.start).toDate() : undefined;\n const endValue = value?.end && dayjs(value.end).isValid() ? dayjs(value.end).toDate() : undefined;\n\n const handleStartConfirm = (date: Date) => {\n const dateStr = dayjs(date).format(format);\n const newVal = { start: dateStr, end: value?.end ?? '' };\n setFieldValue(fieldId, newVal);\n onChange?.(newVal);\n };\n\n const handleEndConfirm = (date: Date) => {\n const dateStr = dayjs(date).format(format);\n const newVal = { start: value?.start ?? '', end: dateStr };\n setFieldValue(fieldId, newVal);\n onChange?.(newVal);\n };\n\n return (\n <div className={inputClassName} data-testid={`cascadedatefield-input-${fieldId}`}>\n <div\n onClick={() => !disabled && setStartVisible(true)}\n data-testid={`cascadedatefield-start-${fieldId}`}\n >\n {value?.start || startLabel || '开始日期'}\n </div>\n <span> ~ </span>\n <div\n onClick={() => !disabled && setEndVisible(true)}\n data-testid={`cascadedatefield-end-${fieldId}`}\n >\n {value?.end || endLabel || '结束日期'}\n </div>\n <DatePicker\n visible={startVisible}\n value={startValue}\n onClose={() => setStartVisible(false)}\n onConfirm={handleStartConfirm}\n />\n <DatePicker\n visible={endVisible}\n value={endValue}\n onClose={() => setEndVisible(false)}\n onConfirm={handleEndConfirm}\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function CascadeDateFieldReadonly({ fieldId, readonlyClassName }: CascadeDateFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as { start: string; end: string } | null | undefined;\n const display = value && value.start && value.end ? `${value.start} ~ ${value.end}` : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`cascadedatefield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { AttachmentFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { AttachmentFieldPC } from './AttachmentFieldPC';\nimport { AttachmentFieldMobile } from './AttachmentFieldMobile';\nimport { AttachmentFieldReadonly } from './AttachmentFieldReadonly';\n\nexport function AttachmentField(props: AttachmentFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: AttachmentFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <AttachmentFieldReadonly {...childProps} />\n ) : isMobile ? (\n <AttachmentFieldMobile {...childProps} />\n ) : (\n <AttachmentFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Upload, Button } from 'antd';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n createUid,\n formatFileSize,\n getFileCategory,\n getFileExtension,\n isImageFile,\n normalizeAttachmentItem,\n} from '../shared/fieldFormat';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => {\n const uid = file.uid || createUid('attachment');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nconst PREVIEW_PAGE_EXTENSIONS = [\n 'pdf',\n 'xls',\n 'xlsx',\n 'csv',\n 'txt',\n 'json',\n 'xml',\n 'log',\n 'md',\n 'doc',\n 'docx',\n 'ppt',\n 'pptx',\n];\n\nfunction canPreview(item: AttachmentItem) {\n const ext = getFileExtension(item.name);\n return (\n isImageFile(item.name, item.contentType) ||\n ['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext) ||\n PREVIEW_PAGE_EXTENSIONS.includes(ext)\n );\n}\n\nexport function AttachmentFieldPC({\n fieldId,\n behavior,\n maxCount,\n accept,\n maxSize,\n bucketName = 'attachments',\n multiple = true,\n allowedTypes,\n showPreview = true,\n showDownload = true,\n showFileSize = true,\n showFileTypeBadge = true,\n previewPagePath = '/file-preview',\n onChange,\n}: AttachmentFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const setValue = (items: AttachmentItem[]) => {\n setFieldValue(fieldId, items);\n onChange?.(items);\n };\n\n const handleChange = (info: any) => {\n const fileList: any[] = info.fileList ?? [];\n const items: AttachmentItem[] = fileList.map((f: any) => {\n if (f.uid === undefined && f.name === undefined && f.url === undefined && !f.response) {\n return { url: '', name: '', id: '' };\n }\n return normalizeAttachmentItem({\n url: f.url ?? f.response?.url ?? '',\n name: f.name,\n id: f.uid ?? f.response?.id,\n uid: f.uid ?? f.response?.uid,\n status: f.status,\n percent: f.percent,\n objectName: f.objectName ?? f.response?.objectName,\n bucketName: f.bucketName ?? f.response?.bucketName,\n size: f.size ?? f.response?.size,\n contentType: f.type ?? f.response?.contentType,\n downloadUrl: f.downloadUrl ?? f.response?.downloadUrl,\n previewUrl: f.previewUrl ?? f.response?.previewUrl,\n });\n });\n setValue(items);\n };\n\n const handleRemove = (file: any) => {\n const removed = value.find((item) => item.id === file.uid || item.uid === file.uid);\n const newValue = value.filter((item) => item.id !== file.uid && item.uid !== file.uid);\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const resolvePreviewUrl = async (item: AttachmentItem) => {\n let url = item.previewUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n const ticketValue = typeof ticket === 'string' ? { previewUrl: ticket } : ticket;\n if (ticketValue?.previewPageUrl && ticketValue?.ticket) {\n const separator = ticketValue.previewPageUrl.includes('?') ? '&' : '?';\n return `${ticketValue.previewPageUrl}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n url = ticketValue?.previewUrl || ticketValue?.url || url;\n if (ticketValue?.ticket && PREVIEW_PAGE_EXTENSIONS.includes(getFileExtension(item.name))) {\n const separator = previewPagePath.includes('?') ? '&' : '?';\n return `${previewPagePath}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n }\n return url;\n };\n\n const resolveDownloadUrl = async (item: AttachmentItem) => {\n let url = item.downloadUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n url =\n typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || url;\n }\n return url;\n };\n\n const handlePreview = async (file: any) => {\n const item = value.find((current) => current.id === file.uid || current.uid === file.uid);\n const url = item ? await resolvePreviewUrl(item) : file.url;\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const handleDownload = async (item: AttachmentItem) => {\n const url = await resolveDownloadUrl(item);\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const fileList = value.map((item) => ({\n uid: item.id,\n name: item.name,\n url: item.url,\n status: item.status ?? ('done' as const),\n percent: item.percent,\n }));\n\n const beforeUpload = (file: any) => {\n if (maxSize && file.size / 1024 / 1024 > maxSize) {\n return false;\n }\n const ext = String(file.name || '')\n .split('.')\n .pop()\n ?.toLowerCase();\n if (allowedTypes?.length && ext && !allowedTypes.includes(ext)) {\n return false;\n }\n return true;\n };\n\n const customRequest = async ({ file, onProgress, onSuccess, onError }: any) => {\n const currentFile = file as File & { uid?: string };\n const localItem = createLocalItem(currentFile);\n const nextValue = multiple ? [...value, localItem].slice(0, maxCount ?? Infinity) : [localItem];\n setValue(nextValue);\n try {\n const uploaded = await api.uploadFile(currentFile, bucketName, (percent) => {\n onProgress?.({ percent });\n setValue(\n nextValue.map((item) =>\n item.id === localItem.id ? { ...item, percent, status: 'uploading' } : item,\n ),\n );\n });\n const completed = normalizeAttachmentItem({\n ...uploaded,\n id: uploaded.id || localItem.id,\n uid: uploaded.uid || localItem.uid,\n url: uploaded.url || localItem.url,\n status: 'done',\n percent: 100,\n extension: uploaded.extension || getFileExtension(uploaded.name || localItem.name),\n });\n setValue(nextValue.map((item) => (item.id === localItem.id ? completed : item)));\n onSuccess?.(completed);\n } catch (error: any) {\n const failed = {\n ...localItem,\n status: 'error' as const,\n error: error?.message || '上传失败',\n };\n setValue(nextValue.map((item) => (item.id === localItem.id ? failed : item)));\n onError?.(error);\n }\n };\n\n return (\n <div className=\"sy-attachment-field\" data-testid={`attachmentfield-enhanced-${fieldId}`}>\n <Upload\n data-testid={`attachmentfield-input-${fieldId}`}\n fileList={fileList}\n customRequest={customRequest}\n accept={accept}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\n onChange={handleChange}\n onRemove={handleRemove}\n onPreview={handlePreview}\n beforeUpload={beforeUpload}\n >\n <Button disabled={disabled} data-testid={`attachmentfield-upload-btn-${fieldId}`}>\n 上传文件\n </Button>\n </Upload>\n {value.length > 0 && (\n <div className=\"sy-file-list\" data-testid={`attachmentfield-rich-list-${fieldId}`}>\n {value.map((item) => {\n const category = getFileCategory(item.name, item.contentType);\n const extension = getFileExtension(item.name);\n return (\n <div className=\"sy-file-item\" key={item.id || item.uid || item.name}>\n <span className={`sy-file-icon sy-file-icon-${category}`} aria-hidden=\"true\">\n {category === 'image' ? 'IMG' : extension || 'FILE'}\n </span>\n <div className=\"sy-file-meta\">\n <span className=\"sy-file-name\" title={item.name}>\n {item.name}\n </span>\n <span className=\"sy-file-sub\">\n {item.status === 'uploading'\n ? `上传中 ${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : [\n showFileTypeBadge && extension ? extension.toUpperCase() : '',\n showFileSize ? formatFileSize(item.size) : '',\n ]\n .filter(Boolean)\n .join(' · ') || '已上传'}\n </span>\n </div>\n <div className=\"sy-file-actions\">\n {showPreview && canPreview(item) && (\n <button\n type=\"button\"\n disabled={item.status !== 'done'}\n onClick={() => handlePreview({ uid: item.uid || item.id, url: item.url })}\n >\n 预览\n </button>\n )}\n {showDownload && (\n <button\n type=\"button\"\n disabled={item.status !== 'done'}\n onClick={() => handleDownload(item)}\n >\n 下载\n </button>\n )}\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemove({ uid: item.uid || item.id })}\n >\n 删除\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import type { AttachmentItem, DepartmentTreeNode, UserItem } from '../../types';\n\nexport const EMPTY_TEXT = '--';\n\nexport function createUid(prefix = 'field') {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function getUserId(user: Partial<UserItem> | any): string {\n return String(user?.id || user?.value || user?.key || '').trim();\n}\n\nexport function getUserName(user: Partial<UserItem> | any): string {\n return String(user?.name || user?.label || user?.title || user?.username || getUserId(user));\n}\n\nexport function normalizeUser(user: any): UserItem {\n const id = getUserId(user);\n return {\n ...user,\n id,\n name: getUserName({ ...user, id }),\n };\n}\n\nexport function getDepartmentId(node: Partial<DepartmentTreeNode> | any): string {\n return String(node?.id || node?.value || node?.key || '').trim();\n}\n\nexport function getDepartmentName(node: Partial<DepartmentTreeNode> | any): string {\n return String(node?.name || node?.label || node?.title || getDepartmentId(node));\n}\n\nexport function normalizeDepartmentNode(node: any): DepartmentTreeNode {\n const id = getDepartmentId(node);\n const name = getDepartmentName({ ...node, id });\n const hasChildren =\n typeof node?.hasChildren === 'boolean'\n ? node.hasChildren\n : Array.isArray(node?.children) && node.children.length > 0;\n const children = Array.isArray(node?.children)\n ? node.children.map((child: any) => normalizeDepartmentNode(child))\n : undefined;\n return {\n ...node,\n id,\n name,\n key: String(node?.key || id),\n title: String(node?.title || name),\n hasChildren,\n isLeaf: typeof node?.isLeaf === 'boolean' ? node.isLeaf : !hasChildren,\n children,\n };\n}\n\nexport function flattenDepartments(nodes: DepartmentTreeNode[]) {\n const result: Array<{ id: string; name: string; node: DepartmentTreeNode }> = [];\n const walk = (items: DepartmentTreeNode[]) => {\n for (const node of items) {\n const id = getDepartmentId(node);\n if (id) result.push({ id, name: getDepartmentName(node), node });\n if (node.children?.length) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\nexport function formatFileSize(bytes?: number): string {\n if (!bytes) return '';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${Number(value.toFixed(value >= 10 || index === 0 ? 0 : 1))} ${units[index]}`;\n}\n\nexport function getFileExtension(fileName?: string): string {\n return (\n String(fileName || '')\n .split('.')\n .pop()\n ?.toLowerCase() || ''\n );\n}\n\nexport function isImageFile(fileName?: string, contentType?: string): boolean {\n return (\n String(contentType || '').startsWith('image/') ||\n ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp'].includes(getFileExtension(fileName))\n );\n}\n\nexport function getFileCategory(fileName?: string, contentType?: string) {\n const ext = getFileExtension(fileName);\n if (isImageFile(fileName, contentType)) return 'image';\n if (['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext)) return 'video';\n if (['mp3', 'wav', 'aac', 'flac', 'm4a', 'ogg'].includes(ext)) return 'audio';\n if (ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv'].includes(ext)) return 'excel';\n if (['doc', 'docx'].includes(ext)) return 'word';\n if (['ppt', 'pptx'].includes(ext)) return 'ppt';\n if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) return 'archive';\n if (['txt', 'json', 'xml', 'log', 'md'].includes(ext)) return 'text';\n if (['js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'less', 'java', 'py'].includes(ext)) {\n return 'code';\n }\n return 'file';\n}\n\nexport function normalizeAttachmentItem(\n item: any,\n fallback?: Partial<AttachmentItem>,\n): AttachmentItem {\n const id = String(item?.id || item?.uid || item?.objectName || fallback?.id || createUid('file'));\n const name = String(item?.name || item?.originalName || fallback?.name || item?.fileName || id);\n return {\n ...fallback,\n ...item,\n id,\n uid: String(item?.uid || item?.id || fallback?.uid || id),\n name,\n originalName: item?.originalName || fallback?.originalName || name,\n url: String(item?.url || item?.downloadUrl || item?.previewUrl || fallback?.url || ''),\n status: item?.status || fallback?.status || 'done',\n size: item?.size ?? fallback?.size,\n percent: item?.percent ?? fallback?.percent,\n contentType: item?.contentType || item?.mimeType || fallback?.contentType,\n mimeType: item?.mimeType || item?.contentType || fallback?.mimeType,\n extension: item?.extension || fallback?.extension || getFileExtension(name),\n };\n}\n","import React from 'react';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function AttachmentFieldMobile({\n fieldId,\n behavior,\n maxCount,\n accept,\n maxSize,\n bucketName = 'attachments',\n multiple = true,\n allowedTypes,\n onChange,\n}: AttachmentFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const acceptedFiles = Array.from(files).filter((file) => {\n if (maxSize && file.size / 1024 / 1024 > maxSize) return false;\n const ext = String(file.name || '')\n .split('.')\n .pop()\n ?.toLowerCase();\n if (allowedTypes?.length && ext && !allowedTypes.includes(ext)) return false;\n return true;\n });\n const newItems: AttachmentItem[] = acceptedFiles.map((f) => {\n const uid = `${Date.now()}-${f.name}`;\n return {\n url: URL.createObjectURL(f),\n name: f.name,\n id: uid,\n uid,\n status: 'uploading',\n size: f.size,\n };\n });\n const merged = [...value, ...newItems].slice(0, maxCount ?? Infinity);\n setFieldValue(fieldId, merged);\n onChange?.(merged);\n acceptedFiles.forEach((file, index) => {\n const localId = newItems[index]?.id;\n api\n .uploadFile(file, bucketName)\n .then((uploaded) => {\n const current = ((formData[fieldId] as AttachmentItem[] | undefined) ?? merged).map(\n (item) => (item.id === localId ? { ...uploaded, id: uploaded.id || localId } : item),\n );\n setFieldValue(fieldId, current);\n onChange?.(current);\n })\n .catch(() => undefined);\n });\n };\n\n const handleRemove = (id: string) => {\n const removed = value.find((item) => item.id === id);\n const newValue = value.filter((item) => item.id !== id);\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n return (\n <div data-testid={`attachmentfield-mobile-${fieldId}`}>\n <input\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileSelect}\n data-testid={`attachmentfield-file-input-${fieldId}`}\n />\n <ul data-testid={`attachmentfield-list-${fieldId}`}>\n {value.map((item) => (\n <li key={item.id} data-testid={`attachmentfield-item-${item.id}`}>\n <span>{item.name}</span>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemove(item.id)}\n data-testid={`attachmentfield-remove-${item.id}`}\n >\n 删除\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","import React from 'react';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function AttachmentFieldReadonly({ fieldId, readonlyClassName }: AttachmentFieldProps) {\n const { formData, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n\n if (value.length === 0) {\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`attachmentfield-readonly-${fieldId}`}\n >\n --\n </div>\n );\n }\n\n return (\n <ul\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`attachmentfield-readonly-${fieldId}`}\n >\n {value.map((item) => (\n <li key={item.id}>\n <a\n href={item.downloadUrl || item.url || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={async (event) => {\n if (!item.objectName) return;\n event.preventDefault();\n const ticket = await api.createDownloadTicket(\n item.bucketName || 'attachments',\n item.objectName,\n item.name,\n );\n const url =\n typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.url || item.downloadUrl || item.url;\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n }}\n >\n {item.name}\n </a>\n </li>\n ))}\n </ul>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { ImageFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { ImageFieldPC } from './ImageFieldPC';\nimport { ImageFieldMobile } from './ImageFieldMobile';\nimport { ImageFieldReadonly } from './ImageFieldReadonly';\n\nexport function ImageField(props: ImageFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: ImageFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <ImageFieldReadonly {...childProps} />\n ) : isMobile ? (\n <ImageFieldMobile {...childProps} />\n ) : (\n <ImageFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Upload } from 'antd';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { createUid, getFileExtension, normalizeAttachmentItem } from '../shared/fieldFormat';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => {\n const uid = file.uid || createUid('image');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nexport function ImageFieldPC({\n fieldId,\n behavior,\n maxCount,\n accept,\n bucketName = 'images',\n multiple = true,\n maxSize,\n listType = 'picture-card',\n showPreviewIcon = true,\n showRemoveIcon = true,\n showDownloadIcon = true,\n onChange,\n}: ImageFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const setValue = (items: AttachmentItem[]) => {\n setFieldValue(fieldId, items);\n onChange?.(items);\n };\n\n const handleChange = (info: any) => {\n const fileList: any[] = info.fileList ?? [];\n const items: AttachmentItem[] = fileList.map((f: any) => {\n if (\n f.uid === undefined &&\n f.name === undefined &&\n f.url === undefined &&\n f.thumbUrl === undefined &&\n !f.response\n ) {\n return { url: '', name: '', id: '' };\n }\n return normalizeAttachmentItem({\n url: f.url ?? f.thumbUrl ?? f.response?.url ?? '',\n previewUrl: f.previewUrl ?? f.thumbUrl ?? f.response?.previewUrl,\n name: f.name,\n id: f.uid ?? f.response?.id,\n uid: f.uid ?? f.response?.uid,\n status: f.status,\n percent: f.percent,\n objectName: f.objectName ?? f.response?.objectName,\n bucketName: f.bucketName ?? f.response?.bucketName,\n size: f.size ?? f.response?.size,\n contentType: f.type ?? f.response?.contentType,\n });\n });\n setValue(items);\n };\n\n const handleRemove = (file: any) => {\n const removed = value.find((item) => item.id === file.uid || item.uid === file.uid);\n const newValue = value.filter((item) => item.id !== file.uid && item.uid !== file.uid);\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const handlePreview = async (file: any) => {\n const item = value.find((current) => current.id === file.uid || current.uid === file.uid);\n let url = item?.previewUrl || item?.url || file.url || file.thumbUrl;\n if (item?.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n url = typeof ticket === 'string' ? ticket : ticket?.previewUrl || ticket?.url || url;\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const fileList = value.map((item) => ({\n uid: item.id,\n name: item.name,\n url: item.url,\n thumbUrl: item.url,\n status: item.status ?? ('done' as const),\n percent: item.percent,\n }));\n\n const beforeUpload = (file: File) => {\n if (\n !String(file.type || '').startsWith('image/') &&\n !/\\.(png|jpe?g|gif|bmp|svg|webp)$/i.test(file.name)\n ) {\n return false;\n }\n if (maxSize && file.size / 1024 / 1024 > maxSize) {\n return false;\n }\n return true;\n };\n\n const customRequest = async ({ file, onProgress, onSuccess, onError }: any) => {\n const currentFile = file as File & { uid?: string };\n const localItem = createLocalItem(currentFile);\n const nextValue = multiple ? [...value, localItem].slice(0, maxCount ?? Infinity) : [localItem];\n setValue(nextValue);\n try {\n const uploaded = await api.uploadFile(currentFile, bucketName, (percent) => {\n onProgress?.({ percent });\n setValue(\n nextValue.map((item) =>\n item.id === localItem.id ? { ...item, percent, status: 'uploading' } : item,\n ),\n );\n });\n const completed = normalizeAttachmentItem({\n ...uploaded,\n id: uploaded.id || localItem.id,\n uid: uploaded.uid || localItem.uid,\n url: uploaded.previewUrl || uploaded.url || localItem.url,\n status: 'done',\n percent: 100,\n });\n setValue(nextValue.map((item) => (item.id === localItem.id ? completed : item)));\n onSuccess?.(completed);\n } catch (error: any) {\n const failed = {\n ...localItem,\n status: 'error' as const,\n error: error?.message || '上传失败',\n };\n setValue(nextValue.map((item) => (item.id === localItem.id ? failed : item)));\n onError?.(error);\n }\n };\n\n return (\n <div className=\"sy-image-field\" data-testid={`imagefield-enhanced-${fieldId}`}>\n <Upload\n data-testid={`imagefield-input-${fieldId}`}\n listType={listType}\n fileList={fileList}\n customRequest={customRequest}\n accept={accept ?? 'image/*'}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\n showUploadList={{\n showPreviewIcon,\n showRemoveIcon,\n showDownloadIcon,\n }}\n onChange={handleChange}\n onRemove={handleRemove}\n onPreview={handlePreview}\n beforeUpload={beforeUpload}\n >\n {(!maxCount || value.length < maxCount) && (\n <div data-testid={`imagefield-upload-btn-${fieldId}`}>+ 上传图片</div>\n )}\n </Upload>\n {value.length > 0 && (\n <div className=\"sy-image-grid\" data-testid={`imagefield-rich-grid-${fieldId}`}>\n {value.map((item) => (\n <button\n key={item.id || item.uid || item.name}\n type=\"button\"\n className=\"sy-image-thumb\"\n disabled={item.status !== 'done'}\n onClick={() =>\n handlePreview({\n uid: item.uid || item.id,\n url: item.url,\n thumbUrl: item.previewUrl,\n })\n }\n >\n {item.url || item.previewUrl ? (\n <img src={item.previewUrl || item.url} alt={item.name} />\n ) : (\n <span>{Math.round(item.percent ?? 0)}%</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { createUid, normalizeAttachmentItem } from '../shared/fieldFormat';\n\nconst getMobileImageUploader = () => {\n try {\n return (MobileAntd as any).ImageUploader;\n } catch {\n return undefined;\n }\n};\n\nconst getMobileToast = () => {\n try {\n return (MobileAntd as any).Toast;\n } catch {\n return undefined;\n }\n};\n\nexport function ImageFieldMobile({\n fieldId,\n behavior,\n maxCount,\n accept,\n bucketName = 'images',\n multiple = true,\n maxSize,\n onChange,\n}: ImageFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const setValue = (items: AttachmentItem[]) => {\n setFieldValue(fieldId, items);\n onChange?.(items);\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const acceptedFiles = Array.from(files).filter((file) => {\n const isImage =\n String(file.type || '').startsWith('image/') ||\n /\\.(png|jpe?g|gif|bmp|svg|webp)$/i.test(file.name);\n if (!isImage) return false;\n if (maxSize && file.size / 1024 / 1024 > maxSize) return false;\n return true;\n });\n const newItems: AttachmentItem[] = acceptedFiles.map((f) => {\n const uid = createUid('image');\n return {\n url: URL.createObjectURL(f),\n name: f.name,\n id: uid,\n uid,\n status: 'uploading',\n size: f.size,\n };\n });\n const merged = [...value, ...newItems].slice(0, maxCount ?? Infinity);\n setValue(merged);\n acceptedFiles.forEach((file, index) => {\n const localId = newItems[index]?.id;\n api\n .uploadFile(file, bucketName)\n .then((uploaded) => {\n const current = ((formData[fieldId] as AttachmentItem[] | undefined) ?? merged).map(\n (item) => (item.id === localId ? { ...uploaded, id: uploaded.id || localId } : item),\n );\n setValue(current);\n })\n .catch(() => undefined);\n });\n };\n\n const handleRemove = (id: string) => {\n const removed = value.find((item) => item.id === id);\n const newValue = value.filter((item) => item.id !== id);\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const ImageUploader = getMobileImageUploader();\n if (ImageUploader) {\n const upload = async (file: File) => {\n const isImage =\n String(file.type || '').startsWith('image/') ||\n /\\.(png|jpe?g|gif|bmp|svg|webp)$/i.test(file.name);\n if (!isImage) throw new Error('只支持图片格式');\n if (maxSize && file.size / 1024 / 1024 > maxSize) throw new Error('图片大小超出限制');\n const uploaded = await api.uploadFile(file, bucketName);\n const item = normalizeAttachmentItem({\n ...uploaded,\n id: uploaded.id || createUid('image'),\n uid: uploaded.uid || uploaded.id,\n url: uploaded.previewUrl || uploaded.url,\n status: 'done',\n });\n getMobileToast()?.show?.({ content: `${file.name} 上传成功` });\n return { key: item.uid || item.id, url: item.previewUrl || item.url, extra: item };\n };\n return (\n <div data-testid={`imagefield-mobile-${fieldId}`}>\n <ImageUploader\n value={value.map((item) => ({\n key: item.uid || item.id,\n url: item.previewUrl || item.url,\n extra: item,\n }))}\n upload={upload}\n onChange={(items: any[]) => {\n setValue(\n (items || []).map((item) =>\n normalizeAttachmentItem(\n item.extra || { id: item.key, uid: item.key, url: item.url },\n ),\n ),\n );\n }}\n maxCount={maxCount}\n multiple={multiple}\n disableUpload={disabled}\n deletable={!disabled}\n showUpload={!maxCount || value.length < maxCount}\n />\n </div>\n );\n }\n\n return (\n <div data-testid={`imagefield-mobile-${fieldId}`}>\n <input\n type=\"file\"\n accept={accept ?? 'image/*'}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileSelect}\n data-testid={`imagefield-file-input-${fieldId}`}\n />\n <div data-testid={`imagefield-grid-${fieldId}`}>\n {value.map((item) => (\n <div key={item.id} data-testid={`imagefield-thumb-${item.id}`}>\n <img src={item.url} alt={item.name} />\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemove(item.id)}\n data-testid={`imagefield-remove-${item.id}`}\n >\n 删除\n </button>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function ImageFieldReadonly({ fieldId, readonlyClassName }: ImageFieldProps) {\n const { formData, api } = useFormContext();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n\n if (value.length === 0) {\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`imagefield-readonly-${fieldId}`}\n >\n --\n </div>\n );\n }\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`imagefield-readonly-${fieldId}`}\n >\n {value.map((item) => (\n <img\n key={item.id}\n src={item.previewUrl || item.url}\n alt={item.name}\n data-testid={`imagefield-readonly-img-${item.id}`}\n style={{ width: 80, height: 80, objectFit: 'cover', marginRight: 8 }}\n onClick={async () => {\n let url = item.previewUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || 'images',\n item.objectName,\n item.name,\n 'preview',\n );\n url = typeof ticket === 'string' ? ticket : ticket?.previewUrl || ticket?.url || url;\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n }}\n />\n ))}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { SubFormFieldPC } from './SubFormFieldPC';\nimport { SubFormFieldMobile } from './SubFormFieldMobile';\nimport { SubFormFieldReadonly } from './SubFormFieldReadonly';\n\nexport function SubFormField(props: SubFormFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: SubFormFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <SubFormFieldReadonly {...childProps} />\n ) : isMobile ? (\n <SubFormFieldMobile {...childProps} />\n ) : (\n <SubFormFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { FieldBehavior, SubFormColumn } from '../../types';\nimport { useComponent } from '../../core/ComponentRegistry';\nimport { FormContext, useFormContext } from '../../core/FormContext';\n\ninterface SubFormCellProps {\n parentFieldId: string;\n rowIndex: number;\n column: SubFormColumn;\n row: Record<string, any>;\n behavior?: FieldBehavior;\n fallbackTestId: string;\n onCellChange: (rowIndex: number, colId: string, value: any) => void;\n}\n\nconst stringifyFallbackValue = (value: any) => {\n if (value === undefined || value === null) return '';\n if (typeof value === 'string' || typeof value === 'number') return value;\n return JSON.stringify(value);\n};\n\nexport function SubFormCell({\n parentFieldId,\n rowIndex,\n column,\n row,\n behavior,\n fallbackTestId,\n onCellChange,\n}: SubFormCellProps) {\n const Component = useComponent(column.componentName);\n const parentContext = useFormContext();\n const scopedFieldId = `${parentFieldId}.${rowIndex}.${column.fieldId}`;\n const cellValue = row[column.fieldId];\n const resolvedBehavior = behavior ?? 'NORMAL';\n\n const childContext = useMemo(\n () => ({\n ...parentContext,\n formData: {\n ...parentContext.formData,\n [scopedFieldId]: cellValue,\n },\n fieldBehaviors: {\n ...parentContext.fieldBehaviors,\n [scopedFieldId]: resolvedBehavior,\n },\n setFieldValue: (fieldId: string, value: any) => {\n if (fieldId === scopedFieldId) {\n onCellChange(rowIndex, column.fieldId, value);\n return;\n }\n parentContext.setFieldValue(fieldId, value);\n },\n getFieldValue: (fieldId: string) =>\n fieldId === scopedFieldId ? cellValue : parentContext.getFieldValue(fieldId),\n getFormData: () => ({\n ...parentContext.getFormData(),\n [scopedFieldId]: cellValue,\n }),\n validateField: (fieldId: string) =>\n fieldId === scopedFieldId ? Promise.resolve(true) : parentContext.validateField(fieldId),\n registerField: (fieldId: string) => {\n if (fieldId !== scopedFieldId) parentContext.registerField(fieldId);\n },\n unregisterField: (fieldId: string) => {\n if (fieldId !== scopedFieldId) parentContext.unregisterField(fieldId);\n },\n }),\n [\n cellValue,\n column.fieldId,\n onCellChange,\n parentContext,\n resolvedBehavior,\n rowIndex,\n scopedFieldId,\n ],\n );\n\n if (!Component) {\n return (\n <input\n value={stringifyFallbackValue(cellValue)}\n disabled={resolvedBehavior === 'DISABLED'}\n onChange={(event) => onCellChange(rowIndex, column.fieldId, event.target.value)}\n data-testid={fallbackTestId}\n />\n );\n }\n\n const columnProps: Record<string, any> = { ...column };\n delete columnProps.fieldId;\n delete columnProps.componentName;\n delete columnProps.label;\n delete columnProps.required;\n delete columnProps.tips;\n\n return (\n <FormContext.Provider value={childContext}>\n <Component\n {...columnProps}\n fieldId={scopedFieldId}\n label=\"\"\n behavior={resolvedBehavior}\n required={false}\n tips={undefined}\n />\n </FormContext.Provider>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { SubFormCell } from './SubFormCell';\n\nexport function SubFormFieldPC({\n fieldId,\n behavior,\n columns,\n maxRows,\n minRows,\n onChange,\n}: SubFormFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const rows = (formData[fieldId] as Record<string, any>[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleAddRow = () => {\n if (maxRows && rows.length >= maxRows) return;\n const emptyRow: Record<string, any> = {};\n columns.forEach((col) => {\n emptyRow[col.fieldId] = col.defaultValue ?? '';\n });\n const newRows = [...rows, emptyRow];\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleRemoveRow = (index: number) => {\n if (minRows && rows.length <= minRows) return;\n const newRows = rows.filter((_, i) => i !== index);\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleCellChange = (rowIndex: number, colId: string, value: any) => {\n const newRows = rows.map((row, i) => (i === rowIndex ? { ...row, [colId]: value } : row));\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const addDisabled = disabled || Boolean(maxRows && rows.length >= maxRows);\n\n return (\n <div className=\"sy-subform sy-subform-pc\" data-testid={`subformfield-pc-${fieldId}`}>\n <div className=\"sy-subform-table-wrap\">\n <table className=\"sy-subform-table\" data-testid={`subformfield-table-${fieldId}`}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.fieldId}>{col.label}</th>\n ))}\n <th>操作</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} data-testid={`subformfield-row-${fieldId}-${rowIndex}`}>\n {columns.map((col) => (\n <td key={col.fieldId}>\n <SubFormCell\n parentFieldId={fieldId}\n rowIndex={rowIndex}\n column={col}\n row={row}\n behavior={behavior}\n fallbackTestId={`subformfield-cell-${fieldId}-${rowIndex}-${col.fieldId}`}\n onCellChange={handleCellChange}\n />\n </td>\n ))}\n <td>\n <button\n type=\"button\"\n disabled={disabled || Boolean(minRows && rows.length <= minRows)}\n className=\"sy-subform-link-button\"\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {rows.length === 0 && <div className=\"sy-subform-empty\">暂无数据</div>}\n <button\n type=\"button\"\n disabled={addDisabled}\n className=\"sy-subform-add-button\"\n onClick={handleAddRow}\n data-testid={`subformfield-add-${fieldId}`}\n >\n 添加行\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { SubFormCell } from './SubFormCell';\n\nexport function SubFormFieldMobile({\n fieldId,\n behavior,\n columns,\n maxRows,\n minRows,\n onChange,\n}: SubFormFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const rows = (formData[fieldId] as Record<string, any>[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n\n const handleAddRow = () => {\n if (maxRows && rows.length >= maxRows) return;\n const emptyRow: Record<string, any> = {};\n columns.forEach((col) => {\n emptyRow[col.fieldId] = col.defaultValue ?? '';\n });\n const newRows = [...rows, emptyRow];\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleRemoveRow = (index: number) => {\n if (minRows && rows.length <= minRows) return;\n const newRows = rows.filter((_, i) => i !== index);\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleCellChange = (rowIndex: number, colId: string, value: any) => {\n const newRows = rows.map((row, i) => (i === rowIndex ? { ...row, [colId]: value } : row));\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const addDisabled = disabled || Boolean(maxRows && rows.length >= maxRows);\n\n return (\n <div className=\"sy-subform sy-subform-mobile\" data-testid={`subformfield-mobile-${fieldId}`}>\n {rows.map((row, rowIndex) => (\n <div\n className=\"sy-subform-card\"\n key={rowIndex}\n data-testid={`subformfield-card-${fieldId}-${rowIndex}`}\n >\n <div className=\"sy-subform-card-head\">\n <strong>第 {rowIndex + 1} 行</strong>\n <button\n type=\"button\"\n disabled={disabled || Boolean(minRows && rows.length <= minRows)}\n className=\"sy-subform-link-button\"\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-mobile-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n </div>\n {columns.map((col) => (\n <div className=\"sy-subform-mobile-cell\" key={col.fieldId}>\n <label>{col.label}</label>\n <SubFormCell\n parentFieldId={fieldId}\n rowIndex={rowIndex}\n column={col}\n row={row}\n behavior={behavior}\n fallbackTestId={`subformfield-mobile-cell-${fieldId}-${rowIndex}-${col.fieldId}`}\n onCellChange={handleCellChange}\n />\n </div>\n ))}\n </div>\n ))}\n {rows.length === 0 && <div className=\"sy-subform-empty\">暂无数据</div>}\n <button\n type=\"button\"\n disabled={addDisabled}\n className=\"sy-subform-add-button\"\n onClick={handleAddRow}\n data-testid={`subformfield-mobile-add-${fieldId}`}\n >\n 添加行\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SubFormFieldReadonly({ fieldId, columns, readonlyClassName }: SubFormFieldProps) {\n const { formData } = useFormContext();\n const rows = (formData[fieldId] as Record<string, any>[] | undefined) ?? [];\n\n if (rows.length === 0) {\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`subformfield-readonly-${fieldId}`}\n >\n --\n </div>\n );\n }\n\n return (\n <table\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`subformfield-readonly-${fieldId}`}\n >\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.fieldId}>{col.label}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} data-testid={`subformfield-readonly-row-${fieldId}-${rowIndex}`}>\n {columns.map((col) => (\n <td key={col.fieldId}>{row[col.fieldId] ?? '--'}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { UserSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { UserSelectFieldPC } from './UserSelectFieldPC';\nimport { UserSelectFieldMobile } from './UserSelectFieldMobile';\nimport { UserSelectFieldReadonly } from './UserSelectFieldReadonly';\n\nexport function UserSelectField(props: UserSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: UserSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <UserSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <UserSelectFieldMobile {...childProps} />\n ) : (\n <UserSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Select } from 'antd';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getUserId, getUserName, normalizeUser } from '../shared/fieldFormat';\nimport { UserPicker } from '../shared/UserPicker';\n\nexport function UserSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = true,\n searchable = true,\n dataSource = [],\n treeData,\n allowClear = true,\n maxCount,\n notFoundContent = '暂无数据',\n onChange,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as UserItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const [optionsSource, setOptionsSource] = useState<UserItem[]>(() =>\n dataSource.map(normalizeUser),\n );\n const [loading, setLoading] = useState(false);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n useEffect(() => {\n if (dataSource.length) {\n setOptionsSource(dataSource.map(normalizeUser));\n }\n }, [dataSource]);\n\n const fetchUsers = async (keyword?: string) => {\n if (dataSource.length) return;\n setLoading(true);\n try {\n const users = await api.getUserList(\n keyword ? { name: keyword, username: keyword } : undefined,\n );\n setOptionsSource(users.map(normalizeUser));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchUsers();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleChange = (selectedIds: string | string[]) => {\n const ids = Array.isArray(selectedIds) ? selectedIds : [selectedIds];\n const selected = ids\n .map(\n (id) =>\n optionsSource.find((u) => getUserId(u) === id) ?? value.find((u) => getUserId(u) === id),\n )\n .filter(Boolean) as UserItem[];\n const result = multiple ? selected.slice(0, maxCount ?? selected.length) : selected.slice(0, 1);\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const handlePickerConfirm = (items: UserItem[]) => {\n const result = multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1);\n const normalized = result.map(normalizeUser);\n setOptionsSource((current) => {\n const merged = [...current];\n for (const item of normalized) {\n if (!merged.some((existing) => getUserId(existing) === getUserId(item))) merged.push(item);\n }\n return merged;\n });\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const options = useMemo(\n () =>\n optionsSource.map((u) => ({\n value: getUserId(u),\n label: getUserName(u),\n })),\n [optionsSource],\n );\n const selectValue = multiple ? value.map(getUserId) : value[0] ? getUserId(value[0]) : undefined;\n\n return (\n <div className=\"sy-select-with-picker\">\n <Select\n className={inputClassName}\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n allowClear={allowClear}\n maxCount={maxCount}\n showSearch={searchable}\n filterOption={dataSource.length ? undefined : false}\n onSearch={searchable ? fetchUsers : undefined}\n loading={loading}\n notFoundContent={loading ? '加载中...' : notFoundContent}\n options={options}\n onChange={handleChange}\n data-testid={`userselectfield-input-${fieldId}`}\n />\n <button\n type=\"button\"\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={() => setPickerOpen(true)}\n data-testid={`userselectfield-picker-trigger-${fieldId}`}\n >\n 选择\n </button>\n {pickerOpen && (\n <UserPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple={multiple}\n value={value}\n dataSource={dataSource}\n treeData={treeData}\n displaySearch={searchable}\n onConfirm={handlePickerConfirm}\n onCancel={() => undefined}\n />\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Avatar, Button, Checkbox, Empty, Input, List, Modal, Space, Spin, Tag, Tree } from 'antd';\nimport { SearchOutlined, TeamOutlined, UserOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi, UserItem } from '../../types';\nimport {\n getDepartmentId,\n getDepartmentName,\n getUserId,\n getUserName,\n normalizeUser,\n} from './fieldFormat';\nimport { useLazyDepartmentTree } from './useLazyDepartmentTree';\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\ninterface UserPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: UserItem[];\n dataSource?: UserItem[];\n treeData?: DepartmentTreeNode[];\n displaySearch?: boolean;\n onConfirm: (items: UserItem[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeUsers(users?: UserItem[]) {\n return (users || []).map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function UserPickerPanel({\n api,\n multiple = true,\n value,\n dataSource,\n treeData,\n displaySearch = true,\n onConfirm,\n onCancel,\n mobile = false,\n}: UserPickerPanelProps) {\n const {\n treeData: deptTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [departmentKeyword, setDepartmentKeyword] = useState('');\n const [memberKeyword, setMemberKeyword] = useState('');\n const [mobileKeyword, setMobileKeyword] = useState('');\n const [currentDeptId, setCurrentDeptId] = useState('');\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [members, setMembers] = useState<UserItem[]>(() => normalizeUsers(dataSource));\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<UserItem[]>(() => normalizeUsers(value));\n const selectedIds = selected.map(getUserId);\n const MobileSearchBar = getMobileComponent('SearchBar');\n\n useEffect(() => {\n if (dataSource?.length) setMembers(normalizeUsers(dataSource));\n }, [dataSource]);\n\n useEffect(() => {\n if (currentDeptId || deptTreeData.length === 0) return;\n setCurrentDeptId(getDepartmentId(deptTreeData[0]));\n setExpandedKeys(deptTreeData.map((node) => getDepartmentId(node)));\n }, [currentDeptId, deptTreeData]);\n\n useEffect(() => {\n let active = true;\n const keyword = (mobile ? mobileKeyword : memberKeyword).trim();\n if (dataSource?.length) {\n const lower = keyword.toLowerCase();\n setMembers(\n normalizeUsers(dataSource).filter((user) =>\n keyword ? getUserName(user).toLowerCase().includes(lower) : true,\n ),\n );\n return;\n }\n setLoading(true);\n const timer = setTimeout(\n () => {\n const request = keyword\n ? api.getUserList({ name: keyword, username: keyword })\n : currentDeptId\n ? api.getDepartmentMembers(currentDeptId)\n : api.getUserList();\n request\n .then((users) => {\n if (active) setMembers(normalizeUsers(users as UserItem[]));\n })\n .catch(() => {\n if (active) setMembers([]);\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n },\n keyword ? 250 : 0,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [api, currentDeptId, dataSource, memberKeyword, mobile, mobileKeyword]);\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: Array<{ id: string; name: string }> = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileDepartments = useMemo(() => {\n const keyword = mobileKeyword.trim().toLowerCase();\n if (keyword) {\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(keyword))\n .map((item) => item.node);\n }\n if (!currentDeptId) return deptTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, deptTreeData, flatNodes, mobileKeyword, nodeMap]);\n\n const toggleUser = (user: UserItem, checked: boolean) => {\n const normalized = normalizeUser(user);\n const id = getUserId(normalized);\n if (!id) return;\n if (multiple) {\n setSelected((prev) => {\n if (checked)\n return prev.some((item) => getUserId(item) === id) ? prev : [...prev, normalized];\n return prev.filter((item) => getUserId(item) !== id);\n });\n return;\n }\n setSelected(checked ? [normalized] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-user-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length} 人</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={getUserId(item)} closable onClose={() => toggleUser(item, false)}>\n {getUserName(item)}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n const renderMemberList = () => (\n <Spin spinning={loading}>\n <List\n dataSource={members}\n locale={{ emptyText: '暂无成员' }}\n renderItem={(user) => {\n const id = getUserId(user);\n const checked = selectedIds.includes(id);\n return (\n <List.Item key={id}>\n <label className=\"sy-user-picker-row\">\n <Checkbox\n checked={checked}\n onChange={(event) => toggleUser(user, event.target.checked)}\n />\n <Avatar size={36} src={user.avatar} icon={!user.avatar && <UserOutlined />} />\n <span>{getUserName(user)}</span>\n </label>\n </List.Item>\n );\n }}\n />\n </Spin>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-user-picker sy-user-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择成员</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar\n placeholder=\"搜索部门或成员\"\n value={mobileKeyword}\n onChange={setMobileKeyword}\n />\n ) : (\n <input value={mobileKeyword} onChange={(event) => setMobileKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => setCurrentDeptId('')}>\n 通讯录\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => setCurrentDeptId(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileDepartments}\n locale={{ emptyText: null }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n return (\n <List.Item\n key={id}\n onClick={async () => {\n await loadChildren(id);\n setCurrentDeptId(id);\n setMobileKeyword('');\n }}\n >\n <List.Item.Meta avatar={<TeamOutlined />} title={getDepartmentName(node)} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderMemberList()}\n {renderSelected()}\n </div>\n );\n }\n\n const lowerDepartmentKeyword = departmentKeyword.trim().toLowerCase();\n const filteredTreeData = lowerDepartmentKeyword\n ? deptTreeData.filter((node) =>\n getDepartmentName(node).toLowerCase().includes(lowerDepartmentKeyword),\n )\n : deptTreeData;\n\n return (\n <div className=\"sy-user-picker\">\n <div className=\"sy-user-picker-main\">\n <div className=\"sy-user-picker-depts\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={departmentKeyword}\n onChange={(event) => setDepartmentKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n selectedKeys={currentDeptId ? [currentDeptId] : []}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onSelect={(keys) => setCurrentDeptId(String(keys[0] || ''))}\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={320}\n />\n </Spin>\n </div>\n <div className=\"sy-user-picker-members\">\n {displaySearch && (\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索成员\"\n value={memberKeyword}\n onChange={(event) => setMemberKeyword(event.target.value)}\n />\n )}\n {renderMemberList()}\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface UserPickerProps extends Omit<UserPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function UserPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: UserPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <UserPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择成员\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(980px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DataNode } from 'antd/es/tree';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from './fieldFormat';\n\nexport interface LazyDepartmentNode extends DataNode, DepartmentTreeNode {\n key: string;\n title: string;\n childrenLoaded?: boolean;\n children?: LazyDepartmentNode[];\n}\n\nexport interface LazyDepartmentFlatNode {\n id: string;\n name: string;\n node: LazyDepartmentNode;\n path: Array<{ id: string; name: string }>;\n}\n\nconst toLazyNode = (node: DepartmentTreeNode): LazyDepartmentNode => {\n const normalized = normalizeDepartmentNode(node);\n const id = getDepartmentId(normalized);\n const name = getDepartmentName(normalized);\n const children = normalized.children?.map(toLazyNode);\n const hasChildren = normalized.hasChildren ?? Boolean(children?.length);\n return {\n ...normalized,\n id,\n name,\n key: id,\n title: name,\n hasChildren,\n isLeaf: normalized.isLeaf ?? !hasChildren,\n childrenLoaded: Boolean(children?.length) || normalized.isLeaf === true || !hasChildren,\n children,\n };\n};\n\nconst replaceChildren = (\n nodes: LazyDepartmentNode[],\n parentId: string,\n children: LazyDepartmentNode[],\n): LazyDepartmentNode[] =>\n nodes.map((node) => {\n if (getDepartmentId(node) === parentId) {\n return {\n ...node,\n children,\n hasChildren: children.length > 0,\n isLeaf: children.length === 0,\n childrenLoaded: true,\n };\n }\n return node.children?.length\n ? { ...node, children: replaceChildren(node.children, parentId, children) }\n : node;\n });\n\nfunction buildIndexes(nodes: LazyDepartmentNode[]) {\n const nodeMap = new Map<string, LazyDepartmentNode>();\n const parentMap = new Map<string, string | null>();\n const flatNodes: LazyDepartmentFlatNode[] = [];\n\n const walk = (\n list: LazyDepartmentNode[],\n parentId: string | null,\n path: Array<{ id: string; name: string }>,\n ) => {\n for (const node of list) {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const nextPath = [...path, { id, name }];\n nodeMap.set(id, node);\n parentMap.set(id, parentId);\n flatNodes.push({ id, name, node, path: nextPath });\n if (node.children?.length) walk(node.children, id, nextPath);\n }\n };\n\n walk(nodes, null, []);\n return { nodeMap, parentMap, flatNodes };\n}\n\nexport function useLazyDepartmentTree(\n api: FormRuntimeApi,\n configuredTreeData?: DepartmentTreeNode[],\n) {\n const [treeData, setTreeDataState] = useState<LazyDepartmentNode[]>(() =>\n (configuredTreeData || []).map(toLazyNode),\n );\n const [treeLoading, setTreeLoading] = useState(false);\n const treeDataRef = useRef(treeData);\n const rootsLoadedRef = useRef(Boolean(configuredTreeData?.length));\n const rootPromiseRef = useRef<Promise<LazyDepartmentNode[]> | null>(null);\n const childPromiseRef = useRef<Record<string, Promise<LazyDepartmentNode[]> | undefined>>({});\n\n const setTreeData = useCallback(\n (next: LazyDepartmentNode[] | ((prev: LazyDepartmentNode[]) => LazyDepartmentNode[])) => {\n const resolved = typeof next === 'function' ? next(treeDataRef.current) : next;\n treeDataRef.current = resolved;\n setTreeDataState(resolved);\n return resolved;\n },\n [],\n );\n\n useEffect(() => {\n if (!configuredTreeData) return;\n const next = configuredTreeData.map(toLazyNode);\n rootsLoadedRef.current = next.length > 0;\n setTreeData(next);\n }, [configuredTreeData, setTreeData]);\n\n const loadRootDepartments = useCallback(async () => {\n if (rootsLoadedRef.current) return treeDataRef.current;\n if (rootPromiseRef.current) return rootPromiseRef.current;\n setTreeLoading(true);\n const promise = api\n .getDepartmentRoots()\n .then((nodes) => {\n const next = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n rootsLoadedRef.current = true;\n setTreeData(next);\n return next;\n })\n .finally(() => {\n rootPromiseRef.current = null;\n setTreeLoading(false);\n });\n rootPromiseRef.current = promise;\n return promise;\n }, [api, setTreeData]);\n\n const loadChildren = useCallback(\n async (parentId: string) => {\n const id = String(parentId || '');\n if (!id) return [];\n const current = flattenDepartments(treeDataRef.current).find((item) => item.id === id)\n ?.node as LazyDepartmentNode | undefined;\n if (!current || current.childrenLoaded || current.isLeaf || current.hasChildren === false) {\n return current?.children || [];\n }\n if (childPromiseRef.current[id]) return childPromiseRef.current[id];\n const promise = api\n .getDepartmentChildren(id)\n .then((nodes) => {\n const children = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n setTreeData((prev) => replaceChildren(prev, id, children));\n return children;\n })\n .finally(() => {\n delete childPromiseRef.current[id];\n });\n childPromiseRef.current[id] = promise;\n return promise;\n },\n [api, setTreeData],\n );\n\n const indexes = useMemo(() => buildIndexes(treeData), [treeData]);\n\n useEffect(() => {\n void loadRootDepartments();\n }, [loadRootDepartments]);\n\n return {\n treeData,\n treeLoading,\n ...indexes,\n loadRootDepartments,\n loadChildren,\n };\n}\n","import React, { useEffect, useState } from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getUserId, getUserName, normalizeUser } from '../shared/fieldFormat';\nimport { UserPicker } from '../shared/UserPicker';\n\nconst getMobilePopup = () => {\n try {\n return (MobileAntd as any).Popup;\n } catch {\n return undefined;\n }\n};\n\nexport function UserSelectFieldMobile({\n fieldId,\n behavior,\n placeholder,\n multiple = true,\n dataSource = [],\n treeData,\n maxCount,\n onChange,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as UserItem[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const [showPicker, setShowPicker] = useState(false);\n const [optionsSource, setOptionsSource] = useState<UserItem[]>(() =>\n dataSource.map(normalizeUser),\n );\n\n useEffect(() => {\n if (dataSource.length) {\n setOptionsSource(dataSource.map(normalizeUser));\n }\n }, [dataSource]);\n\n const ensureUsers = async () => {\n if (dataSource.length || optionsSource.length) return;\n const users = await api.getUserList();\n setOptionsSource(users.map(normalizeUser));\n };\n\n const handleSelect = (userId: string) => {\n const user = optionsSource.find((u) => getUserId(u) === userId);\n /* v8 ignore next */\n if (!user) return;\n\n let newValue: UserItem[];\n if (multiple) {\n const exists = value.some((u) => getUserId(u) === userId);\n newValue = exists ? value.filter((u) => getUserId(u) !== userId) : [...value, user];\n newValue = newValue.slice(0, maxCount ?? newValue.length);\n } else {\n newValue = [user];\n setShowPicker(false);\n }\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\n };\n\n const handleConfirm = (items: UserItem[]) => {\n const next = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n normalizeUser,\n );\n setFieldValue(fieldId, next);\n onChange?.(next);\n setShowPicker(false);\n };\n\n return (\n <div data-testid={`userselectfield-mobile-${fieldId}`}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n setShowPicker(!showPicker);\n ensureUsers();\n }}\n data-testid={`userselectfield-mobile-trigger-${fieldId}`}\n >\n {value.length > 0 ? value.map(getUserName).join(', ') : placeholder || '请选择'}\n </button>\n {showPicker && getMobilePopup() ? (\n <UserPicker\n api={api}\n open={showPicker}\n onOpenChange={setShowPicker}\n mobile\n multiple={multiple}\n value={value}\n dataSource={dataSource}\n treeData={treeData}\n onConfirm={handleConfirm}\n onCancel={() => setShowPicker(false)}\n />\n ) : showPicker ? (\n <ul data-testid={`userselectfield-mobile-list-${fieldId}`}>\n {optionsSource.map((user) => (\n <li key={getUserId(user)}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(getUserId(user))}\n data-testid={`userselectfield-mobile-option-${getUserId(user)}`}\n >\n {getUserName(user)}\n {value.some((u) => getUserId(u) === getUserId(user)) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function UserSelectFieldReadonly({ fieldId, readonlyClassName }: UserSelectFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as UserItem[] | undefined) ?? [];\n\n const display = value.length > 0 ? value.map((u) => u.name).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`userselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { DepartmentSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { DepartmentSelectFieldPC } from './DepartmentSelectFieldPC';\nimport { DepartmentSelectFieldMobile } from './DepartmentSelectFieldMobile';\nimport { DepartmentSelectFieldReadonly } from './DepartmentSelectFieldReadonly';\n\nexport function DepartmentSelectField(props: DepartmentSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: DepartmentSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <DepartmentSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <DepartmentSelectFieldMobile {...childProps} />\n ) : (\n <DepartmentSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { TreeSelect } from 'antd';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from '../shared/fieldFormat';\nimport { DepartmentPicker } from '../shared/DepartmentPicker';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nfunction convertTreeData(nodes: DepartmentTreeNode[]): any[] {\n return nodes.map((node) => ({\n value: getDepartmentId(node),\n title: getDepartmentName(node),\n isLeaf: node.isLeaf ?? !node.hasChildren,\n children: node.children ? convertTreeData(node.children) : undefined,\n }));\n}\n\nexport function DepartmentSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = false,\n treeData,\n allowClear = true,\n maxCount,\n onChange,\n}: DepartmentSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as { id: string; name: string }[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const configuredTreeData = treeData ?? EMPTY_TREE_DATA;\n const remoteLoadedRef = useRef(false);\n const [loadedTreeData, setLoadedTreeData] = useState<DepartmentTreeNode[]>(configuredTreeData);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData.map(normalizeDepartmentNode));\n return;\n }\n if (remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n api\n .getDepartmentRoots()\n .then((nodes) =>\n setLoadedTreeData((nodes as DepartmentTreeNode[]).map(normalizeDepartmentNode)),\n );\n }, [api, configuredTreeData]);\n\n const allDepts = flattenDepartments(loadedTreeData);\n\n const handleChange = (selectedIds: string | string[]) => {\n const ids = Array.isArray(selectedIds) ? selectedIds : [selectedIds];\n const selected = ids\n .map((id) => allDepts.find((d) => d.id === id) ?? value.find((d) => d.id === id))\n .filter(Boolean) as { id: string; name: string }[];\n const result = (\n multiple ? selected.slice(0, maxCount ?? selected.length) : selected.slice(0, 1)\n ).map((item) => ({ id: item.id, name: item.name }));\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const handlePickerConfirm = (items: { id: string; name: string }[]) => {\n const result = multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1);\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const treeDataConverted = convertTreeData(loadedTreeData);\n const selectValue = multiple ? value.map((d) => d.id) : value[0]?.id;\n\n return (\n <div className=\"sy-select-with-picker\">\n <TreeSelect\n className={inputClassName}\n style={{ width: '100%' }}\n multiple={multiple}\n maxCount={maxCount}\n allowClear={allowClear}\n treeData={treeDataConverted}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleChange}\n loadData={async (node: any) => {\n if (configuredTreeData.length) return;\n const children = await api.getDepartmentChildren(String(node.value));\n setLoadedTreeData((current) => {\n const attach = (items: DepartmentTreeNode[]): DepartmentTreeNode[] =>\n items.map((item) => {\n const id = getDepartmentId(item);\n if (id === String(node.value)) {\n return {\n ...item,\n children: (children as DepartmentTreeNode[]).map(normalizeDepartmentNode),\n };\n }\n return item.children ? { ...item, children: attach(item.children) } : item;\n });\n return attach(current);\n });\n }}\n treeDefaultExpandAll={Boolean(configuredTreeData.length)}\n data-testid={`deptselectfield-input-${fieldId}`}\n />\n <button\n type=\"button\"\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={() => setPickerOpen(true)}\n data-testid={`deptselectfield-picker-trigger-${fieldId}`}\n >\n 选择\n </button>\n {pickerOpen && (\n <DepartmentPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple={multiple}\n value={value}\n treeData={treeData}\n onConfirm={handlePickerConfirm}\n onCancel={() => undefined}\n />\n )}\n </div>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { Button, Checkbox, Empty, Input, List, Modal, Space, Spin, Tag, Tree } from 'antd';\nimport type { TreeProps } from 'antd';\nimport { ApartmentOutlined, SearchOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport { getDepartmentId, getDepartmentName } from './fieldFormat';\nimport { useLazyDepartmentTree, type LazyDepartmentNode } from './useLazyDepartmentTree';\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\nexport interface DepartmentValue {\n id: string;\n name: string;\n}\n\ninterface DepartmentPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: DepartmentValue[];\n treeData?: DepartmentTreeNode[];\n onConfirm: (items: DepartmentValue[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeSelection(items: DepartmentValue[]) {\n return items\n .map((item) => ({ id: String(item.id || ''), name: String(item.name || item.id || '') }))\n .filter((item) => item.id);\n}\n\nfunction matchSearch(nodes: LazyDepartmentNode[], keyword: string): LazyDepartmentNode[] {\n if (!keyword) return nodes;\n const lower = keyword.toLowerCase();\n return nodes\n .map((node) => {\n const name = getDepartmentName(node);\n const children = node.children ? matchSearch(node.children, keyword) : undefined;\n if (name.toLowerCase().includes(lower) || children?.length) {\n return { ...node, children };\n }\n return null;\n })\n .filter(Boolean) as LazyDepartmentNode[];\n}\n\nexport function DepartmentPickerPanel({\n api,\n multiple = false,\n value,\n treeData,\n onConfirm,\n onCancel,\n mobile = false,\n}: DepartmentPickerPanelProps) {\n const {\n treeData: loadedTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [keyword, setKeyword] = useState('');\n const [selected, setSelected] = useState<DepartmentValue[]>(() => normalizeSelection(value));\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [currentDeptId, setCurrentDeptId] = useState<string | null>(null);\n const selectedIds = selected.map((item) => item.id);\n const MobileSearchBar = getMobileComponent('SearchBar');\n\n const filteredTreeData = useMemo(\n () => matchSearch(loadedTreeData, keyword.trim()),\n [keyword, loadedTreeData],\n );\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: DepartmentValue[] = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileList = useMemo(() => {\n if (keyword.trim()) {\n const lower = keyword.trim().toLowerCase();\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(lower))\n .map((item) => item.node);\n }\n if (!currentDeptId) return loadedTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, flatNodes, keyword, loadedTreeData, nodeMap]);\n\n const upsertSelected = (department: DepartmentValue, checked: boolean) => {\n if (multiple) {\n setSelected((prev) => {\n if (checked) {\n return prev.some((item) => item.id === department.id) ? prev : [...prev, department];\n }\n return prev.filter((item) => item.id !== department.id);\n });\n return;\n }\n setSelected(checked ? [department] : []);\n };\n\n const handleTreeCheck: TreeProps['onCheck'] = (keys) => {\n const checkedKeys = Array.isArray(keys) ? keys : keys.checked;\n const next = checkedKeys\n .map((key) => {\n const node = nodeMap.get(String(key));\n return node ? { id: getDepartmentId(node), name: getDepartmentName(node) } : undefined;\n })\n .filter(Boolean) as DepartmentValue[];\n setSelected(next);\n };\n\n const handleTreeSelect: TreeProps['onSelect'] = (keys) => {\n const id = String(keys[0] || '');\n const node = id ? nodeMap.get(id) : undefined;\n setSelected(node ? [{ id, name: getDepartmentName(node) }] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-org-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length}</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={item.id} closable onClose={() => upsertSelected(item, false)}>\n {item.name}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-org-picker sy-org-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择部门</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar placeholder=\"搜索部门\" value={keyword} onChange={setKeyword} />\n ) : (\n <input value={keyword} onChange={(event) => setKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => setCurrentDeptId(null)}>\n 部门\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => setCurrentDeptId(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileList}\n locale={{ emptyText: '暂无部门' }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const selectedNow = selectedIds.includes(id);\n const hasChildren = Boolean(node.hasChildren && !node.isLeaf);\n return (\n <List.Item\n key={id}\n actions={[\n <Checkbox\n key=\"select\"\n checked={selectedNow}\n onChange={(event) => upsertSelected({ id, name }, event.target.checked)}\n />,\n hasChildren ? (\n <button\n key=\"children\"\n type=\"button\"\n onClick={async () => {\n await loadChildren(id);\n setCurrentDeptId(id);\n setKeyword('');\n }}\n >\n 下级\n </button>\n ) : null,\n ]}\n >\n <List.Item.Meta avatar={<ApartmentOutlined />} title={name} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderSelected()}\n </div>\n );\n }\n\n return (\n <div className=\"sy-org-picker\">\n <div className=\"sy-org-picker-main\">\n <div className=\"sy-org-picker-tree\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={keyword}\n onChange={(event) => setKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n checkable={multiple}\n checkedKeys={multiple ? selectedIds : undefined}\n selectedKeys={multiple ? undefined : selectedIds}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onCheck={multiple ? handleTreeCheck : undefined}\n onSelect={multiple ? undefined : handleTreeSelect}\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={360}\n />\n </Spin>\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface DepartmentPickerProps extends Omit<DepartmentPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function DepartmentPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: DepartmentPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <DepartmentPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择部门\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(760px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n flattenDepartments,\n getDepartmentName,\n normalizeDepartmentNode,\n} from '../shared/fieldFormat';\nimport { DepartmentPicker } from '../shared/DepartmentPicker';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nconst getMobilePopup = () => {\n try {\n return (MobileAntd as any).Popup;\n } catch {\n return undefined;\n }\n};\n\nexport function DepartmentSelectFieldMobile({\n fieldId,\n behavior,\n placeholder,\n multiple = false,\n treeData,\n maxCount,\n onChange,\n}: DepartmentSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = (formData[fieldId] as { id: string; name: string }[] | undefined) ?? [];\n const disabled = behavior === 'DISABLED';\n const [showPicker, setShowPicker] = useState(false);\n const configuredTreeData = treeData ?? EMPTY_TREE_DATA;\n const remoteLoadedRef = useRef(false);\n const [loadedTreeData, setLoadedTreeData] = useState<DepartmentTreeNode[]>(configuredTreeData);\n\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData.map(normalizeDepartmentNode));\n }\n }, [configuredTreeData]);\n\n const ensureDepartments = async () => {\n if (configuredTreeData.length || loadedTreeData.length || remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n const roots = await api.getDepartmentRoots();\n setLoadedTreeData((roots as DepartmentTreeNode[]).map(normalizeDepartmentNode));\n };\n\n const allDepts = flattenDepartments(loadedTreeData);\n\n const handleSelect = (deptId: string) => {\n const dept = allDepts.find((d) => d.id === deptId);\n /* v8 ignore next */\n if (!dept) return;\n\n let newValue: { id: string; name: string }[];\n if (multiple) {\n const exists = value.some((d) => d.id === deptId);\n newValue = exists ? value.filter((d) => d.id !== deptId) : [...value, dept];\n newValue = newValue.slice(0, maxCount ?? newValue.length);\n } else {\n newValue = [dept];\n setShowPicker(false);\n }\n const normalized = newValue.map((item) => ({ id: item.id, name: item.name }));\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const handleConfirm = (items: { id: string; name: string }[]) => {\n const next = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n (item) => ({ id: item.id, name: item.name }),\n );\n setFieldValue(fieldId, next);\n onChange?.(next);\n setShowPicker(false);\n };\n\n return (\n <div data-testid={`deptselectfield-mobile-${fieldId}`}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n setShowPicker(!showPicker);\n ensureDepartments();\n }}\n data-testid={`deptselectfield-mobile-trigger-${fieldId}`}\n >\n {value.length > 0 ? value.map((d) => d.name).join(', ') : placeholder || '请选择'}\n </button>\n {showPicker && getMobilePopup() ? (\n <DepartmentPicker\n api={api}\n open={showPicker}\n onOpenChange={setShowPicker}\n mobile\n multiple={multiple}\n value={value}\n treeData={treeData}\n onConfirm={handleConfirm}\n onCancel={() => setShowPicker(false)}\n />\n ) : showPicker ? (\n <ul data-testid={`deptselectfield-mobile-list-${fieldId}`}>\n {allDepts.map((dept) => (\n <li key={dept.id}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(dept.id)}\n data-testid={`deptselectfield-mobile-option-${dept.id}`}\n >\n {getDepartmentName(dept)}\n {value.some((d) => d.id === dept.id) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport type { DepartmentSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function DepartmentSelectFieldReadonly({\n fieldId,\n readonlyClassName,\n}: DepartmentSelectFieldProps) {\n const { formData } = useFormContext();\n const value = (formData[fieldId] as { id: string; name: string }[] | undefined) ?? [];\n\n const display = value.length > 0 ? value.map((d) => d.name).join(', ') : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`deptselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Cascader } from 'antd';\nimport type { CascadeSelectFieldProps, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst toValuePath = (value: any, multiple?: boolean) => {\n if (!value) return multiple ? [] : [];\n if (multiple && Array.isArray(value) && Array.isArray(value[0])) {\n return value.map((path: OptionItem[]) => path.map((item) => item.value));\n }\n if (Array.isArray(value)) return value.map((item) => item.value);\n return [];\n};\n\nconst normalizePath = (selectedOptions?: any[]) =>\n (selectedOptions ?? []).map((item) => ({\n label: String(item?.label ?? item?.title ?? item?.value ?? ''),\n value: String(item?.value ?? ''),\n }));\n\nexport function CascadeSelectField(props: CascadeSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n options = [],\n multiple = false,\n allowClear = true,\n changeOnSelect,\n showSearch,\n fieldNames,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] ?? (multiple ? [] : []);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n const readonlyText = Array.isArray(value)\n ? (multiple && Array.isArray(value[0]) ? value.flat() : value)\n .map((item: any) => item?.label ?? item?.value ?? item)\n .join(' / ')\n : '--';\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`cascadeselectfield-readonly-${fieldId}`}\n >\n {readonlyText || '--'}\n </div>\n ) : (\n <Cascader\n className={inputClassName}\n style={{ width: '100%' }}\n options={options}\n multiple={multiple}\n allowClear={allowClear}\n changeOnSelect={changeOnSelect}\n showSearch={showSearch}\n fieldNames={fieldNames as any}\n disabled={behavior === 'DISABLED'}\n placeholder={placeholder}\n value={toValuePath(value, multiple) as any}\n onChange={(_nextValue: any, selectedOptions: any) => {\n const next = multiple\n ? ((selectedOptions as any[][]) ?? []).map((path) => normalizePath(path))\n : normalizePath(selectedOptions as any[]);\n setFieldValue(fieldId, next);\n onChange?.(next);\n }}\n data-testid={`cascadeselectfield-input-${fieldId}`}\n />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Cascader, Input, Space, Spin } from 'antd';\nimport * as MobileAntd from 'antd-mobile';\nimport type { AddressFieldProps, AddressValue, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\n\nconst LEVELS = ['province', 'city', 'district', 'street'] as const;\n\ntype AddressLevel = (typeof LEVELS)[number];\ntype AddressOption = OptionItem & {\n level?: AddressLevel;\n isLeaf?: boolean;\n children?: AddressOption[];\n};\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\nconst modeDepth = (mode?: AddressFieldProps['mode']) => {\n if (mode === 'province-city') return 2;\n if (mode === 'province-city-district-street' || mode === 'province-city-district-street-detail') {\n return 4;\n }\n return 3;\n};\n\nconst activeLevels = (mode?: AddressFieldProps['mode']) => LEVELS.slice(0, modeDepth(mode));\n\nconst valueToPath = (value?: AddressValue) =>\n LEVELS.map((level) => value?.[level]?.value).filter(Boolean) as string[];\n\nconst normalizeDivision = (item: any, level: AddressLevel, depth: number, index: number) => ({\n label: String(item.name || item.label || item.adcode || item.value),\n value: String(item.adcode || item.value || item.id),\n level,\n isLeaf: index + 1 >= depth || item.isLeaf === true,\n});\n\nconst composeFullAddress = (value?: AddressValue, levels: readonly AddressLevel[] = LEVELS) => {\n if (!value) return '';\n return [...levels.map((level) => value[level]?.label), value.detail].filter(Boolean).join('');\n};\n\nexport function AddressField(props: AddressFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n defaultValue,\n mode = 'province-city-district',\n detailPlaceholder = '请输入详细地址',\n allowClear = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as AddressValue | undefined;\n const [options, setOptions] = useState<AddressOption[]>([]);\n const [loadingRoots, setLoadingRoots] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileLevelIndex, setMobileLevelIndex] = useState(0);\n const [mobileOptions, setMobileOptions] = useState<AddressOption[]>([]);\n const [mobileLoading, setMobileLoading] = useState(false);\n const [tempValue, setTempValue] = useState<AddressValue | undefined>();\n const depth = modeDepth(mode);\n const levels = useMemo(() => activeLevels(mode), [mode]);\n const detailEnabled = mode === 'province-city-district-street-detail';\n const disabled = behavior === 'DISABLED';\n const MobilePopup = getMobileComponent('Popup');\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const loadDivisions = async (\n parentAdcode: string | undefined,\n level: AddressLevel,\n index: number,\n ) => {\n const list = await api.getChinaDivisions(parentAdcode);\n return list.map((item: any) => normalizeDivision(item, level, depth, index));\n };\n\n useEffect(() => {\n setLoadingRoots(true);\n loadDivisions(undefined, 'province', 0)\n .then(setOptions)\n .finally(() => setLoadingRoots(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, depth]);\n\n useEffect(() => {\n if (!mobileOpen) return;\n const level = levels[mobileLevelIndex] || 'province';\n const parentLevel = levels[mobileLevelIndex - 1];\n const parentAdcode = parentLevel ? tempValue?.[parentLevel]?.value : undefined;\n setMobileLoading(true);\n loadDivisions(parentAdcode, level, mobileLevelIndex)\n .then(setMobileOptions)\n .finally(() => setMobileLoading(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mobileOpen, mobileLevelIndex, tempValue, levels]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setAddressValue = (next: AddressValue | undefined) => {\n const normalized = next\n ? { ...next, fullAddress: composeFullAddress(next, levels) }\n : undefined;\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const display = value?.fullAddress || composeFullAddress(value, levels) || '--';\n\n const renderDetailInput = (\n currentValue?: AddressValue,\n onCommit?: (next?: AddressValue) => void,\n ) =>\n detailEnabled ? (\n <Input\n value={currentValue?.detail ?? ''}\n disabled={disabled}\n placeholder={detailPlaceholder}\n onChange={(event) => {\n const next = {\n ...(currentValue ?? {}),\n detail: event.target.value,\n };\n onCommit?.(next);\n }}\n />\n ) : null;\n\n const mobilePicker = MobilePopup ? (\n <MobilePopup\n visible={mobileOpen}\n onMaskClick={() => setMobileOpen(false)}\n bodyStyle={{ height: '80vh' }}\n >\n <div className=\"sy-address-mobile\">\n <div className=\"sy-address-mobile-head\">\n <button\n type=\"button\"\n disabled={mobileLevelIndex === 0}\n onClick={() => setMobileLevelIndex((prev) => Math.max(0, prev - 1))}\n >\n 返回\n </button>\n <strong>{['省份', '城市', '区县', '街道'][mobileLevelIndex] || '地址'}</strong>\n <button type=\"button\" onClick={() => setMobileOpen(false)}>\n 关闭\n </button>\n </div>\n <div className=\"sy-address-mobile-path\">\n {levels.map((level, index) => (\n <button\n type=\"button\"\n key={level}\n className={index === mobileLevelIndex ? 'is-active' : undefined}\n disabled={!tempValue?.[level] && index > 0}\n onClick={() => setMobileLevelIndex(index)}\n >\n {tempValue?.[level]?.label || ['省', '市', '区', '街道'][index]}\n </button>\n ))}\n </div>\n <div className=\"sy-address-mobile-list\">\n {mobileLoading ? (\n <Spin />\n ) : mobileOptions.length ? (\n mobileOptions.map((option) => (\n <button\n type=\"button\"\n key={option.value}\n className={\n tempValue?.[option.level || 'province']?.value === option.value\n ? 'is-active'\n : undefined\n }\n onClick={() => {\n const level = levels[mobileLevelIndex];\n if (!level) return;\n const next: AddressValue = { ...(tempValue ?? {}) };\n next[level] = { label: option.label, value: option.value };\n levels.slice(mobileLevelIndex + 1).forEach((laterLevel) => {\n delete next[laterLevel];\n });\n setTempValue(next);\n if (mobileLevelIndex < levels.length - 1) {\n setMobileLevelIndex(mobileLevelIndex + 1);\n }\n }}\n >\n {option.label}\n </button>\n ))\n ) : (\n <div className=\"sy-empty\">暂无数据</div>\n )}\n </div>\n {detailEnabled && (\n <div className=\"sy-address-mobile-detail\">\n {renderDetailInput(tempValue, (next) => setTempValue(next))}\n </div>\n )}\n <div className=\"sy-address-mobile-footer\">\n <Button onClick={() => setMobileOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n onClick={() => {\n setAddressValue(tempValue);\n setMobileOpen(false);\n }}\n >\n 确定\n </Button>\n </div>\n </div>\n </MobilePopup>\n ) : null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div className=\"sy-field-readonly-value\" data-testid={`addressfield-readonly-${fieldId}`}>\n {display}\n </div>\n ) : isMobile && MobilePopup ? (\n <div className={inputClassName} data-testid={`addressfield-input-${fieldId}`}>\n <Space.Compact style={{ width: '100%' }}>\n <Button\n style={{ flex: 1, textAlign: 'left' }}\n disabled={disabled}\n onClick={() => {\n setTempValue(value);\n setMobileLevelIndex(0);\n setMobileOpen(true);\n }}\n >\n {display === '--' ? props.placeholder || '请选择地址' : display}\n </Button>\n {allowClear && (\n <Button disabled={disabled} onClick={() => setAddressValue(undefined)}>\n 清空\n </Button>\n )}\n </Space.Compact>\n {mobilePicker}\n </div>\n ) : (\n <div className={inputClassName} data-testid={`addressfield-input-${fieldId}`}>\n <Cascader\n style={{ width: '100%' }}\n options={options}\n allowClear={allowClear}\n disabled={disabled}\n value={valueToPath(value)}\n placeholder={props.placeholder || '请选择地址'}\n loading={loadingRoots}\n loadData={async (selectedOptions) => {\n const target = selectedOptions[selectedOptions.length - 1] as AddressOption;\n const nextLevel = levels[selectedOptions.length] ?? 'street';\n const children = await loadDivisions(target.value, nextLevel, selectedOptions.length);\n target.children = children;\n setOptions([...options]);\n }}\n onChange={(_path, selectedOptions) => {\n if (!selectedOptions?.length) {\n setAddressValue(undefined);\n return;\n }\n const next: AddressValue = {};\n selectedOptions.forEach((item: any, index) => {\n const level = levels[index];\n if (level) next[level] = { label: item.label, value: item.value };\n });\n next.detail = value?.detail;\n setAddressValue(next);\n }}\n />\n {renderDetailInput(value, setAddressValue)}\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Button, Drawer, Input, Modal, Select, Space, Spin, Table, Tag } from 'antd';\nimport type { ColumnsType, TablePaginationConfig } from 'antd/es/table';\nimport type { AssociationFormFieldProps, AssociationValue } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\n\ntype AssociationRecord = Record<string, any> & {\n __associationLabel: string;\n __associationValue: string | number;\n};\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nconst normalizeValues = (value: any): AssociationValue[] => {\n if (!value) return [];\n return (Array.isArray(value) ? value : [value]).filter(\n (item) => item && item.value !== undefined && item.value !== null,\n );\n};\n\nconst normalizeCellValue = (value: any) => {\n if (value === undefined || value === null || value === '') return '--';\n if (typeof value === 'object') {\n if ('label' in value) return String(value.label ?? '--');\n if ('name' in value) return String(value.name ?? '--');\n return JSON.stringify(value);\n }\n return String(value);\n};\n\nconst normalizeSearchResult = (result: any) => {\n const payload = result?.data ?? result?.result ?? result ?? {};\n const list = Array.isArray(payload)\n ? payload\n : payload.list || payload.items || payload.records || payload.data || [];\n return {\n list: Array.isArray(list) ? list : [],\n total: payload.total ?? payload.totalCount ?? payload.count ?? list.length ?? 0,\n };\n};\n\nexport function AssociationFormField(props: AssociationFormFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n associationForm,\n multiple = false,\n allowClear = true,\n showSearch = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeValues(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const [options, setOptions] = useState<AssociationValue[]>([]);\n const [selectLoading, setSelectLoading] = useState(false);\n const [selectorOpen, setSelectorOpen] = useState(false);\n const [tableLoading, setTableLoading] = useState(false);\n const [tableData, setTableData] = useState<AssociationRecord[]>([]);\n const [keyword, setKeyword] = useState('');\n const [pagination, setPagination] = useState({\n current: 1,\n pageSize: DEFAULT_PAGE_SIZE,\n total: 0,\n });\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);\n const [selectedRecords, setSelectedRecords] = useState<AssociationRecord[]>([]);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, normalizeValues(defaultValue));\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const canQuery = Boolean(associationForm?.appType && associationForm?.formUuid);\n\n const normalizeRecord = useCallback(\n (record: Record<string, any>): AssociationRecord => {\n const mainFieldValue = associationForm?.mainFieldId\n ? record?.[associationForm.mainFieldId]\n : undefined;\n const labelText = normalizeCellValue(mainFieldValue);\n const valueId =\n record?.formInstId ??\n record?.formInstID ??\n record?.bizObjectId ??\n record?.id ??\n record?.dataId ??\n record?.uuid ??\n labelText;\n return {\n ...record,\n __associationLabel: labelText,\n __associationValue: valueId,\n };\n },\n [associationForm?.mainFieldId],\n );\n\n const toValue = useCallback(\n (record: AssociationRecord): AssociationValue => ({\n label: record.__associationLabel,\n value: record.__associationValue,\n record,\n }),\n [],\n );\n\n const buildFilters = useCallback(() => {\n const rules = associationForm?.dataFilterRules || [];\n return rules\n .map((rule) => {\n if (!rule?.key) return null;\n const sourceValue =\n rule.valueType === 'currentField' && rule.currentFieldKey\n ? formData[rule.currentFieldKey]\n : rule.value;\n if (sourceValue === undefined || sourceValue === null || sourceValue === '') return null;\n return {\n key: rule.key,\n operator: rule.operator || 'EQ',\n componentName: rule.componentName,\n value:\n typeof sourceValue === 'object' && 'value' in sourceValue\n ? sourceValue.value\n : sourceValue,\n };\n })\n .filter(Boolean);\n }, [associationForm?.dataFilterRules, formData]);\n\n const fetchRecords = useCallback(\n async (params?: { currentPage?: number; pageSize?: number; searchKeyWord?: string }) => {\n if (!canQuery) return { list: [] as AssociationRecord[], total: 0 };\n const filters = buildFilters();\n const result = await api.advancedSearch({\n appType: associationForm?.appType,\n formUuid: associationForm?.formUuid,\n currentPage: params?.currentPage || 1,\n pageSize: params?.pageSize || DEFAULT_PAGE_SIZE,\n searchKeyWord: params?.searchKeyWord,\n ...(filters.length\n ? {\n filters: JSON.stringify(filters),\n conditionType: associationForm?.dataFilterConditionType || 'AND',\n }\n : {}),\n });\n const normalized = normalizeSearchResult(result);\n return {\n list: normalized.list.map((record: any) => normalizeRecord(record)),\n total: normalized.total,\n };\n },\n [api, associationForm, buildFilters, canQuery, normalizeRecord],\n );\n\n const loadOptions = useCallback(\n async (searchKeyWord?: string) => {\n setSelectLoading(true);\n try {\n const result = await fetchRecords({ currentPage: 1, pageSize: 20, searchKeyWord });\n setOptions(result.list.map(toValue));\n } finally {\n setSelectLoading(false);\n }\n },\n [fetchRecords, toValue],\n );\n\n const loadTable = useCallback(\n async (next?: Partial<typeof pagination> & { searchKeyWord?: string }) => {\n setTableLoading(true);\n const current = next?.current || 1;\n const pageSize = next?.pageSize || pagination.pageSize;\n try {\n const result = await fetchRecords({\n currentPage: current,\n pageSize,\n searchKeyWord: next?.searchKeyWord ?? keyword,\n });\n setTableData(result.list);\n setPagination({ current, pageSize, total: result.total });\n } finally {\n setTableLoading(false);\n }\n },\n [fetchRecords, keyword, pagination.pageSize],\n );\n\n useEffect(() => {\n void loadOptions();\n }, [loadOptions]);\n\n useEffect(() => {\n setSelectedRowKeys(value.map((item) => item.value));\n setSelectedRecords(\n value\n .map((item) =>\n item.record ? normalizeRecord(item.record as Record<string, any>) : undefined,\n )\n .filter(Boolean) as AssociationRecord[],\n );\n }, [normalizeRecord, value]);\n\n const applyDataFilling = useCallback(\n (next: AssociationValue[]) => {\n if (!associationForm?.dataFillingEnabled && !associationForm?.dataFillingRules?.mainRules) {\n return;\n }\n const sourceRecord = next[0]?.record;\n if (!sourceRecord) return;\n (associationForm?.dataFillingRules?.mainRules || []).forEach((rule) => {\n if (!rule?.source || !rule?.target) return;\n setFieldValue(rule.target, sourceRecord[rule.source]);\n });\n },\n [associationForm?.dataFillingEnabled, associationForm?.dataFillingRules, setFieldValue],\n );\n\n const commitSelection = useCallback(\n (next: AssociationValue[]) => {\n const normalized = multiple ? next : next.slice(0, 1);\n setFieldValue(fieldId, normalized);\n applyDataFilling(normalized);\n onChange?.(normalized);\n },\n [applyDataFilling, fieldId, multiple, onChange, setFieldValue],\n );\n\n const selectorColumns: ColumnsType<AssociationRecord> = useMemo(() => {\n const configured = associationForm?.selectorColumns || [];\n if (configured.length) {\n return configured\n .map((column) => {\n if (typeof column === 'string') {\n return { title: column, dataIndex: column, key: column, ellipsis: true };\n }\n return {\n title: column.title || column.dataIndex,\n dataIndex: column.dataIndex,\n key: column.key || column.dataIndex,\n width: column.width,\n ellipsis: column.ellipsis ?? true,\n render: (cellValue: any, record: AssociationRecord) =>\n column.dataIndex === associationForm?.mainFieldId\n ? normalizeCellValue(record.__associationLabel)\n : normalizeCellValue(cellValue),\n };\n })\n .filter(Boolean) as ColumnsType<AssociationRecord>;\n }\n const mainFieldId = associationForm?.mainFieldId;\n return [\n {\n title: '主字段',\n dataIndex: mainFieldId || '__associationLabel',\n key: mainFieldId || '__associationLabel',\n ellipsis: true,\n render: (_cellValue: any, record: AssociationRecord) =>\n normalizeCellValue(record.__associationLabel),\n },\n {\n title: 'ID',\n dataIndex: '__associationValue',\n key: '__associationValue',\n ellipsis: true,\n render: (_cellValue: any, record: AssociationRecord) =>\n normalizeCellValue(record.__associationValue),\n },\n ];\n }, [associationForm?.mainFieldId, associationForm?.selectorColumns]);\n\n const selectOptions = useMemo(\n () =>\n [...options, ...value]\n .filter(\n (item, index, list) =>\n list.findIndex((candidate) => candidate.value === item.value) === index,\n )\n .map((item) => ({ label: item.label, value: item.value })),\n [options, value],\n );\n\n if (behavior === 'HIDDEN') return null;\n\n const readonlyContent = value.map((item) => item.label).join(', ') || '--';\n const openSelector = () => {\n if (disabled) return;\n setSelectorOpen(true);\n void loadTable({ current: 1 });\n };\n const picker = (\n <div className=\"sy-association-selector\">\n <Input.Search\n allowClear\n enterButton=\"搜索\"\n value={keyword}\n placeholder={associationForm?.mainFieldId ? '搜索关联数据' : '搜索'}\n onChange={(event) => {\n setKeyword(event.target.value);\n if (!event.target.value) void loadTable({ current: 1, searchKeyWord: '' });\n }}\n onSearch={(searchKeyWord) => {\n setKeyword(searchKeyWord);\n void loadTable({ current: 1, searchKeyWord });\n }}\n />\n <Table<AssociationRecord>\n rowKey=\"__associationValue\"\n dataSource={tableData}\n columns={selectorColumns}\n loading={tableLoading}\n size=\"small\"\n pagination={{\n current: pagination.current,\n pageSize: pagination.pageSize,\n total: pagination.total,\n onChange: (current, pageSize) => void loadTable({ current, pageSize }),\n }}\n rowSelection={{\n type: multiple ? 'checkbox' : 'radio',\n preserveSelectedRowKeys: true,\n selectedRowKeys,\n onChange: (keys, rows) => {\n setSelectedRowKeys(keys);\n setSelectedRecords(rows as AssociationRecord[]);\n },\n }}\n onChange={(nextPagination: TablePaginationConfig) => {\n void loadTable({\n current: nextPagination.current,\n pageSize: nextPagination.pageSize,\n });\n }}\n onRow={(record) => ({\n onClick: () => {\n if (multiple) {\n const exists = selectedRowKeys.includes(record.__associationValue);\n setSelectedRowKeys(\n exists\n ? selectedRowKeys.filter((item) => item !== record.__associationValue)\n : [...selectedRowKeys, record.__associationValue],\n );\n setSelectedRecords(\n exists\n ? selectedRecords.filter(\n (item) => item.__associationValue !== record.__associationValue,\n )\n : [...selectedRecords, record],\n );\n return;\n }\n setSelectedRowKeys([record.__associationValue]);\n setSelectedRecords([record]);\n },\n onDoubleClick: () => {\n commitSelection([toValue(record)]);\n setSelectorOpen(false);\n },\n })}\n scroll={{ x: true }}\n />\n {selectedRecords.length > 0 && (\n <div className=\"sy-association-selected\">\n {selectedRecords.map((record) => (\n <Tag\n key={record.__associationValue}\n closable={!disabled}\n onClose={(event) => {\n event.preventDefault();\n setSelectedRowKeys((prev) =>\n prev.filter((key) => key !== record.__associationValue),\n );\n setSelectedRecords((prev) =>\n prev.filter((item) => item.__associationValue !== record.__associationValue),\n );\n }}\n >\n {record.__associationLabel}\n </Tag>\n ))}\n </div>\n )}\n </div>\n );\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`associationformfield-readonly-${fieldId}`}\n >\n {readonlyContent}\n </div>\n ) : (\n <div className={`sy-select-with-picker ${inputClassName || ''}`}>\n <Select\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n allowClear={allowClear}\n showSearch={showSearch}\n filterOption={false}\n onSearch={showSearch ? loadOptions : undefined}\n disabled={disabled}\n placeholder={placeholder}\n loading={selectLoading}\n notFoundContent={selectLoading ? <Spin size=\"small\" /> : undefined}\n options={selectOptions}\n value={multiple ? value.map((item) => item.value) : value[0]?.value}\n onChange={(nextValue) => {\n const ids = (Array.isArray(nextValue) ? nextValue : [nextValue]).filter(\n (item) => item !== undefined && item !== null,\n );\n const next = ids\n .map(\n (id) =>\n options.find((item) => item.value === id) ??\n value.find((item) => item.value === id),\n )\n .filter(Boolean) as AssociationValue[];\n commitSelection(next);\n }}\n data-testid={`associationformfield-input-${fieldId}`}\n />\n <Button\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={openSelector}\n data-testid={`associationformfield-picker-trigger-${fieldId}`}\n >\n 选择\n </Button>\n {value.length > 0 && (\n <Button disabled={disabled} onClick={() => commitSelection([])}>\n 清空\n </Button>\n )}\n </div>\n )}\n {isMobile ? (\n <Drawer\n title={associationForm?.formUuid || '选择关联数据'}\n placement=\"bottom\"\n height=\"80%\"\n open={selectorOpen}\n onClose={() => setSelectorOpen(false)}\n destroyOnClose\n footer={\n <Space style={{ width: '100%', justifyContent: 'flex-end' }}>\n <Button onClick={() => setSelectorOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n onClick={() => {\n commitSelection(selectedRecords.map(toValue));\n setSelectorOpen(false);\n }}\n >\n 确定\n </Button>\n </Space>\n }\n >\n {picker}\n </Drawer>\n ) : (\n <Modal\n title={associationForm?.formUuid || '选择关联数据'}\n open={selectorOpen}\n width={760}\n onCancel={() => setSelectorOpen(false)}\n onOk={() => {\n commitSelection(selectedRecords.map(toValue));\n setSelectorOpen(false);\n }}\n okButtonProps={{ disabled: selectedRecords.length === 0 }}\n destroyOnClose\n >\n {picker}\n </Modal>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Image from '@tiptap/extension-image';\nimport Link from '@tiptap/extension-link';\nimport Color from '@tiptap/extension-color';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport Highlight from '@tiptap/extension-highlight';\nimport { Table } from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport type { EditorFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\ntype ToolbarAction =\n | 'undo'\n | 'redo'\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'heading'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'alignLeft'\n | 'alignCenter'\n | 'alignRight'\n | 'link'\n | 'image'\n | 'highlight'\n | 'color'\n | 'table'\n | 'clear';\n\nconst TOOLBAR_PRESETS: Record<'minimal' | 'basic' | 'full', ToolbarAction[]> = {\n minimal: ['bold', 'italic', 'link', 'bulletList', 'orderedList', 'undo', 'redo'],\n basic: [\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'bulletList',\n 'orderedList',\n 'link',\n 'image',\n 'undo',\n 'redo',\n ],\n full: [\n 'undo',\n 'redo',\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'color',\n 'highlight',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'link',\n 'image',\n 'table',\n 'clear',\n ],\n};\n\nconst DEFAULT_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp'];\n\nconst normalizeToolbarConfig = (config?: EditorFieldProps['toolbarConfig']): ToolbarAction[] => {\n if (Array.isArray(config)) return config as ToolbarAction[];\n if (config === 'minimal' || config === 'basic' || config === 'full')\n return TOOLBAR_PRESETS[config];\n return TOOLBAR_PRESETS.full;\n};\n\nconst getImageUrl = async (\n api: ReturnType<typeof useFormContext>['api'],\n file: File,\n bucketName: string,\n) => {\n const uploaded = await api.uploadFile(file, bucketName);\n if (uploaded.previewUrl || uploaded.url) return uploaded.previewUrl || uploaded.url;\n if (uploaded.bucketName && uploaded.objectName) {\n const ticket = await api.createFileAccessTicket(\n uploaded.bucketName,\n uploaded.objectName,\n uploaded.name,\n 'preview',\n );\n return ticket?.url || ticket?.previewUrl || ticket?.downloadUrl || ticket?.ticketUrl || '';\n }\n return '';\n};\n\nconst isImageAllowed = (file: File, allowedTypes: string[]) => {\n if (!allowedTypes.length) return true;\n const lowerName = file.name.toLowerCase();\n return allowedTypes.some((type) => {\n const normalized = type.toLowerCase();\n if (normalized.startsWith('.')) return lowerName.endsWith(normalized);\n return file.type.toLowerCase() === normalized;\n });\n};\n\nfunction ToolbarButton({\n active,\n disabled,\n label,\n onClick,\n}: {\n active?: boolean;\n disabled?: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className={active ? 'is-active' : undefined}\n disabled={disabled}\n title={label}\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n\nfunction EditorToolbar({\n editor,\n actions,\n disabled,\n onPickImage,\n}: {\n editor: Editor | null;\n actions: ToolbarAction[];\n disabled?: boolean;\n onPickImage: () => void;\n}) {\n if (!editor || actions.length === 0) return null;\n\n const canUndo = editor.can().undo();\n const canRedo = editor.can().redo();\n\n return (\n <div className=\"sy-editor-toolbar\" role=\"toolbar\" aria-label=\"编辑器工具栏\">\n {actions.includes('undo') && (\n <ToolbarButton\n label=\"撤销\"\n disabled={disabled || !canUndo}\n onClick={() => editor.chain().focus().undo().run()}\n />\n )}\n {actions.includes('redo') && (\n <ToolbarButton\n label=\"重做\"\n disabled={disabled || !canRedo}\n onClick={() => editor.chain().focus().redo().run()}\n />\n )}\n {actions.includes('heading') && (\n <select\n className=\"sy-editor-select\"\n disabled={disabled}\n value={\n editor.isActive('heading', { level: 1 })\n ? 'h1'\n : editor.isActive('heading', { level: 2 })\n ? 'h2'\n : editor.isActive('heading', { level: 3 })\n ? 'h3'\n : 'p'\n }\n onChange={(event) => {\n const value = event.target.value;\n if (value === 'p') editor.chain().focus().setParagraph().run();\n if (value === 'h1') editor.chain().focus().toggleHeading({ level: 1 }).run();\n if (value === 'h2') editor.chain().focus().toggleHeading({ level: 2 }).run();\n if (value === 'h3') editor.chain().focus().toggleHeading({ level: 3 }).run();\n }}\n title=\"段落样式\"\n >\n <option value=\"p\">正文</option>\n <option value=\"h1\">标题 1</option>\n <option value=\"h2\">标题 2</option>\n <option value=\"h3\">标题 3</option>\n </select>\n )}\n {actions.includes('bold') && (\n <ToolbarButton\n label=\"B\"\n disabled={disabled}\n active={editor.isActive('bold')}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n )}\n {actions.includes('italic') && (\n <ToolbarButton\n label=\"I\"\n disabled={disabled}\n active={editor.isActive('italic')}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n )}\n {actions.includes('underline') && (\n <ToolbarButton\n label=\"U\"\n disabled={disabled}\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n />\n )}\n {actions.includes('strike') && (\n <ToolbarButton\n label=\"S\"\n disabled={disabled}\n active={editor.isActive('strike')}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n />\n )}\n {actions.includes('color') && (\n <input\n type=\"color\"\n className=\"sy-editor-color\"\n disabled={disabled}\n title=\"文字颜色\"\n onChange={(event) => editor.chain().focus().setColor(event.target.value).run()}\n />\n )}\n {actions.includes('highlight') && (\n <ToolbarButton\n label=\"标记\"\n disabled={disabled}\n active={editor.isActive('highlight')}\n onClick={() => editor.chain().focus().toggleHighlight({ color: '#fff3bf' }).run()}\n />\n )}\n {actions.includes('bulletList') && (\n <ToolbarButton\n label=\"• 列表\"\n disabled={disabled}\n active={editor.isActive('bulletList')}\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n />\n )}\n {actions.includes('orderedList') && (\n <ToolbarButton\n label=\"1. 列表\"\n disabled={disabled}\n active={editor.isActive('orderedList')}\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n />\n )}\n {actions.includes('blockquote') && (\n <ToolbarButton\n label=\"引用\"\n disabled={disabled}\n active={editor.isActive('blockquote')}\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n />\n )}\n {actions.includes('alignLeft') && (\n <ToolbarButton\n label=\"左对齐\"\n disabled={disabled}\n active={editor.isActive({ textAlign: 'left' })}\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n />\n )}\n {actions.includes('alignCenter') && (\n <ToolbarButton\n label=\"居中\"\n disabled={disabled}\n active={editor.isActive({ textAlign: 'center' })}\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n />\n )}\n {actions.includes('alignRight') && (\n <ToolbarButton\n label=\"右对齐\"\n disabled={disabled}\n active={editor.isActive({ textAlign: 'right' })}\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n />\n )}\n {actions.includes('link') && (\n <ToolbarButton\n label=\"链接\"\n disabled={disabled}\n active={editor.isActive('link')}\n onClick={() => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt('请输入链接地址', previousUrl || '');\n if (url === null) return;\n if (!url) {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n }}\n />\n )}\n {actions.includes('image') && (\n <ToolbarButton label=\"图片\" disabled={disabled} onClick={onPickImage} />\n )}\n {actions.includes('table') && (\n <ToolbarButton\n label=\"表格\"\n disabled={disabled}\n active={editor.isActive('table')}\n onClick={() =>\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()\n }\n />\n )}\n {actions.includes('clear') && (\n <ToolbarButton\n label=\"清除格式\"\n disabled={disabled}\n onClick={() => editor.chain().focus().unsetAllMarks().clearNodes().run()}\n />\n )}\n </div>\n );\n}\n\nexport function EditorField(props: EditorFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n rows = 8,\n maxLength,\n height,\n toolbarConfig,\n uploadBucketName = 'images',\n maxImageSize = 10,\n allowedImageTypes = DEFAULT_IMAGE_TYPES,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = (formData[fieldId] as string | undefined) ?? '';\n const disabled = behavior === 'DISABLED';\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [uploading, setUploading] = useState(false);\n const [uploadError, setUploadError] = useState('');\n const [charCount, setCharCount] = useState(0);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const actions = useMemo(() => normalizeToolbarConfig(toolbarConfig), [toolbarConfig]);\n const extensions = useMemo(\n () => [\n StarterKit.configure({\n heading: { levels: [1, 2, 3] },\n }),\n Underline,\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Link.configure({ openOnClick: false, autolink: true, linkOnPaste: true }),\n Placeholder.configure({ placeholder: placeholder || '请输入内容' }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Image.configure({\n allowBase64: false,\n HTMLAttributes: { class: 'sy-editor-image' },\n }),\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n ],\n [placeholder],\n );\n\n const updateHtml = useCallback(\n (next: string) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n },\n [fieldId, onChange, setFieldValue],\n );\n\n const editor = useEditor(\n {\n extensions,\n content: value || '',\n editable: !disabled,\n onUpdate: ({ editor: currentEditor }) => {\n const text = currentEditor.getText();\n setCharCount(text.length);\n if (maxLength && text.length > maxLength) {\n currentEditor.commands.undo();\n return;\n }\n updateHtml(currentEditor.isEmpty ? '' : currentEditor.getHTML());\n },\n editorProps: {\n attributes: {\n class: 'sy-editor-prose',\n 'data-testid': `editorfield-input-${fieldId}`,\n },\n },\n },\n [fieldId, extensions, disabled, maxLength, updateHtml],\n );\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!disabled);\n }, [disabled, editor]);\n\n useEffect(() => {\n if (!editor) return;\n const currentHtml = editor.isEmpty ? '' : editor.getHTML();\n if ((value || '') !== currentHtml) {\n editor.commands.setContent(value || '', { emitUpdate: false });\n setCharCount(editor.getText().length);\n }\n }, [editor, value]);\n\n const insertImageFiles = useCallback(\n async (files: File[]) => {\n if (!editor || disabled || files.length === 0) return;\n const validFiles = files.filter((file) => {\n if (!isImageAllowed(file, allowedImageTypes)) return false;\n if (maxImageSize && file.size > maxImageSize * 1024 * 1024) return false;\n return true;\n });\n if (validFiles.length !== files.length) {\n setUploadError(`图片仅支持 ${allowedImageTypes.join(', ')},且不能超过 ${maxImageSize}MB`);\n } else {\n setUploadError('');\n }\n if (!validFiles.length) return;\n setUploading(true);\n try {\n for (const file of validFiles) {\n const url = await getImageUrl(api, file, uploadBucketName);\n if (url) {\n editor.chain().focus().setImage({ src: url, alt: file.name, title: file.name }).run();\n }\n }\n } catch (error) {\n setUploadError(error instanceof Error ? error.message : '图片上传失败');\n } finally {\n setUploading(false);\n }\n },\n [allowedImageTypes, api, disabled, editor, maxImageSize, uploadBucketName],\n );\n\n if (behavior === 'HIDDEN') return null;\n\n const minHeight =\n typeof height === 'number'\n ? height\n : typeof height === 'string'\n ? height\n : Math.max(160, rows * 32);\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value sy-editor-readonly\"\n data-testid={`editorfield-readonly-${fieldId}`}\n dangerouslySetInnerHTML={{ __html: value || '--' }}\n />\n ) : (\n <div className={inputClassName} data-testid={`editorfield-shell-${fieldId}`}>\n <div className={`sy-editor ${disabled ? 'is-disabled' : ''}`}>\n <EditorToolbar\n editor={editor}\n actions={actions}\n disabled={disabled || uploading}\n onPickImage={() => inputRef.current?.click()}\n />\n <div\n className=\"sy-editor-body\"\n style={{ minHeight }}\n onPasteCapture={(event) => {\n const files = Array.from(event.clipboardData?.files || []).filter((file) =>\n file.type.startsWith('image/'),\n );\n if (files.length) {\n event.preventDefault();\n void insertImageFiles(files);\n }\n }}\n onDropCapture={(event) => {\n const files = Array.from(event.dataTransfer?.files || []).filter((file) =>\n file.type.startsWith('image/'),\n );\n if (files.length) {\n event.preventDefault();\n void insertImageFiles(files);\n }\n }}\n >\n <EditorContent editor={editor} />\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept={allowedImageTypes.join(',')}\n hidden\n multiple\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n event.target.value = '';\n void insertImageFiles(files);\n }}\n />\n </div>\n <div className=\"sy-editor-footer\">\n <span>{uploading ? '图片上传中...' : uploadError}</span>\n {maxLength && (\n <span>\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Input } from 'antd';\nimport type { SerialNumberFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function SerialNumberField(props: SerialNumberFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior = 'READONLY',\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder = '自动生成',\n defaultValue,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'READONLY';\n const value = (formData[fieldId] as string | undefined) ?? '';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`serialnumberfield-readonly-${fieldId}`}\n >\n {value || '--'}\n </div>\n ) : (\n <Input\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n placeholder={placeholder}\n readOnly\n disabled={behavior === 'DISABLED'}\n data-testid={`serialnumberfield-input-${fieldId}`}\n />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, Space } from 'antd';\nimport type { LocationFieldProps, LocationValue } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst getDingTalkApi = () => {\n if (typeof window === 'undefined') return undefined;\n return (window as any).dd || (window as any).dingtalk || (window as any).DingTalkPC;\n};\n\nconst isDingTalkEnvironment = () => {\n if (typeof navigator === 'undefined') return false;\n return /DingTalk/i.test(navigator.userAgent || '') || Boolean(getDingTalkApi());\n};\n\nconst normalizeDingTalkLocation = (res: any): LocationValue => ({\n latitude: Number(res.latitude),\n longitude: Number(res.longitude),\n address: res.address || res.snippet || res.title || res.poiName,\n city: res.city,\n district: res.adName || res.district,\n province: res.province,\n name: res.title || res.poiName || res.address,\n accuracy: res.accuracy ? Number(res.accuracy) : undefined,\n source: 'dingTalk',\n time: Date.now(),\n});\n\nexport function LocationField(props: LocationFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n defaultValue,\n allowClear = true,\n locateButtonText = '获取定位',\n clearButtonText = '清空',\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as LocationValue | undefined;\n const [locating, setLocating] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setValue = (next?: LocationValue) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const ensureDingTalkReady = async () => {\n const dingTalk = getDingTalkApi();\n if (!dingTalk) throw new Error('当前环境不支持钉钉定位');\n if (typeof dingTalk.config !== 'function') return dingTalk;\n const currentUrl =\n typeof window !== 'undefined' ? window.location.href.split('#')[0] : undefined;\n const signature = currentUrl ? await api.getDingTalkSignature(currentUrl) : undefined;\n dingTalk.config({\n agentId: signature?.agentId,\n corpId: signature?.corpId,\n timeStamp: signature?.timeStamp || signature?.timestamp,\n nonceStr: signature?.nonceStr,\n signature: signature?.signature,\n jsApiList: ['getLocation', 'locateInMap', 'device.geolocation.get', 'biz.map.locate'],\n });\n await new Promise<void>((resolve, reject) => {\n if (typeof dingTalk.ready !== 'function') {\n resolve();\n return;\n }\n dingTalk.ready(() => resolve());\n if (typeof dingTalk.error === 'function') dingTalk.error((err: any) => reject(err));\n setTimeout(resolve, 3000);\n });\n return dingTalk;\n };\n\n const locateWithDingTalk = async () => {\n const dingTalk = await ensureDingTalkReady();\n return new Promise<LocationValue>((resolve, reject) => {\n const options = {\n type: 1,\n useCache: true,\n coordinate: '1',\n cacheTimeout: 20,\n withReGeocode: true,\n targetAccuracy: '200',\n success: (res: any) => resolve(normalizeDingTalkLocation(res)),\n fail: (err: any) => reject(err || new Error('定位失败')),\n complete: () => undefined,\n };\n if (typeof dingTalk.getLocation === 'function') {\n dingTalk.getLocation(options);\n return;\n }\n if (typeof dingTalk.device?.geolocation?.get === 'function') {\n dingTalk.device.geolocation.get(options);\n return;\n }\n reject(new Error('当前钉钉版本不支持定位'));\n });\n };\n\n const locateWithBrowser = async () =>\n new Promise<LocationValue>((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('当前浏览器不支持定位'));\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (position) => {\n resolve({\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n source: 'browser',\n time: Date.now(),\n });\n },\n (geoError) => reject(geoError || new Error('定位失败')),\n { enableHighAccuracy: true, timeout: 10000 },\n );\n });\n\n const locate = async () => {\n setLocating(true);\n setError('');\n try {\n const next = isDingTalkEnvironment()\n ? await locateWithDingTalk().catch(() => locateWithBrowser())\n : await locateWithBrowser();\n setValue(next);\n } catch (currentError) {\n setError(currentError instanceof Error ? currentError.message : '定位失败');\n } finally {\n setLocating(false);\n }\n };\n\n const display = value\n ? value.address || value.name || `${value.latitude.toFixed(6)}, ${value.longitude.toFixed(6)}`\n : '--';\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <div className=\"sy-location-field\" data-testid={`locationfield-${fieldId}`}>\n <div className=\"sy-field-readonly-value\">{display}</div>\n {value?.accuracy !== undefined && (\n <div className=\"sy-location-meta\">精度约 {Math.round(value.accuracy)} 米</div>\n )}\n {error && <div className=\"sy-field-error\">{error}</div>}\n {behavior !== 'READONLY' && (\n <Space>\n <Button\n type=\"primary\"\n loading={locating}\n disabled={behavior === 'DISABLED'}\n onClick={locate}\n >\n {locateButtonText}\n </Button>\n {allowClear && (\n <Button\n disabled={behavior === 'DISABLED'}\n onClick={() => {\n setError('');\n setValue(undefined);\n }}\n >\n {clearButtonText}\n </Button>\n )}\n </Space>\n )}\n </div>\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button, Modal, Space } from 'antd';\nimport type {\n DigitalSignatureFieldProps,\n DigitalSignatureValue,\n SignaturePoint,\n} from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst CANVAS_HEIGHT = 260;\n\nconst computeSHA512 = async (text: string) => {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buffer = await crypto.subtle.digest('SHA-512', new TextEncoder().encode(text));\n return Array.from(new Uint8Array(buffer))\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n let hash = 0;\n for (let index = 0; index < text.length; index += 1) {\n hash = (hash << 5) - hash + text.charCodeAt(index);\n hash |= 0;\n }\n return `fallback-${Math.abs(hash).toString(16)}`;\n};\n\nexport function DigitalSignatureField(props: DigitalSignatureFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n defaultValue,\n bucketName = 'signatures',\n allowClear = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as DigitalSignatureValue | undefined;\n const [open, setOpen] = useState(false);\n const [saving, setSaving] = useState(false);\n const [drawn, setDrawn] = useState(false);\n const [error, setError] = useState('');\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const drawingRef = useRef(false);\n const pointsRef = useRef<SignaturePoint[]>([]);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const prepareCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const cssWidth = Math.max(480, rect.width || 640);\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n canvas.width = Math.floor(cssWidth * dpr);\n canvas.height = Math.floor(CANVAS_HEIGHT * dpr);\n canvas.style.height = `${CANVAS_HEIGHT}px`;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, cssWidth, CANVAS_HEIGHT);\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, cssWidth, CANVAS_HEIGHT);\n ctx.lineWidth = 2.4;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.strokeStyle = '#111827';\n }, []);\n\n useEffect(() => {\n if (!open) return;\n pointsRef.current = [];\n setDrawn(false);\n setError('');\n requestAnimationFrame(prepareCanvas);\n }, [open, prepareCanvas]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setValue = (next?: DigitalSignatureValue) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top, t: Date.now() };\n };\n\n const clearCanvas = () => {\n pointsRef.current = [];\n setDrawn(false);\n setError('');\n prepareCanvas();\n };\n\n const save = async () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (!pointsRef.current.length) {\n setError('请先完成签名');\n return;\n }\n setSaving(true);\n setError('');\n try {\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!blob) throw new Error('生成签名图片失败');\n const file = new File([blob], `signature-${Date.now()}.png`, { type: 'image/png' });\n const uploaded = await api.uploadFile(file, bucketName);\n const payload: Omit<DigitalSignatureValue, 'hash'> = {\n url: uploaded.url,\n bucketName: uploaded.bucketName || bucketName,\n objectName: uploaded.objectName,\n previewUrl: uploaded.previewUrl || uploaded.url,\n points: pointsRef.current.slice(),\n timestamp: Date.now(),\n };\n const hash = await computeSHA512(JSON.stringify(payload));\n setValue({ ...payload, hash });\n setOpen(false);\n } catch (saveError) {\n setError(saveError instanceof Error ? saveError.message : '签名保存失败');\n } finally {\n setSaving(false);\n }\n };\n\n const previewUrl = value?.previewUrl || value?.url;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <div className=\"sy-signature-field\" data-testid={`digitalsignaturefield-${fieldId}`}>\n {previewUrl ? (\n <button\n type=\"button\"\n className=\"sy-signature-preview\"\n onClick={() => setOpen(behavior !== 'READONLY')}\n disabled={behavior === 'READONLY'}\n >\n <img src={previewUrl} alt={label} />\n </button>\n ) : (\n <span className=\"sy-field-readonly-value\">--</span>\n )}\n {value?.hash && (\n <div className=\"sy-signature-hash\">SHA-512: {value.hash.slice(0, 24)}...</div>\n )}\n {behavior !== 'READONLY' && (\n <Space>\n <Button disabled={behavior === 'DISABLED'} onClick={() => setOpen(true)}>\n {previewUrl ? '重新签名' : '开始签名'}\n </Button>\n {allowClear && (\n <Button disabled={behavior === 'DISABLED'} onClick={() => setValue(undefined)}>\n 清空\n </Button>\n )}\n </Space>\n )}\n <Modal\n open={open}\n title={label}\n onCancel={() => setOpen(false)}\n onOk={save}\n confirmLoading={saving}\n okButtonProps={{ disabled: !drawn }}\n width={720}\n destroyOnClose\n >\n <div className=\"sy-signature-canvas-wrap\">\n <canvas\n ref={canvasRef}\n style={{ width: '100%', height: CANVAS_HEIGHT, border: '1px solid #d9d9d9' }}\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n drawingRef.current = true;\n const point = getPoint(event);\n pointsRef.current.push(point);\n setDrawn(true);\n }}\n onPointerMove={(event) => {\n if (!drawingRef.current) return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n const last = pointsRef.current[pointsRef.current.length - 1];\n const next = getPoint(event);\n if (ctx && last) {\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(next.x, next.y);\n ctx.stroke();\n }\n pointsRef.current.push(next);\n }}\n onPointerUp={(event) => {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n drawingRef.current = false;\n }}\n onPointerLeave={() => {\n drawingRef.current = false;\n }}\n data-testid={`digitalsignaturefield-canvas-${fieldId}`}\n />\n {error && <div className=\"sy-field-error\">{error}</div>}\n <Button onClick={clearCanvas} disabled={saving}>\n 清空画布\n </Button>\n </div>\n </Modal>\n </div>\n </FieldWrapper>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { JSONFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst formatJson = (value: any) => {\n if (value === undefined || value === null || value === '') return '--';\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nexport function JSONField(props: JSONFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n readonlyClassName,\n defaultValue,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'READONLY';\n const value = formData[fieldId];\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <pre\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`jsonfield-readonly-${fieldId}`}\n >\n {formatJson(value)}\n </pre>\n </FieldWrapper>\n );\n}\n","import type React from 'react';\nimport { TextField } from '../fields/TextField';\nimport { NumberField } from '../fields/NumberField';\nimport { TextAreaField } from '../fields/TextAreaField';\nimport { SelectField } from '../fields/SelectField';\nimport { MultiSelectField } from '../fields/MultiSelectField';\nimport { RadioField } from '../fields/RadioField';\nimport { CheckboxField } from '../fields/CheckboxField';\nimport { DateField } from '../fields/DateField';\nimport { CascadeDateField } from '../fields/CascadeDateField';\nimport { AttachmentField } from '../fields/AttachmentField';\nimport { ImageField } from '../fields/ImageField';\nimport { SubFormField } from '../fields/SubFormField';\nimport { UserSelectField } from '../fields/UserSelectField';\nimport { DepartmentSelectField } from '../fields/DepartmentSelectField';\nimport { CascadeSelectField } from '../fields/CascadeSelectField';\nimport { AddressField } from '../fields/AddressField';\nimport { AssociationFormField } from '../fields/AssociationFormField';\nimport { EditorField } from '../fields/EditorField';\nimport { SerialNumberField } from '../fields/SerialNumberField';\nimport { LocationField } from '../fields/LocationField';\nimport { DigitalSignatureField } from '../fields/DigitalSignatureField';\nimport { JSONField } from '../fields/JSONField';\n\nexport const defaultComponentRegistry: Record<string, React.ComponentType<any>> = {\n TextField,\n NumberField,\n TextAreaField,\n SelectField,\n MultiSelectField,\n RadioField,\n CheckboxField,\n DateField,\n CascadeDateField,\n AttachmentField,\n ImageField,\n SubFormField,\n UserSelectField,\n EmployeeSelectField: UserSelectField,\n DepartmentSelectField,\n TextareaField: TextAreaField,\n CascadeSelectField,\n AddressField,\n AssociationFormField,\n EditorField,\n SerialNumberField,\n LocationField,\n DigitalSignatureField,\n JSONField,\n};\n","import type { FormEffect, FieldBehavior } from '../types';\n\n/**\n * Evaluate form effects based on current form data.\n * Returns a map of fieldId → FieldBehavior adjustments.\n * Only behavior-changing actions (show/hide/enable/disable) are processed.\n * setValue actions are ignored in behavior evaluation.\n */\nexport function evaluateEffects(\n effects: FormEffect[],\n formData: Record<string, any>,\n currentBehaviors: Record<string, FieldBehavior>,\n): Record<string, FieldBehavior> {\n const result: Record<string, FieldBehavior> = { ...currentBehaviors };\n\n for (const effect of effects) {\n const conditionMet = evaluateCondition(effect.when, formData);\n\n if (conditionMet) {\n for (const action of effect.then) {\n switch (action.action) {\n case 'show':\n result[action.field] = 'NORMAL';\n break;\n case 'hide':\n result[action.field] = 'HIDDEN';\n break;\n case 'enable':\n result[action.field] = 'NORMAL';\n break;\n case 'disable':\n result[action.field] = 'DISABLED';\n break;\n case 'setValue':\n // setValue does not affect behavior, handled elsewhere\n break;\n }\n }\n }\n }\n\n return result;\n}\n\nfunction evaluateCondition(when: FormEffect['when'], formData: Record<string, any>): boolean {\n const fieldValue = formData[when.field];\n\n switch (when.operator) {\n case 'eq':\n return fieldValue === when.value;\n case 'ne':\n return fieldValue !== when.value;\n case 'in':\n return Array.isArray(when.value) && when.value.includes(fieldValue);\n case 'changed':\n return true;\n }\n}\n","import type { ValidationRule } from '../types';\n\n/**\n * Validate a single field value against its rules.\n * Returns the first error message encountered, or null if valid.\n */\nexport async function validateField(value: any, rules: ValidationRule[]): Promise<string | null> {\n for (const rule of rules) {\n // Required check\n if (rule.required) {\n const isEmpty =\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0);\n if (isEmpty) {\n return rule.message || '此字段为必填项';\n }\n }\n\n // Skip further checks if value is empty and not required\n if (value === null || value === undefined || value === '') {\n continue;\n }\n\n // Min check\n if (rule.min !== undefined) {\n if (typeof value === 'string' && value.length < rule.min) {\n return rule.message || `最少输入 ${rule.min} 个字符`;\n }\n if (typeof value === 'number' && value < rule.min) {\n return rule.message || `不能小于 ${rule.min}`;\n }\n }\n\n // Max check\n if (rule.max !== undefined) {\n if (typeof value === 'string' && value.length > rule.max) {\n return rule.message || `最多输入 ${rule.max} 个字符`;\n }\n if (typeof value === 'number' && value > rule.max) {\n return rule.message || `不能大于 ${rule.max}`;\n }\n }\n\n // Pattern check\n if (rule.pattern !== undefined) {\n const regex = typeof rule.pattern === 'string' ? new RegExp(rule.pattern) : rule.pattern;\n if (!regex.test(String(value))) {\n return rule.message || '格式不正确';\n }\n }\n\n // Custom validator\n if (rule.validator) {\n try {\n await rule.validator(value);\n } catch (e: any) {\n return e?.message || rule.message || '校验失败';\n }\n }\n }\n\n return null;\n}\n\n/**\n * Validate all fields in a form.\n * Returns a map of fieldId → error message for fields that have errors.\n */\nexport async function validateAllFields(\n formData: Record<string, any>,\n fieldRules: Record<string, ValidationRule[]>,\n): Promise<Record<string, string>> {\n const errors: Record<string, string> = {};\n\n const entries = Object.entries(fieldRules);\n const results = await Promise.all(\n entries.map(([fieldId, rules]) => validateField(formData[fieldId], rules)),\n );\n\n entries.forEach(([fieldId], index) => {\n const error = results[index];\n if (error) {\n errors[fieldId] = error;\n }\n });\n\n return errors;\n}\n","import type {\n AttachmentItem,\n FormRuntimeApi,\n FormRuntimeApiConfig,\n RuntimeRequestConfig,\n RuntimeResponse,\n} from '../types';\n\nconst DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\nconst CHUNK_UPLOAD_THRESHOLD = 10 * 1024 * 1024;\n\nconst trimTrailingSlash = (value?: string) => String(value || '').replace(/\\/$/, '');\n\nconst getDefaultBaseUrl = () => {\n const globalEnv = (globalThis as any).process?.env;\n const envBaseUrl = globalEnv?.FORM_API_BASE_URL || globalEnv?.BASE_API_URL;\n if (envBaseUrl) return trimTrailingSlash(envBaseUrl);\n\n const browserGlobal = typeof window !== 'undefined' ? (window as any) : undefined;\n const windowBaseUrl =\n browserGlobal?.FORM_API_BASE_URL ||\n browserGlobal?.BASE_API_URL ||\n browserGlobal?.__FORM_API_BASE_URL__ ||\n browserGlobal?.__LOWCODE_API_BASE_URL__;\n if (windowBaseUrl) return trimTrailingSlash(windowBaseUrl);\n\n return typeof window !== 'undefined' ? '/service' : '';\n};\n\nconst appendQuery = (url: string, params?: Record<string, any>) => {\n if (!params) return url;\n const search = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null || value === '') return;\n if (Array.isArray(value)) {\n value.forEach((item) => search.append(key, String(item)));\n return;\n }\n search.append(key, String(value));\n });\n const query = search.toString();\n if (!query) return url;\n return `${url}${url.includes('?') ? '&' : '?'}${query}`;\n};\n\nconst joinUrl = (baseUrl: string, url: string) => {\n if (/^https?:\\/\\//i.test(url)) return url;\n return `${trimTrailingSlash(baseUrl)}${url.startsWith('/') ? url : `/${url}`}`;\n};\n\nconst parseResponse = async <T>(response: Response): Promise<RuntimeResponse<T>> => {\n const contentType = response.headers.get('content-type') || '';\n const payload = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n\n if (!response.ok) {\n const message =\n typeof payload === 'object' && payload\n ? payload.message || payload.error || response.statusText\n : response.statusText;\n throw new Error(message || '请求失败');\n }\n\n if (typeof payload === 'object' && payload) {\n return payload as RuntimeResponse<T>;\n }\n\n return {\n code: response.status,\n success: response.ok,\n data: payload as T,\n result: payload as T,\n message: response.statusText,\n };\n};\n\nconst createDefaultRequest =\n (baseUrl: string): FormRuntimeApi['request'] =>\n async <T = any>(config: RuntimeRequestConfig): Promise<RuntimeResponse<T> | Blob> => {\n const method = config.method ?? 'get';\n const url = appendQuery(joinUrl(baseUrl, config.url), config.params);\n const headers = new Headers(config.headers as HeadersInit);\n let body: BodyInit | undefined;\n\n if (config.data !== undefined) {\n if (config.data instanceof FormData) {\n body = config.data;\n } else {\n headers.set('Content-Type', headers.get('Content-Type') || 'application/json');\n body = JSON.stringify(config.data);\n }\n }\n\n const token = typeof window !== 'undefined' ? window.localStorage?.getItem('token') : undefined;\n if (token && !headers.has('authorization')) {\n headers.set('authorization', token);\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body,\n credentials: 'include',\n });\n\n if (config.responseType === 'blob') {\n if (!response.ok) throw new Error(response.statusText || '请求失败');\n return response.blob();\n }\n\n return parseResponse<T>(response);\n };\n\nconst generateUid = () => `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;\n\nconst normalizeUploadData = (data: any, file: File, bucketName: string): AttachmentItem => {\n const item = Array.isArray(data) ? data[0] : data;\n const objectName = item?.objectName || item?.objectKey || item?.key;\n const resolvedBucketName = item?.bucketName || bucketName;\n return {\n id: item?.id || item?.uid || objectName || generateUid(),\n uid: item?.uid || item?.id || objectName || generateUid(),\n name: item?.originalName || item?.name || file.name,\n originalName: item?.originalName || file.name,\n url: item?.url || '',\n status: 'done',\n size: item?.size ?? file.size,\n objectName,\n bucketName: resolvedBucketName,\n contentType: item?.contentType || file.type,\n mimeType: item?.contentType || file.type,\n };\n};\n\nconst uploadWithXhr = (\n baseUrl: string,\n file: File,\n bucketName: string,\n onProgress?: (percent: number) => void,\n): Promise<AttachmentItem> =>\n new Promise((resolve, reject) => {\n if ((globalThis as any).process?.env?.VITEST) {\n onProgress?.(100);\n resolve({\n id: generateUid(),\n uid: generateUid(),\n name: file.name,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n status: 'done',\n size: file.size,\n bucketName,\n contentType: file.type,\n });\n return;\n }\n\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n formData.append('files', file);\n\n xhr.open('POST', joinUrl(baseUrl, `/file/upload?bucketName=${encodeURIComponent(bucketName)}`));\n xhr.withCredentials = true;\n const token = typeof window !== 'undefined' ? window.localStorage?.getItem('token') : undefined;\n if (token) xhr.setRequestHeader('authorization', token);\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n onProgress?.(Math.round((event.loaded / event.total) * 100));\n }\n };\n xhr.onload = () => {\n try {\n const payload = JSON.parse(xhr.responseText || '{}');\n if (xhr.status >= 200 && xhr.status < 300 && payload.success !== false) {\n resolve(normalizeUploadData(payload.data, file, bucketName));\n return;\n }\n reject(new Error(payload.message || payload.error || '上传失败'));\n } catch (error) {\n reject(error);\n }\n };\n xhr.onerror = () => reject(new Error('上传失败'));\n xhr.send(formData);\n });\n\nasync function uploadChunkedFile(\n request: FormRuntimeApi['request'],\n file: File,\n bucketName: string,\n onProgress?: (percent: number) => void,\n) {\n const initiate = (await request<any>({\n url: '/file/multipart/initiate',\n method: 'post',\n data: {\n fileName: file.name,\n fileSize: file.size,\n chunkSize: DEFAULT_CHUNK_SIZE,\n bucketName,\n },\n })) as RuntimeResponse<any>;\n const uploadInfo = initiate.data || initiate.result;\n const totalParts = uploadInfo?.totalParts || Math.ceil(file.size / DEFAULT_CHUNK_SIZE);\n const parts: Array<{ partNumber: number; etag: string }> = [];\n\n try {\n for (let index = 0; index < totalParts; index += 1) {\n const start = index * DEFAULT_CHUNK_SIZE;\n const end = Math.min(start + DEFAULT_CHUNK_SIZE, file.size);\n const formData = new FormData();\n formData.append('file', file.slice(start, end));\n formData.append('uploadId', uploadInfo.uploadId);\n formData.append('partNumber', String(index + 1));\n formData.append('bucketName', uploadInfo.bucketName);\n formData.append('objectName', uploadInfo.objectName);\n const part = (await request<any>({\n url: '/file/multipart/upload',\n method: 'post',\n data: formData,\n })) as RuntimeResponse<any>;\n parts.push(part.data || part.result);\n onProgress?.(Math.round(((index + 1) / totalParts) * 100));\n }\n\n const completed = (await request<any>({\n url: '/file/multipart/complete',\n method: 'post',\n data: {\n uploadId: uploadInfo.uploadId,\n bucketName: uploadInfo.bucketName,\n objectName: uploadInfo.objectName,\n originalName: file.name,\n contentType: file.type || undefined,\n parts: parts.sort((a, b) => a.partNumber - b.partNumber),\n },\n })) as RuntimeResponse<any>;\n\n return normalizeUploadData(completed.data || completed.result, file, bucketName);\n } catch (error) {\n await request({\n url: '/file/multipart/abort',\n method: 'post',\n data: {\n uploadId: uploadInfo?.uploadId,\n bucketName: uploadInfo?.bucketName,\n objectName: uploadInfo?.objectName,\n },\n }).catch(() => undefined);\n throw error;\n }\n}\n\nexport function createFormRuntimeApi(config?: FormRuntimeApiConfig): FormRuntimeApi {\n const { baseUrl = getDefaultBaseUrl(), ...overrides } = config ?? {};\n const request = overrides.request ?? createDefaultRequest(baseUrl);\n\n const defaults: FormRuntimeApi = {\n request,\n uploadFile: async (file, bucketName = 'files', onProgress) => {\n if (file.size > CHUNK_UPLOAD_THRESHOLD) {\n return uploadChunkedFile(request, file, bucketName, onProgress);\n }\n return uploadWithXhr(baseUrl, file, bucketName, onProgress);\n },\n deleteFile: async (objectName, bucketName = 'files') => {\n await request({ url: '/file/delete', method: 'post', data: { bucketName, objectName } });\n return { success: true };\n },\n createDownloadTicket: async (bucketName, objectName, fileName) => {\n const response = (await request<any>({\n url: '/file/download-ticket',\n method: 'post',\n data: { bucketName, objectName, fileName },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n createFileAccessTicket: async (bucketName, objectName, fileName, purpose = 'preview') => {\n const response = (await request<any>({\n url: '/file/access-ticket',\n method: 'post',\n data: { bucketName, objectName, fileName, purpose },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n getUserById: async (id) => {\n const response = (await request<any>({\n url: `/user/${id}`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n getUserList: async (params) => {\n const response = (await request<any>({\n url: '/user/list',\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n const data = response.data || response.result;\n return Array.isArray(data) ? data : data?.items || data?.list || [];\n },\n getDepartmentRoots: async () => {\n const response = (await request<any>({\n url: '/department/root',\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n getDepartmentChildren: async (parentId) => {\n const response = (await request<any>({\n url: `/department/${parentId}/children`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n getDepartmentParentDepartments: async (id) => {\n const response = (await request<any>({\n url: `/department/${id}/parentDepartments`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n getDepartmentMembers: async (id) => {\n const response = (await request<any>({\n url: `/department/${id}/members`,\n method: 'get',\n })) as RuntimeResponse<any>;\n const data = response.data || response.result;\n return Array.isArray(data) ? data : data?.items || data?.list || [];\n },\n getChinaDivisions: async (parentAdcode) => {\n const response = (await request<any>({\n url: '/china-divisions',\n method: 'get',\n params: parentAdcode ? { parentAdcode } : undefined,\n })) as RuntimeResponse<any>;\n return response.data || response.result || [];\n },\n advancedSearch: async (params) => {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/advancedSearch.json`,\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n return response.result || response.data || {};\n },\n getDingTalkSignature: async (url) => {\n const response = (await request<any>({\n url: '/dingtalk/signature',\n method: 'get',\n params: { url },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n },\n submitFormData: async (payload) => {\n const response = (await request<any>({\n url: '/form/submitFormData',\n method: 'post',\n data: payload,\n })) as RuntimeResponse<any>;\n return response.data || response.result || response;\n },\n updateFormData: async (payload) => {\n const response = (await request<any>({\n url: `/${payload.appType}/v1/form/updateFormData.json`,\n method: 'post',\n data: payload,\n })) as RuntimeResponse<any>;\n return response.data || response.result || response;\n },\n };\n\n return { ...defaults, ...overrides, request };\n}\n","import React from 'react';\nimport { useFormContext } from './FormContext';\nimport { useComponent } from './ComponentRegistry';\n\nexport interface FormRendererProps {\n className?: string;\n fieldClassName?: string;\n columns?: 1 | 2 | 3 | 4;\n size?: 'compact' | 'default' | 'large';\n}\n\nconst columnsClassMap: Record<number, string> = {\n 1: 'sy-grid-cols-1',\n 2: 'sy-grid-cols-1 md:sy-grid-cols-2',\n 3: 'sy-grid-cols-1 md:sy-grid-cols-2 lg:sy-grid-cols-3',\n 4: 'sy-grid-cols-1 md:sy-grid-cols-2 lg:sy-grid-cols-4',\n};\n\nconst sizeClassMap: Record<string, string> = {\n compact: 'sy-gap-y-3 sy-gap-x-4',\n default: 'sy-gap-y-5 sy-gap-x-6',\n large: 'sy-gap-y-6 sy-gap-x-8',\n};\n\nfunction FieldRenderer({ field, fieldClassName }: { field: any; fieldClassName?: string }) {\n const Component = useComponent(field.componentName);\n\n if (!Component) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[FormRenderer] Component \"${field.componentName}\" is not registered, skipping field \"${field.fieldId}\".`,\n );\n }\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fieldId, componentName: _, ...fieldProps } = field;\n\n return React.createElement(Component, {\n ...fieldProps,\n fieldId,\n className: fieldClassName ?? fieldProps.className,\n });\n}\n\nexport function FormRenderer({\n className,\n fieldClassName,\n columns = 1,\n size = 'default',\n}: FormRendererProps) {\n const { schema } = useFormContext();\n\n const gridClass = columnsClassMap[columns];\n const gapClass = sizeClassMap[size];\n const containerClassName = ['sy-grid', gridClass, gapClass, className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClassName} data-testid=\"form-renderer\">\n {schema.fields.map((field) => (\n <FieldRenderer key={field.fieldId} field={field} fieldClassName={fieldClassName} />\n ))}\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { Button } from 'antd';\nimport { useFormContext } from './FormContext';\n\nexport interface FormActionsProps {\n className?: string;\n submitText?: string;\n resetText?: string;\n showReset?: boolean;\n onSubmit?: (values: Record<string, any>) => Promise<void>;\n submitSuccessMode?: 'stay' | 'callback';\n}\n\nexport function FormActions({\n className,\n submitText = '提交',\n resetText = '重置',\n showReset = true,\n onSubmit,\n}: FormActionsProps) {\n const { mode, validateAll, getFormData, resetForm, api, config } = useFormContext();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = useCallback(async () => {\n setSubmitError(null);\n const valid = await validateAll();\n if (!valid) return;\n\n const values = getFormData();\n setIsSubmitting(true);\n try {\n const beforeResult = await config.submit?.beforeSubmit?.(values);\n if (beforeResult === false) return;\n\n let response: any;\n if (onSubmit) {\n response = await onSubmit(values);\n } else if (mode === 'edit' && config.formInstanceId) {\n response = await api.updateFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n formInstId: config.formInstanceId,\n updateFormDataJson: JSON.stringify(values),\n });\n } else {\n response = await api.submitFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n data: values,\n });\n }\n\n await config.submit?.afterSubmit?.(response);\n\n if (config.submit?.submitSuccessMode === 'redirect' && config.submit.redirectUrl) {\n window.location.href = config.submit.redirectUrl;\n }\n } catch (e: any) {\n setSubmitError(e?.message || '提交失败');\n } finally {\n setIsSubmitting(false);\n }\n }, [api, config, getFormData, mode, onSubmit, validateAll]);\n\n const handleReset = useCallback(() => {\n resetForm();\n }, [resetForm]);\n\n if (mode === 'readonly') return null;\n\n return (\n <div className={className ?? 'sy-form-actions'} data-testid=\"form-actions\">\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n loading={isSubmitting}\n onClick={handleSubmit}\n data-testid=\"form-submit-btn\"\n >\n {submitText}\n </Button>\n {showReset && (\n <Button\n htmlType=\"reset\"\n disabled={isSubmitting}\n onClick={handleReset}\n data-testid=\"form-reset-btn\"\n >\n {resetText}\n </Button>\n )}\n {submitError && (\n <span className=\"sy-field-error\" role=\"alert\" data-testid=\"form-submit-error\">\n {submitError}\n </span>\n )}\n </div>\n );\n}\n","import React from 'react';\n\n/** Simple className merge utility */\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport interface FormContainerProps {\n title?: string;\n description?: string;\n children: React.ReactNode;\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n className?: string;\n}\n\nconst maxWidthClassMap: Record<string, string> = {\n sm: 'sy-form-container-sm',\n md: 'sy-form-container-md',\n lg: 'sy-form-container-lg',\n xl: 'sy-form-container-xl',\n full: 'sy-form-container-full',\n};\n\nexport function FormContainer({\n title,\n description,\n children,\n maxWidth = 'md',\n className,\n}: FormContainerProps) {\n const sizeClass = maxWidthClassMap[maxWidth];\n\n return (\n <div className={cn('sy-form-container', sizeClass, className)}>\n {(title || description) && (\n <div className=\"sy-form-header\">\n {title && <h2 className=\"sy-form-title\">{title}</h2>}\n {description && <p className=\"sy-form-description\">{description}</p>}\n </div>\n )}\n <div className=\"sy-form-body\">{children}</div>\n </div>\n );\n}\n","import type { ProcessStatus, StatusMeta, TaskStatus } from '../types';\n\n/** 流程状态元映射 */\nexport const PROCESS_STATUS_META: Record<ProcessStatus, StatusMeta> = {\n running: { label: '审批中', tone: 'brand' },\n waiting: { label: '等待中', tone: 'neutral' },\n exception: { label: '流程异常', tone: 'danger' },\n completed: { label: '已完成', tone: 'success' },\n terminated: { label: '已拒绝', tone: 'danger' },\n withdrawn: { label: '已撤销', tone: 'neutral' },\n pending: { label: '待处理', tone: 'brand' },\n cancelled: { label: '已取消', tone: 'neutral' },\n};\n\n/** 任务状态元映射 */\nexport const TASK_STATUS_META: Record<TaskStatus, StatusMeta> = {\n pending: { label: '待处理', tone: 'brand' },\n approved: { label: '已同意', tone: 'success' },\n rejected: { label: '已拒绝', tone: 'danger' },\n returned: { label: '已退回', tone: 'warning' },\n suspended: { label: '已挂起', tone: 'neutral' },\n cancelled: { label: '已取消', tone: 'neutral' },\n copied: { label: '已抄送', tone: 'neutral' },\n waiting: { label: '等待中', tone: 'neutral' },\n simulated: { label: '未开始', tone: 'neutral' },\n};\n","import type {\n ApprovalPermission,\n ApproveParams,\n ChangeRecordListResponse,\n ChangeRecordQueryParams,\n FormDataDeleteParams,\n FormDataQueryParams,\n FormInstanceData,\n FormRuntimeApi,\n PreviewParams,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessRoute,\n ProcessTask,\n ReturnableNode,\n ReturnParams,\n ResubmitParams,\n RuntimeResponse,\n SaveTaskParams,\n TransferParams,\n ViewPermissionQueryParams,\n ViewPermissionSummary,\n WithdrawParams,\n} from '../types';\n\n// ============ 流程基础 ============\n\nconst normalizeProcessTask = (value: any): ProcessTask => {\n const taskId = value?.taskId ?? value?.id ?? value?.task_id ?? '';\n return {\n ...value,\n id: value?.id ?? taskId,\n taskId,\n nodeId: value?.nodeId ?? value?.node_id ?? '',\n nodeType: value?.nodeType ?? value?.node_type ?? 'approval',\n nodeName: value?.nodeName ?? value?.title ?? value?.name ?? value?.nodeId ?? '审批节点',\n status: value?.status ?? 'pending',\n assigneeId: value?.assigneeId ?? value?.assignee,\n };\n};\n\nconst normalizeProcessTasks = (value: any): ProcessTask[] => {\n if (Array.isArray(value)) return value.map(normalizeProcessTask);\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value.tasks)) return value.tasks.map(normalizeProcessTask);\n if (Array.isArray(value.currentTasks)) return value.currentTasks.map(normalizeProcessTask);\n if (Array.isArray(value.list)) return value.list.map(normalizeProcessTask);\n if (Array.isArray(value.items)) return value.items.map(normalizeProcessTask);\n if (Array.isArray(value.records)) return value.records.map(normalizeProcessTask);\n return [];\n};\n\nconst normalizeProcessBasic = (value: any): ProcessBasicInfo => {\n const raw = value ?? {};\n const instance = raw.instance ?? raw;\n const currentTask = raw.currentTask ? normalizeProcessTask(raw.currentTask) : undefined;\n\n return {\n ...raw,\n instanceId: raw.instanceId ?? raw.id ?? instance.formInstanceId ?? instance.id,\n processStatus: raw.processStatus ?? raw.status ?? instance.processStatus ?? instance.status,\n formUuid: raw.formUuid ?? instance.formUuid ?? instance.definition?.formUuid,\n appType: raw.appType ?? instance.appType ?? instance.definition?.appType,\n title: raw.title ?? instance.title,\n originatorId: raw.originatorId ?? instance.originatorId ?? instance.startedBy,\n originatorName: raw.originatorName ?? instance.originatorName ?? instance.startedByName,\n originatorDepartment:\n raw.originatorDepartment ?? instance.originatorDepartment ?? instance.startedDepartmentName,\n createdAt: raw.createdAt ?? instance.createdAt ?? instance.startedAt,\n currentTask,\n };\n};\n\nconst normalizeApprovalPermission = (value: any): ApprovalPermission => {\n const raw = value ?? {};\n const currentTasks = normalizeProcessTasks(raw.currentTasks);\n const hasPermission = Boolean(raw.hasPermission ?? raw.isApprover ?? currentTasks.length > 0);\n\n return {\n ...raw,\n hasPermission,\n isApprover: Boolean(raw.isApprover ?? hasPermission),\n canUndo: Boolean(raw.canUndo ?? raw.canWithdraw),\n currentTasks,\n };\n};\n\nconst normalizeReturnableNodes = (value: any): ReturnableNode[] => {\n const raw = value?.candidates || value?.nodes || value?.data || value;\n if (!Array.isArray(raw)) return [];\n return raw.map((node) => ({\n ...node,\n nodeId: node?.nodeId || node?.id || '',\n nodeName: node?.nodeName || node?.name || node?.title || node?.id || '',\n }));\n};\n\nconst normalizeProcessDefinition = (value: any): ProcessDefinition => {\n const raw = value?.definitionJson || value?.viewJson || value || {};\n const nodes = Array.isArray(raw.nodes) ? raw.nodes : [];\n const startNode = nodes.find((node: any) => node?.type === 'start' || node?.nodeType === 'start');\n return {\n ...raw,\n processId: raw.processId || raw.id || value?.id || '',\n flowConfig: raw.flowConfig || value?.flowConfig || {},\n startNodeId: raw.startNodeId || startNode?.id || value?.startNodeId,\n };\n};\n\n/** 获取流程基本信息 */\nexport async function getProcessBasic(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessBasicInfo> {\n const response = (await request<ProcessBasicInfo>({\n url: `/workflow/instance/${formInstId}/basic`,\n method: 'get',\n })) as RuntimeResponse<ProcessBasicInfo>;\n return normalizeProcessBasic(response.data || response.result);\n}\n\n/** 获取流程进度(任务列表) */\nexport async function getProcessProgress(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessTask[]> {\n const response = (await request<any>({\n url: `/workflow/instance/${formInstId}/all-tasks`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return normalizeProcessTasks(response.data || response.result);\n}\n\n/** 检查当前用户审批权限 */\nexport async function checkUserApproval(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ApprovalPermission> {\n const response = (await request<ApprovalPermission>({\n url: `/workflow/instance/${formInstId}/permission`,\n method: 'get',\n })) as RuntimeResponse<ApprovalPermission>;\n return normalizeApprovalPermission(response.data || response.result);\n}\n\n// ============ 审批操作 ============\n\n/** 审批(同意/拒绝) */\nexport async function handleApproval(\n request: FormRuntimeApi['request'],\n params: ApproveParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/approve',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 撤销流程 */\nexport async function withdrawProcess(\n request: FormRuntimeApi['request'],\n params: WithdrawParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/instance/${params.instanceId}/withdraw`,\n method: 'put',\n data: { reason: params.reason },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 转交任务 */\nexport async function transferTask(\n request: FormRuntimeApi['request'],\n params: TransferParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/transfer`,\n method: 'put',\n data: { newAssignee: params.newAssignee, reason: params.reason },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 退回任务 */\nexport async function returnTask(\n request: FormRuntimeApi['request'],\n params: ReturnParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/return`,\n method: 'put',\n data: { targetNodeId: params.targetNodeId, reason: params.reason },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 重新提交任务 */\nexport async function resubmitTask(\n request: FormRuntimeApi['request'],\n params: ResubmitParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit`,\n method: 'post',\n data: {\n formUuid: params.formUuid,\n appType: params.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n },\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 暂存任务 */\nexport async function saveTask(\n request: FormRuntimeApi['request'],\n params: SaveTaskParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/task/save',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 获取可退回节点 */\nexport async function getReturnableNodes(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNode[]> {\n const response = (await request<ReturnableNode[]>({\n url: `/workflow/task/${taskId}/returnable-nodes`,\n method: 'get',\n })) as RuntimeResponse<ReturnableNode[]>;\n return normalizeReturnableNodes(response.data || response.result);\n}\n\n// ============ 流程预览和定义 ============\n\n/** 预览流程路由 */\nexport async function previewProcess(\n request: FormRuntimeApi['request'],\n params: PreviewParams,\n): Promise<ProcessRoute[]> {\n const response = (await request<ProcessRoute[]>({\n url: '/workflow/preview',\n method: 'post',\n data: params,\n })) as RuntimeResponse<ProcessRoute[]>;\n return response.data || response.result || [];\n}\n\n/** 获取流程定义 */\nexport async function getProcessDefinition(\n request: FormRuntimeApi['request'],\n formUuid: string,\n): Promise<ProcessDefinition> {\n const response = (await request<ProcessDefinition>({\n url: '/workflow/definition/form',\n method: 'get',\n params: { formUuid },\n })) as RuntimeResponse<ProcessDefinition>;\n return normalizeProcessDefinition(response.data || response.result);\n}\n\n/** 触发回调等待任务 */\nexport async function triggerCallbackTask(\n request: FormRuntimeApi['request'],\n params: { taskId: string; payload?: Record<string, any> },\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/callback`,\n method: 'post',\n data: params.payload || {},\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n// ============ 表单详情 ============\n\n/** 获取表单实例数据 */\nexport async function getFormData(\n request: FormRuntimeApi['request'],\n params: FormDataQueryParams,\n): Promise<FormInstanceData> {\n const response = (await request<FormInstanceData>({\n url: '/form/queryFormDataByFormInstanceId',\n method: 'get',\n params,\n })) as RuntimeResponse<FormInstanceData>;\n return response.data || response.result!;\n}\n\n/** 删除表单数据 */\nexport async function deleteFormData(\n request: FormRuntimeApi['request'],\n params: FormDataDeleteParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return response.data || response.result;\n}\n\n/** 获取表单变更记录 */\nexport async function getChangeRecords(\n request: FormRuntimeApi['request'],\n params: ChangeRecordQueryParams,\n): Promise<ChangeRecordListResponse> {\n const response = (await request<ChangeRecordListResponse>({\n url: '/form/getFormDataChangeRecords',\n method: 'get',\n params,\n })) as RuntimeResponse<ChangeRecordListResponse>;\n return response.data || response.result!;\n}\n\n/** 获取视图权限摘要 */\nexport async function getViewPermission(\n request: FormRuntimeApi['request'],\n params: ViewPermissionQueryParams,\n): Promise<ViewPermissionSummary> {\n const response = (await request<ViewPermissionSummary>({\n url: '/permission/form-group/view-permissions',\n method: 'get',\n params,\n })) as RuntimeResponse<ViewPermissionSummary>;\n return response.data || response.result!;\n}\n","import type { FieldDefinition, FormRuntimeApi, RuntimeResponse } from '../types';\n\nexport type DataManagementConfigScope = 'global' | 'personal';\nexport type DataManagementDensity = 'compact' | 'middle' | 'loose';\nexport type FilterLogic = 'AND' | 'OR';\nexport type SortDirection = 'ascend' | 'descend' | null;\n\nexport interface DataManagementField extends FieldDefinition {\n id: string;\n fieldId: string;\n componentName: string;\n label: string;\n width?: number;\n system?: boolean;\n processOnly?: boolean;\n displayable?: boolean;\n}\n\nexport interface DataManagementFilterRule {\n id: string;\n key: string;\n operator: string;\n value: any;\n componentName?: string;\n}\n\nexport interface DataManagementFilterGroup {\n id: string;\n logic: FilterLogic;\n rules: DataManagementFilterRule[];\n conditions: DataManagementFilterGroup[];\n}\n\nexport interface DataManagementSort {\n id: string;\n isAsc: 'y' | 'n';\n}\n\nexport interface DataManagementConfig {\n showFields?: string[];\n widths?: Record<string, number>;\n lockFieldIds?: string[];\n sort?: DataManagementSort[];\n filter?: {\n searchKeyWord?: string;\n group?: DataManagementFilterGroup;\n };\n density?: DataManagementDensity;\n detailOpenMode?: 'drawer' | 'newPage';\n pageSize?: number;\n [key: string]: any;\n}\n\nexport interface DataManagementQuery {\n appType: string;\n formUuid: string;\n filters?: DataManagementFilterGroup;\n rawFilters?: string;\n conditionType?: FilterLogic;\n searchKeyWord?: string;\n currentPage?: number;\n pageSize?: number;\n order?: DataManagementSort[];\n instanceStatus?: string;\n}\n\nexport interface DataManagementListResult {\n records: any[];\n total: number;\n}\n\nexport interface DataManagementApiOptions {\n appType: string;\n formUuid: string;\n menuFormUuid?: string;\n scope?: DataManagementConfigScope;\n}\n\nconst unwrap = <T = any>(response: RuntimeResponse<T> | Blob | any): T => {\n if (response instanceof Blob) return response as T;\n if (response?.data?.result !== undefined) return response.data.result as T;\n if (response?.result !== undefined) return response.result as T;\n if (response?.data !== undefined) return response.data as T;\n return response as T;\n};\n\nconst pickData = (value: any) => value?.data ?? value?.result ?? value;\n\nconst normalizeComponentName = (field: any) =>\n field?.componentName ||\n field?.component_name ||\n field?.component_type ||\n field?.componentType ||\n field?.type ||\n 'TextField';\n\nconst normalizeField = (key: string, field: any, system = false): DataManagementField => ({\n ...field,\n id: field?.id || field?.fieldId || key,\n fieldId: field?.fieldId || field?.id || key,\n componentName: normalizeComponentName(field),\n label: field?.label || field?.title || field?.name || key,\n width: field?.width,\n system,\n});\n\nconst SYSTEM_VALUE_ALIASES: Record<string, string[]> = {\n formInstanceId: ['formInstanceId', 'formInstId', 'form_instance_id', 'processInstanceId'],\n instanceTitle: ['instanceTitle', 'instance_title', 'processInstanceTitle', 'title'],\n createdBy: ['createdBy', 'created_by', 'originator'],\n createdByName: ['createdByName', 'created_by_name', 'originatorName', 'creatorName'],\n createdByDepartmentId: ['createdByDepartmentId', 'created_by_department_id', 'originatorCorp'],\n createdByDepartmentName: [\n 'createdByDepartmentName',\n 'created_by_department_name',\n 'originatorDepartmentName',\n 'originatorCorpName',\n ],\n createdAt: ['createdAt', 'created_at', 'createTime', 'gmtCreate'],\n updatedAt: ['updatedAt', 'updated_at', 'modifiedTime', 'modifyTime', 'gmtModified'],\n};\n\nconst pickAliasValue = (record: any, aliases: string[]) => {\n for (const alias of aliases) {\n const value = record?.[alias];\n if (value !== undefined && value !== null && value !== '') return value;\n }\n return undefined;\n};\n\nconst normalizeDataManagementRecord = (record: any) => {\n if (!record || typeof record !== 'object' || Array.isArray(record)) return record;\n const normalized = { ...record };\n Object.entries(SYSTEM_VALUE_ALIASES).forEach(([targetKey, aliases]) => {\n if (normalized[targetKey] !== undefined && normalized[targetKey] !== null) return;\n const aliasValue = pickAliasValue(record, aliases);\n if (aliasValue !== undefined) normalized[targetKey] = aliasValue;\n });\n return normalized;\n};\n\nexport const PROCESS_INSTANCE_STATUS_OPTIONS = [\n { label: '待处理', value: 'pending' },\n { label: '审批中', value: 'running' },\n { label: '等待中', value: 'waiting' },\n { label: '流程异常', value: 'exception' },\n { label: '已完成', value: 'completed' },\n { label: '已拒绝', value: 'terminated' },\n { label: '已撤销', value: 'withdrawn' },\n];\n\nexport const APPROVAL_RESULT_OPTIONS = [\n { label: '审批中', value: 'processing' },\n { label: '同意', value: 'approved' },\n { label: '拒绝', value: 'rejected' },\n { label: '撤销', value: 'withdrawn' },\n { label: '异常', value: 'exception' },\n];\n\nconst PROCESS_SYSTEM_FIELDS: DataManagementField[] = [\n normalizeField(\n 'currentApprovalNodeName',\n {\n label: '当前审批节点',\n componentName: 'TextField',\n width: 140,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n normalizeField(\n 'processInstanceStatus',\n {\n label: '实例状态',\n componentName: 'SelectField',\n width: 110,\n options: PROCESS_INSTANCE_STATUS_OPTIONS,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n normalizeField(\n 'approvalResult',\n {\n label: '审批结果',\n componentName: 'SelectField',\n width: 110,\n options: APPROVAL_RESULT_OPTIONS,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n];\n\nconst BASE_SYSTEM_FIELDS: DataManagementField[] = [\n normalizeField(\n 'instanceTitle',\n { label: '实例标题', componentName: 'TextField', width: 220, displayable: true },\n true,\n ),\n normalizeField(\n 'createdByName',\n { label: '创建人', componentName: 'TextField', width: 130, displayable: true },\n true,\n ),\n normalizeField(\n 'createdByDepartmentName',\n { label: '创建人部门', componentName: 'TextField', width: 150, displayable: true },\n true,\n ),\n normalizeField(\n 'createdAt',\n { label: '创建时间', componentName: 'DateField', width: 170, displayable: true },\n true,\n ),\n normalizeField(\n 'updatedAt',\n { label: '更新时间', componentName: 'DateField', width: 170, displayable: true },\n true,\n ),\n];\n\nexport const getSystemFieldsForFormType = (formType?: string) =>\n formType === 'process' ? [...BASE_SYSTEM_FIELDS, ...PROCESS_SYSTEM_FIELDS] : BASE_SYSTEM_FIELDS;\n\nexport const normalizeDataManagementFields = (\n payload: any,\n): {\n fields: DataManagementField[];\n formType?: string;\n} => {\n const data = pickData(payload);\n const formType = data?.formType || data?.schema?.formType || data?.type;\n const rawFields =\n data?.formFields ||\n data?.schema?.formFields ||\n data?.fields ||\n data?.schema?.fields ||\n data?.formSchema?.fields ||\n [];\n\n const fields = Array.isArray(rawFields)\n ? rawFields.map((field: any) => normalizeField(field?.fieldId || field?.id, field))\n : Object.entries(rawFields).map(([key, field]) => normalizeField(key, field));\n\n return {\n fields: fields.filter((field) => field.componentName !== 'PageSection'),\n formType,\n };\n};\n\nexport const normalizeDataManagementList = (payload: any): DataManagementListResult => {\n const data = unwrap<any>(payload);\n const body = data?.result || data;\n const records = body?.data || body?.records || body?.list || body?.items || [];\n const total = body?.totalCount ?? body?.total ?? body?.count ?? records.length;\n return {\n records: Array.isArray(records) ? records.map(normalizeDataManagementRecord) : [],\n total: Number(total) || 0,\n };\n};\n\nexport const buildFilterPayload = (group?: DataManagementFilterGroup): string | undefined => {\n if (!group) return undefined;\n const trimGroup = (current: DataManagementFilterGroup): DataManagementFilterGroup => ({\n ...current,\n rules: (current.rules || []).filter(\n (rule) => rule.key && rule.operator && rule.value !== undefined && rule.value !== '',\n ),\n conditions: (current.conditions || [])\n .map(trimGroup)\n .filter((item) => item.rules.length > 0 || item.conditions.length > 0),\n });\n const payload = trimGroup(group);\n if (payload.rules.length === 0 && payload.conditions.length === 0) return undefined;\n return JSON.stringify(payload);\n};\n\nexport const normalizeColumnConfig = (\n cfg: DataManagementConfig | undefined,\n fields: DataManagementField[],\n): Required<Pick<DataManagementConfig, 'showFields' | 'widths' | 'lockFieldIds' | 'sort'>> & {\n density: DataManagementDensity;\n detailOpenMode: 'drawer' | 'newPage';\n pageSize: number;\n} => {\n const allowed = new Set(fields.map((field) => field.fieldId));\n const configured = Array.isArray(cfg?.showFields)\n ? cfg.showFields.filter((fieldId) => allowed.has(fieldId))\n : [];\n const defaultBusinessFields = fields\n .filter((field) => !field.system)\n .slice(0, 8)\n .map((field) => field.fieldId);\n const defaultSystemFields = fields\n .filter((field) => field.system && field.displayable)\n .map((field) => field.fieldId);\n const defaultShow = [...defaultBusinessFields, ...defaultSystemFields];\n\n return {\n showFields: configured.length > 0 ? configured : defaultShow,\n widths: cfg?.widths || {},\n lockFieldIds: cfg?.lockFieldIds || [],\n sort: Array.isArray(cfg?.sort) ? cfg.sort : [],\n density: cfg?.density || 'middle',\n detailOpenMode: cfg?.detailOpenMode === 'newPage' ? 'newPage' : 'drawer',\n pageSize: cfg?.pageSize || 10,\n };\n};\n\nexport async function getDataManagementSchema(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string },\n) {\n const response = await request({\n url: '/form/getFormSchemaAndPackages',\n method: 'get',\n params,\n });\n return normalizeDataManagementFields(response);\n}\n\nexport async function getDataManagementConfig(\n request: FormRuntimeApi['request'],\n options: DataManagementApiOptions,\n): Promise<DataManagementConfig | undefined> {\n const targetFormUuid = options.menuFormUuid || options.formUuid;\n const personal = options.scope === 'personal';\n const response = await request<DataManagementConfig>({\n url: `/${options.appType}/v1/form/dataManagement/config/${personal ? 'personal/' : ''}get.json`,\n method: 'get',\n params: { formUuid: targetFormUuid },\n });\n return unwrap<DataManagementConfig>(response);\n}\n\nexport async function saveDataManagementConfig(\n request: FormRuntimeApi['request'],\n options: DataManagementApiOptions & { config: DataManagementConfig },\n) {\n const targetFormUuid = options.menuFormUuid || options.formUuid;\n const personal = options.scope === 'personal';\n const response = await request({\n url: `/${options.appType}/v1/form/dataManagement/config/${personal ? 'personal/' : ''}save.json`,\n method: 'post',\n data: { formUuid: targetFormUuid, config: options.config },\n });\n return unwrap(response);\n}\n\nexport async function advancedSearchDataManagement(\n request: FormRuntimeApi['request'],\n query: DataManagementQuery,\n): Promise<DataManagementListResult> {\n const response = await request({\n url: `/${query.appType}/v1/form/advancedSearch.json`,\n method: 'get',\n params: {\n appType: query.appType,\n formUuid: query.formUuid,\n filters: query.rawFilters ?? buildFilterPayload(query.filters),\n conditionType: query.conditionType,\n searchKeyWord: query.searchKeyWord,\n currentPage: query.currentPage || 1,\n pageSize: query.pageSize || 10,\n order: JSON.stringify(query.order || []),\n instanceStatus: query.instanceStatus,\n },\n });\n return normalizeDataManagementList(response);\n}\n\nexport async function deleteDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; formInstanceIds: string[] },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: {\n appType: params.appType,\n formUuid: params.formUuid,\n formInstIds: params.formInstanceIds,\n formInstanceIds: params.formInstanceIds,\n },\n });\n return unwrap(response);\n}\n\nexport async function batchApproveDataManagementRows(\n request: FormRuntimeApi['request'],\n params: {\n appType: string;\n formUuid: string;\n formInstanceIds: string[];\n action: 'approved' | 'rejected';\n comments?: string;\n },\n) {\n const response = await request({\n url: '/workflow/approve/batch',\n method: 'post',\n data: {\n instanceIds: params.formInstanceIds,\n action: params.action,\n comments: params.comments,\n },\n });\n return unwrap(response);\n}\n\nexport async function exportDataManagementRows(\n request: FormRuntimeApi['request'],\n params: DataManagementQuery & {\n exportAll?: 'y' | 'n';\n embedImages?: 'y' | 'n';\n exportFields?: string[];\n },\n) {\n return request({\n url: `/${params.appType}/v1/form/advancedExport.xlsx`,\n method: 'get',\n responseType: 'blob',\n params: {\n appType: params.appType,\n formUuid: params.formUuid,\n filters: params.rawFilters ?? buildFilterPayload(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: JSON.stringify(params.order || []),\n instanceStatus: params.instanceStatus,\n exportAll: params.exportAll || 'n',\n embedImages: params.embedImages || 'n',\n exportFields: (params.exportFields || []).join(','),\n },\n });\n}\n\nexport async function downloadDataManagementImportTemplate(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string },\n) {\n return request({\n url: `/${params.appType}/v1/form/advancedExportTemplate.xlsx`,\n method: 'get',\n responseType: 'blob',\n params: {\n formUuid: params.formUuid,\n },\n });\n}\n\nexport async function importPreviewDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; fileBase64: string },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/importPreview.xlsx`,\n method: 'post',\n data: { formUuid: params.formUuid, fileBase64: params.fileBase64 },\n });\n return unwrap(response);\n}\n\nexport async function importDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; fileBase64: string },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/import.xlsx`,\n method: 'post',\n data: { formUuid: params.formUuid, fileBase64: params.fileBase64 },\n });\n return unwrap(response);\n}\n\nexport async function getDataManagementTransferRecords(\n request: FormRuntimeApi['request'],\n params: {\n appType: string;\n formUuid: string;\n type: 'import' | 'export';\n currentPage?: number;\n pageSize?: number;\n },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/${params.type}Records.json`,\n method: 'get',\n params,\n });\n return normalizeDataManagementList(response);\n}\n","import React, { useState } from 'react';\n\nexport interface FormSectionProps {\n title: string;\n description?: string;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n className?: string;\n titleClassName?: string;\n contentClassName?: string;\n children: React.ReactNode;\n}\n\nexport function FormSection({\n title,\n description,\n collapsible = false,\n defaultCollapsed = false,\n className,\n titleClassName,\n contentClassName,\n children,\n}: FormSectionProps) {\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n const handleToggle = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section\n className={className ?? 'border border-gray-200 rounded-lg p-4 mb-4'}\n data-testid=\"form-section\"\n >\n <div\n className={titleClassName ?? 'flex items-center justify-between mb-3'}\n onClick={handleToggle}\n role={collapsible ? 'button' : undefined}\n aria-expanded={collapsible ? !collapsed : undefined}\n data-testid=\"form-section-header\"\n >\n <div>\n <h3 className=\"text-base font-semibold text-gray-900\">{title}</h3>\n {description && (\n <p className=\"text-sm text-gray-500 mt-1\" data-testid=\"form-section-description\">\n {description}\n </p>\n )}\n </div>\n {collapsible && (\n <span\n className=\"text-gray-400 transition-transform duration-200\"\n data-testid=\"form-section-arrow\"\n style={{ transform: collapsed ? 'rotate(-90deg)' : 'rotate(0deg)' }}\n >\n ▼\n </span>\n )}\n </div>\n {!collapsed && (\n <div className={contentClassName} data-testid=\"form-section-content\">\n {children}\n </div>\n )}\n </section>\n );\n}\n","import React from 'react';\n\nexport interface FormGridProps {\n columns?: 1 | 2 | 3 | 4;\n gap?: number;\n className?: string;\n children: React.ReactNode;\n}\n\nconst columnClasses: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-4',\n};\n\nconst gapClasses: Record<number, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n};\n\nexport function FormGrid({ columns = 2, gap = 4, className, children }: FormGridProps) {\n const colClass = columnClasses[columns];\n const gapClass = gapClasses[gap] ?? `gap-${gap}`;\n\n return (\n <div className={className ?? `grid ${colClass} ${gapClass}`} data-testid=\"form-grid\">\n {children}\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nexport interface FormTabItem {\n key: string;\n label: string;\n children: React.ReactNode;\n}\n\nexport interface FormTabsProps {\n items: FormTabItem[];\n defaultActiveKey?: string;\n className?: string;\n tabClassName?: string;\n}\n\nexport function FormTabs({ items, defaultActiveKey, className, tabClassName }: FormTabsProps) {\n const [activeKey, setActiveKey] = useState(defaultActiveKey || items[0]?.key || '');\n\n const activeItem = items.find((item) => item.key === activeKey);\n\n return (\n <div className={className ?? 'w-full'} data-testid=\"form-tabs\">\n <div\n className={tabClassName ?? 'flex border-b border-gray-200 overflow-x-auto'}\n role=\"tablist\"\n data-testid=\"form-tabs-nav\"\n >\n {items.map((item) => (\n <button\n key={item.key}\n role=\"tab\"\n type=\"button\"\n aria-selected={activeKey === item.key}\n className={\n activeKey === item.key\n ? 'px-4 py-2 text-sm font-medium text-blue-600 border-b-2 border-blue-600 whitespace-nowrap'\n : 'px-4 py-2 text-sm font-medium text-gray-500 hover:text-gray-700 whitespace-nowrap'\n }\n onClick={() => setActiveKey(item.key)}\n data-testid={`form-tab-${item.key}`}\n >\n {item.label}\n </button>\n ))}\n </div>\n <div className=\"pt-4\" role=\"tabpanel\" data-testid=\"form-tabs-content\">\n {activeItem?.children}\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nexport interface FormStepItem {\n key: string;\n title: string;\n description?: string;\n children: React.ReactNode;\n}\n\nexport interface FormStepsProps {\n items: FormStepItem[];\n className?: string;\n onStepChange?: (step: number) => void;\n}\n\nexport function FormSteps({ items, className, onStepChange }: FormStepsProps) {\n const [currentStep, setCurrentStep] = useState(0);\n\n const goTo = (step: number) => {\n setCurrentStep(step);\n onStepChange?.(step);\n };\n\n const handlePrev = () => {\n if (currentStep > 0) {\n goTo(currentStep - 1);\n }\n };\n\n const handleNext = () => {\n if (currentStep < items.length - 1) {\n goTo(currentStep + 1);\n }\n };\n\n return (\n <div className={className ?? 'w-full'} data-testid=\"form-steps\">\n {/* Step indicator */}\n <div className=\"flex items-center mb-6\" data-testid=\"form-steps-indicator\">\n {items.map((item, index) => (\n <React.Fragment key={item.key}>\n <div className=\"flex items-center\">\n <div\n className={\n index === currentStep\n ? 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-blue-600 text-white'\n : index < currentStep\n ? 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-green-500 text-white'\n : 'w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-gray-200 text-gray-600'\n }\n data-testid={`form-step-circle-${index}`}\n >\n {index + 1}\n </div>\n <div className=\"ml-2 hidden sm:block\">\n <div className=\"text-sm font-medium text-gray-900\">{item.title}</div>\n {item.description && (\n <div className=\"text-xs text-gray-500\">{item.description}</div>\n )}\n </div>\n </div>\n {index < items.length - 1 && (\n <div\n className={\n index < currentStep\n ? 'flex-1 h-0.5 mx-4 bg-green-500'\n : 'flex-1 h-0.5 mx-4 bg-gray-200'\n }\n data-testid={`form-step-connector-${index}`}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Content */}\n <div data-testid=\"form-steps-content\">{items[currentStep]?.children}</div>\n\n {/* Navigation buttons */}\n <div className=\"flex justify-between mt-6\" data-testid=\"form-steps-actions\">\n <button\n type=\"button\"\n onClick={handlePrev}\n disabled={currentStep === 0}\n className={\n currentStep === 0\n ? 'px-4 py-2 text-sm font-medium text-gray-400 bg-gray-100 rounded cursor-not-allowed'\n : 'px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded hover:bg-gray-50'\n }\n data-testid=\"form-steps-prev\"\n >\n 上一步\n </button>\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={currentStep === items.length - 1}\n className={\n currentStep === items.length - 1\n ? 'px-4 py-2 text-sm font-medium text-gray-400 bg-gray-100 rounded cursor-not-allowed'\n : 'px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded hover:bg-blue-700'\n }\n data-testid=\"form-steps-next\"\n >\n 下一步\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useFormContext } from '../../core/FormContext';\n\nexport interface FormSummaryProps {\n className?: string;\n labelClassName?: string;\n valueClassName?: string;\n columns?: 1 | 2 | 3;\n fields?: string[];\n}\n\nconst columnClasses: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n};\n\nexport function FormSummary({\n className,\n labelClassName,\n valueClassName,\n columns = 2,\n fields,\n}: FormSummaryProps) {\n const { schema, formData } = useFormContext();\n\n const displayFields = fields\n ? schema.fields.filter((f) => fields.includes(f.fieldId))\n : schema.fields;\n\n const colClass = columnClasses[columns];\n\n const formatValue = (value: any): string => {\n if (value === null || value === undefined || value === '') return '--';\n if (Array.isArray(value)) {\n if (value.length === 0) return '--';\n return value.map((v) => (typeof v === 'object' && v?.label ? v.label : String(v))).join(', ');\n }\n if (typeof value === 'object' && value?.label) return value.label;\n return String(value);\n };\n\n return (\n <div className={className ?? `grid ${colClass} gap-4`} data-testid=\"form-summary\">\n {displayFields.map((field) => (\n <div\n key={field.fieldId}\n className=\"flex flex-col\"\n data-testid={`summary-field-${field.fieldId}`}\n >\n <span className={labelClassName ?? 'text-sm text-gray-500 mb-1'}>{field.label}</span>\n <span className={valueClassName ?? 'text-sm text-gray-900'}>\n {formatValue(formData[field.fieldId])}\n </span>\n </div>\n ))}\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useRef } from 'react';\nimport type { FieldBehavior, FormSchema, FormEngineConfig, ValidationRule } from '../types';\nimport { evaluateEffects } from '../core/effects';\nimport { validateAllFields } from '../core/validation';\n\nexport interface UseFormEngineReturn {\n formData: Record<string, any>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n validateAll: () => Promise<boolean>;\n resetForm: () => void;\n mode: string;\n fieldBehaviors: Record<string, FieldBehavior>;\n fieldErrors: Record<string, string>;\n}\n\nexport function useFormEngine(schema: FormSchema, config: FormEngineConfig): UseFormEngineReturn {\n // Build initial values from schema defaults\n const initialValues = useMemo(() => {\n const values: Record<string, any> = {};\n for (const field of schema.fields) {\n if (field.defaultValue !== undefined) {\n values[field.fieldId] = field.defaultValue;\n }\n }\n return values;\n }, [schema]);\n\n const initialValuesRef = useRef(initialValues);\n const [formData, setFormData] = useState<Record<string, any>>({ ...initialValues });\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n\n // Compute field behaviors based on permissions and effects\n const fieldBehaviors = useMemo(() => {\n // Start with default behaviors from schema\n const baseBehaviors: Record<string, FieldBehavior> = {};\n for (const field of schema.fields) {\n baseBehaviors[field.fieldId] = field.behavior || 'NORMAL';\n }\n\n // Apply effects\n let computed = baseBehaviors;\n if (config.effects && config.effects.length > 0) {\n computed = evaluateEffects(config.effects, formData, baseBehaviors);\n }\n\n // Apply permissions (override effects)\n if (config.permissions?.fieldPermissions) {\n for (const [fieldId, behavior] of Object.entries(config.permissions.fieldPermissions)) {\n computed[fieldId] = behavior;\n }\n }\n\n // In readonly mode, all fields become READONLY unless HIDDEN\n if (config.mode === 'readonly') {\n for (const fieldId of Object.keys(computed)) {\n if (computed[fieldId] !== 'HIDDEN') {\n computed[fieldId] = 'READONLY';\n }\n }\n }\n\n return computed;\n }, [schema, config.effects, config.permissions, config.mode, formData]);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n // Clear error when value changes\n setFieldErrors((prev) => {\n if (prev[fieldId]) {\n const next = { ...prev };\n delete next[fieldId];\n return next;\n }\n return prev;\n });\n }, []);\n\n const getFieldValue = useCallback((fieldId: string) => formData[fieldId], [formData]);\n\n const getFormData = useCallback(() => ({ ...formData }), [formData]);\n\n const validateAll = useCallback(async () => {\n const fieldRules: Record<string, ValidationRule[]> = {};\n for (const field of schema.fields) {\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n if (rules.length > 0) {\n fieldRules[field.fieldId] = rules;\n }\n }\n\n const errors = await validateAllFields(formData, fieldRules);\n setFieldErrors(errors);\n return Object.keys(errors).length === 0;\n }, [schema, formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setFieldErrors({});\n }, []);\n\n return {\n formData,\n setFieldValue,\n getFieldValue,\n getFormData,\n validateAll,\n resetForm,\n mode: config.mode,\n fieldBehaviors,\n fieldErrors,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\n\nexport interface UseFormDataReturn {\n formData: Record<string, any>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n resetForm: () => void;\n dirtyFields: Set<string>;\n}\n\nexport function useFormData(initialValues: Record<string, any> = {}): UseFormDataReturn {\n const [formData, setFormData] = useState<Record<string, any>>({ ...initialValues });\n const [dirtyFields, setDirtyFields] = useState<Set<string>>(new Set());\n const initialValuesRef = useRef(initialValues);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n setDirtyFields((prev) => {\n const next = new Set(prev);\n next.add(fieldId);\n return next;\n });\n }, []);\n\n const getFieldValue = useCallback(\n (fieldId: string) => {\n return formData[fieldId];\n },\n [formData],\n );\n\n const getFormData = useCallback(() => {\n return { ...formData };\n }, [formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setDirtyFields(new Set());\n }, []);\n\n return {\n formData,\n setFieldValue,\n getFieldValue,\n getFormData,\n resetForm,\n dirtyFields,\n };\n}\n","import { useMemo } from 'react';\nimport type { FieldBehavior, FormEffect } from '../types';\nimport { evaluateEffects } from '../core/effects';\n\nexport interface UseFieldBehaviorOptions {\n fieldId: string;\n permissions?: Record<string, FieldBehavior>;\n effects?: FormEffect[];\n formData: Record<string, any>;\n defaultBehavior?: FieldBehavior;\n}\n\n/**\n * Computes the final behavior for a field.\n * Priority: permissions > effects > defaultBehavior > 'NORMAL'\n */\nexport function useFieldBehavior({\n fieldId,\n permissions,\n effects,\n formData,\n defaultBehavior = 'NORMAL',\n}: UseFieldBehaviorOptions): FieldBehavior {\n return useMemo(() => {\n // If permissions explicitly define this field, that takes priority\n if (permissions && permissions[fieldId]) {\n return permissions[fieldId];\n }\n\n // Evaluate effects to see if they modify the behavior\n if (effects && effects.length > 0) {\n const baseBehaviors: Record<string, FieldBehavior> = { [fieldId]: defaultBehavior };\n const computed = evaluateEffects(effects, formData, baseBehaviors);\n return computed[fieldId] as FieldBehavior;\n }\n\n return defaultBehavior;\n }, [fieldId, permissions, effects, formData, defaultBehavior]);\n}\n","import { useState, useCallback } from 'react';\n\nexport interface SubmitConfig {\n beforeSubmit?: (values: Record<string, any>) => Promise<boolean | void>;\n afterSubmit?: (response: any) => Promise<void>;\n submitSuccessMode?: 'redirect' | 'stay' | 'callback';\n redirectUrl?: string;\n}\n\nexport interface UseFormSubmitReturn {\n submit: (formData: Record<string, any>, validateFn: () => Promise<boolean>) => Promise<void>;\n isSubmitting: boolean;\n submitError: string | null;\n}\n\nexport function useFormSubmit(config?: SubmitConfig): UseFormSubmitReturn {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const submit = useCallback(\n async (formData: Record<string, any>, validateFn: () => Promise<boolean>) => {\n setSubmitError(null);\n\n // Validate\n const isValid = await validateFn();\n if (!isValid) {\n setSubmitError('表单校验失败');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // beforeSubmit hook\n if (config?.beforeSubmit) {\n const result = await config.beforeSubmit(formData);\n if (result === false) {\n setIsSubmitting(false);\n return;\n }\n }\n\n // afterSubmit hook (simulates completion of submit)\n if (config?.afterSubmit) {\n await config.afterSubmit(formData);\n }\n } catch (e: any) {\n setSubmitError(e?.message || '提交失败');\n } finally {\n setIsSubmitting(false);\n }\n },\n [config],\n );\n\n return { submit, isSubmitting, submitError };\n}\n","import { useMemo, useCallback } from 'react';\nimport type {\n FieldBehavior,\n ProcessDefinition,\n ProcessTask,\n ViewPermissionSummary,\n} from '../types';\nimport { normalizeFieldBehaviors } from '../utils/permissions';\n\nexport interface UseFieldPermissionOptions {\n viewPermissions?: ViewPermissionSummary;\n processDefinition?: ProcessDefinition;\n currentTask?: ProcessTask;\n isApprover?: boolean;\n mode: 'readonly' | 'edit';\n}\n\nexport interface UseFieldPermissionReturn {\n fieldBehaviors: Record<string, FieldBehavior>;\n computeBehaviors: () => Record<string, FieldBehavior>;\n}\n\nconst normalizeBehavior = (value?: string): FieldBehavior => {\n if (value === 'EDITABLE') return 'NORMAL';\n if (value === 'READ_ONLY') return 'READONLY';\n if (value === 'DISABLED') return 'DISABLED';\n if (value === 'HIDDEN') return 'HIDDEN';\n if (value === 'NORMAL' || value === 'READONLY') return value;\n return 'READONLY';\n};\n\nconst normalizeFlowConfig = (config: any): Record<string, FieldBehavior> | null => {\n if (!config) return null;\n if (Array.isArray(config)) {\n const result: Record<string, FieldBehavior> = {};\n config.forEach((item) => {\n const fieldId = item?.fieldId || item?.field_id || item?.id;\n if (!fieldId) return;\n result[fieldId] = normalizeBehavior(item?.fieldBehavior || item?.behavior || item?.value);\n });\n return Object.keys(result).length > 0 ? result : null;\n }\n if (typeof config === 'object') {\n const result: Record<string, FieldBehavior> = {};\n Object.entries(config).forEach(([fieldId, value]) => {\n result[fieldId] = normalizeBehavior(\n typeof value === 'string'\n ? value\n : (value as any)?.fieldBehavior || (value as any)?.behavior,\n );\n });\n return result;\n }\n return null;\n};\n\n/**\n * 字段权限计算 hook\n * 根据不同场景(普通详情、流程审批等)计算字段行为映射\n */\nexport function useFieldPermission(options: UseFieldPermissionOptions): UseFieldPermissionReturn {\n const { viewPermissions, processDefinition, currentTask, isApprover, mode } = options;\n\n const computeBehaviors = useCallback((): Record<string, FieldBehavior> => {\n const behaviors: Record<string, FieldBehavior> = {};\n\n // 场景1:普通详情页,基于 viewPermissions + mode\n if (!currentTask && viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, mode);\n }\n\n // 场景2:流程-非审批人,全部 READONLY(除 HIDDEN 外)\n if (currentTask && !isApprover && viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, 'readonly');\n }\n\n // 场景3:流程-发起人修改(originator_return 节点)\n if (currentTask && isApprover && currentTask.nodeType === 'originator_return') {\n if (processDefinition?.flowConfig && processDefinition.startNodeId) {\n const startConfig = normalizeFlowConfig(\n processDefinition.flowConfig[processDefinition.startNodeId],\n );\n if (startConfig) {\n for (const [fieldId, behavior] of Object.entries(startConfig)) {\n behaviors[fieldId] = mode === 'edit' ? behavior : 'READONLY';\n }\n return behaviors;\n }\n }\n // 降级:如果无法获取 startNode 配置,全部可编辑\n if (viewPermissions) {\n for (const fieldId of Object.keys(viewPermissions.fieldPermissions)) {\n if (viewPermissions.fieldPermissions[fieldId] === 'FORM_FILED_HIDDEN') {\n behaviors[fieldId] = 'HIDDEN';\n } else {\n behaviors[fieldId] = mode === 'edit' ? 'NORMAL' : 'READONLY';\n }\n }\n }\n return behaviors;\n }\n\n // 场景4:流程-审批人,使用 currentTask.nodeId 对应的 fieldConfig\n if (currentTask && isApprover && processDefinition?.flowConfig) {\n const nodeConfig = normalizeFlowConfig(processDefinition.flowConfig[currentTask.nodeId]);\n if (nodeConfig) {\n for (const [fieldId, behavior] of Object.entries(nodeConfig)) {\n behaviors[fieldId] = mode === 'edit' ? behavior : 'READONLY';\n }\n return behaviors;\n }\n }\n\n // 兜底:基于 viewPermissions\n if (viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, mode);\n }\n\n return behaviors;\n }, [viewPermissions, processDefinition, currentTask, isApprover, mode]);\n\n const fieldBehaviors = useMemo(() => computeBehaviors(), [computeBehaviors]);\n\n return { fieldBehaviors, computeBehaviors };\n}\n","import type { FieldBehavior, ViewPermissionSummary } from '../types';\n\nconst OPERATION_ALIASES: Record<string, string> = {\n VIEW: 'view',\n EDIT: 'edit',\n DELETE: 'delete',\n VIEW_CHANGE_RECORDS: 'change_records',\n CHANGE_RECORDS: 'change_records',\n VIEW_PROCESS: 'workflow',\n WORKFLOW: 'workflow',\n};\n\nexport function normalizeOperation(operation?: string): string {\n const raw = String(operation || '').trim();\n if (!raw) return '';\n const upper = raw.toUpperCase();\n return OPERATION_ALIASES[upper] || raw.toLowerCase();\n}\n\nexport function hasViewOperation(operations: string[] | undefined, expected: string): boolean {\n const normalized = new Set((operations || []).map(normalizeOperation));\n return normalized.has(normalizeOperation(expected));\n}\n\nexport function normalizeFieldBehaviors(\n permissions: ViewPermissionSummary | null | undefined,\n mode: 'readonly' | 'edit',\n): Record<string, FieldBehavior> {\n const behaviors: Record<string, FieldBehavior> = {};\n Object.entries(permissions?.fieldPermissions || {}).forEach(([fieldId, value]) => {\n if (value === 'FORM_FILED_HIDDEN') {\n behaviors[fieldId] = 'HIDDEN';\n } else if (value === 'FORM_FILED_EDIT') {\n behaviors[fieldId] = mode === 'edit' ? 'NORMAL' : 'READONLY';\n } else {\n behaviors[fieldId] = 'READONLY';\n }\n });\n return behaviors;\n}\n\nexport function hasViewPermission(permissions: ViewPermissionSummary | null | undefined): boolean {\n const operations = permissions?.operations || [];\n return operations.length === 0 ? false : hasViewOperation(operations, 'view');\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { FieldBehavior, FormInstanceData, ViewPermissionSummary } from '../types';\nimport { getFormData, getViewPermission, deleteFormData } from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\nimport { extractFormValues, normalizeFormInstanceInfo } from '../utils/formInstanceData';\nimport { hasViewOperation, normalizeFieldBehaviors } from '../utils/permissions';\n\nexport interface UseFormDetailOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n fieldIds?: readonly string[];\n onPermissionDenied?: () => void;\n}\n\nexport interface UseFormDetailReturn {\n loading: boolean;\n mode: 'readonly' | 'edit';\n formData: Record<string, any> | null;\n instanceInfo: FormInstanceData | null;\n permissions: ViewPermissionSummary | null;\n fieldBehaviors: Record<string, FieldBehavior>;\n\n switchToEdit: () => void;\n switchToReadonly: () => void;\n saveChanges: (values: Record<string, any>) => Promise<boolean>;\n deleteInstance: () => Promise<boolean>;\n\n canEdit: boolean;\n canDelete: boolean;\n canViewChangeRecords: boolean;\n}\n\n/**\n * 详情页核心逻辑 hook\n * 处理数据加载、权限计算、模式切换、保存和删除\n */\nexport function useFormDetail(options: UseFormDetailOptions): UseFormDetailReturn {\n const { formUuid, appType, formInstanceId, fieldIds, onPermissionDenied } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [loading, setLoading] = useState(true);\n const [mode, setMode] = useState<'readonly' | 'edit'>('readonly');\n const [formData, setFormData] = useState<Record<string, any> | null>(null);\n const [instanceInfo, setInstanceInfo] = useState<FormInstanceData | null>(null);\n const [permissions, setPermissions] = useState<ViewPermissionSummary | null>(null);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const loadData = useCallback(async () => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n const [permResult, formResult] = await Promise.all([\n getViewPermission(request, { formUuid, appType, formInstanceId }),\n getFormData(request, { formInstanceId, appType, formUuid }),\n ]);\n\n if (!mountedRef.current) return;\n\n // 检查是否有权限\n if (!permResult || !hasViewOperation(permResult.operations, 'view')) {\n onPermissionDenied?.();\n }\n\n const normalizedInfo = normalizeFormInstanceInfo(formResult, {\n formUuid,\n appType,\n formInstanceId,\n });\n setPermissions(permResult);\n setInstanceInfo(normalizedInfo);\n setFormData(extractFormValues(formResult, fieldIds));\n } catch (error) {\n console.error('[useFormDetail] Failed to load data:', error);\n if (mountedRef.current) {\n setPermissions(null);\n setInstanceInfo(null);\n setFormData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [request, formUuid, appType, formInstanceId, fieldIds, onPermissionDenied]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const fieldBehaviors = normalizeFieldBehaviors(permissions, mode);\n\n const canEdit = hasViewOperation(permissions?.operations, 'edit');\n const canDelete = hasViewOperation(permissions?.operations, 'delete');\n const canViewChangeRecords = hasViewOperation(permissions?.operations, 'change_records');\n\n const switchToEdit = useCallback(() => {\n // 切换到编辑模式时重新加载最新数据\n setMode('edit');\n loadData();\n }, [loadData]);\n\n const switchToReadonly = useCallback(() => {\n setMode('readonly');\n }, []);\n\n const saveChanges = useCallback(\n async (values: Record<string, any>): Promise<boolean> => {\n try {\n await api.updateFormData({\n formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(values),\n });\n if (mountedRef.current) {\n setFormData(values);\n setMode('readonly');\n }\n return true;\n } catch (error) {\n console.error('[useFormDetail] Failed to save changes:', error);\n return false;\n }\n },\n [api, formInstanceId, formUuid, appType],\n );\n\n const deleteInstance = useCallback(async (): Promise<boolean> => {\n try {\n await deleteFormData(request, { formInstanceId, appType, formUuid });\n return true;\n } catch (error) {\n console.error('[useFormDetail] Failed to delete instance:', error);\n return false;\n }\n }, [request, formInstanceId, appType, formUuid]);\n\n return {\n loading,\n mode,\n formData,\n instanceInfo,\n permissions,\n fieldBehaviors,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n canEdit,\n canDelete,\n canViewChangeRecords,\n };\n}\n","const FORM_INSTANCE_METADATA_KEYS = new Set([\n 'appType',\n 'code',\n 'createTime',\n 'created_at',\n 'createdAt',\n 'createdBy',\n 'created_by',\n 'created_by_department_id',\n 'created_by_department_name',\n 'created_by_name',\n 'createdByDepartmentId',\n 'createdByDepartmentName',\n 'createdByName',\n 'creator',\n 'data',\n 'error',\n 'formInstId',\n 'formInstanceId',\n 'formUuid',\n 'instanceTitle',\n 'message',\n 'modifiedTime',\n 'modifyTime',\n 'originator',\n 'originatorCorp',\n 'originatorCorpName',\n 'originatorDepartmentName',\n 'originatorName',\n 'processInstanceTitle',\n 'result',\n 'success',\n 'title',\n 'updated_at',\n 'updatedAt',\n]);\n\nconst isPlainRecord = (value: unknown): value is Record<string, any> =>\n Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n\nconst parseJsonRecord = (value: unknown): Record<string, any> | null => {\n if (typeof value !== 'string' || value.trim() === '') return null;\n try {\n const parsed = JSON.parse(value);\n return isPlainRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst pickKnownFields = (\n source: Record<string, any>,\n fieldIds?: readonly string[],\n): Record<string, any> => {\n if (fieldIds?.length) {\n const values: Record<string, any> = {};\n for (const fieldId of fieldIds) {\n if (Object.prototype.hasOwnProperty.call(source, fieldId)) {\n values[fieldId] = source[fieldId];\n }\n }\n return values;\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([key]) => !FORM_INSTANCE_METADATA_KEYS.has(key)),\n );\n};\n\nexport const extractFormValues = (\n formInstance: unknown,\n fieldIds?: readonly string[],\n): Record<string, any> | null => {\n if (!isPlainRecord(formInstance)) return null;\n\n const nestedCandidates = [\n formInstance.data,\n parseJsonRecord(formInstance.data),\n formInstance.formData,\n parseJsonRecord(formInstance.formData),\n formInstance.values,\n formInstance.fieldValues,\n parseJsonRecord(formInstance.formDataJson),\n parseJsonRecord(formInstance.dataJson),\n ];\n\n for (const candidate of nestedCandidates) {\n if (isPlainRecord(candidate)) {\n return pickKnownFields(candidate, fieldIds);\n }\n }\n\n const flatValues = pickKnownFields(formInstance, fieldIds);\n return Object.keys(flatValues).length > 0 ? flatValues : null;\n};\n\nconst firstValue = (source: Record<string, any>, keys: string[]) => {\n for (const key of keys) {\n const value = source[key];\n if (value !== undefined && value !== null && value !== '') return value;\n }\n return undefined;\n};\n\nexport const normalizeFormInstanceInfo = (\n formInstance: unknown,\n fallback?: { formUuid?: string; appType?: string; formInstanceId?: string },\n) => {\n if (!isPlainRecord(formInstance)) return null;\n\n const creator = isPlainRecord(formInstance.creator) ? formInstance.creator : {};\n const formInstanceId = firstValue(formInstance, [\n 'formInstanceId',\n 'formInstId',\n 'form_instance_id',\n 'id',\n ]);\n const createdByName = firstValue(formInstance, [\n 'createdByName',\n 'created_by_name',\n 'originatorName',\n 'creatorName',\n ]);\n const createdByDepartmentName = firstValue(formInstance, [\n 'createdByDepartmentName',\n 'created_by_department_name',\n 'originatorDepartmentName',\n 'originatorCorpName',\n ]);\n\n return {\n ...formInstance,\n formInstanceId: formInstanceId || fallback?.formInstanceId || '',\n formUuid: formInstance.formUuid || fallback?.formUuid || '',\n appType: formInstance.appType || fallback?.appType || '',\n data: isPlainRecord(formInstance.data) ? formInstance.data : {},\n title:\n firstValue(formInstance, [\n 'title',\n 'instanceTitle',\n 'instance_title',\n 'processInstanceTitle',\n ]) || undefined,\n instanceTitle:\n firstValue(formInstance, [\n 'instanceTitle',\n 'instance_title',\n 'processInstanceTitle',\n 'title',\n ]) || undefined,\n creator: {\n userId:\n creator.userId || creator.id || formInstance.createdBy || formInstance.originator || '',\n name: creator.name || createdByName || '',\n avatar: creator.avatar,\n department: creator.department || createdByDepartmentName || '',\n },\n createdBy: firstValue(formInstance, ['createdBy', 'created_by', 'originator']),\n createdByName,\n createdByDepartmentId: firstValue(formInstance, [\n 'createdByDepartmentId',\n 'created_by_department_id',\n 'originatorCorp',\n ]),\n createdByDepartmentName,\n createdAt:\n firstValue(formInstance, ['createdAt', 'created_at', 'createTime', 'gmtCreate']) || '',\n updatedAt: firstValue(formInstance, [\n 'updatedAt',\n 'updated_at',\n 'modifiedTime',\n 'modifyTime',\n 'gmtModified',\n ]),\n };\n};\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n FieldBehavior,\n FormInstanceData,\n ProcessAction,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessStatus,\n ProcessTask,\n ViewPermissionSummary,\n} from '../types';\nimport {\n getProcessBasic,\n getProcessProgress,\n checkUserApproval,\n getViewPermission,\n getFormData,\n getProcessDefinition,\n} from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\nimport { useFieldPermission } from './useFieldPermission';\nimport { extractFormValues } from '../utils/formInstanceData';\n\nexport interface UseProcessDetailOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n fieldIds?: readonly string[];\n}\n\nexport interface UseProcessDetailReturn {\n loading: boolean;\n processInfo: ProcessBasicInfo | null;\n processStatus: ProcessStatus | null;\n currentTask: ProcessTask | null;\n progressList: ProcessTask[];\n formData: Record<string, any> | null;\n instanceInfo: FormInstanceData | null;\n\n isApprover: boolean;\n activeActions: ProcessAction[];\n fieldBehaviors: Record<string, FieldBehavior>;\n mode: 'readonly' | 'edit';\n\n isOriginatorReturn: boolean;\n isProcessCompleted: boolean;\n canWithdraw: boolean;\n\n switchToEdit: () => void;\n switchToReadonly: () => void;\n refreshProgress: () => Promise<void>;\n}\n\nconst DEFAULT_APPROVAL_ACTIONS: ProcessAction[] = [\n { action: 'agree', name: { zh_CN: '同意' } },\n { action: 'rejected', name: { zh_CN: '拒绝' } },\n];\n\nconst WITHDRAW_ACTION: ProcessAction = { action: 'withdraw', name: { zh_CN: '撤销' } };\n\nfunction mergeCurrentTask(\n processTask: ProcessTask | null | undefined,\n approvalTask: ProcessTask | null | undefined,\n): ProcessTask | null {\n if (!approvalTask) return processTask ?? null;\n if (!processTask) return approvalTask;\n\n return {\n ...processTask,\n ...approvalTask,\n nodeName: processTask.nodeName || approvalTask.nodeName,\n title: processTask.title || approvalTask.title,\n actions: processTask.actions ?? approvalTask.actions,\n };\n}\n\n/**\n * 流程详情核心逻辑 hook\n */\nexport function useProcessDetail(options: UseProcessDetailOptions): UseProcessDetailReturn {\n const { formUuid, appType, formInstanceId, fieldIds } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [loading, setLoading] = useState(true);\n const [mode, setMode] = useState<'readonly' | 'edit'>('readonly');\n const [processInfo, setProcessInfo] = useState<ProcessBasicInfo | null>(null);\n const [progressList, setProgressList] = useState<ProcessTask[]>([]);\n const [formData, setFormData] = useState<Record<string, any> | null>(null);\n const [instanceInfo, setInstanceInfo] = useState<FormInstanceData | null>(null);\n const [isApprover, setIsApprover] = useState(false);\n const [canWithdraw, setCanWithdraw] = useState(false);\n const [approvalTasks, setApprovalTasks] = useState<ProcessTask[]>([]);\n const [permissions, setPermissions] = useState<ViewPermissionSummary | null>(null);\n const [processDefinition, setProcessDefinition] = useState<ProcessDefinition | null>(null);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const currentTask = useMemo(\n () => mergeCurrentTask(processInfo?.currentTask, approvalTasks[0]),\n [processInfo?.currentTask, approvalTasks],\n );\n const processStatus = processInfo?.processStatus ?? null;\n\n const isOriginatorReturn = currentTask?.nodeType === 'originator_return';\n const isProcessCompleted = processStatus === 'completed' || processStatus === 'terminated';\n\n // 使用 useFieldPermission 计算字段行为\n const { fieldBehaviors } = useFieldPermission({\n viewPermissions: permissions ?? undefined,\n processDefinition: processDefinition ?? undefined,\n currentTask: currentTask ?? undefined,\n isApprover,\n mode,\n });\n\n // 当前任务可执行的操作\n const activeActions: ProcessAction[] = useMemo(() => {\n if (!isApprover) return [];\n\n const actions =\n currentTask?.actions && currentTask.actions.length > 0\n ? [...currentTask.actions]\n : [...DEFAULT_APPROVAL_ACTIONS];\n\n if (canWithdraw && !actions.some((action) => action.action === 'withdraw')) {\n actions.push(WITHDRAW_ACTION);\n }\n\n return actions;\n }, [isApprover, currentTask?.actions, canWithdraw]);\n\n const loadData = useCallback(async () => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n // 并行调用基础数据\n const [basicResult, approvalResult, permResult, formResult] = await Promise.all([\n getProcessBasic(request, formInstanceId),\n checkUserApproval(request, formInstanceId),\n getViewPermission(request, { formUuid, appType, formInstanceId }),\n getFormData(request, { formInstanceId, appType, formUuid }),\n ]);\n\n if (!mountedRef.current) return;\n\n setProcessInfo(basicResult);\n setIsApprover(approvalResult?.isApprover ?? false);\n setCanWithdraw(approvalResult?.canUndo ?? false);\n setApprovalTasks(approvalResult?.currentTasks ?? []);\n setPermissions(permResult);\n setInstanceInfo(formResult);\n setFormData(extractFormValues(formResult, fieldIds));\n\n // 如果有流程查看权限,加载进度\n if (permResult?.operations?.includes('VIEW_PROCESS') || permResult?.operations?.length > 0) {\n try {\n const progress = await getProcessProgress(request, formInstanceId);\n if (mountedRef.current) {\n setProgressList(progress);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load progress:', error);\n }\n }\n\n // 如果是审批人且需要字段配置,加载流程定义\n const task = basicResult?.currentTask;\n if (\n approvalResult?.isApprover &&\n task &&\n (task.nodeType === 'originator_return' || task.nodeType === 'approval')\n ) {\n try {\n const definition = await getProcessDefinition(request, formUuid);\n if (mountedRef.current) {\n setProcessDefinition(definition);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load process definition:', error);\n }\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load data:', error);\n if (mountedRef.current) {\n setProcessInfo(null);\n setFormData(null);\n setInstanceInfo(null);\n setApprovalTasks([]);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [request, formUuid, appType, formInstanceId, fieldIds]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const switchToEdit = useCallback(() => {\n setMode('edit');\n }, []);\n\n const switchToReadonly = useCallback(() => {\n setMode('readonly');\n }, []);\n\n const refreshProgress = useCallback(async () => {\n try {\n const [progress, basicResult] = await Promise.all([\n getProcessProgress(request, formInstanceId),\n getProcessBasic(request, formInstanceId),\n ]);\n if (mountedRef.current) {\n setProgressList(progress);\n setProcessInfo(basicResult);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to refresh progress:', error);\n }\n }, [request, formInstanceId]);\n\n return {\n loading,\n processInfo,\n processStatus,\n currentTask,\n progressList,\n formData,\n instanceInfo,\n isApprover,\n activeActions,\n fieldBehaviors,\n mode,\n isOriginatorReturn,\n isProcessCompleted,\n canWithdraw,\n switchToEdit,\n switchToReadonly,\n refreshProgress,\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { ReturnableNode } from '../types';\nimport {\n handleApproval,\n withdrawProcess,\n transferTask,\n returnTask,\n resubmitTask,\n saveTask,\n getReturnableNodes,\n triggerCallbackTask,\n} from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\n\nexport interface UseApprovalActionsOptions {\n formInstanceId: string;\n formUuid: string;\n appType: string;\n currentTaskId?: string;\n onActionComplete?: (action: string) => void;\n getFormValues?: () => Record<string, any>;\n}\n\nexport interface UseApprovalActionsReturn {\n approve: (comments?: string) => Promise<boolean>;\n reject: (comments?: string) => Promise<boolean>;\n transfer: (userId: string, reason?: string) => Promise<boolean>;\n returnTo: (nodeId: string, reason?: string) => Promise<boolean>;\n withdraw: (reason?: string) => Promise<boolean>;\n save: () => Promise<boolean>;\n resubmit: (comments?: string) => Promise<boolean>;\n callbackTask: (payload?: Record<string, any>) => Promise<boolean>;\n\n isLoading: boolean;\n currentAction: string | null;\n returnableNodes: ReturnableNode[];\n loadReturnableNodes: () => Promise<void>;\n}\n\n/**\n * 审批操作逻辑 hook\n */\nexport function useApprovalActions(options: UseApprovalActionsOptions): UseApprovalActionsReturn {\n const { formInstanceId, formUuid, appType, currentTaskId, onActionComplete, getFormValues } =\n options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [isLoading, setIsLoading] = useState(false);\n const [currentAction, setCurrentAction] = useState<string | null>(null);\n const [returnableNodes, setReturnableNodes] = useState<ReturnableNode[]>([]);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n const resetLoading = useCallback(() => {\n if (mountedRef.current) {\n setIsLoading(false);\n setCurrentAction(null);\n }\n }, []);\n\n const approve = useCallback(\n async (comments?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('approve');\n try {\n const formValues = getFormValues?.();\n await handleApproval(request, {\n instanceId: formInstanceId,\n action: 'approved',\n comments,\n appType,\n formUuid,\n updateFormDataJson: formValues ? JSON.stringify(formValues) : undefined,\n });\n resetLoading();\n onActionComplete?.('approve');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] approve failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, appType, formUuid, getFormValues, onActionComplete, resetLoading],\n );\n\n const reject = useCallback(\n async (comments?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('reject');\n try {\n const formValues = getFormValues?.();\n await handleApproval(request, {\n instanceId: formInstanceId,\n action: 'rejected',\n comments,\n appType,\n formUuid,\n updateFormDataJson: formValues ? JSON.stringify(formValues) : undefined,\n });\n resetLoading();\n onActionComplete?.('reject');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] reject failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, appType, formUuid, getFormValues, onActionComplete, resetLoading],\n );\n\n const transfer = useCallback(\n async (userId: string, reason?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] transfer failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('transfer');\n try {\n await transferTask(request, {\n taskId: currentTaskId,\n newAssignee: userId,\n reason,\n });\n resetLoading();\n onActionComplete?.('transfer');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] transfer failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const returnTo = useCallback(\n async (nodeId: string, reason?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] returnTo failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('return');\n try {\n await returnTask(request, {\n taskId: currentTaskId,\n targetNodeId: nodeId,\n reason,\n });\n resetLoading();\n onActionComplete?.('return');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] returnTo failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const withdraw = useCallback(\n async (reason?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('withdraw');\n try {\n await withdrawProcess(request, {\n instanceId: formInstanceId,\n reason,\n });\n resetLoading();\n onActionComplete?.('withdraw');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] withdraw failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, onActionComplete, resetLoading],\n );\n\n const save = useCallback(async (): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('save');\n try {\n const formValues = getFormValues?.() ?? {};\n await saveTask(request, {\n instanceId: formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(formValues),\n });\n resetLoading();\n onActionComplete?.('save');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] save failed:', error);\n resetLoading();\n return false;\n }\n }, [request, formInstanceId, formUuid, appType, getFormValues, onActionComplete, resetLoading]);\n\n const resubmit = useCallback(\n async (comments?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] resubmit failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('resubmit');\n try {\n const formValues = getFormValues?.() ?? {};\n await resubmitTask(request, {\n taskId: currentTaskId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(formValues),\n comments,\n });\n resetLoading();\n onActionComplete?.('resubmit');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] resubmit failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, formUuid, appType, getFormValues, onActionComplete, resetLoading],\n );\n\n const callbackTask = useCallback(\n async (payload?: Record<string, any>): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] callbackTask failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('callback');\n try {\n await triggerCallbackTask(request, {\n taskId: currentTaskId,\n payload,\n });\n resetLoading();\n onActionComplete?.('callback');\n return true;\n } catch (error) {\n console.error('[useApprovalActions] callbackTask failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const loadReturnableNodes = useCallback(async (): Promise<void> => {\n if (!currentTaskId) return;\n try {\n const nodes = await getReturnableNodes(request, currentTaskId);\n if (mountedRef.current) {\n setReturnableNodes(nodes);\n }\n } catch (error) {\n console.error('[useApprovalActions] loadReturnableNodes failed:', error);\n }\n }, [request, currentTaskId]);\n\n return {\n approve,\n reject,\n transfer,\n returnTo,\n withdraw,\n save,\n resubmit,\n callbackTask,\n isLoading,\n currentAction,\n returnableNodes,\n loadReturnableNodes,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { ChangeRecord, ChangeRecordListResponse } from '../types';\nimport { getChangeRecords } from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\n\nexport interface UseChangeRecordsOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n pageSize?: number;\n autoLoad?: boolean;\n}\n\nexport interface UseChangeRecordsReturn {\n records: ChangeRecord[];\n loading: boolean;\n total: number;\n page: number;\n loadMore: () => Promise<void>;\n refresh: () => Promise<void>;\n hasMore: boolean;\n}\n\nconst normalizeChangeRecordList = (value: any): ChangeRecordListResponse => {\n const body = value?.data ?? value?.result ?? value ?? {};\n const records = body.records ?? body.data ?? body.list ?? body.items ?? [];\n return {\n records: Array.isArray(records) ? records : [],\n total: Number(body.total ?? body.totalCount ?? body.count ?? records.length) || 0,\n page: Number(body.page ?? body.currentPage ?? 1) || 1,\n pageSize: Number(body.pageSize ?? body.limit ?? 20) || 20,\n };\n};\n\n/**\n * 变更记录加载 hook\n */\nexport function useChangeRecords(options: UseChangeRecordsOptions): UseChangeRecordsReturn {\n const { formUuid, appType, formInstanceId, pageSize = 20, autoLoad = true } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [records, setRecords] = useState<ChangeRecord[]>([]);\n const [loading, setLoading] = useState(false);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const fetchRecords = useCallback(\n async (pageNum: number, append: boolean) => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n const result = await getChangeRecords(request, {\n formUuid,\n appType,\n formInstanceId,\n page: pageNum,\n pageSize,\n });\n if (!mountedRef.current) return;\n\n const normalized = normalizeChangeRecordList(result);\n if (append) {\n setRecords((prev) => [...prev, ...normalized.records]);\n } else {\n setRecords(normalized.records);\n }\n setTotal(normalized.total);\n setPage(normalized.page || pageNum);\n } catch (error) {\n console.error('[useChangeRecords] Failed to load change records:', error);\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [request, formUuid, appType, formInstanceId, pageSize],\n );\n\n useEffect(() => {\n if (autoLoad) {\n fetchRecords(1, false);\n }\n }, [autoLoad, fetchRecords]);\n\n const safeRecords = Array.isArray(records) ? records : [];\n const hasMore = safeRecords.length < total;\n\n const loadMore = useCallback(async () => {\n if (!hasMore || loading) return;\n await fetchRecords(page + 1, true);\n }, [hasMore, loading, page, fetchRecords]);\n\n const refresh = useCallback(async () => {\n setRecords([]);\n setPage(1);\n setTotal(0);\n await fetchRecords(1, false);\n }, [fetchRecords]);\n\n return {\n records: safeRecords,\n loading,\n total,\n page,\n loadMore,\n refresh,\n hasMore,\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseFormNavigationOptions {\n appType: string;\n formUuid: string;\n formType?: 'form' | 'process';\n mode?: 'redirect' | 'stay' | 'callback';\n redirectDelay?: number;\n basePath?: string;\n onStay?: (formInstId: string) => void;\n}\n\nexport interface UseFormNavigationReturn {\n navigateToDetail: (formInstId: string) => void;\n navigateToProcessDetail: (formInstId: string) => void;\n handlePostSubmit: (formInstId: string) => void;\n isRedirecting: boolean;\n countdown: number;\n cancelRedirect: () => void;\n}\n\n/**\n * 页面导航 hook\n */\nconst normalizeBasePath = (basePath?: string) => {\n const normalized = String(basePath || '').replace(/^\\/+|\\/+$/g, '');\n return normalized ? `/${normalized}` : '';\n};\n\nconst inferBasePath = (appType: string) => {\n if (typeof window === 'undefined') return '';\n const pathname = window.location?.pathname || '';\n const marker = `/${appType}/`;\n const markerIndex = pathname.indexOf(marker);\n if (markerIndex <= 0) return '';\n return pathname.slice(0, markerIndex);\n};\n\nconst buildDetailUrl = (\n appType: string,\n formUuid: string,\n formInstId: string,\n detailType: 'formDetail' | 'processDetail',\n basePath?: string,\n) => {\n const prefix = normalizeBasePath(basePath ?? inferBasePath(appType));\n return `${prefix}/${appType}/${detailType}/${formUuid}?formInstId=${encodeURIComponent(formInstId)}`;\n};\n\nexport function useFormNavigation(options: UseFormNavigationOptions): UseFormNavigationReturn {\n const {\n appType,\n formUuid,\n formType = 'form',\n mode = 'redirect',\n redirectDelay = 3000,\n basePath,\n onStay,\n } = options;\n\n const [isRedirecting, setIsRedirecting] = useState(false);\n const [countdown, setCountdown] = useState(0);\n\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const redirectTargetRef = useRef<string | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n };\n }, []);\n\n const navigateToDetail = useCallback(\n (formInstId: string) => {\n window.location.href = buildDetailUrl(appType, formUuid, formInstId, 'formDetail', basePath);\n },\n [appType, basePath, formUuid],\n );\n\n const navigateToProcessDetail = useCallback(\n (formInstId: string) => {\n window.location.href = buildDetailUrl(\n appType,\n formUuid,\n formInstId,\n 'processDetail',\n basePath,\n );\n },\n [appType, basePath, formUuid],\n );\n\n const startRedirectCountdown = useCallback(\n (targetUrl: string) => {\n const totalSeconds = Math.ceil(redirectDelay / 1000);\n setIsRedirecting(true);\n setCountdown(totalSeconds);\n redirectTargetRef.current = targetUrl;\n\n timerRef.current = setInterval(() => {\n if (!mountedRef.current) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return;\n }\n\n setCountdown((prev) => {\n const next = prev - 1;\n if (next <= 0) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setIsRedirecting(false);\n if (redirectTargetRef.current) {\n window.location.href = redirectTargetRef.current;\n }\n return 0;\n }\n return next;\n });\n }, 1000);\n },\n [redirectDelay],\n );\n\n const cancelRedirect = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setIsRedirecting(false);\n setCountdown(0);\n redirectTargetRef.current = null;\n }, []);\n\n const handlePostSubmit = useCallback(\n (formInstId: string) => {\n if (mode === 'stay') {\n onStay?.(formInstId);\n return;\n }\n\n if (mode === 'callback') {\n onStay?.(formInstId);\n return;\n }\n\n // redirect 模式\n const targetUrl = buildDetailUrl(\n appType,\n formUuid,\n formInstId,\n formType === 'process' ? 'processDetail' : 'formDetail',\n basePath,\n );\n\n startRedirectCountdown(targetUrl);\n },\n [mode, formType, appType, formUuid, basePath, onStay, startRedirectCountdown],\n );\n\n return {\n navigateToDetail,\n navigateToProcessDetail,\n handlePostSubmit,\n isRedirecting,\n countdown,\n cancelRedirect,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseDraftStorageOptions {\n appType: string;\n formUuid: string;\n autoRestore?: boolean;\n}\n\nexport interface UseDraftStorageReturn {\n hasDraft: boolean;\n draftData: Record<string, any> | null;\n draftTimestamp: number | null;\n saveDraft: (data: Record<string, any>) => void;\n restoreDraft: () => Record<string, any> | null;\n clearDraft: () => void;\n}\n\ninterface DraftPayload {\n data: Record<string, any>;\n ts: number;\n}\n\nfunction getDraftKey(appType: string, formUuid: string): string {\n return `${appType}__${formUuid}__draft`;\n}\n\nfunction readDraft(key: string): DraftPayload | null {\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as DraftPayload;\n if (parsed && typeof parsed.data === 'object' && typeof parsed.ts === 'number') {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 草稿暂存 hook\n * 使用 localStorage 存储表单草稿数据\n */\nexport function useDraftStorage(options: UseDraftStorageOptions): UseDraftStorageReturn {\n const { appType, formUuid, autoRestore = false } = options;\n const key = getDraftKey(appType, formUuid);\n\n const [hasDraft, setHasDraft] = useState(false);\n const [draftData, setDraftData] = useState<Record<string, any> | null>(null);\n const [draftTimestamp, setDraftTimestamp] = useState<number | null>(null);\n\n // 初始化时检测是否有 draft\n useEffect(() => {\n const stored = readDraft(key);\n if (stored) {\n setHasDraft(true);\n setDraftTimestamp(stored.ts);\n if (autoRestore) {\n setDraftData(stored.data);\n }\n } else {\n setHasDraft(false);\n setDraftData(null);\n setDraftTimestamp(null);\n }\n }, [key, autoRestore]);\n\n const saveDraft = useCallback(\n (data: Record<string, any>) => {\n const payload: DraftPayload = { data, ts: Date.now() };\n try {\n localStorage.setItem(key, JSON.stringify(payload));\n setHasDraft(true);\n setDraftData(data);\n setDraftTimestamp(payload.ts);\n } catch (error) {\n console.error('[useDraftStorage] Failed to save draft:', error);\n }\n },\n [key],\n );\n\n const restoreDraft = useCallback((): Record<string, any> | null => {\n const stored = readDraft(key);\n if (stored) {\n setDraftData(stored.data);\n return stored.data;\n }\n return null;\n }, [key]);\n\n const clearDraft = useCallback(() => {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('[useDraftStorage] Failed to clear draft:', error);\n }\n setHasDraft(false);\n setDraftData(null);\n setDraftTimestamp(null);\n }, [key]);\n\n return {\n hasDraft,\n draftData,\n draftTimestamp,\n saveDraft,\n restoreDraft,\n clearDraft,\n };\n}\n","import type { FormSchema } from '../types';\n\n/**\n * 类型安全的表单 Schema 定义辅助函数\n * 提供 TypeScript 类型推导和编辑器智能提示\n */\nexport function defineFormSchema(schema: FormSchema): FormSchema {\n return schema;\n}\n","import React from 'react';\n\nexport interface FormSummaryCardProps {\n title?: string;\n formInstanceId?: string;\n creator?: { name: string; avatar?: string; department?: string };\n createdAt?: string;\n status?: { label: string; tone: 'brand' | 'success' | 'danger' | 'neutral' | 'warning' };\n className?: string;\n children?: React.ReactNode;\n}\n\nconst toneClasses: Record<string, string> = {\n brand: 'bg-blue-50 text-blue-600',\n success: 'bg-green-50 text-green-600',\n danger: 'bg-red-50 text-red-600',\n neutral: 'bg-gray-100 text-gray-500',\n warning: 'bg-amber-50 text-amber-600',\n};\n\nexport const FormSummaryCard: React.FC<FormSummaryCardProps> = ({\n title,\n formInstanceId,\n creator,\n createdAt,\n status,\n className = '',\n children,\n}) => {\n const shortId = formInstanceId ? formInstanceId.slice(0, 8) : null;\n\n const renderAvatar = () => {\n if (!creator) return null;\n if (creator.avatar) {\n return (\n <img\n src={creator.avatar}\n alt={creator.name}\n className=\"w-7 h-7 rounded-full object-cover\"\n />\n );\n }\n const initial = creator.name.charAt(0);\n return (\n <span className=\"w-7 h-7 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center text-xs font-medium\">\n {initial}\n </span>\n );\n };\n\n return (\n <div className={`bg-white rounded-xl shadow-sm border border-gray-100 p-6 ${className}`}>\n <div className=\"flex items-start justify-between\">\n {/* Left */}\n <div className=\"min-w-0 flex-1\">\n {title && <h2 className=\"text-xl font-semibold text-gray-900 truncate\">{title}</h2>}\n {shortId && <span className=\"text-xs text-gray-400 mt-0.5 inline-block\">#{shortId}</span>}\n </div>\n {/* Right - Status Badge */}\n {status && (\n <span\n className={`px-2.5 py-0.5 rounded-full text-xs font-medium whitespace-nowrap ${toneClasses[status.tone] || toneClasses.neutral}`}\n >\n {status.label}\n </span>\n )}\n </div>\n\n {/* Creator info */}\n {creator && (\n <div className=\"flex items-center gap-2 mt-4 text-sm text-gray-600\">\n {renderAvatar()}\n <span className=\"font-medium\">{creator.name}</span>\n {creator.department && (\n <>\n <span className=\"text-gray-300\">·</span>\n <span>{creator.department}</span>\n </>\n )}\n {createdAt && (\n <>\n <span className=\"text-gray-300\">·</span>\n <span className=\"text-gray-400\">{createdAt}</span>\n </>\n )}\n </div>\n )}\n\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { Button, Empty, Pagination, Skeleton, Tag, Tooltip } from 'antd';\nimport {\n ArrowRightOutlined,\n DownOutlined,\n HistoryOutlined,\n ReloadOutlined,\n UpOutlined,\n} from '@ant-design/icons';\nimport type { ChangeRecord } from '../types';\n\nexport interface RecordChangePanelProps {\n records?: ChangeRecord[];\n loading?: boolean;\n total?: number;\n page?: number;\n pageSize?: number;\n defaultExpanded?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onRefresh?: () => void;\n onExpand?: () => void;\n onPageChange?: (page: number, pageSize: number) => void;\n className?: string;\n}\n\nconst sourceLabels: Record<string, string> = {\n frontend: '前端',\n integration: '集成',\n automation: '自动化',\n import: '导入',\n};\n\nconst typeLabels: Record<string, string> = {\n create: '新增',\n update: '修改',\n delete: '删除',\n};\n\nfunction formatValue(value: any): React.ReactNode {\n if (value === null || value === undefined || value === '')\n return <span className=\"text-ant-text-tertiary\">空</span>;\n if (Array.isArray(value)) {\n return (\n <span className=\"inline-flex flex-wrap gap-1\">\n {value.map((item, index) => (\n <Tag key={`${index}-${String(item)}`} className=\"m-0\">\n {String(\n typeof item === 'object' ? item.label || item.value || JSON.stringify(item) : item,\n )}\n </Tag>\n ))}\n </span>\n );\n }\n if (typeof value === 'object') {\n const label = value.label ?? value.value;\n return label ? String(label) : <code className=\"text-xs\">{JSON.stringify(value)}</code>;\n }\n return String(value);\n}\n\nfunction getInitial(name?: string) {\n return (\n String(name || '?')\n .trim()\n .slice(0, 1)\n .toUpperCase() || '?'\n );\n}\n\nexport const RecordChangePanel: React.FC<RecordChangePanelProps> = ({\n records = [],\n loading = false,\n total,\n page = 1,\n pageSize = 20,\n defaultExpanded = false,\n hasMore = false,\n onLoadMore,\n onRefresh,\n onExpand,\n onPageChange,\n className = '',\n}) => {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const count = total ?? records.length;\n\n const handleToggle = () => {\n const next = !expanded;\n setExpanded(next);\n if (next) onExpand?.();\n };\n\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"flex items-center justify-between gap-3 border-b border-ant-border-secondary px-5 py-4\">\n <button\n type=\"button\"\n className=\"flex min-w-0 items-center gap-2 bg-transparent p-0 text-left\"\n onClick={handleToggle}\n >\n <HistoryOutlined className=\"text-ant-primary\" />\n <span className=\"font-semibold text-ant-text\">变更记录</span>\n <span className=\"rounded-full bg-gray-100 px-2 py-0.5 text-xs text-ant-text-tertiary\">\n {count} 条\n </span>\n {expanded ? <UpOutlined className=\"text-xs\" /> : <DownOutlined className=\"text-xs\" />}\n </button>\n {expanded && (\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ReloadOutlined />}\n onClick={onRefresh}\n disabled={loading}\n >\n 刷新\n </Button>\n )}\n </div>\n\n {expanded ? (\n <div className=\"p-5\">\n {loading && records.length === 0 ? (\n <Skeleton active paragraph={{ rows: 3 }} />\n ) : records.length === 0 ? (\n <Empty description=\"暂无变更记录\" />\n ) : (\n <div className=\"space-y-4\">\n {records.map((record) => {\n const changes =\n record.changes && record.changes.length > 0\n ? record.changes\n : [\n {\n fieldKey: record.fieldId,\n fieldLabel: record.fieldLabel,\n beforeValue: record.oldValue,\n afterValue: record.newValue,\n },\n ];\n const operator = record.operatorName || (record.changeSource ? '系统' : '未知');\n const operatedAt = record.operatedAt || record.createdAt || '-';\n return (\n <article\n key={record.id || record.operationId}\n className=\"rounded-md border border-ant-border-secondary p-4\"\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-blue-50 text-sm font-semibold text-blue-700\">\n {getInitial(operator)}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {operator}\n {record.operatorDepartmentName && (\n <span className=\"ml-2 font-normal text-ant-text-tertiary\">\n {record.operatorDepartmentName}\n </span>\n )}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n 变更 {record.changedCount || changes.length} 项 · {operatedAt}\n </span>\n </span>\n </div>\n <span className=\"flex flex-wrap justify-end gap-2\">\n {record.changeType && (\n <Tag>{typeLabels[record.changeType] || record.changeType}</Tag>\n )}\n {record.changeSource && (\n <Tag color=\"blue\">\n {sourceLabels[record.changeSource] || record.changeSource}\n </Tag>\n )}\n {record.operationId && (\n <Tooltip title={`操作ID:${record.operationId}`}>\n <Tag>{record.operationId.slice(0, 8)}</Tag>\n </Tooltip>\n )}\n </span>\n </div>\n <div className=\"mt-4 space-y-3\">\n {changes.map((change) => (\n <div\n key={change.fieldKey || change.fieldLabel}\n className=\"grid gap-2 md:grid-cols-[160px_1fr]\"\n >\n <div className=\"text-sm font-medium text-ant-text-secondary\">\n {change.fieldLabel || change.fieldKey || '-'}\n </div>\n <div className=\"grid min-w-0 grid-cols-[1fr_auto_1fr] items-start gap-2 text-sm\">\n <div className=\"min-w-0 rounded bg-red-50 px-2 py-1 text-red-700\">\n {formatValue(change.beforeValue)}\n </div>\n <ArrowRightOutlined className=\"mt-1 text-xs text-ant-text-tertiary\" />\n <div className=\"min-w-0 rounded bg-emerald-50 px-2 py-1 text-emerald-700\">\n {formatValue(change.afterValue)}\n </div>\n </div>\n </div>\n ))}\n </div>\n </article>\n );\n })}\n </div>\n )}\n {onPageChange && count > pageSize ? (\n <div className=\"mt-4 flex justify-end\">\n <Pagination\n size=\"small\"\n current={page}\n pageSize={pageSize}\n total={count}\n onChange={onPageChange}\n showSizeChanger\n />\n </div>\n ) : hasMore ? (\n <Button block className=\"mt-4\" onClick={onLoadMore} loading={loading}>\n 加载更多\n </Button>\n ) : null}\n </div>\n ) : (\n <div className=\"px-5 py-4 text-sm text-ant-text-tertiary\">点击展开查看变更记录</div>\n )}\n </section>\n );\n};\n","import React from 'react';\nimport type { ChangeRecord } from '../types';\nimport { RecordChangePanel } from './RecordChangePanel';\n\nexport interface ChangeRecordsProps {\n records?: ChangeRecord[];\n loading?: boolean;\n defaultExpanded?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onExpand?: () => void;\n className?: string;\n renderItem?: (record: ChangeRecord) => React.ReactNode;\n}\n\nexport const ChangeRecords: React.FC<ChangeRecordsProps> = ({\n records = [],\n loading = false,\n defaultExpanded = false,\n hasMore = false,\n onLoadMore,\n onExpand,\n className = '',\n renderItem,\n}) => {\n if (renderItem) {\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"border-b border-ant-border-secondary px-5 py-4 font-semibold\">变更记录</div>\n <div className=\"p-5\">\n {records.length === 0 ? (\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">\n {loading ? '加载中...' : '暂无变更记录'}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {records.map((record) => (\n <div key={record.id}>{renderItem(record)}</div>\n ))}\n </div>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className=\"mt-4 w-full rounded-md border border-ant-border-secondary py-2 text-sm text-ant-primary\"\n onClick={onLoadMore}\n disabled={loading}\n >\n {loading ? '加载中...' : '加载更多'}\n </button>\n )}\n </div>\n </section>\n );\n }\n\n return (\n <RecordChangePanel\n records={records}\n loading={loading}\n defaultExpanded={defaultExpanded}\n hasMore={hasMore}\n onLoadMore={onLoadMore}\n onRefresh={onExpand}\n onExpand={onExpand}\n className={className}\n />\n );\n};\n","import React, { useMemo } from 'react';\nimport {\n ApiOutlined,\n CheckCircleFilled,\n ClockCircleOutlined,\n CloseCircleFilled,\n CodeOutlined,\n CopyOutlined,\n EditOutlined,\n FileTextOutlined,\n LoadingOutlined,\n NotificationOutlined,\n ReloadOutlined,\n RollbackOutlined,\n UserOutlined,\n} from '@ant-design/icons';\nimport type { ProcessTask, StatusMeta } from '../types';\nimport { TASK_STATUS_META } from '../core/constants';\n\nexport interface ApprovalTimelineProps {\n tasks: ProcessTask[];\n className?: string;\n renderNode?: (task: ProcessTask, index: number) => React.ReactNode;\n showRemarks?: boolean;\n compactMode?: boolean;\n showApproverInfo?: boolean;\n}\n\ntype VisualState =\n | 'completed'\n | 'current'\n | 'waiting'\n | 'future'\n | 'rejected'\n | 'returned'\n | 'neutral';\n\nconst systemNodeTypes = new Set([\n 'condition',\n 'condition_branch',\n 'js_code',\n 'data_retrieve_single',\n 'data_retrieve_batch',\n 'data_create',\n 'data_update',\n 'connector_call',\n 'loop_container',\n 'work_notification',\n 'dingtalk_card',\n 'system',\n]);\n\nconst systemLabels: Record<string, string> = {\n condition: '条件判断',\n condition_branch: '条件分支',\n js_code: 'JS 代码',\n data_retrieve_single: '数据读取',\n data_retrieve_batch: '批量读取',\n data_create: '数据创建',\n data_update: '数据更新',\n connector_call: '连接器调用',\n loop_container: '循环节点',\n work_notification: '工作通知',\n dingtalk_card: '钉钉卡片',\n system: '系统动作',\n};\n\nconst toneClasses: Record<StatusMeta['tone'] | 'return' | 'future', string> = {\n brand: 'bg-blue-600 text-white border-blue-600',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n return: 'bg-amber-50 text-amber-700 border-amber-200',\n future: 'bg-gray-50 text-gray-400 border-gray-200',\n};\n\nfunction groupTasks(tasks: ProcessTask[]) {\n const groups = new Map<string, ProcessTask[]>();\n tasks.forEach((task, index) => {\n const key = task.nodeVisitId || `${task.nodeId || 'node'}-${task.id || task.taskId || index}`;\n const group = groups.get(key) || [];\n group.push(task);\n groups.set(key, group);\n });\n return Array.from(groups.values()).map((group) => {\n const hasOrSignResult = group.some(\n (task) =>\n task.nodeType === 'approval' &&\n task.multiApproveMode === 'or' &&\n !task.isSimulated &&\n ['approved', 'rejected', 'returned'].includes(task.status),\n );\n if (!hasOrSignResult) return group;\n const outcome = group.filter(\n (task) => !task.isSimulated && ['approved', 'rejected', 'returned'].includes(task.status),\n );\n return outcome.length > 0 ? outcome : group;\n });\n}\n\nfunction isCompactNode(task: ProcessTask) {\n return (\n task.nodeType === 'start' ||\n task.nodeType === 'copy' ||\n task.nodeType === 'end' ||\n systemNodeTypes.has(task.nodeType)\n );\n}\n\nfunction getNodeTitle(task: ProcessTask) {\n if (task.nodeType === 'start') return task.title || task.nodeName || '流程提交';\n if (task.nodeType === 'originator_return') return task.title || task.nodeName || '发起人修改';\n if (task.nodeType === 'copy') return task.title || task.nodeName || '抄送通知';\n if (task.nodeType === 'callback_wait') return task.title || task.nodeName || '等待第三方回调';\n if (task.nodeType === 'end') return task.title || task.nodeName || '流程完成';\n if (systemNodeTypes.has(task.nodeType))\n return task.title || task.nodeName || systemLabels[task.nodeType] || '系统动作';\n return task.title || task.nodeName || '审批';\n}\n\nfunction getVisualState(task: ProcessTask, isFutureGroup: boolean): VisualState {\n if (isFutureGroup || task.isSimulated || task.status === 'simulated') return 'future';\n if (task.status === 'rejected') return 'rejected';\n if (task.status === 'returned') return 'returned';\n if (task.status === 'pending' || task.status === 'waiting' || task.canApprove)\n return task.canApprove ? 'current' : 'waiting';\n if (\n task.status === 'approved' ||\n task.status === 'copied' ||\n task.nodeType === 'start' ||\n task.nodeType === 'end'\n ) {\n return 'completed';\n }\n return 'neutral';\n}\n\nfunction getStatusMeta(task: ProcessTask, state: VisualState, compact: boolean): StatusMeta {\n if (state === 'future') return { label: '未开始', tone: 'neutral' };\n if (state === 'current')\n return { label: task.nodeType === 'callback_wait' ? '等待回调' : '审批中', tone: 'brand' };\n if (state === 'waiting') return { label: '等待处理中', tone: 'neutral' };\n if (state === 'rejected') return TASK_STATUS_META.rejected;\n if (state === 'returned') return TASK_STATUS_META.returned;\n if (task.nodeType === 'copy' || task.status === 'copied') return TASK_STATUS_META.copied;\n if (compact) return { label: '已完成', tone: 'neutral' };\n return TASK_STATUS_META[task.status] || TASK_STATUS_META.approved;\n}\n\nfunction getIcon(task: ProcessTask, state: VisualState) {\n if (state === 'current')\n return task.nodeType === 'callback_wait' ? <ClockCircleOutlined /> : <LoadingOutlined />;\n if (state === 'future' || state === 'waiting')\n return task.nodeType === 'approval' ? <UserOutlined /> : <ClockCircleOutlined />;\n if (state === 'rejected') return <CloseCircleFilled />;\n if (state === 'returned') return <RollbackOutlined />;\n switch (task.nodeType as string) {\n case 'start':\n return <FileTextOutlined />;\n case 'approval':\n return <CheckCircleFilled />;\n case 'originator_return':\n return <EditOutlined />;\n case 'copy':\n return <CopyOutlined />;\n case 'callback_wait':\n return <ClockCircleOutlined />;\n case 'js_code':\n return <CodeOutlined />;\n case 'connector_call':\n return <ApiOutlined />;\n case 'work_notification':\n case 'dingtalk_card':\n return <NotificationOutlined />;\n case 'data_retrieve_single':\n case 'data_retrieve_batch':\n case 'data_create':\n case 'data_update':\n case 'loop_container':\n return <ReloadOutlined />;\n default:\n return <CheckCircleFilled />;\n }\n}\n\nfunction getDotClass(state: VisualState) {\n const map: Record<VisualState, string> = {\n completed: 'border-emerald-500 text-emerald-600 bg-white',\n current: 'border-blue-600 bg-blue-600 text-white',\n waiting: 'border-gray-200 text-gray-300 bg-white',\n future: 'border-dashed border-gray-300 text-gray-300 bg-white',\n rejected: 'border-red-500 text-red-600 bg-white',\n returned: 'border-amber-500 text-amber-600 bg-white',\n neutral: 'border-gray-200 text-gray-400 bg-white',\n };\n return map[state];\n}\n\nexport const ApprovalTimeline: React.FC<ApprovalTimelineProps> = ({\n tasks,\n className = '',\n renderNode,\n showRemarks = true,\n compactMode = false,\n showApproverInfo = true,\n}) => {\n const taskList = useMemo(() => (Array.isArray(tasks) ? tasks : []), [tasks]);\n const groups = useMemo(() => groupTasks(taskList), [taskList]);\n\n if (taskList.length === 0) {\n return (\n <div\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container p-6 ${className}`}\n >\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">暂无审批记录</p>\n </div>\n );\n }\n\n if (renderNode) {\n return (\n <div className={className}>\n {taskList.map((task, index) => (\n <div key={task.taskId || task.id || index}>{renderNode(task, index)}</div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`approval-timeline ${className}`}>\n {groups.map((group, index) => {\n const node = group[0];\n const isLast = index === groups.length - 1;\n const isFutureGroup = group.some((task) => task.isSimulated || task.status === 'simulated');\n const compact = compactMode || isCompactNode(node);\n const state = getVisualState(node, isFutureGroup);\n const statusMeta = getStatusMeta(node, state, compact);\n const title = getNodeTitle(node);\n const time = node.actionAt || node.createdAt;\n\n return (\n <div\n key={node.nodeVisitId || `${node.nodeId}-${node.taskId}-${index}`}\n className={`relative flex gap-4 pb-5 ${isLast ? 'pb-0' : ''}`}\n >\n {!isLast && (\n <div\n className={`absolute bottom-0 left-[21px] top-11 w-px ${\n state === 'future'\n ? 'border-l border-dashed border-gray-300'\n : 'bg-ant-border-secondary'\n }`}\n />\n )}\n <div\n className={`relative z-10 flex h-11 w-11 shrink-0 items-center justify-center rounded-full border-2 shadow-[0_0_0_4px_var(--ant-color-bg-layout,#f5f5f5)] ${getDotClass(state)}`}\n >\n {getIcon(node, state)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div\n className={`rounded-lg border p-4 ${\n state === 'current'\n ? 'border-blue-300 bg-blue-50/60'\n : state === 'future'\n ? 'border-dashed border-gray-200 bg-gray-50/70'\n : 'border-ant-border-secondary bg-ant-bg-container'\n }`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"font-medium text-ant-text\">{title}</span>\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2 text-xs font-medium ${\n state === 'future' ? toneClasses.future : toneClasses[statusMeta.tone]\n }`}\n >\n {statusMeta.label}\n </span>\n {node.nodeType === 'originator_return' && (\n <span className=\"rounded-md bg-amber-50 px-2 py-1 text-xs text-amber-700\">\n 发起人操作\n </span>\n )}\n </div>\n {!isFutureGroup && time && (\n <span className=\"text-xs text-ant-text-tertiary\">{time}</span>\n )}\n </div>\n\n {showApproverInfo && !compact && group.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-3\">\n <span className=\"w-full text-xs font-medium text-ant-text-tertiary\">\n {state === 'current' || state === 'waiting' ? '当前审批人' : '处理人'}\n </span>\n {group.map((assignee) => (\n <span\n key={assignee.taskId || assignee.id}\n className=\"inline-flex min-w-0 items-center gap-2\"\n >\n <span className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-blue-50 text-xs font-semibold text-blue-700\">\n {assignee.assigneeName?.slice(0, 1) || '?'}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {assignee.assigneeName || '系统'}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n {assignee.departmentName ||\n assignee.actionAt ||\n assignee.createdAt ||\n ''}\n </span>\n </span>\n </span>\n ))}\n </div>\n )}\n\n {showApproverInfo && compact && (\n <div className=\"mt-2 text-sm text-ant-text-secondary\">\n {group\n .map((item) => item.assigneeName)\n .filter(Boolean)\n .join('、') ||\n (node.nodeType === 'start'\n ? '提交申请'\n : systemNodeTypes.has(node.nodeType)\n ? node.comments || '系统自动处理'\n : '')}\n </div>\n )}\n\n {showRemarks && node.comments && (\n <div\n className={`mt-3 border-l-2 pl-3 text-sm leading-6 ${\n state === 'rejected'\n ? 'border-red-300 text-red-700'\n : state === 'returned'\n ? 'border-amber-300 text-amber-700'\n : 'border-ant-border-secondary text-ant-text-secondary'\n }`}\n >\n {node.comments}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport { Form, Input, Modal, Select } from 'antd';\nimport {\n CheckOutlined,\n CloseOutlined,\n RollbackOutlined,\n SaveOutlined,\n SwapOutlined,\n} from '@ant-design/icons';\nimport type { ProcessAction, ReturnableNode } from '../types';\nimport type { ActionConfig } from './FormActionBar';\nimport { StickyActionBar } from './StickyActionBar';\n\nexport interface ApprovalActionBarProps {\n actions: ProcessAction[];\n onApprove?: (comments?: string) => Promise<void> | void;\n onReject?: (comments?: string) => Promise<void> | void;\n onTransfer?: (userId: string, reason?: string) => Promise<void> | void;\n onReturn?: (nodeId: string, reason?: string) => Promise<void> | void;\n onWithdraw?: (reason?: string) => Promise<void> | void;\n onSave?: () => Promise<void> | void;\n onResubmit?: (comments?: string) => Promise<void> | void;\n onCallback?: () => Promise<void> | void;\n returnableNodes?: ReturnableNode[];\n onLoadReturnableNodes?: () => Promise<void> | void;\n renderTransferSelector?: (props: {\n value?: string;\n onChange: (userId: string) => void;\n }) => React.ReactNode;\n renderReturnNodeLabel?: (node: ReturnableNode) => React.ReactNode;\n renderActionModalExtra?: (action: ProcessAction) => React.ReactNode;\n maxMobileButtons?: number;\n className?: string;\n inDrawer?: boolean;\n}\n\ntype ModalAction = 'agree' | 'rejected' | 'withdraw' | 'transfer' | 'return' | 'resubmit' | null;\n\nconst actionPriority: Record<string, number> = {\n agree: 10,\n approved: 10,\n return: 20,\n transfer: 30,\n resubmit: 40,\n save: 80,\n withdraw: 90,\n rejected: 100,\n reject: 100,\n};\n\nfunction getActionLabel(action: ProcessAction) {\n return action.name?.zh_CN || action.text?.zh_CN || action.action;\n}\n\nfunction normalizeAction(action: string): ModalAction | 'save' | 'callback' {\n if (action === 'approved') return 'agree';\n if (action === 'reject') return 'rejected';\n if (\n action === 'agree' ||\n action === 'rejected' ||\n action === 'withdraw' ||\n action === 'transfer' ||\n action === 'return' ||\n action === 'resubmit'\n ) {\n return action;\n }\n if (action === 'save' || action === 'callback') return action;\n return 'agree';\n}\n\nfunction getModalTitle(action: ModalAction) {\n switch (action) {\n case 'agree':\n return '审批意见';\n case 'rejected':\n return '拒绝理由';\n case 'withdraw':\n return '撤销流程';\n case 'transfer':\n return '转交任务';\n case 'return':\n return '退回任务';\n case 'resubmit':\n return '重新提交';\n default:\n return '确认操作';\n }\n}\n\nexport const ApprovalActionBar: React.FC<ApprovalActionBarProps> = ({\n actions,\n onApprove,\n onReject,\n onTransfer,\n onReturn,\n onWithdraw,\n onSave,\n onResubmit,\n onCallback,\n returnableNodes = [],\n onLoadReturnableNodes,\n renderTransferSelector,\n renderReturnNodeLabel,\n renderActionModalExtra,\n maxMobileButtons = 2,\n className = '',\n inDrawer = false,\n}) => {\n const [form] = Form.useForm();\n const [modalAction, setModalAction] = useState<ModalAction>(null);\n const [activeAction, setActiveAction] = useState<ProcessAction | null>(null);\n const [loading, setLoading] = useState(false);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (actionPriority[a.action] ?? 50) - (actionPriority[b.action] ?? 50)),\n [actions],\n );\n\n const openModal = async (action: ProcessAction, target: ModalAction) => {\n setActiveAction(action);\n const defaultComments = action.remark?.content?.zh_CN;\n form.setFieldsValue({\n comments: defaultComments || '',\n reason: '',\n userId: undefined,\n nodeId: undefined,\n });\n if (target === 'return') await onLoadReturnableNodes?.();\n setModalAction(target);\n };\n\n const executeDirect = async (action: ProcessAction) => {\n const normalized = normalizeAction(action.action);\n if (normalized === 'save') {\n await onSave?.();\n return;\n }\n if (normalized === 'callback') {\n await onCallback?.();\n return;\n }\n if (normalized === 'agree') {\n await onApprove?.();\n }\n };\n\n const handleActionClick = async (action: ProcessAction) => {\n const normalized = normalizeAction(action.action);\n if (normalized === 'save' || normalized === 'callback') {\n await executeDirect(action);\n return;\n }\n await openModal(action, normalized);\n };\n\n const handleOk = async () => {\n if (!modalAction) return;\n const values = await form.validateFields();\n setLoading(true);\n try {\n if (modalAction === 'agree') await onApprove?.(values.comments || undefined);\n if (modalAction === 'rejected') await onReject?.(values.comments || undefined);\n if (modalAction === 'withdraw')\n await onWithdraw?.(values.reason || values.comments || undefined);\n if (modalAction === 'transfer') await onTransfer?.(values.userId, values.reason || undefined);\n if (modalAction === 'return') await onReturn?.(values.nodeId, values.reason || undefined);\n if (modalAction === 'resubmit') await onResubmit?.(values.comments || undefined);\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const actionConfigs: ActionConfig[] = visibleActions.map((action) => {\n const normalized = normalizeAction(action.action);\n const danger = normalized === 'rejected' || normalized === 'withdraw';\n return {\n key: action.action,\n label: getActionLabel(action),\n type: normalized === 'agree' ? 'primary' : danger ? 'danger' : 'default',\n icon:\n normalized === 'agree' ? (\n <CheckOutlined />\n ) : normalized === 'rejected' ? (\n <CloseOutlined />\n ) : normalized === 'transfer' ? (\n <SwapOutlined />\n ) : normalized === 'return' || normalized === 'withdraw' ? (\n <RollbackOutlined />\n ) : normalized === 'save' ? (\n <SaveOutlined />\n ) : undefined,\n onClick: () => handleActionClick(action),\n placement: danger || normalized === 'save' ? 'right' : 'left',\n priority: actionPriority[action.action] ?? 50,\n } as ActionConfig;\n });\n\n const requiredComment =\n activeAction?.remark?.required || modalAction === 'rejected' || modalAction === 'withdraw';\n\n return (\n <>\n <StickyActionBar\n actions={actionConfigs}\n layoutMode=\"approval\"\n maxMobileButtons={maxMobileButtons}\n className={className}\n inDrawer={inDrawer}\n />\n <Modal\n getContainer={false}\n title={getModalTitle(modalAction)}\n open={modalAction !== null}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={loading}\n onOk={handleOk}\n onCancel={() => {\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n }}\n destroyOnClose\n >\n <Form form={form} layout=\"vertical\">\n {modalAction === 'transfer' && (\n <Form.Item\n name=\"userId\"\n label=\"转交给\"\n rules={[{ required: true, message: '请选择转交用户' }]}\n >\n {renderTransferSelector ? (\n renderTransferSelector({\n value: form.getFieldValue('userId'),\n onChange: (userId) => form.setFieldsValue({ userId }),\n })\n ) : (\n <Input placeholder=\"请输入用户 ID\" />\n )}\n </Form.Item>\n )}\n {modalAction === 'return' && (\n <Form.Item\n name=\"nodeId\"\n label=\"退回到节点\"\n rules={[{ required: true, message: '请选择退回节点' }]}\n >\n <Select\n placeholder=\"请选择退回节点\"\n getPopupContainer={(triggerNode) => triggerNode.parentElement || document.body}\n options={returnableNodes.map((node) => ({\n value: node.nodeId || node.id || '',\n label: renderReturnNodeLabel\n ? renderReturnNodeLabel(node)\n : node.nodeName || node.name || node.nodeId || node.id,\n }))}\n />\n </Form.Item>\n )}\n <Form.Item\n name={\n modalAction === 'withdraw' || modalAction === 'transfer' || modalAction === 'return'\n ? 'reason'\n : 'comments'\n }\n label={\n modalAction === 'withdraw'\n ? '撤销原因'\n : modalAction === 'transfer'\n ? '转交原因'\n : modalAction === 'return'\n ? '退回原因'\n : '审批意见'\n }\n rules={[{ required: requiredComment, message: '请填写说明' }]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入说明\" />\n </Form.Item>\n {activeAction && renderActionModalExtra?.(activeAction)}\n </Form>\n </Modal>\n </>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Dropdown } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ActionConfig } from './FormActionBar';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface StickyActionBarProps {\n actions: ActionConfig[];\n className?: string;\n maxMobileButtons?: number;\n layoutMode?: 'default' | 'approval';\n inDrawer?: boolean;\n maxWidth?: number | string;\n position?: 'sticky' | 'fixed' | 'inline';\n}\n\nconst getActionPriority = (action: ActionConfig) => {\n const maybePriority = (action as ActionConfig & { priority?: number }).priority;\n if (typeof maybePriority === 'number') return maybePriority;\n if (action.type === 'primary') return 10;\n if (action.type === 'danger') return 90;\n return 50;\n};\n\nconst getPlacement = (action: ActionConfig) =>\n (action as ActionConfig & { placement?: 'left' | 'right' }).placement;\n\nexport const StickyActionBar: React.FC<StickyActionBarProps> = ({\n actions,\n className = '',\n maxMobileButtons = 2,\n layoutMode = 'default',\n maxWidth = 1120,\n position = 'sticky',\n}) => {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const update = () => setIsMobile(typeof window !== 'undefined' && window.innerWidth <= 768);\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, []);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => action.visible !== false)\n .sort((left, right) => getActionPriority(left) - getActionPriority(right)),\n [actions],\n );\n\n if (visibleActions.length === 0) return null;\n\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n const primaryMobile = visibleActions.slice(0, maxMobileButtons);\n const moreMobile = visibleActions.slice(maxMobileButtons);\n const leftActions = visibleActions.filter((action) => getPlacement(action) === 'left');\n const rightActions = visibleActions.filter((action) => getPlacement(action) !== 'left');\n\n const positionClass =\n position === 'fixed'\n ? 'fixed bottom-0 left-0 right-0'\n : position === 'inline'\n ? 'relative'\n : 'sticky bottom-0';\n\n const runAction = (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n }\n action.onClick();\n };\n\n const renderButton = (action: ActionConfig, mobile = false) => (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={action.loading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => runAction(action)}\n className={`${mobile ? 'min-w-0 flex-1' : 'min-w-[88px]'} rounded-md`}\n >\n {action.label}\n </Button>\n );\n\n return (\n <div\n className={`${positionClass} z-20 border-t border-ant-border-secondary bg-ant-bg-container/95 px-4 py-3 shadow-[0_-8px_24px_rgba(15,23,42,0.06)] backdrop-blur supports-[padding:max(0px)]:pb-[max(0.75rem,env(safe-area-inset-bottom))] ${className}`}\n >\n <div\n className={`mx-auto flex w-full items-center gap-3 ${\n layoutMode === 'approval' && !isMobile ? 'justify-between' : 'justify-end'\n }`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {isMobile ? (\n <>\n <div className=\"flex flex-1 gap-2\">\n {primaryMobile.map((action) => renderButton(action, true))}\n </div>\n {moreMobile.length > 0 && (\n <Dropdown\n trigger={['click']}\n placement=\"topRight\"\n menu={{\n items: moreMobile.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.type === 'danger',\n disabled: action.disabled,\n icon: action.icon,\n onClick: () => runAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />} className=\"rounded-md\">\n 更多\n </Button>\n </Dropdown>\n )}\n </>\n ) : layoutMode === 'approval' && leftActions.length > 0 ? (\n <>\n <div className=\"flex flex-wrap items-center gap-3\">\n {leftActions.map((action) => renderButton(action))}\n </div>\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {rightActions.map((action) => renderButton(action))}\n </div>\n </>\n ) : (\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {visibleActions.map((action) => renderButton(action))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","export const confirmAction = (title?: string, content?: string) => {\n const message = [title, content].filter(Boolean).join('\\n') || '确认继续吗?';\n if (typeof window === 'undefined' || typeof window.confirm !== 'function') {\n return true;\n }\n\n try {\n return window.confirm(message);\n } catch {\n return true;\n }\n};\n","import React, { useMemo, useState } from 'react';\nimport { Button, Dropdown, Form, Input, Modal } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ProcessAction } from '../types';\n\nexport interface ApprovalActionsProps {\n actions: ProcessAction[];\n onApprove?: (comments?: string) => Promise<void> | void;\n onReject?: (comments?: string) => Promise<void> | void;\n onTransfer?: () => void;\n onReturn?: () => void;\n onWithdraw?: (reason?: string) => Promise<void> | void;\n onSave?: () => Promise<void> | void;\n layout?: 'horizontal' | 'vertical';\n maxVisible?: number;\n className?: string;\n}\n\ntype ModalAction = 'approve' | 'reject' | 'withdraw' | null;\n\nconst priority: Record<string, number> = {\n agree: 10,\n approved: 10,\n transfer: 20,\n return: 30,\n save: 40,\n withdraw: 90,\n rejected: 100,\n reject: 100,\n};\n\nconst getLabel = (action: ProcessAction) =>\n action.name?.zh_CN || action.text?.zh_CN || action.action;\n\nexport const ApprovalActions: React.FC<ApprovalActionsProps> = ({\n actions,\n onApprove,\n onReject,\n onTransfer,\n onReturn,\n onWithdraw,\n onSave,\n layout = 'horizontal',\n maxVisible = 3,\n className = '',\n}) => {\n const [form] = Form.useForm();\n const [modalAction, setModalAction] = useState<ModalAction>(null);\n const [activeAction, setActiveAction] = useState<ProcessAction | null>(null);\n const [loading, setLoading] = useState(false);\n const [saveLoading, setSaveLoading] = useState(false);\n\n const renderableActions = useMemo(\n () =>\n actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (priority[a.action] ?? 50) - (priority[b.action] ?? 50)),\n [actions],\n );\n\n const openModal = (target: ModalAction, action: ProcessAction) => {\n setActiveAction(action);\n form.setFieldsValue({ comments: action.remark?.content?.zh_CN || '' });\n setModalAction(target);\n };\n\n const handleSave = async () => {\n setSaveLoading(true);\n try {\n await onSave?.();\n } finally {\n setSaveLoading(false);\n }\n };\n\n const handleAction = (action: ProcessAction) => {\n if (action.action === 'transfer') {\n onTransfer?.();\n return;\n }\n if (action.action === 'return') {\n onReturn?.();\n return;\n }\n if (action.action === 'save') {\n void handleSave();\n return;\n }\n if (action.action === 'withdraw') {\n openModal('withdraw', action);\n return;\n }\n if (action.action === 'rejected' || action.action === 'reject') {\n openModal('reject', action);\n return;\n }\n openModal('approve', action);\n };\n\n const handleConfirm = async () => {\n const values = await form.validateFields();\n setLoading(true);\n try {\n if (modalAction === 'approve') await onApprove?.(values.comments || undefined);\n if (modalAction === 'reject') await onReject?.(values.comments || undefined);\n if (modalAction === 'withdraw') await onWithdraw?.(values.comments || undefined);\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const visibleButtons = renderableActions.slice(0, maxVisible);\n const moreButtons = renderableActions.slice(maxVisible);\n const title =\n modalAction === 'approve' ? '审批意见' : modalAction === 'reject' ? '拒绝理由' : '撤销原因';\n\n const button = (action: ProcessAction) => (\n <Button\n key={action.action}\n type={action.action === 'agree' || action.action === 'approved' ? 'primary' : 'default'}\n danger={\n action.action === 'rejected' || action.action === 'reject' || action.action === 'withdraw'\n }\n onClick={() => handleAction(action)}\n loading={action.action === 'save' && saveLoading}\n >\n {getLabel(action)}\n </Button>\n );\n\n return (\n <>\n <div\n className={`${layout === 'horizontal' ? 'flex items-center gap-3' : 'flex flex-col gap-2'} ${className}`}\n >\n {visibleButtons.map(button)}\n {moreButtons.length > 0 && (\n <Dropdown\n trigger={['click']}\n getPopupContainer={(triggerNode) => triggerNode.parentElement || document.body}\n menu={{\n items: moreButtons.map((action) => ({\n key: action.action,\n label: getLabel(action),\n danger:\n action.action === 'rejected' ||\n action.action === 'reject' ||\n action.action === 'withdraw',\n onClick: () => handleAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />}>更多</Button>\n </Dropdown>\n )}\n </div>\n <Modal\n getContainer={false}\n title={title}\n open={modalAction !== null}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={loading}\n onOk={handleConfirm}\n onCancel={() => {\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n }}\n destroyOnClose\n >\n <Form form={form} layout=\"vertical\">\n <Form.Item\n name=\"comments\"\n label={modalAction === 'approve' ? '审批意见' : '请输入理由'}\n rules={[\n {\n required: Boolean(activeAction?.remark?.required) || modalAction !== 'approve',\n message: '请填写说明',\n },\n ]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入说明\" />\n </Form.Item>\n </Form>\n </Modal>\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { Button } from 'antd';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface ActionConfig {\n key: string;\n label: string;\n type?: 'primary' | 'default' | 'danger' | 'text';\n onClick: () => void | Promise<void>;\n loading?: boolean;\n disabled?: boolean;\n visible?: boolean;\n confirm?: { title: string; content: string; okText?: string; cancelText?: string };\n icon?: React.ReactNode;\n priority?: number;\n placement?: 'left' | 'right';\n}\n\nexport interface FormActionBarProps {\n actions: ActionConfig[];\n position?: 'bottom-fixed' | 'inline';\n className?: string;\n}\n\nexport const FormActionBar: React.FC<FormActionBarProps> = ({\n actions,\n position = 'bottom-fixed',\n className = '',\n}) => {\n const [loadingKeys, setLoadingKeys] = useState<Set<string>>(new Set());\n\n const visibleActions = actions.filter((a) => a.visible !== false);\n\n // Sort: danger first, primary last\n const sortedActions = [...visibleActions].sort((a, b) => {\n if (a.type === 'danger' && b.type !== 'danger') return -1;\n if (a.type !== 'danger' && b.type === 'danger') return 1;\n if (a.type === 'primary' && b.type !== 'primary') return 1;\n if (a.type !== 'primary' && b.type === 'primary') return -1;\n return 0;\n });\n\n const handleClick = async (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n await executeAction(action);\n } else {\n await executeAction(action);\n }\n };\n\n const executeAction = async (action: ActionConfig) => {\n setLoadingKeys((prev) => new Set(prev).add(action.key));\n try {\n await action.onClick();\n } finally {\n setLoadingKeys((prev) => {\n const next = new Set(prev);\n next.delete(action.key);\n return next;\n });\n }\n };\n\n const isFixed = position === 'bottom-fixed';\n\n const bar = (\n <div\n className={`${\n isFixed\n ? 'fixed bottom-0 left-0 right-0 z-50 backdrop-blur-lg bg-white/80 border-t border-gray-200 shadow-[0_-1px_3px_rgba(0,0,0,0.05)] px-6 py-3'\n : ''\n } ${className}`}\n >\n <div className=\"flex items-center justify-end gap-3 flex-wrap md:flex-nowrap\">\n {sortedActions.map((action) => {\n const isLoading = action.loading || loadingKeys.has(action.key);\n return (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={isLoading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => handleClick(action)}\n className=\"md:w-auto w-full\"\n >\n {action.label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n\n if (isFixed) {\n return (\n <>\n {bar}\n {/* Spacer to prevent content from being hidden behind fixed bar */}\n <div className=\"h-16\" />\n </>\n );\n }\n\n return bar;\n};\n","import React from 'react';\nimport { Alert, Empty, Spin } from 'antd';\n\nexport interface RuntimePageShellProps {\n children: React.ReactNode;\n actions?: React.ReactNode;\n loading?: boolean;\n loadingTip?: string;\n accessDenied?: boolean;\n error?: React.ReactNode;\n empty?: React.ReactNode;\n className?: string;\n contentClassName?: string;\n maxWidth?: number | string;\n inDrawer?: boolean;\n}\n\nexport const RuntimePageShell: React.FC<RuntimePageShellProps> = ({\n children,\n actions,\n loading = false,\n loadingTip = '正在加载页面...',\n accessDenied = false,\n error,\n empty,\n className = '',\n contentClassName = '',\n maxWidth = 1120,\n inDrawer = false,\n}) => {\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n\n const renderState = () => {\n if (loading) {\n return (\n <div className=\"min-h-[360px] flex items-center justify-center\">\n <Spin tip={loadingTip} />\n </div>\n );\n }\n if (accessDenied) {\n return <Empty description=\"无权限查看详情\" />;\n }\n if (error) {\n return <Alert type=\"error\" showIcon message=\"页面加载失败\" description={error} />;\n }\n if (empty) {\n return <>{empty}</>;\n }\n return children;\n };\n\n return (\n <div className={`sy-runtime-page min-h-full bg-ant-bg-layout text-ant-text ${className}`}>\n <div\n className={`sy-runtime-page__content mx-auto w-full px-4 py-6 pb-8 md:px-6 ${\n inDrawer ? 'py-4 md:px-4' : ''\n } ${contentClassName}`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {renderState()}\n </div>\n {actions}\n </div>\n );\n};\n","import React from 'react';\nimport { Avatar } from 'antd';\nimport { ApartmentOutlined, CalendarOutlined, FileTextOutlined } from '@ant-design/icons';\nimport type { StatusMeta } from '../types';\n\nexport interface SummaryPanelMetaItem {\n key: string;\n label: string;\n value?: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nexport interface SummaryPanelProps {\n title?: React.ReactNode;\n eyebrow?: React.ReactNode;\n status?: StatusMeta;\n creator?: { name?: string; avatar?: string; department?: string };\n createdAt?: React.ReactNode;\n metaItems?: SummaryPanelMetaItem[];\n className?: string;\n children?: React.ReactNode;\n}\n\nconst toneClasses: Record<StatusMeta['tone'], string> = {\n brand: 'bg-blue-50 text-blue-700 border-blue-200',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n};\n\nexport const SummaryPanel: React.FC<SummaryPanelProps> = ({\n title = '详情',\n eyebrow,\n status,\n creator,\n createdAt,\n metaItems,\n className = '',\n children,\n}) => {\n const defaultItems: SummaryPanelMetaItem[] = [\n {\n key: 'creator',\n label: '创建人',\n value: creator?.name || '未知用户',\n icon: creator?.avatar ? (\n <Avatar size={24} src={creator.avatar} />\n ) : (\n <Avatar size={24}>{creator?.name?.slice(0, 1) || '表'}</Avatar>\n ),\n },\n {\n key: 'department',\n label: '所属部门',\n value: creator?.department || '-',\n icon: <ApartmentOutlined />,\n },\n {\n key: 'createdAt',\n label: '创建时间',\n value: createdAt || '-',\n icon: <CalendarOutlined />,\n },\n ];\n const items = metaItems || defaultItems;\n\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"p-5 md:p-6\">\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <div className=\"min-w-0 text-sm text-ant-text-tertiary\">\n {eyebrow || (\n <span className=\"inline-flex items-center gap-2\">\n <FileTextOutlined />\n 数据实例\n </span>\n )}\n </div>\n {status && (\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2.5 text-xs font-medium ${\n toneClasses[status.tone] || toneClasses.neutral\n }`}\n >\n {status.label}\n </span>\n )}\n </div>\n <h1 className=\"m-0 break-words text-2xl font-semibold leading-9 text-ant-text md:text-[28px]\">\n {title}\n </h1>\n {items.length > 0 && (\n <div className=\"mt-5 grid grid-cols-1 gap-4 md:grid-cols-4\">\n {items.map((item) => (\n <div key={item.key} className=\"flex min-w-0 items-center gap-3\">\n {item.icon && (\n <span className=\"inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-gray-100 text-ant-text-secondary\">\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span className=\"block text-xs leading-5 text-ant-text-tertiary\">\n {item.label}\n </span>\n <span className=\"block break-words text-sm font-medium leading-6 text-ant-text\">\n {item.value || '-'}\n </span>\n </span>\n </div>\n ))}\n </div>\n )}\n {children && <div className=\"mt-5\">{children}</div>}\n </div>\n </section>\n );\n};\n","import React from 'react';\nimport { Button } from 'antd';\nimport { EditOutlined } from '@ant-design/icons';\n\nexport interface DraftManagerProps {\n hasDraft: boolean;\n draftTimestamp?: number | null;\n onRestore: () => void;\n onDiscard: () => void;\n className?: string;\n}\n\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return '刚刚';\n if (minutes < 60) return `${minutes}分钟前`;\n if (hours < 24) return `${hours}小时前`;\n return `${days}天前`;\n}\n\nexport const DraftManager: React.FC<DraftManagerProps> = ({\n hasDraft,\n draftTimestamp,\n onRestore,\n onDiscard,\n className = '',\n}) => {\n if (!hasDraft) return null;\n\n const timeLabel = draftTimestamp ? formatRelativeTime(draftTimestamp) : null;\n\n return (\n <div\n className={`bg-blue-50 border border-blue-200 rounded-lg p-4 animate-[slideDown_0.3s_ease-out] ${className}`}\n >\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <EditOutlined className=\"text-blue-500\" />\n <span>\n 检测到未提交的草稿\n {timeLabel && <span className=\"text-blue-500 ml-1\">(保存于 {timeLabel})</span>}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"text\" size=\"small\" onClick={onDiscard} className=\"!text-gray-500\">\n 丢弃\n </Button>\n <Button type=\"primary\" size=\"small\" onClick={onRestore}>\n 恢复填写\n </Button>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Modal, Skeleton, Button } from 'antd';\nimport { CheckCircleOutlined, UserOutlined } from '@ant-design/icons';\nimport type { ProcessRoute } from '../types';\n\nexport interface ProcessPreviewProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n routes: ProcessRoute[];\n loading?: boolean;\n}\n\nexport const ProcessPreview: React.FC<ProcessPreviewProps> = ({\n open,\n onClose,\n onConfirm,\n routes,\n loading = false,\n}) => {\n const routeList = Array.isArray(routes) ? routes : [];\n\n return (\n <Modal\n getContainer={false}\n title=\"流程预览\"\n open={open}\n onCancel={onClose}\n width={520}\n footer={\n <div className=\"flex justify-end gap-3\">\n <Button onClick={onClose}>取消</Button>\n <Button type=\"primary\" onClick={onConfirm} loading={loading}>\n 确认提交\n </Button>\n </div>\n }\n >\n {loading && routeList.length === 0 ? (\n <Skeleton active paragraph={{ rows: 4 }} />\n ) : routeList.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8\">暂无流程节点</p>\n ) : (\n <div className=\"py-2\">\n {routeList.map((route, index) => {\n const isLast = index === routeList.length - 1;\n return (\n <div key={route.nodeId} className=\"flex gap-3\">\n {/* Left timeline */}\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-blue-50 border-2 border-blue-400 flex items-center justify-center flex-shrink-0\">\n <CheckCircleOutlined className=\"text-blue-500 text-xs\" />\n </div>\n {!isLast && <div className=\"w-0.5 flex-1 bg-blue-200 mt-1\" />}\n </div>\n\n {/* Right content */}\n <div className={`flex-1 ${isLast ? 'pb-0' : 'pb-5'}`}>\n <div className=\"text-sm font-medium text-gray-900\">{route.nodeName}</div>\n {route.assignees && route.assignees.length > 0 && (\n <div className=\"mt-1 flex items-center gap-1.5 flex-wrap\">\n <UserOutlined className=\"text-gray-400 text-xs\" />\n {route.assignees.map((assignee) => (\n <span\n key={assignee.id}\n className=\"text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded\"\n >\n {assignee.name}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </Modal>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { TableProps } from 'antd';\nimport {\n Button,\n Checkbox,\n ConfigProvider,\n Divider,\n Drawer,\n Dropdown,\n Empty,\n Input,\n Modal,\n Segmented,\n Select,\n Space,\n Table,\n Tag,\n Tooltip,\n Upload,\n message,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport {\n DeleteOutlined,\n DownloadOutlined,\n FilterOutlined,\n HistoryOutlined,\n ImportOutlined,\n MoreOutlined,\n PlusOutlined,\n ReloadOutlined,\n SettingOutlined,\n SwapOutlined,\n} from '@ant-design/icons';\nimport type { FormRuntimeApi, FormRuntimeApiConfig } from '../types';\nimport { createFormRuntimeApi } from '../core/runtimeApi';\nimport {\n advancedSearchDataManagement,\n batchApproveDataManagementRows,\n deleteDataManagementRows,\n downloadDataManagementImportTemplate,\n exportDataManagementRows,\n getDataManagementConfig,\n getDataManagementSchema,\n getDataManagementTransferRecords,\n getSystemFieldsForFormType,\n importDataManagementRows,\n importPreviewDataManagementRows,\n normalizeColumnConfig,\n saveDataManagementConfig,\n type DataManagementConfig,\n type DataManagementConfigScope,\n type DataManagementDensity,\n type DataManagementField,\n type DataManagementFilterGroup,\n type DataManagementFilterRule,\n type DataManagementSort,\n} from '../core/dataManagementApi';\nimport { confirmAction } from '../utils/confirmAction';\n\ntype DetailRenderer = (props: {\n record: any;\n formInstanceId?: string;\n onClose: () => void;\n}) => React.ReactNode;\n\ntype DetailPageUrlBuilder = (props: { record: any; formInstanceId: string }) => string | undefined;\n\ntype SubmitRenderer = (props: { onClose: () => void; onSubmitted: () => void }) => React.ReactNode;\n\ntype DataManagementFetchState = {\n current?: number;\n pageSize?: number;\n searchKeyWord?: string;\n filterGroup?: DataManagementFilterGroup;\n sort?: DataManagementSort[];\n};\n\nexport interface DataManagementRowAction {\n key: string;\n label: string;\n danger?: boolean;\n onClick: (record: any) => void;\n}\n\nexport interface DataManagementListProps {\n appType: string;\n formUuid: string;\n detailBasePath?: string;\n menuFormUuid?: string;\n readonly?: boolean;\n fullHeight?: boolean;\n configScope?: DataManagementConfigScope;\n title?: string;\n detailRenderer?: DetailRenderer;\n detailPageUrlBuilder?: DetailPageUrlBuilder;\n submitRenderer?: SubmitRenderer;\n requestOverride?: FormRuntimeApi['request'] | FormRuntimeApiConfig;\n rowActions?: DataManagementRowAction[];\n}\n\nconst createGroup = (): DataManagementFilterGroup => ({\n id: `group_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n logic: 'AND',\n rules: [],\n conditions: [],\n});\n\nconst createRule = (field?: DataManagementField): DataManagementFilterRule => ({\n id: `rule_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n key: field?.fieldId || '',\n operator: 'contains',\n value: '',\n componentName: field?.componentName,\n});\n\nconst getRecordId = (record: any) =>\n record?.formInstanceId ||\n record?.formInstId ||\n record?.form_instance_id ||\n record?.instanceId ||\n record?.id ||\n record?.processInstanceId;\n\nconst getSelectedRecordId = (record: any, fallback: React.Key) =>\n record?.formInstId ||\n record?.formInstanceId ||\n record?.form_instance_id ||\n record?.id ||\n fallback;\n\nconst hydrateFilterGroup = (group?: DataManagementFilterGroup): DataManagementFilterGroup => {\n if (!group) return createGroup();\n return {\n id: group.id || createGroup().id,\n logic: group.logic === 'OR' ? 'OR' : 'AND',\n rules: Array.isArray(group.rules)\n ? group.rules.map((rule) => ({\n ...rule,\n id: rule.id || `rule_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n }))\n : [],\n conditions: Array.isArray(group.conditions) ? group.conditions.map(hydrateFilterGroup) : [],\n };\n};\n\nconst formatPrimitive = (value: any) => {\n if (value === undefined || value === null || value === '')\n return <span className=\"text-ant-color-text-quaternary\">--</span>;\n return String(value);\n};\n\nconst formatDateTime = (value: any) => {\n if (value === undefined || value === null || value === '') return formatPrimitive('');\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.format('YYYY-MM-DD HH:mm:ss') : String(value);\n};\n\nconst pickOptionLabel = (field: DataManagementField, value: any) => {\n const options =\n field.options || field.optionList || field.option_list || field.componentProps?.options || [];\n const scalar =\n typeof value === 'object' ? (value?.value ?? value?.id ?? value?.label ?? value?.name) : value;\n const match = Array.isArray(options)\n ? options.find((option: any) => String(option.value ?? option.id) === String(scalar))\n : undefined;\n return match?.label || match?.name || value?.label || value?.name || scalar;\n};\n\nconst renderStatusTag = (value: any, fieldId: string) => {\n const raw = String(value || '');\n const statusMap: Record<string, { label: string; color: string }> = {\n pending: { label: '待处理', color: 'processing' },\n running: { label: '审批中', color: 'processing' },\n waiting: { label: '等待中', color: 'default' },\n exception: { label: '流程异常', color: 'error' },\n completed: { label: '已完成', color: 'success' },\n terminated: { label: '已拒绝', color: 'error' },\n withdrawn: { label: '已撤销', color: 'default' },\n processing: { label: '审批中', color: 'processing' },\n approved: { label: '同意', color: 'success' },\n rejected: { label: '拒绝', color: 'error' },\n };\n if (fieldId !== 'processInstanceStatus' && fieldId !== 'approvalResult') return null;\n const meta = statusMap[raw];\n return <Tag color={meta?.color}>{meta?.label || raw || '--'}</Tag>;\n};\n\nconst renderCellValue = (value: any, field: DataManagementField) => {\n const status = renderStatusTag(value, field.fieldId);\n if (status) return status;\n\n if (field.componentName === 'DateField' || field.componentName === 'DateTimeField') {\n return formatDateTime(value);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return formatPrimitive('');\n if (field.componentName === 'ImageField') {\n return (\n <div className=\"flex max-w-[180px] gap-1 overflow-hidden\">\n {value.slice(0, 3).map((item: any, index) => (\n <img\n key={item?.uid || item?.id || item?.url || index}\n alt={item?.name || field.label}\n src={item?.url || item?.previewUrl}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ))}\n </div>\n );\n }\n if (field.componentName === 'AttachmentField') {\n return (\n <Space size={4} wrap>\n {value.slice(0, 3).map((item: any, index) => (\n <Tag key={item?.uid || item?.id || index}>\n {item?.name || item?.originalName || `附件${index + 1}`}\n </Tag>\n ))}\n {value.length > 3 && <Tag>+{value.length - 3}</Tag>}\n </Space>\n );\n }\n return (\n <Space size={4} wrap>\n {value.slice(0, 4).map((item, index) => (\n <Tag key={`${field.fieldId}_${index}`}>{pickOptionLabel(field, item)}</Tag>\n ))}\n {value.length > 4 && <Tag>+{value.length - 4}</Tag>}\n </Space>\n );\n }\n\n if (value && typeof value === 'object') {\n if (\n field.componentName === 'UserSelectField' ||\n field.componentName === 'DepartmentSelectField'\n ) {\n return value.name || value.label || value.username || formatPrimitive(value.id);\n }\n if (value.start || value.end) {\n return [value.start, value.end].filter(Boolean).join(' 至 ');\n }\n if (value.label || value.name || value.value) {\n return pickOptionLabel(field, value);\n }\n return (\n <Tooltip title={JSON.stringify(value)}>\n <span className=\"text-ant-color-text-secondary\">对象数据</span>\n </Tooltip>\n );\n }\n\n if (\n ['SelectField', 'RadioField', 'CheckboxField', 'MultiSelectField'].includes(field.componentName)\n ) {\n return pickOptionLabel(field, value);\n }\n\n return formatPrimitive(value);\n};\n\nconst fileToBase64 = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = String(reader.result || '');\n resolve(result.includes(',') ? result.split(',')[1] : result);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\nconst normalizeBasePath = (basePath?: string) => {\n const normalized = String(basePath || '').replace(/^\\/+|\\/+$/g, '');\n return normalized ? `/${normalized}` : '';\n};\n\nconst inferBasePath = (appType: string) => {\n if (typeof window === 'undefined') return '';\n const pathname = window.location?.pathname || '';\n const marker = `/${appType}/`;\n const markerIndex = pathname.indexOf(marker);\n if (markerIndex <= 0) return '';\n return pathname.slice(0, markerIndex);\n};\n\nconst buildDefaultDetailUrl = ({\n appType,\n formUuid,\n formType,\n formInstanceId,\n basePath,\n}: {\n appType: string;\n formUuid: string;\n formType?: string;\n formInstanceId: string;\n basePath?: string;\n}) => {\n const prefix = normalizeBasePath(basePath ?? inferBasePath(appType));\n const detailType = formType === 'process' ? 'processDetail' : 'formDetail';\n return `${prefix}/${appType}/${detailType}/${formUuid}?formInstId=${encodeURIComponent(formInstanceId)}`;\n};\n\nconst getHeaderValue = (headers: any, key: string) => {\n if (!headers) return '';\n if (typeof headers.get === 'function')\n return headers.get(key) || headers.get(key.toLowerCase()) || '';\n return headers[key] || headers[key.toLowerCase()] || '';\n};\n\nconst resolveDownloadFilename = (headers: any, fallbackName: string) => {\n const disposition = getHeaderValue(headers, 'content-disposition');\n if (typeof disposition !== 'string') return fallbackName;\n const matchStar = disposition.match(/filename\\*=UTF-8''([^;]+)/i);\n if (matchStar?.[1]) return decodeURIComponent(matchStar[1]);\n const match = disposition.match(/filename=\"?([^\";]+)\"?/i);\n if (match?.[1]) return decodeURIComponent(match[1]);\n return fallbackName;\n};\n\nconst downloadBlobResponse = async (response: any, fallbackName: string) => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n const headers = response?.headers;\n const payload = response?.data ?? response;\n const contentType = getHeaderValue(headers, 'content-type') || payload?.type || '';\n const hasBlob = typeof Blob !== 'undefined';\n\n if (hasBlob && payload instanceof Blob && String(contentType).includes('application/json')) {\n const text = await payload.text();\n try {\n const json = JSON.parse(text);\n throw new Error(json?.message || '下载失败');\n } catch (error) {\n if (error instanceof SyntaxError) throw new Error('下载失败');\n if (error instanceof Error) throw error;\n throw new Error('下载失败');\n }\n }\n\n const blob =\n hasBlob && payload instanceof Blob\n ? payload\n : hasBlob && payload instanceof ArrayBuffer\n ? new Blob([payload], { type: contentType || 'application/octet-stream' })\n : new Blob([typeof payload === 'string' ? payload : JSON.stringify(payload ?? '')], {\n type: contentType || 'application/octet-stream',\n });\n const filename = resolveDownloadFilename(headers, fallbackName);\n const url = window.URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n window.URL.revokeObjectURL(url);\n};\n\nfunction FilterGroupEditor({\n group,\n fields,\n onChange,\n level = 0,\n}: {\n group: DataManagementFilterGroup;\n fields: DataManagementField[];\n onChange: (group: DataManagementFilterGroup) => void;\n level?: number;\n}) {\n const fieldOptions = fields.map((field) => ({ label: field.label, value: field.fieldId }));\n\n const updateRule = (ruleId: string, patch: Partial<DataManagementFilterRule>) => {\n onChange({\n ...group,\n rules: group.rules.map((rule) => (rule.id === ruleId ? { ...rule, ...patch } : rule)),\n });\n };\n\n return (\n <div\n className={`${level > 0 ? 'ml-4 border-l border-ant-border-secondary pl-4' : ''} space-y-3`}\n >\n <div className=\"flex items-center justify-between\">\n <Segmented\n size=\"small\"\n value={group.logic}\n options={[\n { label: '满足全部', value: 'AND' },\n { label: '满足任一', value: 'OR' },\n ]}\n onChange={(value) => onChange({ ...group, logic: value as 'AND' | 'OR' })}\n />\n <Space>\n <Button\n size=\"small\"\n onClick={() => onChange({ ...group, rules: [...group.rules, createRule(fields[0])] })}\n >\n 添加条件\n </Button>\n <Button\n size=\"small\"\n onClick={() => onChange({ ...group, conditions: [...group.conditions, createGroup()] })}\n >\n 添加分组\n </Button>\n </Space>\n </div>\n {group.rules.map((rule) => (\n <div\n key={rule.id}\n className=\"grid grid-cols-[minmax(120px,1fr)_120px_minmax(160px,1fr)_auto] gap-2\"\n >\n <Select\n showSearch\n placeholder=\"字段\"\n value={rule.key}\n options={fieldOptions}\n optionFilterProp=\"label\"\n onChange={(fieldId) => {\n const field = fields.find((item) => item.fieldId === fieldId);\n updateRule(rule.id, { key: fieldId, componentName: field?.componentName });\n }}\n />\n <Select\n value={rule.operator}\n options={[\n { label: '包含', value: 'contains' },\n { label: '等于', value: 'eq' },\n { label: '不等于', value: 'ne' },\n { label: '大于', value: 'gt' },\n { label: '小于', value: 'lt' },\n ]}\n onChange={(operator) => updateRule(rule.id, { operator })}\n />\n <Input\n value={rule.value}\n placeholder=\"输入筛选值\"\n onChange={(event) => updateRule(rule.id, { value: event.target.value })}\n />\n <Button\n danger\n type=\"text\"\n icon={<DeleteOutlined />}\n onClick={() =>\n onChange({ ...group, rules: group.rules.filter((item) => item.id !== rule.id) })\n }\n />\n </div>\n ))}\n {group.conditions.map((child) => (\n <FilterGroupEditor\n key={child.id}\n group={child}\n fields={fields}\n level={level + 1}\n onChange={(next) =>\n onChange({\n ...group,\n conditions: group.conditions.map((item) => (item.id === child.id ? next : item)),\n })\n }\n />\n ))}\n {group.rules.length === 0 && group.conditions.length === 0 && (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无筛选条件\" />\n )}\n </div>\n );\n}\n\nfunction ResizableColumnTitle({\n label,\n width,\n onResize,\n onResizeEnd,\n}: {\n label: React.ReactNode;\n width: number;\n onResize: (width: number) => void;\n onResizeEnd: (width: number) => void;\n}) {\n const dragRef = useRef({ startX: 0, startWidth: width, latestWidth: width });\n\n const handleMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.preventDefault();\n event.stopPropagation();\n dragRef.current = {\n startX: event.clientX,\n startWidth: width,\n latestWidth: width,\n };\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const nextWidth = Math.min(\n 520,\n Math.max(96, dragRef.current.startWidth + moveEvent.clientX - dragRef.current.startX),\n );\n dragRef.current.latestWidth = nextWidth;\n onResize(nextWidth);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n onResizeEnd(dragRef.current.latestWidth);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n };\n\n return (\n <span className=\"relative flex min-w-0 items-center pr-3\">\n <span className=\"min-w-0 truncate\">{label}</span>\n <span\n aria-hidden\n className=\"absolute -right-3 top-0 h-full w-4 cursor-col-resize after:absolute after:right-1 after:top-1/2 after:h-5 after:w-0.5 after:-translate-y-1/2 after:rounded after:bg-transparent hover:after:bg-ant-color-primary\"\n onClickCapture={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onDoubleClickCapture={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onMouseDownCapture={handleMouseDown}\n title=\"拖拽调整列宽\"\n />\n </span>\n );\n}\n\nexport const DataManagementList: React.FC<DataManagementListProps> = ({\n appType,\n formUuid,\n detailBasePath,\n menuFormUuid,\n readonly = false,\n fullHeight = true,\n configScope = 'global',\n title,\n detailRenderer,\n detailPageUrlBuilder,\n submitRenderer,\n requestOverride,\n rowActions = [],\n}) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const api = useMemo(() => {\n if (typeof requestOverride === 'function') {\n return createFormRuntimeApi({ request: requestOverride });\n }\n return createFormRuntimeApi(requestOverride);\n }, [requestOverride]);\n\n const [fields, setFields] = useState<DataManagementField[]>([]);\n const [config, setConfig] = useState<DataManagementConfig>({});\n const [formType, setFormType] = useState<string>('form');\n const [showFields, setShowFields] = useState<string[]>([]);\n const [lockFieldIds, setLockFieldIds] = useState<string[]>([]);\n const [widths, setWidths] = useState<Record<string, number>>({});\n const widthsRef = useRef<Record<string, number>>({});\n const [sort, setSort] = useState<DataManagementSort[]>([]);\n const [density, setDensity] = useState<DataManagementDensity>('middle');\n const [detailOpenMode, setDetailOpenMode] = useState<'drawer' | 'newPage'>('drawer');\n const [searchKeyWord, setSearchKeyWord] = useState('');\n const [filterGroup, setFilterGroup] = useState<DataManagementFilterGroup>(createGroup);\n const [dataSource, setDataSource] = useState<any[]>([]);\n const [total, setTotal] = useState(0);\n const [current, setCurrent] = useState(1);\n const [pageSize, setPageSize] = useState(10);\n const [loading, setLoading] = useState(false);\n const [schemaLoading, setSchemaLoading] = useState(true);\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);\n const [filterOpen, setFilterOpen] = useState(false);\n const [columnOpen, setColumnOpen] = useState(false);\n const [exportOpen, setExportOpen] = useState(false);\n const [exportScope, setExportScope] = useState<'selected' | 'all'>('all');\n const [exportFields, setExportFields] = useState<string[]>([]);\n const [exporting, setExporting] = useState(false);\n const [importOpen, setImportOpen] = useState(false);\n const [importPreview, setImportPreview] = useState<any[]>([]);\n const [importBase64, setImportBase64] = useState('');\n const [templateDownloading, setTemplateDownloading] = useState(false);\n const [recordsOpen, setRecordsOpen] = useState(false);\n const [recordTab, setRecordTab] = useState<'import' | 'export'>('export');\n const [transferRecords, setTransferRecords] = useState<any[]>([]);\n const [batchApprovalOpen, setBatchApprovalOpen] = useState(false);\n const [batchApprovalAction, setBatchApprovalAction] = useState<'approved' | 'rejected'>(\n 'approved',\n );\n const [batchApprovalComments, setBatchApprovalComments] = useState('');\n const [batchApproving, setBatchApproving] = useState(false);\n const [activeRecord, setActiveRecord] = useState<any | null>(null);\n const [detailOpen, setDetailOpen] = useState(false);\n const [submitOpen, setSubmitOpen] = useState(false);\n const fetchStateRef = useRef<DataManagementFetchState>({});\n\n const request = api.request;\n const getPopupContainer = useCallback(\n (triggerNode?: HTMLElement) =>\n rootRef.current ||\n triggerNode?.ownerDocument?.body ||\n (typeof document !== 'undefined'\n ? document.body\n : (triggerNode?.parentElement as HTMLElement)),\n [],\n );\n const confirmDanger = useCallback((title: string, content: string, onOk: () => void) => {\n if (confirmAction(title, content)) onOk();\n }, []);\n\n const visibleFields = useMemo(\n () =>\n showFields\n .map((fieldId) => fields.find((field) => field.fieldId === fieldId))\n .filter(Boolean) as DataManagementField[],\n [fields, showFields],\n );\n\n useEffect(() => {\n widthsRef.current = widths;\n }, [widths]);\n\n useEffect(() => {\n fetchStateRef.current = {\n current,\n pageSize,\n searchKeyWord,\n filterGroup,\n sort,\n };\n }, [current, filterGroup, pageSize, searchKeyWord, sort]);\n\n const loadData = useCallback(\n async (overrides: DataManagementFetchState = {}) => {\n if (!appType || !formUuid) return;\n const fetchState = { ...fetchStateRef.current, ...overrides };\n const nextCurrent = fetchState.current || 1;\n const nextPageSize = fetchState.pageSize || 10;\n fetchStateRef.current = {\n ...fetchState,\n current: nextCurrent,\n pageSize: nextPageSize,\n };\n setLoading(true);\n try {\n const result = await advancedSearchDataManagement(request, {\n appType,\n formUuid,\n currentPage: nextCurrent,\n pageSize: nextPageSize,\n searchKeyWord: fetchState.searchKeyWord,\n filters: fetchState.filterGroup,\n order: fetchState.sort,\n });\n setDataSource(result.records);\n setTotal(result.total);\n setCurrent(nextCurrent);\n setPageSize(nextPageSize);\n } catch (error) {\n console.error('[DataManagementList] loadData failed:', error);\n message.error('加载数据失败');\n } finally {\n setLoading(false);\n }\n },\n [appType, formUuid, request],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadSchemaAndConfig = async () => {\n if (!appType || !formUuid) return;\n setSchemaLoading(true);\n setDataSource([]);\n setTotal(0);\n setSelectedRowKeys([]);\n try {\n const schemaResult = await getDataManagementSchema(request, { appType, formUuid });\n if (!mounted) return;\n const allFields = [\n ...schemaResult.fields,\n ...getSystemFieldsForFormType(schemaResult.formType),\n ];\n const saved = await getDataManagementConfig(request, {\n appType,\n formUuid,\n menuFormUuid,\n scope: configScope,\n }).catch(() => undefined);\n if (!mounted) return;\n const resolved = normalizeColumnConfig(saved, allFields);\n const nextSearchKeyWord = saved?.filter?.searchKeyWord || '';\n const nextFilterGroup = hydrateFilterGroup(saved?.filter?.group);\n setFields(allFields);\n setFormType(schemaResult.formType || 'form');\n setConfig(saved || {});\n setShowFields(resolved.showFields);\n setWidths(resolved.widths);\n setLockFieldIds(resolved.lockFieldIds);\n setSort(resolved.sort);\n setDensity(resolved.density);\n setDetailOpenMode(resolved.detailOpenMode);\n setPageSize(resolved.pageSize);\n setSearchKeyWord(nextSearchKeyWord);\n setFilterGroup(nextFilterGroup);\n await loadData({\n current: 1,\n pageSize: resolved.pageSize,\n searchKeyWord: nextSearchKeyWord,\n filterGroup: nextFilterGroup,\n sort: resolved.sort,\n });\n } catch (error) {\n console.error('[DataManagementList] load schema failed:', error);\n message.error('加载表单配置失败');\n } finally {\n if (mounted) setSchemaLoading(false);\n }\n };\n loadSchemaAndConfig();\n return () => {\n mounted = false;\n };\n }, [appType, configScope, formUuid, loadData, menuFormUuid, request]);\n\n const persistConfig = useCallback(\n async (patch: DataManagementConfig) => {\n const nextConfig = { ...config, ...patch };\n setConfig(nextConfig);\n await saveDataManagementConfig(request, {\n appType,\n formUuid,\n menuFormUuid,\n scope: configScope,\n config: nextConfig,\n }).catch((error) => {\n console.error('[DataManagementList] save config failed:', error);\n message.warning('配置保存失败,本次仅在当前页面生效');\n });\n },\n [appType, config, configScope, formUuid, menuFormUuid, request],\n );\n\n const handleColumnCommit = async () => {\n setColumnOpen(false);\n await persistConfig({\n showFields,\n lockFieldIds,\n widths,\n sort,\n density,\n detailOpenMode,\n pageSize,\n });\n await loadData({ current: 1, pageSize, sort });\n };\n\n const handleSortChange = (index: number, patch: Partial<DataManagementSort>) => {\n setSort((prev) =>\n prev.map((item, itemIndex) => (itemIndex === index ? { ...item, ...patch } : item)),\n );\n };\n\n const handleAddSort = () => {\n const firstFieldId = showFields[0] || fields[0]?.fieldId;\n if (!firstFieldId) return;\n setSort((prev) => [...prev, { id: firstFieldId, isAsc: 'y' }]);\n };\n\n const handleRemoveSort = (index: number) => {\n setSort((prev) => prev.filter((_, itemIndex) => itemIndex !== index));\n };\n\n const updateColumnWidth = useCallback((fieldId: string, width: number) => {\n const nextWidth = Math.round(Math.max(96, Math.min(520, width)));\n widthsRef.current = { ...widthsRef.current, [fieldId]: nextWidth };\n setWidths(widthsRef.current);\n }, []);\n\n const commitColumnWidth = useCallback(\n (fieldId: string, width: number) => {\n const nextWidth = Math.round(Math.max(96, Math.min(520, width)));\n const nextWidths = { ...widthsRef.current, [fieldId]: nextWidth };\n widthsRef.current = nextWidths;\n setWidths(nextWidths);\n void persistConfig({ widths: nextWidths });\n },\n [persistConfig],\n );\n\n const handleDetail = useCallback(\n (record: any) => {\n const formInstanceId = getRecordId(record);\n if (!formInstanceId) {\n message.warning('当前记录缺少实例 ID,无法打开详情');\n return;\n }\n if (detailOpenMode === 'newPage' && typeof window !== 'undefined') {\n const detailUrl =\n detailPageUrlBuilder?.({ record, formInstanceId: String(formInstanceId) }) ||\n buildDefaultDetailUrl({\n appType,\n formUuid,\n formType,\n formInstanceId: String(formInstanceId),\n basePath: detailBasePath,\n });\n if (detailUrl) {\n window.open(detailUrl, '_blank');\n return;\n }\n }\n setActiveRecord(record);\n setDetailOpen(true);\n },\n [appType, detailBasePath, detailOpenMode, detailPageUrlBuilder, formType, formUuid],\n );\n\n const handleDelete = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n await deleteDataManagementRows(request, { appType, formUuid, formInstanceIds: ids });\n setSelectedRowKeys([]);\n await loadData({ current, pageSize });\n },\n [appType, current, formUuid, loadData, pageSize, request],\n );\n\n const getSelectedRecordIds = useCallback(\n () =>\n selectedRowKeys.map((key) => {\n const record = dataSource.find((item) => String(getRecordId(item)) === String(key));\n return String(getSelectedRecordId(record, key));\n }),\n [dataSource, selectedRowKeys],\n );\n\n const handleBatchApprove = () => {\n if (selectedRowKeys.length === 0) return;\n setBatchApprovalOpen(true);\n };\n\n const handleBatchApprovalConfirm = async () => {\n const ids = getSelectedRecordIds();\n if (ids.length === 0) return;\n setBatchApproving(true);\n try {\n await batchApproveDataManagementRows(request, {\n appType,\n formUuid,\n formInstanceIds: ids,\n action: batchApprovalAction,\n comments: batchApprovalComments || undefined,\n });\n message.success(`批量${batchApprovalAction === 'approved' ? '通过' : '拒绝'}已提交`);\n setSelectedRowKeys([]);\n setBatchApprovalOpen(false);\n setBatchApprovalAction('approved');\n setBatchApprovalComments('');\n await loadData({ current, pageSize });\n } catch (error) {\n console.error('[DataManagementList] batch approval failed:', error);\n message.error('批量审批失败');\n } finally {\n setBatchApproving(false);\n }\n };\n\n const handleExport = async (scope: 'selected' | 'all') => {\n const selectedIds = scope === 'selected' ? getSelectedRecordIds() : [];\n if (scope === 'selected' && selectedIds.length === 0) {\n message.warning('请先选择要导出的记录');\n return;\n }\n\n const selectedFilters = selectedIds.map((id) => ({\n key: 'form_instance_id',\n operator: 'EQ',\n value: id,\n }));\n\n setExporting(true);\n try {\n await exportDataManagementRows(request, {\n appType,\n formUuid,\n currentPage: scope === 'selected' ? 1 : current,\n pageSize: scope === 'selected' ? selectedIds.length : pageSize,\n searchKeyWord: scope === 'selected' ? undefined : searchKeyWord,\n filters: scope === 'selected' ? undefined : filterGroup,\n rawFilters: scope === 'selected' ? JSON.stringify(selectedFilters) : undefined,\n conditionType: scope === 'selected' ? 'OR' : undefined,\n order: sort,\n exportAll: scope === 'all' ? 'y' : 'n',\n exportFields,\n });\n message.success('导出任务已创建,可在导入导出记录中查看');\n setExportOpen(false);\n } catch (error) {\n console.error('[DataManagementList] export failed:', error);\n message.error('导出失败');\n } finally {\n setExporting(false);\n }\n };\n\n const handleDownloadTemplate = async () => {\n setTemplateDownloading(true);\n try {\n const response = await downloadDataManagementImportTemplate(request, { appType, formUuid });\n await downloadBlobResponse(response, `导入模板-${formUuid}.xlsx`);\n message.success('模板下载已开始');\n } catch (error) {\n console.error('[DataManagementList] download template failed:', error);\n message.error(error instanceof Error ? error.message : '下载导入模板失败');\n } finally {\n setTemplateDownloading(false);\n }\n };\n\n const loadTransferRecords = async (type: 'import' | 'export') => {\n setRecordTab(type);\n setRecordsOpen(true);\n const result = await getDataManagementTransferRecords(request, {\n appType,\n formUuid,\n type,\n currentPage: 1,\n pageSize: 10,\n });\n setTransferRecords(result.records);\n };\n\n const handleImportPreview = async (file: File) => {\n const base64 = await fileToBase64(file);\n setImportBase64(base64);\n const result = await importPreviewDataManagementRows(request, {\n appType,\n formUuid,\n fileBase64: base64,\n });\n const records = result?.data || result?.records || result?.list || result || [];\n setImportPreview(Array.isArray(records) ? records : []);\n return false;\n };\n\n const handleImportConfirm = async () => {\n if (!importBase64) return;\n await importDataManagementRows(request, { appType, formUuid, fileBase64: importBase64 });\n message.success('导入任务已创建');\n setImportOpen(false);\n setImportPreview([]);\n setImportBase64('');\n await loadData({ current: 1, pageSize });\n };\n\n const columns = useMemo<TableProps<any>['columns']>(() => {\n const baseColumns =\n visibleFields.map((field) => {\n const columnWidth = widths[field.fieldId] || field.width || 160;\n return {\n title: (\n <ResizableColumnTitle\n label={field.label}\n width={columnWidth}\n onResize={(width) => updateColumnWidth(field.fieldId, width)}\n onResizeEnd={(width) => commitColumnWidth(field.fieldId, width)}\n />\n ),\n dataIndex: field.fieldId,\n key: field.fieldId,\n width: columnWidth,\n fixed: lockFieldIds.includes(field.fieldId) ? ('left' as const) : undefined,\n ellipsis: true,\n render: (value: any) => renderCellValue(value, field),\n };\n }) || [];\n return [\n ...baseColumns,\n {\n title: '操作',\n key: '__actions',\n width: 136,\n fixed: 'right' as const,\n render: (_: any, record: any) => (\n <Space size={4}>\n <Button type=\"link\" size=\"small\" onClick={() => handleDetail(record)}>\n 详情\n </Button>\n <Dropdown\n trigger={['click']}\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n ...(!readonly\n ? [\n {\n key: 'delete',\n label: '删除',\n danger: true,\n icon: <DeleteOutlined />,\n onClick: () =>\n confirmDanger('确认删除', '删除后不可恢复,确认继续吗?', () =>\n handleDelete([String(getRecordId(record))]),\n ),\n },\n ]\n : []),\n ...rowActions.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.danger,\n onClick: () => action.onClick(record),\n })),\n ...(formType === 'process'\n ? [\n {\n key: 'workflow',\n label: '流程日志',\n icon: <HistoryOutlined />,\n onClick: () =>\n message.info('请通过 detailRenderer 接入流程日志或流程图入口'),\n },\n ]\n : []),\n ],\n }}\n >\n <Button type=\"text\" size=\"small\" icon={<MoreOutlined />} />\n </Dropdown>\n </Space>\n ),\n },\n ];\n }, [\n confirmDanger,\n commitColumnWidth,\n formType,\n getPopupContainer,\n handleDelete,\n handleDetail,\n lockFieldIds,\n readonly,\n rowActions,\n updateColumnWidth,\n visibleFields,\n widths,\n ]);\n\n const tableSize = density === 'compact' ? 'small' : density === 'loose' ? 'large' : 'middle';\n const tableScrollX = Math.max(\n 900,\n visibleFields.reduce((sum, field) => sum + (widths[field.fieldId] || field.width || 160), 136),\n );\n\n const importPreviewColumns = useMemo<TableProps<any>['columns']>(() => {\n const keys = Array.from(\n new Set(importPreview.flatMap((record) => Object.keys(record || {}))),\n ).slice(0, 16);\n return keys.map((key) => {\n const field = fields.find((item) => item.fieldId === key || item.id === key);\n return {\n title: field?.label || key,\n dataIndex: key,\n key,\n width: 150,\n ellipsis: true,\n render: (value: any) => (field ? renderCellValue(value, field) : formatPrimitive(value)),\n };\n });\n }, [fields, importPreview]);\n\n return (\n <ConfigProvider getPopupContainer={getPopupContainer}>\n <div\n ref={rootRef}\n className={`relative w-full bg-ant-bg-layout ${\n fullHeight ? 'flex h-[calc(100vh-88px)] min-h-[560px] overflow-hidden' : ''\n }`}\n >\n <div className=\"mx-auto flex min-h-0 w-full max-w-[1440px] flex-col px-4 py-4 md:px-6\">\n <div className=\"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold text-ant-color-text\">{title || '数据管理'}</h1>\n <p className=\"mt-1 text-sm text-ant-color-text-secondary\">\n 共 {total} 条数据,已选择 {selectedRowKeys.length} 条\n </p>\n </div>\n <Space wrap>\n {!readonly && submitRenderer && (\n <Button icon={<PlusOutlined />} type=\"primary\" onClick={() => setSubmitOpen(true)}>\n 新增\n </Button>\n )}\n <Input.Search\n allowClear\n className=\"w-[260px]\"\n placeholder=\"搜索关键字\"\n value={searchKeyWord}\n onChange={(event) => setSearchKeyWord(event.target.value)}\n onSearch={(value) => {\n const nextSearchKeyWord = String(value || '');\n setSearchKeyWord(nextSearchKeyWord);\n persistConfig({\n filter: { searchKeyWord: nextSearchKeyWord, group: filterGroup },\n });\n loadData({\n current: 1,\n pageSize,\n searchKeyWord: nextSearchKeyWord,\n filterGroup,\n });\n }}\n />\n <Button icon={<FilterOutlined />} onClick={() => setFilterOpen(true)}>\n 筛选\n </Button>\n <Button icon={<SettingOutlined />} onClick={() => setColumnOpen(true)}>\n 列设置\n </Button>\n <Dropdown\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n {\n key: 'selected',\n label: '导出选中',\n disabled: selectedRowKeys.length === 0,\n onClick: () => {\n setExportScope('selected');\n setExportFields(showFields);\n setExportOpen(true);\n },\n },\n {\n key: 'all',\n label: '导出全部',\n onClick: () => {\n setExportScope('all');\n setExportFields(showFields);\n setExportOpen(true);\n },\n },\n {\n key: 'records',\n label: '导出记录',\n onClick: () => loadTransferRecords('export'),\n },\n ],\n }}\n >\n <Button icon={<DownloadOutlined />}>导出</Button>\n </Dropdown>\n {!readonly && (\n <Dropdown\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n { key: 'import', label: '导入数据', onClick: () => setImportOpen(true) },\n {\n key: 'records',\n label: '导入记录',\n onClick: () => loadTransferRecords('import'),\n },\n ],\n }}\n >\n <Button icon={<ImportOutlined />}>导入</Button>\n </Dropdown>\n )}\n <Button icon={<ReloadOutlined />} onClick={() => loadData({ current, pageSize })} />\n </Space>\n </div>\n\n {selectedRowKeys.length > 0 && (\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-3 rounded-lg border border-ant-border-secondary bg-ant-bg-container px-4 py-3 shadow-sm\">\n <span className=\"text-sm text-ant-color-text-secondary\">\n 已选 {selectedRowKeys.length} 条\n </span>\n <Space wrap>\n {!readonly && (\n <Button icon={<SwapOutlined />} onClick={handleBatchApprove}>\n 批量审批\n </Button>\n )}\n {!readonly && (\n <Button\n danger\n icon={<DeleteOutlined />}\n onClick={() =>\n confirmDanger(\n '确认批量删除',\n `将删除 ${selectedRowKeys.length} 条数据,确认继续吗?`,\n () => handleDelete(selectedRowKeys.map(String)),\n )\n }\n >\n 批量删除\n </Button>\n )}\n <Button type=\"link\" onClick={() => setSelectedRowKeys([])}>\n 取消选择\n </Button>\n </Space>\n </div>\n )}\n\n <div className=\"relative flex-1 overflow-hidden rounded-lg border border-ant-border-secondary bg-ant-bg-container\">\n <Table\n rowKey={(record) => String(getRecordId(record))}\n loading={loading || schemaLoading}\n columns={columns}\n dataSource={dataSource}\n size={tableSize as TableProps<any>['size']}\n scroll={{\n x: tableScrollX,\n y: fullHeight\n ? selectedRowKeys.length > 0\n ? 'calc(100vh - 360px)'\n : 'calc(100vh - 300px)'\n : undefined,\n }}\n rowSelection={{\n selectedRowKeys,\n onChange: setSelectedRowKeys,\n }}\n pagination={{\n current,\n pageSize,\n total,\n showSizeChanger: true,\n showTotal: (count) => `共 ${count} 条`,\n }}\n onChange={(pagination) => {\n loadData({\n current: pagination.current || 1,\n pageSize: pagination.pageSize || pageSize,\n sort,\n });\n }}\n />\n </div>\n </div>\n\n <Modal\n getContainer={false}\n title=\"高级筛选\"\n open={filterOpen}\n width={760}\n onCancel={() => setFilterOpen(false)}\n onOk={() => {\n setFilterOpen(false);\n persistConfig({ filter: { searchKeyWord, group: filterGroup } });\n loadData({ current: 1, pageSize, searchKeyWord, filterGroup });\n }}\n okText=\"应用筛选\"\n >\n <FilterGroupEditor group={filterGroup} fields={fields} onChange={setFilterGroup} />\n </Modal>\n\n <Modal\n getContainer={false}\n title=\"列设置\"\n open={columnOpen}\n width={920}\n onCancel={() => setColumnOpen(false)}\n onOk={handleColumnCommit}\n >\n <div className=\"space-y-5\">\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">显示列</div>\n <Checkbox.Group\n className=\"grid grid-cols-2 gap-2 md:grid-cols-3\"\n value={showFields}\n options={fields.map((field) => ({ label: field.label, value: field.fieldId }))}\n onChange={(values) => setShowFields(values.map(String))}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">冻结列</div>\n <Select\n mode=\"multiple\"\n className=\"w-full\"\n value={lockFieldIds}\n options={showFields.map((fieldId) => {\n const field = fields.find((item) => item.fieldId === fieldId);\n return { label: field?.label || fieldId, value: fieldId };\n })}\n onChange={setLockFieldIds}\n />\n </div>\n <Divider className=\"my-1\" />\n <div>\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium text-ant-color-text\">排序规则</span>\n <Button size=\"small\" onClick={handleAddSort} disabled={fields.length === 0}>\n 添加排序\n </Button>\n </div>\n <div className=\"space-y-2\">\n {sort.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-ant-border-secondary px-3 py-4 text-center text-sm text-ant-color-text-tertiary\">\n 暂无排序规则\n </div>\n ) : (\n sort.map((item, index) => (\n <div key={`${item.id}_${index}`} className=\"flex items-center gap-2\">\n <Select\n className=\"min-w-0 flex-1\"\n value={item.id}\n options={fields.map((field) => ({\n label: field.label,\n value: field.fieldId,\n }))}\n onChange={(value) => handleSortChange(index, { id: value })}\n />\n <Segmented\n value={item.isAsc}\n options={[\n { label: '升序', value: 'y' },\n { label: '降序', value: 'n' },\n ]}\n onChange={(value) => handleSortChange(index, { isAsc: value as 'y' | 'n' })}\n />\n <Button\n danger\n type=\"text\"\n icon={<DeleteOutlined />}\n onClick={() => handleRemoveSort(index)}\n />\n </div>\n ))\n )}\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">表格密度</div>\n <Segmented\n block\n value={density}\n options={[\n { label: '紧凑', value: 'compact' },\n { label: '标准', value: 'middle' },\n { label: '宽松', value: 'loose' },\n ]}\n onChange={(value) => setDensity(value as DataManagementDensity)}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">详情打开方式</div>\n <Segmented\n block\n value={detailOpenMode}\n options={[\n { label: '抽屉', value: 'drawer' },\n { label: '新页', value: 'newPage' },\n ]}\n onChange={(value) => setDetailOpenMode(value as 'drawer' | 'newPage')}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">页大小</div>\n <Select\n className=\"w-full\"\n value={pageSize}\n options={[10, 20, 50, 100].map((value) => ({ label: `${value} 条`, value }))}\n onChange={setPageSize}\n />\n </div>\n </div>\n </div>\n </Modal>\n\n <Modal\n getContainer={false}\n title={exportScope === 'selected' ? '导出选中数据' : '导出全部数据'}\n open={exportOpen}\n onCancel={() => setExportOpen(false)}\n footer={\n <Space>\n <Button onClick={() => setExportOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n loading={exporting}\n disabled={exportScope === 'selected' && selectedRowKeys.length === 0}\n onClick={() => handleExport(exportScope)}\n >\n {exportScope === 'selected' ? `导出选中 (${selectedRowKeys.length})` : '导出全部'}\n </Button>\n </Space>\n }\n >\n <Checkbox.Group\n className=\"grid grid-cols-2 gap-2\"\n value={exportFields}\n options={fields.map((field) => ({ label: field.label, value: field.fieldId }))}\n onChange={(values) => setExportFields(values.map(String))}\n />\n </Modal>\n\n <Modal\n getContainer={false}\n title=\"批量审批\"\n open={batchApprovalOpen}\n onCancel={() => setBatchApprovalOpen(false)}\n onOk={handleBatchApprovalConfirm}\n okText={batchApprovalAction === 'approved' ? '确认通过' : '确认拒绝'}\n confirmLoading={batchApproving}\n >\n <div className=\"space-y-4\">\n <div className=\"text-sm text-ant-color-text-secondary\">\n 已选择 {selectedRowKeys.length} 条记录\n </div>\n <Segmented\n block\n value={batchApprovalAction}\n options={[\n { label: '同意', value: 'approved' },\n { label: '拒绝', value: 'rejected' },\n ]}\n onChange={(value) => setBatchApprovalAction(value as 'approved' | 'rejected')}\n />\n <Input.TextArea\n value={batchApprovalComments}\n rows={4}\n maxLength={500}\n showCount\n placeholder=\"填写审批意见\"\n onChange={(event) => setBatchApprovalComments(event.target.value)}\n />\n </div>\n </Modal>\n\n <Modal\n getContainer={false}\n title=\"导入数据\"\n open={importOpen}\n width={720}\n onCancel={() => setImportOpen(false)}\n onOk={handleImportConfirm}\n okButtonProps={{ disabled: !importBase64 }}\n okText=\"确认导入\"\n >\n <div className=\"mb-3 flex flex-col gap-3 rounded-lg border border-ant-border-secondary bg-ant-bg-container px-4 py-3 md:flex-row md:items-center md:justify-between\">\n <div>\n <div className=\"text-sm font-medium text-ant-color-text\">导入模板</div>\n <div className=\"mt-1 text-xs text-ant-color-text-secondary\">\n 先下载模板填写数据,再上传 Excel 文件导入\n </div>\n </div>\n <Button\n icon={<DownloadOutlined />}\n loading={templateDownloading}\n onClick={handleDownloadTemplate}\n >\n 下载导入模板\n </Button>\n </div>\n <Upload.Dragger\n accept=\".xlsx,.xls\"\n maxCount={1}\n beforeUpload={handleImportPreview}\n onRemove={() => {\n setImportBase64('');\n setImportPreview([]);\n }}\n >\n <p className=\"text-ant-color-text-secondary\">拖拽 Excel 文件到此处,或点击选择文件</p>\n </Upload.Dragger>\n {importPreview.length > 0 && (\n <div className=\"mt-4\">\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">导入预览</div>\n <Table\n size=\"small\"\n dataSource={importPreview}\n columns={importPreviewColumns}\n scroll={{ x: Math.max(600, (importPreviewColumns?.length || 0) * 150) }}\n pagination={false}\n rowKey={(_, index) => String(index)}\n />\n </div>\n )}\n </Modal>\n\n <Drawer\n getContainer={false}\n rootStyle={{ position: 'absolute' }}\n styles={{ body: { padding: 24, overflow: 'auto' } }}\n title={recordTab === 'import' ? '导入记录' : '导出记录'}\n open={recordsOpen}\n width={720}\n onClose={() => setRecordsOpen(false)}\n >\n <Segmented\n value={recordTab}\n options={[\n { label: '导入记录', value: 'import' },\n { label: '导出记录', value: 'export' },\n ]}\n onChange={(value) => loadTransferRecords(value as 'import' | 'export')}\n />\n <Table\n className=\"mt-4\"\n size=\"small\"\n dataSource={transferRecords}\n rowKey={(record) => record.id || record.recordId}\n />\n </Drawer>\n\n <Drawer\n getContainer={false}\n rootStyle={{ position: 'absolute' }}\n styles={{ body: { padding: 0, overflow: 'auto' } }}\n title=\"详情\"\n open={detailOpen}\n width={720}\n onClose={() => setDetailOpen(false)}\n destroyOnClose\n >\n {activeRecord && detailRenderer ? (\n detailRenderer({\n record: activeRecord,\n formInstanceId: String(getRecordId(activeRecord)),\n onClose: () => setDetailOpen(false),\n })\n ) : (\n <Empty description=\"请通过 detailRenderer 接入详情模板\" />\n )}\n </Drawer>\n\n <Drawer\n getContainer={false}\n rootStyle={{ position: 'absolute' }}\n styles={{ body: { padding: 0, overflow: 'auto' } }}\n title=\"新增数据\"\n open={submitOpen}\n width={720}\n onClose={() => setSubmitOpen(false)}\n destroyOnClose\n >\n {submitRenderer ? (\n submitRenderer({\n onClose: () => setSubmitOpen(false),\n onSubmitted: () => {\n setSubmitOpen(false);\n loadData({ current: 1, pageSize });\n },\n })\n ) : (\n <Empty description=\"请通过 submitRenderer 接入提交模板\" />\n )}\n </Drawer>\n </div>\n </ConfigProvider>\n );\n};\n","import React, { useState, useCallback } from 'react';\nimport { Button, Select } from 'antd';\nimport { CheckCircleFilled } from '@ant-design/icons';\nimport type { FormSchema, FormEngineConfig, OptionItem, ProcessRoute } from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { useFormContext } from '../core/FormContext';\nimport { previewProcess } from '../core/processApi';\nimport { useDraftStorage } from '../hooks/useDraftStorage';\nimport { useFormNavigation } from '../hooks/useFormNavigation';\nimport { DraftManager } from '../modules/DraftManager';\nimport { ProcessPreview } from '../modules/ProcessPreview';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport type { ActionConfig } from '../modules/FormActionBar';\n\nexport interface SubmitSuccessInfo {\n formInstanceId: string;\n message?: string;\n}\n\nconst pickFormInstanceId = (value: any): string | undefined => {\n if (!value) return undefined;\n if (typeof value === 'string') return value;\n if (typeof value !== 'object') return undefined;\n\n return (\n value.formInstanceId ||\n value.formInstId ||\n value.instanceId ||\n value.id ||\n pickFormInstanceId(value.result) ||\n pickFormInstanceId(value.data)\n );\n};\n\nexport interface FormSubmitTemplateProps {\n schema: FormSchema;\n config: FormEngineConfig;\n formType?: 'form' | 'process';\n submitSuccessMode?: 'redirect' | 'stay' | 'continue';\n enableDraft?: boolean;\n enableProcessPreview?: boolean;\n enableSubmissionDepartmentSelect?: boolean;\n departmentOptions?: OptionItem[];\n header?: React.ReactNode;\n footer?: React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n renderDepartmentSelector?: (props: {\n value?: string;\n onChange: (value?: string) => void;\n options: OptionItem[];\n }) => React.ReactNode;\n renderForm?: (props: { schema: FormSchema; config: FormEngineConfig }) => React.ReactNode;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n onSubmitSuccess?: (formInstId: string) => void;\n inDrawer?: boolean;\n}\n\ninterface SubmitSuccessCardProps {\n info: SubmitSuccessInfo;\n mode: 'redirect' | 'stay' | 'continue';\n isRedirecting: boolean;\n countdown: number;\n onContinue: () => void;\n onViewDetail: () => void;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n}\n\nconst SubmitSuccessCard: React.FC<SubmitSuccessCardProps> = ({\n info,\n mode,\n isRedirecting,\n countdown,\n onContinue,\n onViewDetail,\n renderSuccess,\n}) => {\n if (renderSuccess) {\n return <>{renderSuccess(info)}</>;\n }\n\n return (\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-100 p-6\">\n <div className=\"flex flex-col items-center py-16 animate-[fadeIn_0.3s_ease-out,scaleIn_0.3s_ease-out]\">\n <div className=\"w-12 h-12 rounded-full bg-green-100 flex items-center justify-center mb-4\">\n <CheckCircleFilled className=\"text-2xl text-green-500\" />\n </div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">提交成功</h2>\n <p className=\"text-sm text-gray-500 mb-6\">{info.message || '已成功创建一条新记录'}</p>\n <div className=\"flex gap-3\">\n {(mode === 'stay' || mode === 'redirect') && (\n <Button onClick={onContinue}>继续提交</Button>\n )}\n <Button type=\"primary\" onClick={onViewDetail}>\n 查看详情\n </Button>\n </div>\n {isRedirecting && (\n <div className=\"mt-6 w-48\">\n <div className=\"text-xs text-gray-400 text-center mb-1\">{countdown}秒后自动跳转</div>\n <div className=\"h-1 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-1000\"\n style={{ width: `${(countdown / 3) * 100}%` }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\ninterface InnerFormContentProps {\n schema: FormSchema;\n config: FormEngineConfig;\n formType: 'form' | 'process';\n submitSuccessMode: 'redirect' | 'stay' | 'continue';\n enableDraft: boolean;\n enableProcessPreview: boolean;\n enableSubmissionDepartmentSelect: boolean;\n departmentOptions: OptionItem[];\n header?: React.ReactNode;\n footer?: React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n renderDepartmentSelector?: (props: {\n value?: string;\n onChange: (value?: string) => void;\n options: OptionItem[];\n }) => React.ReactNode;\n renderForm?: (props: { schema: FormSchema; config: FormEngineConfig }) => React.ReactNode;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n onSubmitSuccess?: (formInstId: string) => void;\n inDrawer?: boolean;\n}\n\nconst InnerFormContent: React.FC<InnerFormContentProps> = ({\n schema,\n config,\n formType,\n submitSuccessMode,\n enableDraft,\n enableProcessPreview,\n enableSubmissionDepartmentSelect,\n departmentOptions,\n header,\n footer,\n beforeForm,\n afterForm,\n renderDepartmentSelector,\n renderForm,\n renderSuccess,\n onSubmitSuccess,\n inDrawer = false,\n}) => {\n const { validateAll, getFormData, setFieldValue, resetForm, api } = useFormContext();\n const [submitted, setSubmitted] = useState(false);\n const [successInfo, setSuccessInfo] = useState<SubmitSuccessInfo | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [departmentId, setDepartmentId] = useState<string | undefined>();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewRoutes, setPreviewRoutes] = useState<ProcessRoute[]>([]);\n const [pendingFormData, setPendingFormData] = useState<Record<string, any> | null>(null);\n\n const { hasDraft, draftTimestamp, saveDraft, restoreDraft, clearDraft } = useDraftStorage({\n appType: config.appType,\n formUuid: config.formUuid,\n });\n\n const { navigateToDetail, navigateToProcessDetail, isRedirecting, countdown, handlePostSubmit } =\n useFormNavigation({\n appType: config.appType,\n formUuid: config.formUuid,\n formType,\n mode: submitSuccessMode === 'continue' ? 'stay' : submitSuccessMode,\n basePath: config.navigation?.basePath,\n });\n\n const performSubmit = useCallback(\n async (formData: Record<string, any>) => {\n setSubmitting(true);\n try {\n const submitResponse =\n config.mode === 'edit' && config.formInstanceId\n ? await api.updateFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n formInstId: config.formInstanceId,\n formInstanceId: config.formInstanceId,\n updateFormDataJson: JSON.stringify(formData),\n })\n : await api.submitFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n data: formData,\n submissionDepartmentId: departmentId,\n });\n\n const formInstId =\n pickFormInstanceId(submitResponse) || config.formInstanceId || `inst_${Date.now()}`;\n\n if (config.submit?.afterSubmit) {\n await config.submit.afterSubmit({\n formInstanceId: formInstId,\n data: formData,\n response: submitResponse,\n });\n }\n\n if (enableDraft) {\n clearDraft();\n }\n\n onSubmitSuccess?.(formInstId);\n\n if (submitSuccessMode === 'continue') {\n resetForm();\n } else {\n setSuccessInfo({ formInstanceId: formInstId });\n setSubmitted(true);\n handlePostSubmit(formInstId);\n }\n } catch (error) {\n console.error('[FormSubmitTemplate] Submit failed:', error);\n } finally {\n setSubmitting(false);\n }\n },\n [\n api,\n clearDraft,\n config,\n departmentId,\n enableDraft,\n handlePostSubmit,\n onSubmitSuccess,\n resetForm,\n submitSuccessMode,\n ],\n );\n\n const prepareSubmit = useCallback(async () => {\n const valid = await validateAll();\n if (!valid) return;\n\n const formData = getFormData();\n\n if (config.submit?.beforeSubmit) {\n const shouldContinue = await config.submit.beforeSubmit(formData);\n if (shouldContinue === false) {\n return;\n }\n }\n\n if (formType === 'process' && enableProcessPreview) {\n setPendingFormData(formData);\n setPreviewOpen(true);\n setPreviewLoading(true);\n try {\n const routes = await previewProcess(api.request, {\n appType: config.appType,\n formUuid: config.formUuid,\n data: formData,\n submissionDepartmentId: departmentId,\n });\n setPreviewRoutes(Array.isArray(routes) ? routes : []);\n } catch (error) {\n console.error('[FormSubmitTemplate] Preview failed:', error);\n setPreviewRoutes([]);\n } finally {\n setPreviewLoading(false);\n }\n return;\n }\n\n await performSubmit(formData);\n }, [\n validateAll,\n getFormData,\n config,\n api,\n formType,\n enableProcessPreview,\n departmentId,\n performSubmit,\n ]);\n\n const handlePreviewConfirm = useCallback(async () => {\n const data = pendingFormData ?? getFormData();\n setPreviewOpen(false);\n setPendingFormData(null);\n await performSubmit(data);\n }, [getFormData, pendingFormData, performSubmit]);\n\n const handleSaveDraft = useCallback(() => {\n const data = getFormData();\n saveDraft(data);\n }, [getFormData, saveDraft]);\n\n const handleRestoreDraft = useCallback(() => {\n const data = restoreDraft();\n if (!data) return;\n Object.entries(data).forEach(([fieldId, value]) => {\n setFieldValue(fieldId, value);\n });\n }, [restoreDraft, setFieldValue]);\n\n const handleContinue = useCallback(() => {\n setSubmitted(false);\n setSuccessInfo(null);\n resetForm();\n }, [resetForm]);\n\n const handleViewDetail = useCallback(() => {\n if (!successInfo) return;\n if (formType === 'process') {\n navigateToProcessDetail(successInfo.formInstanceId);\n } else {\n navigateToDetail(successInfo.formInstanceId);\n }\n }, [successInfo, formType, navigateToDetail, navigateToProcessDetail]);\n\n const actions: ActionConfig[] = [];\n if (enableDraft) {\n actions.push({\n key: 'draft',\n label: '暂存',\n type: 'default',\n onClick: handleSaveDraft,\n });\n }\n actions.push({\n key: 'reset',\n label: '重置',\n type: 'default',\n onClick: () => resetForm(),\n });\n actions.push({\n key: 'submit',\n label: '提交',\n type: 'primary',\n loading: submitting,\n onClick: prepareSubmit,\n });\n\n const departmentSelector =\n formType === 'process' && enableSubmissionDepartmentSelect ? (\n <div className=\"mb-5 rounded-lg border border-ant-border-secondary bg-ant-bg-elevated px-4 py-3\">\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">提交部门</div>\n {renderDepartmentSelector ? (\n renderDepartmentSelector({\n value: departmentId,\n onChange: setDepartmentId,\n options: departmentOptions,\n })\n ) : (\n <Select\n allowClear\n className=\"w-full\"\n placeholder=\"请选择本次提交流程所属部门\"\n value={departmentId}\n options={departmentOptions}\n onChange={setDepartmentId}\n />\n )}\n </div>\n ) : null;\n\n const actionsNode = !submitted ? (\n <StickyActionBar\n actions={actions}\n inDrawer={inDrawer}\n position=\"inline\"\n className={\n inDrawer\n ? 'mt-5 -mx-4 -mb-4 rounded-b-lg md:-mx-5 md:-mb-5'\n : 'mt-6 -mx-5 -mb-5 rounded-b-lg md:-mx-6 md:-mb-6'\n }\n />\n ) : null;\n\n return (\n <RuntimePageShell\n inDrawer={inDrawer}\n maxWidth={inDrawer ? '100%' : 1240}\n contentClassName={inDrawer ? 'px-4 py-4 md:px-5' : 'py-4 md:py-6'}\n >\n <div className=\"space-y-6\">\n {header}\n\n {enableDraft && hasDraft && !submitted && (\n <div>\n <DraftManager\n hasDraft={hasDraft}\n draftTimestamp={draftTimestamp}\n onRestore={handleRestoreDraft}\n onDiscard={clearDraft}\n />\n </div>\n )}\n\n {!submitted ? (\n <div\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${\n inDrawer ? 'p-4 md:p-5' : 'p-5 shadow-sm md:p-6'\n }`}\n >\n {departmentSelector}\n {beforeForm}\n {renderForm ? renderForm({ schema, config }) : <FormRenderer columns={2} />}\n {afterForm}\n {actionsNode}\n </div>\n ) : (\n successInfo && (\n <SubmitSuccessCard\n info={successInfo}\n mode={submitSuccessMode}\n isRedirecting={isRedirecting}\n countdown={countdown}\n onContinue={handleContinue}\n onViewDetail={handleViewDetail}\n renderSuccess={renderSuccess}\n />\n )\n )}\n\n {footer}\n </div>\n <ProcessPreview\n open={previewOpen}\n routes={previewRoutes}\n loading={previewLoading}\n onClose={() => setPreviewOpen(false)}\n onConfirm={handlePreviewConfirm}\n />\n </RuntimePageShell>\n );\n};\n\nexport const FormSubmitTemplate: React.FC<FormSubmitTemplateProps> = ({\n schema,\n config,\n formType = 'form',\n submitSuccessMode = 'redirect',\n enableDraft = false,\n enableProcessPreview = false,\n enableSubmissionDepartmentSelect = false,\n departmentOptions = [],\n header,\n footer,\n beforeForm,\n afterForm,\n renderDepartmentSelector,\n renderForm,\n renderSuccess,\n onSubmitSuccess,\n inDrawer = false,\n}) => {\n return (\n <FormProvider schema={schema} config={config}>\n <InnerFormContent\n schema={schema}\n config={config}\n formType={formType}\n submitSuccessMode={submitSuccessMode}\n enableDraft={enableDraft}\n enableProcessPreview={enableProcessPreview}\n enableSubmissionDepartmentSelect={enableSubmissionDepartmentSelect}\n departmentOptions={departmentOptions}\n header={header}\n footer={footer}\n beforeForm={beforeForm}\n afterForm={afterForm}\n renderDepartmentSelector={renderDepartmentSelector}\n renderForm={renderForm}\n renderSuccess={renderSuccess}\n onSubmitSuccess={onSubmitSuccess}\n inDrawer={inDrawer}\n />\n </FormProvider>\n );\n};\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport dayjs from 'dayjs';\nimport type { FormSchema, FormInstanceData, FieldBehavior } from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { useFormContext } from '../core/FormContext';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { useFormDetail } from '../hooks/useFormDetail';\nimport { useChangeRecords } from '../hooks/useChangeRecords';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { SummaryPanel } from '../modules/SummaryPanel';\nimport { RecordChangePanel } from '../modules/RecordChangePanel';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { PageSkeleton } from './PageSkeleton';\n\nexport interface FormDetailTemplateProps {\n schema: FormSchema;\n formUuid: string;\n appType: string;\n formInstanceId: string;\n enableEdit?: boolean;\n enableDelete?: boolean;\n enableChangeRecords?: boolean;\n header?: React.ReactNode;\n footer?: React.ReactNode;\n renderSummary?: (data: FormInstanceData) => React.ReactNode;\n renderActions?: (actions: ActionConfig[]) => React.ReactNode;\n onDelete?: () => void;\n onSave?: (values: Record<string, any>) => void;\n inDrawer?: boolean;\n}\n\nfunction FormDataBridge({\n formDataRef,\n}: {\n formDataRef: React.MutableRefObject<(() => Record<string, any>) | undefined>;\n}) {\n const { getFormData } = useFormContext();\n formDataRef.current = getFormData;\n return null;\n}\n\nconst formatDateTime = (value?: React.ReactNode) => {\n if (!value || typeof value !== 'string') return value || '-';\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.format('YYYY-MM-DD HH:mm:ss') : value;\n};\n\nconst InnerDetailContent: React.FC<FormDetailTemplateProps> = ({\n schema,\n formUuid,\n appType,\n formInstanceId,\n enableEdit = true,\n enableDelete = false,\n enableChangeRecords = false,\n header,\n footer,\n renderSummary,\n renderActions,\n onDelete,\n onSave,\n inDrawer = false,\n}) => {\n const formDataRef = useRef<(() => Record<string, any>) | undefined>(undefined);\n const [accessDenied, setAccessDenied] = useState(false);\n const fieldIds = useMemo(() => schema.fields.map((field) => field.fieldId), [schema.fields]);\n const {\n loading,\n mode,\n formData,\n instanceInfo,\n fieldBehaviors,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n canEdit,\n canDelete,\n canViewChangeRecords,\n } = useFormDetail({\n formUuid,\n appType,\n formInstanceId,\n fieldIds,\n onPermissionDenied: () => setAccessDenied(true),\n });\n\n const {\n records,\n loading: recordsLoading,\n hasMore,\n loadMore,\n refresh: refreshRecords,\n } = useChangeRecords({\n formUuid,\n appType,\n formInstanceId,\n autoLoad: enableChangeRecords && canViewChangeRecords,\n });\n\n const handleSave = useCallback(async () => {\n const values = formDataRef.current?.() ?? formData;\n if (!values) return;\n const success = await saveChanges(values);\n if (success) {\n onSave?.(values);\n }\n }, [formData, saveChanges, onSave]);\n\n const handleDelete = useCallback(async () => {\n const success = await deleteInstance();\n if (success) {\n onDelete?.();\n }\n }, [deleteInstance, onDelete]);\n\n const handleCancel = useCallback(() => {\n switchToReadonly();\n }, [switchToReadonly]);\n\n const readonlyActions: ActionConfig[] = [];\n if (enableEdit && canEdit) {\n readonlyActions.push({\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n });\n }\n if (enableDelete && canDelete) {\n readonlyActions.push({\n key: 'delete',\n label: '删除',\n type: 'danger',\n onClick: handleDelete,\n confirm: { title: '确认删除', content: '删除后将无法恢复,确认要删除吗?' },\n });\n }\n\n const editActions: ActionConfig[] = [\n { key: 'cancel', label: '取消', type: 'default', onClick: handleCancel },\n { key: 'save', label: '保存', type: 'primary', onClick: handleSave },\n ];\n\n const currentActions = mode === 'readonly' ? readonlyActions : editActions;\n\n const formConfig = {\n mode: mode === 'edit' ? ('edit' as const) : ('readonly' as const),\n formUuid,\n appType,\n formInstanceId,\n permissions: {\n fieldPermissions: fieldBehaviors as Record<string, FieldBehavior>,\n operations: [] as string[],\n },\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-ant-bg-layout\">\n <div className=\"max-w-4xl mx-auto py-8 px-6 pb-24\">\n <PageSkeleton type=\"detail\" />\n </div>\n </div>\n );\n }\n\n const actionsNode =\n currentActions.length > 0 ? (\n renderActions ? (\n renderActions(currentActions)\n ) : (\n <StickyActionBar actions={currentActions} inDrawer={inDrawer} />\n )\n ) : null;\n\n return (\n <RuntimePageShell actions={actionsNode} accessDenied={accessDenied} inDrawer={inDrawer}>\n <div className=\"space-y-6\">\n <div>\n {header}\n\n {renderSummary && instanceInfo ? (\n renderSummary(instanceInfo)\n ) : (\n <SummaryPanel\n title={instanceInfo?.title || instanceInfo?.instanceTitle || schema.formMeta.title}\n eyebrow={`数据实例 ${formInstanceId?.slice(0, 8) || '-'}`}\n creator={\n instanceInfo?.creator || instanceInfo?.createdByName\n ? {\n name: instanceInfo?.creator?.name || instanceInfo?.createdByName,\n avatar: instanceInfo?.creator?.avatar,\n department:\n instanceInfo?.creator?.department || instanceInfo?.createdByDepartmentName,\n }\n : undefined\n }\n createdAt={formatDateTime(instanceInfo?.createdAt)}\n metaItems={[\n {\n key: 'creator',\n label: '创建人',\n value: instanceInfo?.creator?.name || instanceInfo?.createdByName || '未知用户',\n },\n {\n key: 'department',\n label: '创建人部门',\n value:\n instanceInfo?.creator?.department ||\n instanceInfo?.createdByDepartmentName ||\n '-',\n },\n {\n key: 'createdAt',\n label: '创建时间',\n value: formatDateTime(instanceInfo?.createdAt),\n },\n {\n key: 'updatedAt',\n label: '更新时间',\n value: formatDateTime(instanceInfo?.updatedAt),\n },\n ]}\n status={mode === 'edit' ? { label: '编辑中', tone: 'brand' } : undefined}\n />\n )}\n\n {mode === 'edit' && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg px-4 py-3 text-sm text-blue-700 transition-all duration-150\">\n 正在编辑,修改后请保存\n </div>\n )}\n\n <div className=\"mt-6 rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n <FormProvider schema={schema} config={formConfig} initialValues={formData ?? undefined}>\n <FormDataBridge formDataRef={formDataRef} />\n <FormRenderer columns={2} />\n </FormProvider>\n </div>\n\n {enableChangeRecords && canViewChangeRecords && (\n <div className=\"mt-6\">\n <RecordChangePanel\n records={records}\n loading={recordsLoading}\n total={records.length}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onRefresh={refreshRecords}\n onExpand={refreshRecords}\n />\n </div>\n )}\n\n {footer}\n </div>\n </div>\n </RuntimePageShell>\n );\n};\n\nexport const FormDetailTemplate: React.FC<FormDetailTemplateProps> = (props) => {\n const { schema, formUuid, appType, formInstanceId } = props;\n\n const wrapperConfig = {\n mode: 'readonly' as const,\n formUuid,\n appType,\n formInstanceId,\n };\n\n return (\n <FormProvider schema={schema} config={wrapperConfig}>\n <InnerDetailContent {...props} />\n </FormProvider>\n );\n};\n","import React from 'react';\nimport { Skeleton } from 'antd';\n\nexport interface PageSkeletonProps {\n type: 'submit' | 'detail' | 'process';\n}\n\nconst CardSkeleton: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-100 p-6\">{children}</div>\n);\n\nconst SummaryCardSkeleton: React.FC = () => (\n <CardSkeleton>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <Skeleton.Input active size=\"large\" style={{ width: 200 }} />\n <div className=\"mt-2\">\n <Skeleton.Input active size=\"small\" style={{ width: 80 }} />\n </div>\n </div>\n <Skeleton.Button active size=\"small\" shape=\"round\" style={{ width: 60 }} />\n </div>\n <div className=\"flex items-center gap-3 mt-4\">\n <Skeleton.Avatar active size=\"small\" />\n <Skeleton.Input active size=\"small\" style={{ width: 120 }} />\n </div>\n </CardSkeleton>\n);\n\nconst FormGridSkeleton: React.FC = () => (\n <CardSkeleton>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"space-y-2\">\n <Skeleton.Input active size=\"small\" style={{ width: 80 }} />\n <Skeleton.Input active block style={{ width: '100%' }} />\n </div>\n ))}\n </div>\n </CardSkeleton>\n);\n\nconst ActionBarSkeleton: React.FC = () => (\n <div className=\"fixed bottom-0 left-0 right-0 backdrop-blur-lg bg-white/80 border-t border-gray-200 px-6 py-3\">\n <div className=\"flex items-center justify-end gap-3\">\n <Skeleton.Button active style={{ width: 80 }} />\n <Skeleton.Button active style={{ width: 80 }} />\n </div>\n </div>\n);\n\nconst TimelineSkeleton: React.FC = () => (\n <CardSkeleton>\n <Skeleton.Input active size=\"default\" style={{ width: 100, marginBottom: 16 }} />\n <div className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-3 h-3 rounded-full bg-gray-200 animate-pulse\" />\n {i < 2 && <div className=\"w-0.5 flex-1 bg-gray-200 mt-1\" />}\n </div>\n <div className=\"flex-1 pb-4\">\n <Skeleton active paragraph={{ rows: 1 }} title={{ width: '60%' }} />\n </div>\n </div>\n ))}\n </div>\n </CardSkeleton>\n);\n\nexport const PageSkeleton: React.FC<PageSkeletonProps> = ({ type }) => {\n if (type === 'submit') {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Skeleton.Input active size=\"large\" style={{ width: 200 }} />\n <Skeleton.Input active size=\"small\" style={{ width: 300 }} />\n </div>\n <FormGridSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n }\n\n if (type === 'detail') {\n return (\n <div className=\"space-y-6\">\n <SummaryCardSkeleton />\n <FormGridSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <SummaryCardSkeleton />\n <FormGridSkeleton />\n <TimelineSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n};\n","import React, { useCallback, useMemo, useRef } from 'react';\nimport type {\n FormSchema,\n ProcessTask,\n ProcessAction,\n FieldBehavior,\n ReturnableNode,\n} from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { useFormContext } from '../core/FormContext';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { useProcessDetail } from '../hooks/useProcessDetail';\nimport { useApprovalActions } from '../hooks/useApprovalActions';\nimport { PROCESS_STATUS_META } from '../core/constants';\nimport { ApprovalTimeline } from '../modules/ApprovalTimeline';\nimport { ApprovalActionBar } from '../modules/ApprovalActionBar';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport { SummaryPanel } from '../modules/SummaryPanel';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { PageSkeleton } from './PageSkeleton';\n\nexport interface ProcessDetailTemplateProps {\n schema: FormSchema;\n formUuid: string;\n appType: string;\n formInstanceId: string;\n header?: React.ReactNode;\n renderTimeline?: (tasks: ProcessTask[]) => React.ReactNode;\n renderActions?: (actions: ProcessAction[]) => React.ReactNode;\n renderTransferSelector?: (props: {\n value?: string;\n onChange: (userId: string) => void;\n }) => React.ReactNode;\n renderReturnNodeLabel?: (node: ReturnableNode) => React.ReactNode;\n renderActionModalExtra?: (action: ProcessAction) => React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n onActionComplete?: (action: string) => void;\n inDrawer?: boolean;\n}\n\nfunction FormDataBridge({\n formDataRef,\n}: {\n formDataRef: React.MutableRefObject<(() => Record<string, any>) | undefined>;\n}) {\n const { getFormData } = useFormContext();\n formDataRef.current = getFormData;\n return null;\n}\n\nconst InnerProcessContent: React.FC<ProcessDetailTemplateProps> = ({\n schema,\n formUuid,\n appType,\n formInstanceId,\n header,\n renderTimeline,\n renderActions,\n renderTransferSelector,\n renderReturnNodeLabel,\n renderActionModalExtra,\n beforeForm,\n afterForm,\n onActionComplete,\n inDrawer = false,\n}) => {\n const formDataRef = useRef<(() => Record<string, any>) | undefined>(undefined);\n const fieldIds = useMemo(() => schema.fields.map((field) => field.fieldId), [schema.fields]);\n\n const {\n loading,\n processInfo,\n processStatus,\n currentTask,\n progressList,\n formData,\n instanceInfo,\n isApprover,\n activeActions,\n fieldBehaviors,\n mode,\n isOriginatorReturn,\n canWithdraw,\n switchToEdit,\n switchToReadonly,\n refreshProgress,\n } = useProcessDetail({ formUuid, appType, formInstanceId, fieldIds });\n\n const {\n approve,\n reject,\n transfer,\n returnTo,\n withdraw,\n save,\n resubmit,\n callbackTask,\n returnableNodes,\n loadReturnableNodes,\n } = useApprovalActions({\n formInstanceId,\n formUuid,\n appType,\n currentTaskId: currentTask?.taskId ?? currentTask?.id,\n onActionComplete: async (action: string) => {\n onActionComplete?.(action);\n await refreshProgress();\n },\n getFormValues: () => formDataRef.current?.() ?? formData ?? {},\n });\n\n const handleApprove = useCallback(\n async (comments?: string) => {\n await approve(comments);\n },\n [approve],\n );\n\n const handleReject = useCallback(\n async (comments?: string) => {\n await reject(comments);\n },\n [reject],\n );\n\n const handleTransfer = useCallback(\n async (userId: string, reason?: string) => {\n await transfer(userId, reason);\n },\n [transfer],\n );\n\n const handleReturn = useCallback(\n async (nodeId: string, reason?: string) => {\n await returnTo(nodeId, reason);\n },\n [returnTo],\n );\n\n const handleWithdraw = useCallback(\n async (reason?: string) => {\n await withdraw(reason);\n },\n [withdraw],\n );\n\n const handleSave = useCallback(async () => {\n await save();\n }, [save]);\n\n const handleResubmit = useCallback(\n async (comments?: string) => {\n await resubmit(comments);\n },\n [resubmit],\n );\n\n const handleCallback = useCallback(async () => {\n await callbackTask();\n }, [callbackTask]);\n\n const bottomActions: ActionConfig[] = useMemo(() => {\n if (isApprover && activeActions.length > 0) return [];\n\n if (isOriginatorReturn) {\n if (mode === 'readonly') {\n return [\n {\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n },\n ];\n }\n return [\n {\n key: 'cancel',\n label: '取消',\n type: 'default',\n onClick: switchToReadonly,\n placement: 'left',\n },\n {\n key: 'resubmit',\n label: '重新提交',\n type: 'primary',\n onClick: () => handleResubmit(),\n },\n ];\n }\n\n if (canWithdraw) {\n return [\n {\n key: 'withdraw',\n label: '撤销',\n type: 'danger',\n onClick: () => handleWithdraw(),\n confirm: { title: '确认撤销', content: '撤销后流程将终止,确认继续吗?' },\n },\n ];\n }\n\n return [];\n }, [\n activeActions.length,\n canWithdraw,\n handleResubmit,\n handleWithdraw,\n isApprover,\n isOriginatorReturn,\n mode,\n switchToEdit,\n switchToReadonly,\n ]);\n\n const formConfig = {\n mode: mode === 'edit' ? ('edit' as const) : ('readonly' as const),\n formUuid,\n appType,\n formInstanceId,\n permissions: {\n fieldPermissions: fieldBehaviors as Record<string, FieldBehavior>,\n operations: [] as string[],\n },\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-ant-bg-layout\">\n <div className=\"mx-auto max-w-4xl px-6 py-8 pb-24\">\n <PageSkeleton type=\"process\" />\n </div>\n </div>\n );\n }\n\n const showApprovalActions = isApprover && activeActions.length > 0;\n const actionsNode = showApprovalActions ? (\n renderActions ? (\n renderActions(activeActions)\n ) : (\n <ApprovalActionBar\n actions={activeActions}\n onApprove={handleApprove}\n onReject={handleReject}\n onTransfer={handleTransfer}\n onReturn={handleReturn}\n onWithdraw={handleWithdraw}\n onSave={handleSave}\n onResubmit={handleResubmit}\n onCallback={handleCallback}\n returnableNodes={returnableNodes}\n onLoadReturnableNodes={loadReturnableNodes}\n renderTransferSelector={renderTransferSelector}\n renderReturnNodeLabel={renderReturnNodeLabel}\n renderActionModalExtra={renderActionModalExtra}\n inDrawer={inDrawer}\n />\n )\n ) : bottomActions.length > 0 ? (\n <StickyActionBar actions={bottomActions} inDrawer={inDrawer} />\n ) : null;\n\n const statusMeta = processStatus ? PROCESS_STATUS_META[processStatus] : undefined;\n\n return (\n <RuntimePageShell actions={actionsNode} inDrawer={inDrawer}>\n <div className=\"space-y-6\">\n {header}\n\n <SummaryPanel\n title={processInfo?.title || instanceInfo?.title || schema.formMeta.title}\n eyebrow={`流程实例 ${formInstanceId?.slice(0, 8) || '-'}`}\n creator={\n processInfo?.originatorName\n ? {\n name: processInfo.originatorName,\n department: processInfo.originatorDepartment,\n }\n : undefined\n }\n createdAt={processInfo?.createdAt}\n status={statusMeta}\n metaItems={[\n { key: 'currentTask', label: '当前节点', value: currentTask?.nodeName || '无' },\n {\n key: 'processStatus',\n label: '实例状态',\n value: statusMeta?.label || processStatus || '-',\n },\n ]}\n />\n\n {beforeForm}\n\n {mode === 'edit' && (\n <div className=\"rounded-lg border border-blue-200 bg-blue-50 px-4 py-3 text-sm text-blue-700 transition-all duration-150\">\n 正在编辑表单,修改后请重新提交\n </div>\n )}\n\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n <FormProvider schema={schema} config={formConfig} initialValues={formData ?? undefined}>\n <FormDataBridge formDataRef={formDataRef} />\n <FormRenderer columns={2} />\n </FormProvider>\n </div>\n\n {afterForm}\n\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-5 md:p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-base font-semibold text-ant-color-text\">审批进度</h3>\n <p className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 节点、审批人、处理意见和等待状态\n </p>\n </div>\n </div>\n {renderTimeline ? (\n renderTimeline(progressList)\n ) : (\n <ApprovalTimeline tasks={progressList} showRemarks showApproverInfo />\n )}\n </div>\n </div>\n </RuntimePageShell>\n );\n};\n\nexport const ProcessDetailTemplate: React.FC<ProcessDetailTemplateProps> = (props) => {\n const { schema, formUuid, appType, formInstanceId } = props;\n\n const wrapperConfig = {\n mode: 'readonly' as const,\n formUuid,\n appType,\n formInstanceId,\n };\n\n return (\n <FormProvider schema={schema} config={wrapperConfig}>\n <InnerProcessContent {...props} />\n </FormProvider>\n );\n};\n"],"mappings":"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","names":["import_react","import_react","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","dayjs","import_react","import_antd_mobile","import_dayjs","import_jsx_runtime","dayjs","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_dayjs","import_jsx_runtime","dayjs","import_react","import_antd_mobile","import_dayjs","import_jsx_runtime","dayjs","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","fileList","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","createLocalItem","fileList","import_jsx_runtime","ImageUploader","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_react","import_antd","MobileAntd","import_react","import_jsx_runtime","MobileAntd","import_jsx_runtime","import_react","MobileAntd","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_react","import_antd","import_icons","MobileAntd","import_jsx_runtime","getMobileComponent","MobileAntd","import_jsx_runtime","import_react","MobileAntd","import_jsx_runtime","EMPTY_TREE_DATA","getMobilePopup","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","MobileAntd","import_jsx_runtime","getMobileComponent","MobileAntd","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","StarterKit","Underline","Color","Highlight","Link","Placeholder","TextAlign","Image","TableRow","TableHeader","TableCell","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","message","getFormData","React","import_react","import_jsx_runtime","React","import_react","import_antd","import_jsx_runtime","getFormData","import_jsx_runtime","cn","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","columnClasses","formatValue","import_react","getFormData","import_react","getFormData","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","import_jsx_runtime","import_react","import_icons","import_jsx_runtime","toneClasses","import_react","import_antd","import_icons","import_react","import_antd","import_icons","message","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd","import_jsx_runtime","import_antd","import_icons","import_jsx_runtime","toneClasses","import_antd","import_icons","import_jsx_runtime","import_antd","import_icons","import_jsx_runtime","import_react","import_antd","import_dayjs","import_icons","import_jsx_runtime","dayjs","normalizeBasePath","inferBasePath","title","import_react","import_antd","import_icons","import_jsx_runtime","getFormData","import_react","import_dayjs","import_antd","import_jsx_runtime","import_jsx_runtime","getFormData","formatDateTime","dayjs","import_react","import_jsx_runtime","FormDataBridge","getFormData"]}
|