sy-form-components 0.2.0
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/README.md +40 -0
- package/dist/index.d.mts +655 -0
- package/dist/index.d.ts +655 -0
- package/dist/index.js +4851 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4765 -0
- package/dist/index.mjs.map +1 -0
- package/dist/tailwind.preset.d.mts +33 -0
- package/dist/tailwind.preset.d.ts +33 -0
- package/dist/tailwind.preset.js +210 -0
- package/dist/tailwind.preset.js.map +1 -0
- package/dist/tailwind.preset.mjs +189 -0
- package/dist/tailwind.preset.mjs.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +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/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/UserSelectField/UserSelectFieldMobile.tsx","../src/fields/UserSelectField/UserSelectFieldReadonly.tsx","../src/fields/DepartmentSelectField/index.tsx","../src/fields/DepartmentSelectField/DepartmentSelectFieldPC.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/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/utils/defineFormSchema.ts"],"sourcesContent":["// 主入口 - 导出所有公共 API\nexport * from './types';\nexport * from './core';\nexport * from './fields';\nexport * from './layout';\nexport * from './display';\nexport * from './hooks';\nexport * from './utils';\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';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => ({\n id: file.uid || `${Date.now()}-${file.name}`,\n uid: file.uid || `${Date.now()}-${file.name}`,\n url: '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n});\n\nexport function AttachmentFieldPC({\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 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 const item: AttachmentItem = {\n url: String(f.url ?? f.response?.url ?? ''),\n name: String(f.name ?? ''),\n id: String(f.uid ?? f.response?.id ?? ''),\n };\n if (f.uid ?? f.response?.uid) item.uid = String(f.uid ?? f.response?.uid);\n if (f.status) item.status = f.status;\n if (f.percent !== undefined) item.percent = f.percent;\n if (f.objectName ?? f.response?.objectName)\n item.objectName = f.objectName ?? f.response?.objectName;\n if (f.bucketName ?? f.response?.bucketName)\n item.bucketName = f.bucketName ?? f.response?.bucketName;\n if (f.size ?? f.response?.size) item.size = f.size ?? f.response?.size;\n if (f.type ?? f.response?.contentType) item.contentType = f.type ?? f.response?.contentType;\n return item;\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?.downloadUrl || item?.url || file.url;\n if (item?.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n url = typeof ticket === 'string' ? ticket : ticket?.downloadUrl || 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 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 = {\n ...uploaded,\n id: uploaded.id || localItem.id,\n uid: uploaded.uid || localItem.uid,\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 <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 );\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';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => ({\n id: file.uid || `${Date.now()}-${file.name}`,\n uid: file.uid || `${Date.now()}-${file.name}`,\n url: '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n});\n\nexport function ImageFieldPC({\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 handleChange = (info: any) => {\n const fileList: any[] = info.fileList ?? [];\n const items: AttachmentItem[] = fileList.map((f: any) => {\n const item: AttachmentItem = {\n url: String(f.url ?? f.thumbUrl ?? f.response?.url ?? ''),\n name: String(f.name ?? ''),\n id: String(f.uid ?? f.response?.id ?? ''),\n };\n if (f.uid ?? f.response?.uid) item.uid = String(f.uid ?? f.response?.uid);\n if (f.status) item.status = f.status;\n if (f.percent !== undefined) item.percent = f.percent;\n if (f.objectName ?? f.response?.objectName)\n item.objectName = f.objectName ?? f.response?.objectName;\n if (f.bucketName ?? f.response?.bucketName)\n item.bucketName = f.bucketName ?? f.response?.bucketName;\n if (f.size ?? f.response?.size) item.size = f.size ?? f.response?.size;\n if (f.type ?? f.response?.contentType) item.contentType = f.type ?? f.response?.contentType;\n return item;\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 = {\n ...uploaded,\n id: uploaded.id || localItem.id,\n uid: uploaded.uid || localItem.uid,\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 <Upload\n data-testid={`imagefield-input-${fieldId}`}\n listType=\"picture-card\"\n fileList={fileList}\n customRequest={customRequest}\n accept={accept ?? 'image/*'}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\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 );\n}\n","import React from 'react';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\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 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 = `${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={`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 return (\n <div data-testid={`subformfield-pc-${fieldId}`}>\n <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}\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 <button\n type=\"button\"\n disabled={disabled}\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 return (\n <div data-testid={`subformfield-mobile-${fieldId}`}>\n {rows.map((row, rowIndex) => (\n <div key={rowIndex} data-testid={`subformfield-card-${fieldId}-${rowIndex}`}>\n {columns.map((col) => (\n <div 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 <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-mobile-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n disabled={disabled}\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';\n\nconst getUserId = (user: UserItem) => String(user.id || user.value || '');\nconst getUserName = (user: UserItem) =>\n String(user.name || user.label || user.username || getUserId(user));\n\nconst normalizeUser = (user: any): UserItem => ({\n ...user,\n id: String(user?.id || user?.value || user?.key || ''),\n name: String(user?.name || user?.label || user?.title || user?.username || user?.id || ''),\n});\n\nexport function UserSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = true,\n searchable = true,\n dataSource = [],\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\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 : selected.slice(0, 1);\n setFieldValue(fieldId, result);\n onChange?.(result);\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 <Select\n className={inputClassName}\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n showSearch={searchable}\n filterOption={dataSource.length ? undefined : false}\n onSearch={searchable ? fetchUsers : undefined}\n loading={loading}\n options={options}\n onChange={handleChange}\n data-testid={`userselectfield-input-${fieldId}`}\n />\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nconst getUserId = (user: UserItem) => String(user.id || user.value || '');\nconst getUserName = (user: UserItem) =>\n String(user.name || user.label || user.username || getUserId(user));\nconst normalizeUser = (user: any): UserItem => ({\n ...user,\n id: String(user?.id || user?.value || user?.key || ''),\n name: String(user?.name || user?.label || user?.title || user?.username || user?.id || ''),\n});\n\nexport function UserSelectFieldMobile({\n fieldId,\n behavior,\n multiple = true,\n dataSource = [],\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 } else {\n newValue = [user];\n setShowPicker(false);\n }\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\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(', ') : '请选择'}\n </button>\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 )}\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';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nfunction convertTreeData(nodes: DepartmentTreeNode[]): any[] {\n return nodes.map((node) => ({\n value: String(node.id || node.value || node.key || ''),\n title: node.name || node.label || node.title,\n isLeaf: node.isLeaf ?? !node.hasChildren,\n children: node.children ? convertTreeData(node.children) : undefined,\n }));\n}\n\nfunction flattenTree(nodes: DepartmentTreeNode[]): { id: string; name: string }[] {\n const result: { id: string; name: string }[] = [];\n const walk = (list: DepartmentTreeNode[]) => {\n for (const node of list) {\n result.push({\n id: String(node.id || node.value || node.key || ''),\n name: String(node.name || node.label || node.title || node.id || ''),\n });\n if (node.children) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\nexport function DepartmentSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = false,\n treeData,\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\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData);\n return;\n }\n if (remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n api.getDepartmentRoots().then((nodes) => setLoadedTreeData(nodes as DepartmentTreeNode[]));\n }, [api, configuredTreeData]);\n\n const allDepts = flattenTree(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 setFieldValue(fieldId, selected);\n onChange?.(selected);\n };\n\n const treeDataConverted = convertTreeData(loadedTreeData);\n const selectValue = multiple ? value.map((d) => d.id) : value[0]?.id;\n\n return (\n <TreeSelect\n className={inputClassName}\n style={{ width: '100%' }}\n multiple={multiple}\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 = String(item.id || item.value || item.key || '');\n if (id === String(node.value)) {\n return { ...item, children: children as DepartmentTreeNode[] };\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 );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nfunction flattenTree(nodes: DepartmentTreeNode[]): { id: string; name: string }[] {\n const result: { id: string; name: string }[] = [];\n const walk = (list: DepartmentTreeNode[]) => {\n for (const node of list) {\n result.push({\n id: String(node.id || node.value || node.key || ''),\n name: String(node.name || node.label || node.title || node.id || ''),\n });\n if (node.children) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\nexport function DepartmentSelectFieldMobile({\n fieldId,\n behavior,\n multiple = false,\n treeData,\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);\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[]);\n };\n\n const allDepts = flattenTree(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 } else {\n newValue = [dept];\n setShowPicker(false);\n }\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\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(', ') : '请选择'}\n </button>\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 {dept.name}\n {value.some((d) => d.id === dept.id) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n )}\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, useState } from 'react';\nimport { Cascader, Input } from 'antd';\nimport type { AddressFieldProps, AddressValue, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst LEVELS = ['province', 'city', 'district', 'street'] as const;\n\ntype AddressOption = OptionItem & {\n level?: (typeof LEVELS)[number];\n isLeaf?: boolean;\n children?: AddressOption[];\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 valueToPath = (value?: AddressValue) =>\n LEVELS.map((level) => value?.[level]?.value).filter(Boolean) as string[];\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 behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as AddressValue | undefined;\n const [options, setOptions] = useState<AddressOption[]>([]);\n const depth = modeDepth(mode);\n const detailEnabled = mode === 'province-city-district-street-detail';\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 useEffect(() => {\n api.getChinaDivisions().then((list) => {\n setOptions(\n list.map((item: any) => ({\n label: String(item.name || item.label || item.adcode),\n value: String(item.adcode || item.value),\n level: 'province',\n isLeaf: depth <= 1 || item.isLeaf === true,\n })),\n );\n });\n }, [api, depth]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setAddressValue = (next: AddressValue | undefined) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const display = value?.fullAddress || valueToPath(value).join(' / ') || '--';\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 ) : (\n <div className={inputClassName} data-testid={`addressfield-input-${fieldId}`}>\n <Cascader\n style={{ width: '100%' }}\n options={options}\n allowClear={allowClear}\n disabled={behavior === 'DISABLED'}\n value={valueToPath(value)}\n placeholder={props.placeholder || '请选择地址'}\n loadData={async (selectedOptions) => {\n const target = selectedOptions[selectedOptions.length - 1] as AddressOption;\n const nextLevel = LEVELS[selectedOptions.length] ?? 'street';\n const children = await api.getChinaDivisions(target.value);\n target.children = children.map((item: any) => ({\n label: String(item.name || item.label || item.adcode),\n value: String(item.adcode || item.value),\n level: nextLevel,\n isLeaf: selectedOptions.length + 1 >= depth || item.isLeaf === true,\n }));\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 next.fullAddress = [\n ...selectedOptions.map((item: any) => item.label),\n detailEnabled ? value?.detail : '',\n ]\n .filter(Boolean)\n .join('');\n setAddressValue(next);\n }}\n />\n {detailEnabled && (\n <Input\n value={value?.detail ?? ''}\n disabled={behavior === 'DISABLED'}\n placeholder={detailPlaceholder}\n onChange={(event) => {\n const detail = event.target.value;\n const labels = LEVELS.map((level) => value?.[level]?.label).filter(Boolean);\n setAddressValue({\n ...(value ?? {}),\n detail,\n fullAddress: [...labels, detail].filter(Boolean).join(''),\n });\n }}\n />\n )}\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Select, Spin } from 'antd';\nimport type { AssociationFormFieldProps, AssociationValue } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst normalizeValues = (value: any): AssociationValue[] => {\n if (!value) return [];\n return (Array.isArray(value) ? value : [value]).filter(Boolean);\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 behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = normalizeValues(formData[fieldId]);\n const [options, setOptions] = useState<AssociationValue[]>([]);\n const [loading, setLoading] = useState(false);\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 loadOptions = async (keyword?: string) => {\n if (!associationForm?.appType || !associationForm.formUuid) return;\n setLoading(true);\n try {\n const result = await api.advancedSearch({\n appType: associationForm.appType,\n formUuid: associationForm.formUuid,\n currentPage: 1,\n pageSize: 20,\n searchKeyWord: keyword,\n });\n const list = Array.isArray(result?.data) ? result.data : result?.list || result?.items || [];\n setOptions(\n list.map((record: any) => {\n const rawLabel = record?.[associationForm.mainFieldId];\n const labelText =\n typeof rawLabel === 'object' ? rawLabel?.label || JSON.stringify(rawLabel) : rawLabel;\n return {\n label: String(labelText || record?.id || record?.formInstId || '--'),\n value: record?.formInstId || record?.id || record?.bizObjectId || labelText,\n record,\n };\n }),\n );\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadOptions();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [associationForm?.appType, associationForm?.formUuid, associationForm?.mainFieldId]);\n\n const selectOptions = useMemo(\n () => options.map((item) => ({ label: item.label, value: item.value })),\n [options],\n );\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={`associationformfield-readonly-${fieldId}`}\n >\n {value.map((item) => item.label).join(', ') || '--'}\n </div>\n ) : (\n <Select\n className={inputClassName}\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={behavior === 'DISABLED'}\n placeholder={placeholder}\n loading={loading}\n notFoundContent={loading ? <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];\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 setFieldValue(fieldId, next);\n onChange?.(next);\n }}\n data-testid={`associationformfield-input-${fieldId}`}\n />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Input } from 'antd';\nimport type { EditorFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst { TextArea } = Input;\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 onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\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={`editorfield-readonly-${fieldId}`}\n dangerouslySetInnerHTML={{ __html: value || '--' }}\n />\n ) : (\n <TextArea\n className={inputClassName}\n style={{ width: '100%' }}\n value={value}\n rows={rows}\n maxLength={maxLength}\n showCount={Boolean(maxLength)}\n placeholder={placeholder}\n disabled={behavior === 'DISABLED'}\n onChange={(event) => {\n setFieldValue(fieldId, event.target.value);\n onChange?.(event.target.value);\n }}\n data-testid={`editorfield-input-${fieldId}`}\n />\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\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 } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as LocationValue | undefined;\n const [locating, setLocating] = useState(false);\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 locate = () => {\n if (!navigator.geolocation) return;\n setLocating(true);\n navigator.geolocation.getCurrentPosition(\n (position) => {\n setLocating(false);\n setValue({\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 () => setLocating(false),\n { enableHighAccuracy: true, timeout: 10000 },\n );\n };\n\n const display = value\n ? value.address || `${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 data-testid={`locationfield-${fieldId}`}>\n <div>{display}</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 disabled={behavior === 'DISABLED'} onClick={() => setValue(undefined)}>\n {clearButtonText}\n </Button>\n )}\n </Space>\n )}\n </div>\n </FieldWrapper>\n );\n}\n","import React, { 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\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 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 useEffect(() => {\n if (!open) return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n canvas.width = Math.max(480, rect.width || 480);\n canvas.height = 240;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.lineWidth = 2;\n ctx.lineCap = 'round';\n ctx.strokeStyle = '#111827';\n }\n }, [open]);\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 save = async () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n setSaving(true);\n canvas.toBlob(async (blob) => {\n if (!blob) {\n setSaving(false);\n return;\n }\n const file = new File([blob], `signature-${Date.now()}.png`, { type: 'image/png' });\n try {\n const uploaded = await api.uploadFile(file, bucketName);\n setValue({\n url: uploaded.url,\n bucketName: uploaded.bucketName,\n objectName: uploaded.objectName,\n previewUrl: uploaded.previewUrl || uploaded.url,\n points: pointsRef.current,\n timestamp: Date.now(),\n });\n setOpen(false);\n } finally {\n setSaving(false);\n }\n }, 'image/png');\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 data-testid={`digitalsignaturefield-${fieldId}`}>\n {previewUrl ? (\n <img src={previewUrl} alt={label} style={{ maxWidth: 240 }} />\n ) : (\n <span>--</span>\n )}\n {behavior !== 'READONLY' && (\n <Space>\n <Button disabled={behavior === 'DISABLED'} onClick={() => setOpen(true)}>\n 开始签名\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 >\n <canvas\n ref={canvasRef}\n style={{ width: '100%', height: 240, border: '1px solid #d9d9d9' }}\n onPointerDown={(event) => {\n drawingRef.current = true;\n pointsRef.current.push(getPoint(event));\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={() => {\n drawingRef.current = false;\n }}\n onPointerLeave={() => {\n drawingRef.current = false;\n }}\n />\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 return trimTrailingSlash(globalEnv?.FORM_API_BASE_URL || globalEnv?.BASE_API_URL || '');\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 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 type { FormSchema } from '../types';\n\n/**\n * 类型安全的表单 Schema 定义辅助函数\n * 提供 TypeScript 类型推导和编辑器智能提示\n */\nexport function defineFormSchema(schema: FormSchema): FormSchema {\n return schema;\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","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_jsx_runtime","import_react","import_jsx_runtime","getUserId","getUserName","normalizeUser","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","EMPTY_TREE_DATA","flattenTree","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","TextArea","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","React","import_react","import_jsx_runtime","React","import_react","import_antd","import_jsx_runtime","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","import_react","import_react","import_react","import_react"]}
|