openxiangda 1.0.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.
Files changed (121) hide show
  1. package/README.md +58 -0
  2. package/bin/openxiangda.js +11 -0
  3. package/lib/cli.js +2423 -0
  4. package/lib/config.js +121 -0
  5. package/lib/http.js +47 -0
  6. package/lib/skills.js +371 -0
  7. package/lib/utils.js +87 -0
  8. package/lib/workspace-init.js +139 -0
  9. package/openxiangda-skills/SKILL.md +128 -0
  10. package/openxiangda-skills/references/architecture-patterns.md +242 -0
  11. package/openxiangda-skills/references/automation-v3.md +129 -0
  12. package/openxiangda-skills/references/component-guide.md +198 -0
  13. package/openxiangda-skills/references/forms/component-registry.md +53 -0
  14. package/openxiangda-skills/references/forms/form-schema.md +109 -0
  15. package/openxiangda-skills/references/forms/layout-and-rules.md +24 -0
  16. package/openxiangda-skills/references/openxiangda-api.md +466 -0
  17. package/openxiangda-skills/references/pages/page-sdk.md +13 -0
  18. package/openxiangda-skills/references/pages/publish-flow.md +36 -0
  19. package/openxiangda-skills/references/pages/workspace-structure.md +38 -0
  20. package/openxiangda-skills/references/permissions-settings.md +147 -0
  21. package/openxiangda-skills/references/platform-data-model.md +305 -0
  22. package/openxiangda-skills/references/style-system.md +492 -0
  23. package/openxiangda-skills/references/troubleshooting.md +246 -0
  24. package/openxiangda-skills/references/workflow-v3.md +105 -0
  25. package/openxiangda-skills/references/workspace-state.md +45 -0
  26. package/openxiangda-skills/skills/openxiangda-app/SKILL.md +64 -0
  27. package/openxiangda-skills/skills/openxiangda-core/SKILL.md +143 -0
  28. package/openxiangda-skills/skills/openxiangda-form/SKILL.md +76 -0
  29. package/openxiangda-skills/skills/openxiangda-inspect/SKILL.md +40 -0
  30. package/openxiangda-skills/skills/openxiangda-page/SKILL.md +62 -0
  31. package/openxiangda-skills/skills/openxiangda-permission-settings/SKILL.md +95 -0
  32. package/openxiangda-skills/skills/openxiangda-workflow-automation/SKILL.md +97 -0
  33. package/package.json +126 -0
  34. package/packages/sdk/bin/lowcode-workspace.mjs +4 -0
  35. package/packages/sdk/dist/build/index.cjs +33 -0
  36. package/packages/sdk/dist/build/index.cjs.map +1 -0
  37. package/packages/sdk/dist/build/index.d.mts +40 -0
  38. package/packages/sdk/dist/build/index.d.ts +40 -0
  39. package/packages/sdk/dist/build/index.mjs +8 -0
  40. package/packages/sdk/dist/build/index.mjs.map +1 -0
  41. package/packages/sdk/dist/components/index.cjs +18700 -0
  42. package/packages/sdk/dist/components/index.cjs.map +1 -0
  43. package/packages/sdk/dist/components/index.d.mts +2094 -0
  44. package/packages/sdk/dist/components/index.d.ts +2094 -0
  45. package/packages/sdk/dist/components/index.mjs +18649 -0
  46. package/packages/sdk/dist/components/index.mjs.map +1 -0
  47. package/packages/sdk/dist/runtime/index.cjs +1469 -0
  48. package/packages/sdk/dist/runtime/index.cjs.map +1 -0
  49. package/packages/sdk/dist/runtime/index.d.mts +831 -0
  50. package/packages/sdk/dist/runtime/index.d.ts +831 -0
  51. package/packages/sdk/dist/runtime/index.mjs +1420 -0
  52. package/packages/sdk/dist/runtime/index.mjs.map +1 -0
  53. package/packages/sdk/dist/styles/antd-theme.cjs +60 -0
  54. package/packages/sdk/dist/styles/antd-theme.cjs.map +1 -0
  55. package/packages/sdk/dist/styles/antd-theme.d.mts +5 -0
  56. package/packages/sdk/dist/styles/antd-theme.d.ts +5 -0
  57. package/packages/sdk/dist/styles/antd-theme.mjs +35 -0
  58. package/packages/sdk/dist/styles/antd-theme.mjs.map +1 -0
  59. package/packages/sdk/dist/styles/tailwind-preset.cjs +2641 -0
  60. package/packages/sdk/dist/styles/tailwind-preset.cjs.map +1 -0
  61. package/packages/sdk/dist/styles/tailwind-preset.d.mts +75 -0
  62. package/packages/sdk/dist/styles/tailwind-preset.d.ts +75 -0
  63. package/packages/sdk/dist/styles/tailwind-preset.mjs +2618 -0
  64. package/packages/sdk/dist/styles/tailwind-preset.mjs.map +1 -0
  65. package/packages/sdk/dist/styles/tokens.css +73 -0
  66. package/packages/sdk/src/build-source/README.md +9 -0
  67. package/packages/sdk/src/build-source/bin/lowcode-workspace.mjs +7 -0
  68. package/packages/sdk/src/build-source/package.json +34 -0
  69. package/packages/sdk/src/build-source/scripts/build-forms.mjs +824 -0
  70. package/packages/sdk/src/build-source/scripts/build-forms.runtime-entry.test.ts +18 -0
  71. package/packages/sdk/src/build-source/scripts/build-pages.mjs +793 -0
  72. package/packages/sdk/src/build-source/scripts/build-workspace.mjs +64 -0
  73. package/packages/sdk/src/build-source/scripts/publish-all.mjs +127 -0
  74. package/packages/sdk/src/build-source/scripts/publish-oss.mjs +149 -0
  75. package/packages/sdk/src/build-source/scripts/register-bundle.mjs +1 -0
  76. package/packages/sdk/src/build-source/scripts/register.mjs +329 -0
  77. package/packages/sdk/src/build-source/scripts/sync-schema.mjs +301 -0
  78. package/packages/sdk/src/build-source/scripts/utils/form-api.mjs +639 -0
  79. package/packages/sdk/src/build-source/scripts/utils/form-api.test.ts +244 -0
  80. package/packages/sdk/src/build-source/scripts/utils/form-runtime-assets.mjs +57 -0
  81. package/packages/sdk/src/build-source/scripts/utils/form-runtime-assets.test.ts +135 -0
  82. package/packages/sdk/src/build-source/scripts/utils/incremental.mjs +210 -0
  83. package/packages/sdk/src/build-source/scripts/utils/load-config.mjs +257 -0
  84. package/packages/sdk/src/build-source/scripts/utils/load-config.test.ts +44 -0
  85. package/packages/sdk/src/build-source/scripts/utils/mime-types.mjs +70 -0
  86. package/packages/sdk/src/build-source/scripts/utils/namespace-css.mjs +61 -0
  87. package/packages/sdk/src/build-source/scripts/utils/oss-client.mjs +128 -0
  88. package/packages/sdk/src/build-source/scripts/utils/pages.mjs +80 -0
  89. package/packages/sdk/src/build-source/scripts/utils/progress.mjs +57 -0
  90. package/packages/sdk/src/build-source/scripts/utils/register-payload.mjs +89 -0
  91. package/packages/sdk/src/build-source/scripts/utils/register-payload.test.ts +76 -0
  92. package/packages/sdk/src/build-source/scripts/utils/runtime-css-check.mjs +44 -0
  93. package/packages/sdk/src/build-source/scripts/utils/runtime-css-check.test.ts +54 -0
  94. package/packages/sdk/src/build-source/scripts/utils/schema-transform.mjs +130 -0
  95. package/packages/sdk/src/build-source/scripts/utils/schema-transform.test.ts +141 -0
  96. package/packages/sdk/src/build-source/scripts/utils/tailwind-config.mjs +227 -0
  97. package/packages/sdk/src/build-source/scripts/utils/tailwind-config.test.ts +187 -0
  98. package/packages/sdk/src/build-source/src/cli.mjs +679 -0
  99. package/templates/sy-lowcode-app-workspace/app-workspace.config.ts +34 -0
  100. package/templates/sy-lowcode-app-workspace/examples/forms/customer/page.tsx +1 -0
  101. package/templates/sy-lowcode-app-workspace/examples/forms/customer/schema.ts +35 -0
  102. package/templates/sy-lowcode-app-workspace/index.html +12 -0
  103. package/templates/sy-lowcode-app-workspace/package.json +49 -0
  104. package/templates/sy-lowcode-app-workspace/postcss.config.cjs +6 -0
  105. package/templates/sy-lowcode-app-workspace/scripts/build-js-code.mjs +100 -0
  106. package/templates/sy-lowcode-app-workspace/src/dev/App.tsx +26 -0
  107. package/templates/sy-lowcode-app-workspace/src/forms/.gitkeep +1 -0
  108. package/templates/sy-lowcode-app-workspace/src/forms/README.md +48 -0
  109. package/templates/sy-lowcode-app-workspace/src/index.css +28 -0
  110. package/templates/sy-lowcode-app-workspace/src/js-code-nodes/.gitkeep +1 -0
  111. package/templates/sy-lowcode-app-workspace/src/js-code-nodes/types.d.ts +3 -0
  112. package/templates/sy-lowcode-app-workspace/src/main.tsx +36 -0
  113. package/templates/sy-lowcode-app-workspace/src/pages/.gitkeep +1 -0
  114. package/templates/sy-lowcode-app-workspace/src/shared/form-schema.ts +128 -0
  115. package/templates/sy-lowcode-app-workspace/src/types/app-workspace.types.ts +31 -0
  116. package/templates/sy-lowcode-app-workspace/tailwind.config.cjs +30 -0
  117. package/templates/sy-lowcode-app-workspace/tsconfig.app.json +24 -0
  118. package/templates/sy-lowcode-app-workspace/tsconfig.js-code-nodes.json +15 -0
  119. package/templates/sy-lowcode-app-workspace/tsconfig.json +7 -0
  120. package/templates/sy-lowcode-app-workspace/tsconfig.node.json +10 -0
  121. package/templates/sy-lowcode-app-workspace/vite.config.ts +32 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/index.ts","../../src/components/core/FormProvider.tsx","../../src/components/core/FormContext.ts","../../src/components/core/ComponentRegistry.tsx","../../src/components/fields/TextField/index.tsx","../../src/components/core/FieldWrapper.tsx","../../src/components/utils/richText.ts","../../src/components/hooks/useDeviceDetect.ts","../../src/components/fields/TextField/TextFieldPC.tsx","../../src/components/fields/TextField/TextFieldMobile.tsx","../../src/components/fields/TextField/TextFieldReadonly.tsx","../../src/components/fields/NumberField/index.tsx","../../src/components/fields/NumberField/NumberFieldPC.tsx","../../src/components/fields/NumberField/NumberFieldMobile.tsx","../../src/components/fields/NumberField/NumberFieldReadonly.tsx","../../src/components/fields/TextAreaField/index.tsx","../../src/components/fields/TextAreaField/TextAreaFieldPC.tsx","../../src/components/fields/TextAreaField/TextAreaFieldMobile.tsx","../../src/components/fields/TextAreaField/TextAreaFieldReadonly.tsx","../../src/components/fields/SelectField/index.tsx","../../src/components/fields/SelectField/SelectFieldPC.tsx","../../src/components/fields/shared/optionDisplay.tsx","../../src/components/fields/SelectField/SelectFieldMobile.tsx","../../src/components/fields/shared/MobileField.tsx","../../src/components/fields/SelectField/SelectFieldReadonly.tsx","../../src/components/fields/MultiSelectField/index.tsx","../../src/components/fields/MultiSelectField/MultiSelectFieldPC.tsx","../../src/components/fields/MultiSelectField/MultiSelectFieldMobile.tsx","../../src/components/fields/MultiSelectField/MultiSelectFieldReadonly.tsx","../../src/components/fields/RadioField/index.tsx","../../src/components/fields/RadioField/RadioFieldPC.tsx","../../src/components/fields/RadioField/RadioFieldMobile.tsx","../../src/components/fields/RadioField/RadioFieldReadonly.tsx","../../src/components/fields/CheckboxField/index.tsx","../../src/components/fields/CheckboxField/CheckboxFieldPC.tsx","../../src/components/fields/CheckboxField/CheckboxFieldMobile.tsx","../../src/components/fields/CheckboxField/CheckboxFieldReadonly.tsx","../../src/components/fields/DateField/index.tsx","../../src/components/fields/DateField/DateFieldPC.tsx","../../src/components/fields/DateField/dateRestrictionUtils.ts","../../src/components/fields/DateField/dateFormat.ts","../../src/components/fields/DateField/dateLocale.ts","../../src/components/fields/DateField/DateFieldMobile.tsx","../../src/components/fields/shared/MobileDatePicker.tsx","../../src/components/fields/DateField/DateFieldReadonly.tsx","../../src/components/fields/CascadeDateField/index.tsx","../../src/components/fields/CascadeDateField/CascadeDateFieldPC.tsx","../../src/components/fields/CascadeDateField/CascadeDateFieldMobile.tsx","../../src/components/fields/CascadeDateField/CascadeDateFieldReadonly.tsx","../../src/components/fields/AttachmentField/index.tsx","../../src/components/fields/AttachmentField/AttachmentFieldPC.tsx","../../src/components/fields/shared/FileDisplay.tsx","../../src/components/fields/shared/fieldFormat.ts","../../src/components/fields/shared/fileTransfer.ts","../../src/components/fields/AttachmentField/AttachmentFieldMobile.tsx","../../src/components/fields/AttachmentField/AttachmentFieldReadonly.tsx","../../src/components/fields/ImageField/index.tsx","../../src/components/fields/ImageField/ImageFieldPC.tsx","../../src/components/fields/ImageField/ImageFieldMobile.tsx","../../src/components/fields/ImageField/ImageFieldReadonly.tsx","../../src/components/fields/SubFormField/index.tsx","../../src/components/fields/SubFormField/SubFormCell.tsx","../../src/components/fields/SubFormField/SubFormColumnLabel.tsx","../../src/components/fields/SubFormField/SubFormFieldPC.tsx","../../src/components/fields/SubFormField/SubFormFieldMobile.tsx","../../src/components/fields/UserSelectField/index.tsx","../../src/components/fields/UserSelectField/UserSelectFieldPC.tsx","../../src/components/fields/shared/UserPicker.tsx","../../src/components/fields/shared/useLazyDepartmentTree.ts","../../src/components/fields/UserSelectField/UserSelectFieldMobile.tsx","../../src/components/fields/UserSelectField/UserSelectFieldReadonly.tsx","../../src/components/fields/DepartmentSelectField/index.tsx","../../src/components/fields/DepartmentSelectField/DepartmentSelectFieldPC.tsx","../../src/components/fields/shared/DepartmentPicker.tsx","../../src/components/fields/DepartmentSelectField/DepartmentSelectFieldMobile.tsx","../../src/components/fields/DepartmentSelectField/DepartmentSelectFieldReadonly.tsx","../../src/components/fields/CascadeSelectField/index.tsx","../../src/components/fields/AddressField/index.tsx","../../src/components/fields/AssociationFormField/index.tsx","../../src/components/fields/EditorField/index.tsx","../../src/components/fields/SerialNumberField/index.tsx","../../src/components/fields/LocationField/index.tsx","../../src/components/fields/DigitalSignatureField/index.tsx","../../src/components/fields/JSONField/index.tsx","../../src/components/core/defaultRegistry.ts","../../src/components/core/effects.ts","../../src/components/core/validation.ts","../../src/components/core/runtimeApi.ts","../../src/components/core/optionSource.ts","../../src/components/core/FormRenderer.tsx","../../src/components/layout/FormSection/index.tsx","../../src/components/layout/FormGrid/index.tsx","../../src/components/layout/FormTabs/index.tsx","../../src/components/layout/FormSteps/index.tsx","../../src/components/core/FormShell.tsx","../../src/components/core/FormActions.tsx","../../src/components/core/validationFeedback.ts","../../src/components/core/FormContainer.tsx","../../src/components/core/constants.ts","../../src/components/core/processApi.ts","../../src/components/core/dataManagementApi.ts","../../src/components/display/FormSummary/index.tsx","../../src/components/hooks/useFormEngine.ts","../../src/components/hooks/useFormData.ts","../../src/components/hooks/useFieldBehavior.ts","../../src/components/hooks/useFormSubmit.ts","../../src/components/hooks/useFieldPermission.ts","../../src/components/utils/permissions.ts","../../src/components/hooks/useFormDetail.ts","../../src/components/utils/formInstanceData.ts","../../src/components/hooks/useProcessDetail.ts","../../src/components/hooks/useApprovalActions.ts","../../src/components/hooks/useChangeRecords.ts","../../src/components/hooks/useFormNavigation.ts","../../src/components/hooks/useDraftStorage.ts","../../src/components/utils/defineFormSchema.ts","../../src/components/modules/FormSummaryCard.tsx","../../src/components/modules/RecordChangePanel.tsx","../../src/components/modules/ChangeRecords.tsx","../../src/components/modules/ApprovalTimeline.tsx","../../src/components/modules/ApprovalActionBar.tsx","../../src/components/modules/StickyActionBar.tsx","../../src/components/utils/confirmAction.ts","../../src/components/modules/ApprovalActions.tsx","../../src/components/modules/FormActionBar.tsx","../../src/components/modules/RuntimePageShell.tsx","../../src/components/modules/SummaryPanel.tsx","../../src/components/modules/DraftManager.tsx","../../src/components/modules/ProcessPreview.tsx","../../src/components/modules/DataManagementList.tsx","../../src/components/templates/StandardFormPage.tsx","../../src/components/templates/FormDetailTemplate.tsx","../../src/components/templates/PageSkeleton.tsx","../../src/components/templates/FormSubmitTemplate.tsx","../../src/components/modules/InitiatorApproverSelector.tsx","../../src/components/templates/ProcessDetailTemplate.tsx","../../src/components/templates/LowcodePageRenderer.tsx"],"sourcesContent":["// 主入口 - 导出所有公共 API\nexport * from './types';\nexport * from './core';\nexport * from './fields';\nexport * from './layout';\nexport * from './display';\nexport * from './hooks';\nexport * from './utils';\nexport * from './modules';\nexport * from './templates';\n","import React, { useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport type {\n FormSchema,\n FormEngineConfig,\n FieldBehavior,\n FieldDefinition,\n ValidationRule,\n FormRuntimeConfig,\n OptionSourceConfig,\n OptionItem,\n SubFormColumn,\n RuntimeDataQueryParams,\n} from '../types';\nimport { FormContext } from './FormContext';\nimport type { FormContextValue } from './FormContext';\nimport { ComponentRegistryProvider } from './ComponentRegistry';\nimport { defaultComponentRegistry } from './defaultRegistry';\nimport {\n evaluateEffects,\n evaluateFieldOverrides,\n evaluateLayoutBehaviors,\n getValueActions,\n} from './effects';\nimport { validateField as validateFieldUtil, validateAllFields } from './validation';\nimport { createFormRuntimeApi } from './runtimeApi';\nimport { resolveOptions, resolveDefaultValueLinkage } from './optionSource';\nimport {\n normalizeDepartmentArray,\n normalizeUser,\n normalizeUserArray,\n} from '../fields/shared/fieldFormat';\n\nconst LINKAGE_DEBOUNCE_MS = 500;\n\nexport interface FormProviderProps {\n schema: FormSchema;\n config: FormEngineConfig;\n initialValues?: Record<string, any>;\n components?: Record<string, React.ComponentType<any>>;\n runtime?: FormRuntimeConfig;\n children: React.ReactNode;\n}\n\ntype ScopedSubFormField = {\n parent: FieldDefinition;\n rowIndex: number;\n column: SubFormColumn;\n scopedFieldId: string;\n};\n\nfunction isInactiveBehavior(behavior?: FieldBehavior) {\n return behavior === 'HIDDEN' || behavior === 'DISABLED';\n}\n\nfunction buildValidationRules(\n label: string,\n required?: boolean,\n rules?: ValidationRule[],\n): ValidationRule[] {\n const result: ValidationRule[] = [];\n if (required) {\n result.push({ required: true, message: `${label}为必填项` });\n }\n if (rules) {\n result.push(...rules);\n }\n return result;\n}\n\nfunction getSubFormRows(formData: Record<string, any>, fieldId: string): Record<string, any>[] {\n const rows = formData[fieldId];\n return Array.isArray(rows) ? rows : [];\n}\n\nfunction getSubFormColumns(field: FieldDefinition): SubFormColumn[] {\n return Array.isArray(field.columns) ? field.columns : [];\n}\n\nfunction getScopedSubFormField(\n fields: FieldDefinition[],\n scopedFieldId: string,\n): ScopedSubFormField | null {\n const [parentFieldId, rowIndexText, ...columnParts] = scopedFieldId.split('.');\n if (!parentFieldId || !rowIndexText || columnParts.length === 0) return null;\n\n const rowIndex = Number(rowIndexText);\n if (!Number.isInteger(rowIndex) || rowIndex < 0) return null;\n\n const parent = fields.find(\n (field) => field.fieldId === parentFieldId && field.componentName === 'SubFormField',\n );\n if (!parent) return null;\n\n const columnFieldId = columnParts.join('.');\n const column = getSubFormColumns(parent).find((item) => item.fieldId === columnFieldId);\n if (!column) return null;\n\n return {\n parent,\n rowIndex,\n column,\n scopedFieldId,\n };\n}\n\nfunction clearFieldAndChildrenErrors(\n errors: Record<string, string>,\n fieldId: string,\n): Record<string, string> {\n let changed = false;\n const next = { ...errors };\n for (const key of Object.keys(next)) {\n if (key === fieldId || key.startsWith(`${fieldId}.`)) {\n delete next[key];\n changed = true;\n }\n }\n return changed ? next : errors;\n}\n\nfunction replaceFieldAndChildrenErrors(\n errors: Record<string, string>,\n fieldId: string,\n nextErrors: Record<string, string>,\n): Record<string, string> {\n return {\n ...clearFieldAndChildrenErrors(errors, fieldId),\n ...nextErrors,\n };\n}\n\nfunction replaceSingleFieldError(\n errors: Record<string, string>,\n fieldId: string,\n error: string | null,\n): Record<string, string> {\n if (error) {\n return { ...errors, [fieldId]: error };\n }\n if (!errors[fieldId]) return errors;\n const next = { ...errors };\n delete next[fieldId];\n return next;\n}\n\nfunction collectSubFormValidationRules(\n field: FieldDefinition,\n formData: Record<string, any>,\n validationData: Record<string, any>,\n fieldRules: Record<string, ValidationRule[]>,\n) {\n const rows = getSubFormRows(formData, field.fieldId);\n if (rows.length === 0) return;\n\n for (const [rowIndex, row] of rows.entries()) {\n for (const column of getSubFormColumns(field)) {\n if (isInactiveBehavior(column.behavior)) continue;\n const rules = buildValidationRules(column.label, column.required, column.rules);\n if (rules.length === 0) continue;\n\n const scopedFieldId = `${field.fieldId}.${rowIndex}.${column.fieldId}`;\n validationData[scopedFieldId] = row?.[column.fieldId];\n fieldRules[scopedFieldId] = rules;\n }\n }\n}\n\nfunction mapRuntimeOperatorToAdvanced(operator?: string) {\n const normalized = String(operator || 'eq').toLowerCase();\n const map: Record<string, string> = {\n eq: 'EQ',\n ne: 'NEQ',\n neq: 'NEQ',\n contains: 'CONTAINS',\n like: 'LIKE',\n gt: 'GT',\n gte: 'GTE',\n lt: 'LT',\n lte: 'LTE',\n in: 'IN',\n notin: 'NOT_IN',\n empty: 'IS_NULL',\n notempty: 'IS_NOT_NULL',\n };\n return map[normalized] || normalized.toUpperCase();\n}\n\nasync function fetchRuntimeFormData(\n api: ReturnType<typeof createFormRuntimeApi>,\n appType: string,\n params: RuntimeDataQueryParams,\n) {\n const filters = (params.filters || [])\n .filter((filter) => filter.fieldId)\n .map((filter) => ({\n key: filter.fieldId,\n value: filter.value,\n operator: mapRuntimeOperatorToAdvanced(filter.operator),\n }));\n const order = params.sort\n ? [{ id: params.sort.field, isAsc: params.sort.order === 'asc' ? 'y' : 'n' }]\n : undefined;\n const response = await api.request<any>({\n url: `/${params.appType || appType}/v1/form/advancedSearch.json`,\n method: 'get',\n params: {\n formUuid: params.formUuid,\n pageSize: params.pageSize ?? 200,\n currentPage: params.currentPage ?? 1,\n filters: filters.length > 0 ? JSON.stringify(filters) : undefined,\n conditionType: params.conditionLogic?.toUpperCase(),\n order: order ? JSON.stringify(order) : undefined,\n },\n });\n const payload = unwrapRuntimePayload(response);\n const data = Array.isArray(payload?.data) ? payload.data : Array.isArray(payload) ? payload : [];\n return {\n data,\n totalCount: Number(payload?.totalCount ?? payload?.total ?? payload?.count ?? data.length),\n };\n}\n\nexport function FormProvider({\n schema,\n config,\n initialValues,\n components,\n runtime,\n children,\n}: FormProviderProps) {\n const api = useMemo(() => createFormRuntimeApi(config.api), [config.api]);\n const [runtimeDefaults, setRuntimeDefaults] = useState<FormRuntimeConfig>({});\n const effects = useMemo(\n () => [\n ...(schema.rules ?? []),\n ...schema.fields.flatMap((field) => field.optionEffects ?? []),\n ...(config.effects ?? []),\n ],\n [schema.rules, schema.fields, config.effects],\n );\n\n // Merge runtime from schema and props (props take precedence)\n const defaultRuntime = useMemo<FormRuntimeConfig>(\n () => ({\n appType: config.appType,\n fetchFormData: (params) => fetchRuntimeFormData(api, config.appType, params),\n }),\n [api, config.appType],\n );\n const mergedRuntime = useMemo(\n () => ({ ...defaultRuntime, ...schema.runtime, ...runtimeDefaults, ...runtime }),\n [defaultRuntime, schema.runtime, runtimeDefaults, runtime],\n );\n\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 const defaultValue = resolveDefaultValue(field, mergedRuntime);\n if (defaultValue !== undefined) {\n values[field.fieldId] = defaultValue;\n }\n }\n return { ...values, ...initialValues };\n }, [schema, initialValues, mergedRuntime]);\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\n useEffect(() => {\n if (!schema.fields.some((field) => needsCurrentUserRuntime(field.defaultShortcut?.type)))\n return;\n if (mergedRuntime.currentUser && mergedRuntime.currentDepartment) return;\n let cancelled = false;\n api\n .getUserById('current')\n .then((payload) => {\n if (cancelled || !payload) return;\n const currentUser = normalizeUser(unwrapRuntimePayload(payload));\n const departments = normalizeDepartmentArray((currentUser as any).departments);\n const currentDepartment = departments[0];\n const currentUserManagers = normalizeUserArray(\n (currentUser as any).managers ||\n (currentUser as any).managerUsers ||\n (currentUser as any).leaders ||\n (currentUser as any).supervisors,\n );\n setRuntimeDefaults((prev) => ({\n ...prev,\n currentUser: prev.currentUser || currentUser,\n currentDepartment: prev.currentDepartment || currentDepartment,\n currentUserManagers: prev.currentUserManagers || currentUserManagers,\n }));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [api, mergedRuntime.currentDepartment, mergedRuntime.currentUser, schema.fields]);\n\n useEffect(() => {\n setFormData((prev) => {\n let changed = false;\n const next = { ...prev };\n for (const field of schema.fields) {\n if (!field.defaultShortcut?.type || !isBlankFormValue(next[field.fieldId])) continue;\n const defaultValue = resolveDefaultValue(field, mergedRuntime);\n if (isBlankFormValue(defaultValue)) continue;\n next[field.fieldId] = defaultValue;\n changed = true;\n }\n return changed ? next : prev;\n });\n }, [mergedRuntime, schema.fields]);\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 (effects.length > 0) {\n computed = evaluateEffects(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, effects, config.permissions, config.mode, formData]);\n\n const fieldOverrides = useMemo(\n () => evaluateFieldOverrides(effects, formData),\n [effects, formData],\n );\n\n const layoutBehaviors = useMemo(\n () => evaluateLayoutBehaviors(effects, formData),\n [effects, formData],\n );\n\n useEffect(() => {\n const valueActions = getValueActions(effects, formData);\n if (valueActions.length === 0) return;\n\n let changed = false;\n const nextData = { ...formData };\n const nextErrors = { ...fieldErrors };\n\n for (const action of valueActions) {\n const nextValue = action.action === 'clearValue' ? undefined : action.value;\n if (!isSameValue(nextData[action.fieldId], nextValue)) {\n changed = true;\n if (action.action === 'clearValue') {\n delete nextData[action.fieldId];\n } else {\n nextData[action.fieldId] = nextValue;\n }\n delete nextErrors[action.fieldId];\n }\n }\n\n if (changed) {\n setFormData(nextData);\n setFieldErrors(nextErrors);\n }\n }, [effects, formData, fieldErrors]);\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) {\n const scopedField = getScopedSubFormField(schema.fields, fieldId);\n if (!scopedField) return true;\n\n const parentBehavior =\n fieldBehaviors[scopedField.parent.fieldId] ?? scopedField.parent.behavior ?? 'NORMAL';\n if (isInactiveBehavior(parentBehavior) || isInactiveBehavior(scopedField.column.behavior)) {\n setFieldErrors((prev) => replaceSingleFieldError(prev, scopedField.scopedFieldId, null));\n return true;\n }\n\n const rows = getSubFormRows(formData, scopedField.parent.fieldId);\n const rules = buildValidationRules(\n scopedField.column.label,\n scopedField.column.required,\n scopedField.column.rules,\n );\n if (rules.length === 0) return true;\n\n const error = await validateFieldUtil(\n rows[scopedField.rowIndex]?.[scopedField.column.fieldId],\n rules,\n );\n setFieldErrors((prev) => replaceSingleFieldError(prev, scopedField.scopedFieldId, error));\n return !error;\n }\n\n const behavior = fieldBehaviors[fieldId] ?? field.behavior ?? 'NORMAL';\n if (isInactiveBehavior(behavior)) {\n setFieldErrors((prev) => {\n return clearFieldAndChildrenErrors(prev, fieldId);\n });\n return true;\n }\n\n const rules = buildValidationRules(\n field.label,\n fieldOverrides[fieldId]?.required ?? field.required,\n field.rules,\n );\n const errors: Record<string, string> = {};\n\n if (rules.length > 0) {\n const error = await validateFieldUtil(formData[fieldId], rules);\n if (error) errors[fieldId] = error;\n }\n\n if (field.componentName === 'SubFormField') {\n const validationData = { ...formData };\n const subFormRules: Record<string, ValidationRule[]> = {};\n collectSubFormValidationRules(field, formData, validationData, subFormRules);\n const subFormErrors = await validateAllFields(validationData, subFormRules);\n Object.assign(errors, subFormErrors);\n }\n\n if (rules.length === 0 && Object.keys(errors).length === 0) {\n if (field.componentName !== 'SubFormField') {\n return true;\n }\n }\n\n setFieldErrors((prev) => {\n return replaceFieldAndChildrenErrors(prev, fieldId, errors);\n });\n return Object.keys(errors).length === 0;\n },\n [schema, formData, fieldBehaviors, fieldOverrides],\n );\n\n const validateAllWithErrors = useCallback(async (): Promise<Record<string, string>> => {\n const fieldRules: Record<string, ValidationRule[]> = {};\n const validationData = { ...formData };\n\n for (const field of schema.fields) {\n const behavior = fieldBehaviors[field.fieldId] ?? field.behavior ?? 'NORMAL';\n if (isInactiveBehavior(behavior)) {\n continue;\n }\n\n const rules = buildValidationRules(\n field.label,\n fieldOverrides[field.fieldId]?.required ?? field.required,\n field.rules,\n );\n if (rules.length > 0) {\n fieldRules[field.fieldId] = rules;\n }\n\n if (field.componentName === 'SubFormField') {\n collectSubFormValidationRules(field, formData, validationData, fieldRules);\n }\n }\n\n const errors = await validateAllFields(validationData, fieldRules);\n setFieldErrors(errors);\n return errors;\n }, [schema, formData, fieldBehaviors, fieldOverrides]);\n\n const validateAll = useCallback(async (): Promise<boolean> => {\n const errors = await validateAllWithErrors();\n return Object.keys(errors).length === 0;\n }, [validateAllWithErrors]);\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 // Dynamic options state for fields with optionSource\n const [dynamicOptions, setDynamicOptions] = useState<Record<string, OptionItem[]>>({});\n\n // Load dynamic options for fields with optionSource config\n useEffect(() => {\n const loadDynamicOptions = async () => {\n const updates: Record<string, OptionItem[]> = {};\n for (const field of schema.fields) {\n const optionSource = (field as any).optionSource as OptionSourceConfig | undefined;\n if (optionSource && optionSource.type !== 'custom') {\n // Skip dataLinkage on initial load - it will be handled by dependency watching\n if (optionSource.type === 'linkedForm') {\n const options = await resolveOptions(optionSource, mergedRuntime, formData);\n updates[field.fieldId] = options;\n }\n }\n }\n if (Object.keys(updates).length > 0) {\n setDynamicOptions((prev) => ({ ...prev, ...updates }));\n }\n };\n loadDynamicOptions();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [schema.fields, mergedRuntime]);\n\n // Watch for data linkage dependencies - reload options when condition fields change\n useEffect(() => {\n let cancelled = false;\n const loadDataLinkageOptions = async () => {\n const updates: Record<string, OptionItem[]> = {};\n for (const field of schema.fields) {\n const optionSource = (field as any).optionSource as OptionSourceConfig | undefined;\n if (optionSource && optionSource.type === 'dataLinkage' && optionSource.dataLinkage) {\n // Check if any condition field has a value\n const hasConditionValues = optionSource.dataLinkage.conditions.some(\n (condition) =>\n formData[condition.localFieldId] !== undefined &&\n formData[condition.localFieldId] !== '',\n );\n if (hasConditionValues) {\n const options = await resolveOptions(optionSource, mergedRuntime, formData);\n updates[field.fieldId] = options;\n }\n }\n }\n if (!cancelled && Object.keys(updates).length > 0) {\n setDynamicOptions((prev) => ({ ...prev, ...updates }));\n }\n };\n const timer = window.setTimeout(loadDataLinkageOptions, LINKAGE_DEBOUNCE_MS);\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [schema.fields, mergedRuntime, formData]);\n\n // Resolve data-linkage default values for fields that should be auto-filled from another form.\n useEffect(() => {\n let cancelled = false;\n\n const loadDefaultValueLinkages = async () => {\n const fields = schema.fields.filter((field) => (field as any).defaultValueLinkage);\n if (fields.length === 0) return;\n\n const updates: Record<string, any> = {};\n for (const field of fields) {\n const linkage = (field as any).defaultValueLinkage;\n if (!hasLinkageConditionValues(linkage, formData)) continue;\n const rawValue = await resolveDefaultValueLinkage(linkage, mergedRuntime, formData);\n const nextValue = coerceLinkedDefaultValue(field, rawValue);\n if (nextValue !== undefined && !isSameValue(formData[field.fieldId], nextValue)) {\n updates[field.fieldId] = nextValue;\n }\n }\n\n if (cancelled || Object.keys(updates).length === 0) return;\n setFormData((prev) => {\n let changed = false;\n const next = { ...prev };\n for (const [fieldId, value] of Object.entries(updates)) {\n if (!isSameValue(next[fieldId], value)) {\n next[fieldId] = value;\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n };\n\n const timer = window.setTimeout(loadDefaultValueLinkages, LINKAGE_DEBOUNCE_MS);\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [schema.fields, mergedRuntime, formData]);\n\n const contextValue: FormContextValue = useMemo(\n () => ({\n mode: config.mode,\n schema,\n formData,\n fieldErrors,\n fieldBehaviors,\n fieldOverrides,\n layoutBehaviors,\n dynamicOptions,\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 validateAllWithErrors,\n resetForm,\n registerField,\n unregisterField,\n }),\n [\n config.mode,\n config.formUuid,\n schema,\n formData,\n fieldErrors,\n fieldBehaviors,\n fieldOverrides,\n layoutBehaviors,\n dynamicOptions,\n api,\n config.appType,\n config.formInstanceId,\n config.submit,\n setFieldValue,\n getFieldValue,\n getFormData,\n validateFieldById,\n validateAll,\n validateAllWithErrors,\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\nfunction resolveDefaultValue(field: Record<string, any>, runtime?: FormRuntimeConfig) {\n if (field.defaultValue !== undefined) {\n return field.defaultValue;\n }\n\n if (!field.defaultShortcut?.type) {\n return undefined;\n }\n\n const shortcut = field.defaultShortcut;\n\n if (shortcut.type === 'fixed') {\n return shortcut.values;\n }\n\n // Date shortcuts\n if (\n shortcut.type === 'today' ||\n shortcut.type === 'yesterday' ||\n shortcut.type === 'tomorrow' ||\n shortcut.type === 'pastDays' ||\n shortcut.type === 'futureDays'\n ) {\n return resolveDateShortcut(shortcut);\n }\n\n // Text shortcuts (TextShortcutConfig)\n if (shortcut.type === 'currentUserName') {\n return runtime?.currentUser?.name ?? '';\n }\n if (shortcut.type === 'currentUserJobNumber') {\n return runtime?.currentUser?.jobNumber ?? '';\n }\n if (shortcut.type === 'currentDeptName') {\n return runtime?.currentDepartment?.name ?? '';\n }\n if (shortcut.type === 'uuid') {\n return typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n\n // People shortcuts (PeopleShortcutConfig)\n if (shortcut.type === 'currentUser') {\n return runtime?.currentUser ? [runtime.currentUser] : [];\n }\n if (shortcut.type === 'currentDepartment') {\n return runtime?.currentDepartment ? [runtime.currentDepartment] : [];\n }\n if (shortcut.type === 'currentUserManager') {\n return runtime?.currentUserManagers?.[0] ? [runtime.currentUserManagers[0]] : [];\n }\n if (shortcut.type === 'currentUserManager2') {\n return runtime?.currentUserManagers?.[1] ? [runtime.currentUserManagers[1]] : [];\n }\n\n return undefined;\n}\n\nfunction needsCurrentUserRuntime(shortcutType?: string) {\n return Boolean(\n shortcutType &&\n [\n 'currentUser',\n 'currentDepartment',\n 'currentUserManager',\n 'currentUserManager2',\n 'currentUserName',\n 'currentUserJobNumber',\n 'currentDeptName',\n ].includes(shortcutType),\n );\n}\n\nfunction unwrapRuntimePayload(payload: any) {\n return payload?.data || payload?.result || payload?.user || payload;\n}\n\nfunction isBlankFormValue(value: any) {\n return (\n value === undefined ||\n value === null ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nfunction resolveDateShortcut(shortcut: {\n type: string;\n amount?: number;\n format?: string;\n includeTime?: boolean;\n}) {\n const date = new Date();\n const amount = shortcut.amount ?? 0;\n\n if (shortcut.type === 'yesterday') {\n date.setDate(date.getDate() - 1);\n } else if (shortcut.type === 'tomorrow') {\n date.setDate(date.getDate() + 1);\n } else if (shortcut.type === 'pastDays') {\n date.setDate(date.getDate() - amount);\n } else if (shortcut.type === 'futureDays') {\n date.setDate(date.getDate() + amount);\n }\n\n const format = shortcut.format || (shortcut.includeTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD');\n return formatDate(date, format);\n}\n\nfunction formatDate(date: Date, format: string) {\n const pad = (value: number) => String(value).padStart(2, '0');\n return format\n .replace('YYYY', String(date.getFullYear()))\n .replace('MM', pad(date.getMonth() + 1))\n .replace('DD', pad(date.getDate()))\n .replace('HH', pad(date.getHours()))\n .replace('mm', pad(date.getMinutes()))\n .replace('ss', pad(date.getSeconds()));\n}\n\nfunction isSameValue(left: any, right: any): boolean {\n if (left === right) return true;\n if (typeof left === 'object' || typeof right === 'object') {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n return false;\n}\n\nfunction hasLinkageConditionValues(\n linkage: { conditions?: Array<{ localFieldId?: string }> } | undefined,\n formData: Record<string, any>,\n) {\n const conditions = linkage?.conditions || [];\n if (conditions.length === 0) return false;\n return conditions.every((condition) => {\n const value = condition.localFieldId ? formData[condition.localFieldId] : undefined;\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n ('start' in value || 'end' in value)\n ) {\n return Boolean((value as any).start && (value as any).end);\n }\n return (\n value !== undefined &&\n value !== null &&\n value !== '' &&\n !(Array.isArray(value) && value.length === 0)\n );\n });\n}\n\nfunction coerceLinkedDefaultValue(\n field: { componentName?: string; options?: OptionItem[] },\n value: any,\n) {\n if (value === undefined) return undefined;\n if (field.componentName === 'SelectField' || field.componentName === 'RadioField') {\n if (typeof value === 'object' && value?.value !== undefined && value?.label !== undefined)\n return value;\n const matched = (field.options || []).find((option) => String(option.value) === String(value));\n return matched || { label: String(value), value: String(value) };\n }\n return value;\n}\n","import { createContext, useContext } from 'react';\nimport type {\n FieldBehavior,\n FormEngineConfig,\n FormRuntimeApi,\n FormSchema,\n OptionItem,\n} from '../types';\n\nexport interface FormContextValue {\n mode: FormEngineConfig['mode'];\n schema: FormSchema;\n formData: Record<string, any>;\n fieldErrors: Record<string, string>;\n fieldBehaviors: Record<string, FieldBehavior>;\n fieldOverrides: Record<string, Record<string, any>>;\n layoutBehaviors: Record<string, FieldBehavior>;\n dynamicOptions: Record<string, OptionItem[]>;\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 validateAllWithErrors: () => Promise<Record<string, string>>;\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 * as Antd from 'antd';\nimport { useFormContext } from './FormContext';\nimport { normalizeRichTextHtml } from '../utils/richText';\n\n/** Simple className merge utility */\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction getAntFormItem(): React.ComponentType<any> | undefined {\n try {\n const item = (Antd as any).Form?.Item as React.ComponentType<any> | undefined;\n const hasMatchMedia = typeof window === 'undefined' || typeof window.matchMedia === 'function';\n return hasMatchMedia ? item : undefined;\n } catch {\n return undefined;\n }\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 const AntFormItem = getAntFormItem();\n const tipsHtml = normalizeRichTextHtml(tips);\n const extra =\n tipsHtml && !error ? (\n <span\n className={cn('sy-field-tips', tipsClassName)}\n data-testid={`tips-${fieldId}`}\n dangerouslySetInnerHTML={{ __html: tipsHtml }}\n />\n ) : undefined;\n const errorNode = error ? (\n <span className=\"sy-field-error\" role=\"alert\" data-testid={`error-${fieldId}`}>\n {error}\n </span>\n ) : undefined;\n\n if (!AntFormItem) {\n return (\n <div className={cn('sy-field-wrapper', className)} data-field-id={fieldId}>\n <label className={cn('sy-field-label', labelClassName)}>\n {required && <span className=\"sy-field-required\">*</span>}\n {label}\n </label>\n <div className=\"sy-field-control\">{children}</div>\n {errorNode}\n {extra}\n </div>\n );\n }\n\n return (\n <div className={cn('sy-field-wrapper', className)} data-field-id={fieldId}>\n <AntFormItem\n name={fieldId}\n label={<span className={labelClassName}>{label}</span>}\n required={required}\n validateStatus={error ? 'error' : undefined}\n help={errorNode}\n extra={extra}\n className=\"sy-field-item\"\n >\n {children}\n </AntFormItem>\n </div>\n );\n}\n","const htmlTagPattern = /<[a-z!/][\\s\\S]*?>/i;\nconst escapedHtmlTagPattern = /&lt;[a-z!/][\\s\\S]*?&gt;/i;\n\nexport function decodeHtmlEntities(value: string): string {\n if (typeof document !== 'undefined') {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = value;\n return textarea.value;\n }\n\n return value\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, '&');\n}\n\nexport function sanitizeRichTextHtml(value?: string): string {\n const html = value || '';\n if (!html.trim()) return '';\n\n if (typeof DOMParser === 'undefined') {\n return html.replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, '');\n }\n\n const parsed = new DOMParser().parseFromString(html, 'text/html');\n parsed.querySelectorAll('script, style, iframe, object, embed').forEach((node) => node.remove());\n parsed.body.querySelectorAll('*').forEach((element) => {\n Array.from(element.attributes).forEach((attribute) => {\n const name = attribute.name.toLowerCase();\n const attrValue = attribute.value.trim();\n if (/^on/i.test(name)) {\n element.removeAttribute(attribute.name);\n return;\n }\n if ((name === 'href' || name === 'src') && /^javascript:/i.test(attrValue)) {\n element.removeAttribute(attribute.name);\n }\n });\n });\n\n return parsed.body.innerHTML;\n}\n\nexport function normalizeRichTextHtml(value?: unknown): string {\n const raw = typeof value === 'string' ? value : value == null ? '' : String(value);\n if (!raw.trim()) return '';\n const shouldDecode = !htmlTagPattern.test(raw) && escapedHtmlTagPattern.test(raw);\n return sanitizeRichTextHtml(shouldDecode ? decodeHtmlEntities(raw) : raw);\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 value: controlledValue,\n placeholder,\n maxLength,\n showCount,\n allowClear,\n prefix,\n suffix,\n autoComplete,\n variant,\n size,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: TextFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (controlledValue as string | undefined) ?? (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 showCount={showCount}\n allowClear={allowClear}\n prefix={prefix}\n suffix={suffix}\n autoComplete={autoComplete}\n variant={variant}\n size={size}\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\nfunction joinClassNames(...classes: Array<string | undefined | false | null>) {\n return classes.filter(Boolean).join(' ');\n}\n\nexport function TextFieldMobile({\n fieldId,\n value: controlledValue,\n placeholder,\n maxLength,\n showCount,\n allowClear,\n prefix,\n suffix,\n inputClassName,\n behavior,\n onChange,\n onBlur,\n}: TextFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (controlledValue as string | undefined) ?? (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\n className={joinClassNames(inputClassName, 'sy-mobile-line-input sy-mobile-text-input')}\n data-testid={`textfield-input-${fieldId}`}\n >\n {prefix && <span className=\"sy-input-prefix\">{prefix}</span>}\n <Input\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n clearable={allowClear}\n disabled={disabled}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {showCount && maxLength ? (\n <span className=\"sy-input-count\">\n {value.length}/{maxLength}\n </span>\n ) : null}\n {suffix && <span className=\"sy-input-suffix\">{suffix}</span>}\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 value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n min,\n max,\n step,\n precision,\n unit,\n unitPosition,\n thousandSeparator,\n controls,\n keyboard,\n stringMode,\n variant,\n size,\n onChange,\n onBlur,\n}: NumberFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? (controlledValue as number | null)\n : (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 const formatter = thousandSeparator\n ? (val: number | string | undefined) => {\n if (val === undefined || val === '') return '';\n const str = String(val);\n const [intPart, decPart] = str.split('.');\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return decPart !== undefined ? `${formattedInt}.${decPart}` : formattedInt;\n }\n : undefined;\n\n const parser = thousandSeparator\n ? (val: string | undefined) => {\n return val ? Number(val.replace(/,/g, '')) : 0;\n }\n : undefined;\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 prefix={unitPosition === 'prefix' ? unit : undefined}\n suffix={unitPosition !== 'prefix' && unit ? unit : undefined}\n controls={controls}\n keyboard={keyboard}\n stringMode={stringMode}\n variant={variant}\n size={size}\n formatter={formatter}\n parser={parser}\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\nfunction joinClassNames(...classes: Array<string | undefined | false | null>) {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction formatWithThousandSeparator(val: number | string): string {\n const str = String(val);\n const [intPart, decPart] = str.split('.');\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return decPart !== undefined ? `${formattedInt}.${decPart}` : formattedInt;\n}\n\nexport function NumberFieldMobile({\n fieldId,\n value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n min,\n max,\n step,\n precision,\n unit,\n unitPosition,\n thousandSeparator,\n onChange,\n onBlur,\n}: NumberFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = controlledValue !== undefined ? controlledValue : formData[fieldId];\n const disabled = behavior === 'DISABLED';\n\n const handleChange = (v: string) => {\n // Strip thousand separators before parsing\n const cleaned = thousandSeparator ? v.replace(/,/g, '') : v;\n const num = cleaned === '' ? null : Number(cleaned);\n let finalValue = num !== null && isNaN(num) ? null : num;\n // Clamp to min/max\n if (finalValue != null) {\n if (min != null && finalValue < min) finalValue = min;\n if (max != null && finalValue > max) finalValue = max;\n if (precision != null) {\n finalValue = Number(finalValue.toFixed(precision));\n }\n }\n setFieldValue(fieldId, finalValue);\n onChange?.(finalValue);\n };\n\n const handleBlur = () => {\n onBlur?.(value ?? null);\n };\n\n const displayValue = (() => {\n if (value == null) return '';\n let str = String(value);\n if (precision != null) {\n str = Number(value).toFixed(precision);\n }\n if (thousandSeparator) {\n str = formatWithThousandSeparator(str);\n }\n return str;\n })();\n\n const unitPrefix = unitPosition === 'prefix' ? unit : undefined;\n const unitSuffix = unitPosition !== 'prefix' && unit ? unit : undefined;\n\n return (\n <div\n className={joinClassNames(inputClassName, 'sy-mobile-line-input sy-mobile-number-input')}\n data-testid={`numberfield-input-${fieldId}`}\n style={{ display: 'flex', alignItems: 'center', gap: 4 }}\n >\n {unitPrefix && <span className=\"sy-number-unit-prefix\">{unitPrefix}</span>}\n <Input\n type={thousandSeparator ? 'text' : 'number'}\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n step={step != null ? String(step) : undefined}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {unitSuffix && <span className=\"sy-number-unit-suffix\">{unitSuffix}</span>}\n </div>\n );\n}\n","import React from 'react';\nimport type { NumberFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\n\nexport function NumberFieldReadonly({\n fieldId,\n readonlyClassName,\n unit,\n unitPosition,\n thousandSeparator,\n precision,\n}: NumberFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId];\n\n const display = (() => {\n if (value == null) return '--';\n let str: string;\n if (precision != null) {\n str = Number(value).toFixed(precision);\n } else {\n str = String(value);\n }\n if (thousandSeparator) {\n const [intPart, decPart] = str.split('.');\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n str = decPart !== undefined ? `${formattedInt}.${decPart}` : formattedInt;\n }\n // Add unit\n if (unit) {\n if (unitPosition === 'prefix') {\n str = `${unit}${str}`;\n } else {\n str = `${str}${unit}`;\n }\n }\n return str;\n })();\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 value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n rows,\n minRows,\n maxRows,\n autoSize,\n maxLength,\n showCount,\n allowClear,\n autoComplete,\n variant,\n size,\n onChange,\n onBlur,\n}: TextAreaFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (controlledValue as string | undefined) ?? (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 autoSize={autoSize ?? (minRows || maxRows ? { minRows, maxRows } : undefined)}\n maxLength={maxLength}\n showCount={showCount}\n allowClear={allowClear}\n autoComplete={autoComplete}\n variant={variant}\n size={size}\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\nfunction joinClassNames(...classes: Array<string | undefined | false | null>) {\n return classes.filter(Boolean).join(' ');\n}\n\nexport function TextAreaFieldMobile({\n fieldId,\n value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n rows,\n minRows,\n maxRows,\n autoSize,\n maxLength,\n showCount,\n onChange,\n onBlur,\n}: TextAreaFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = (controlledValue as string | undefined) ?? (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\n className={joinClassNames(inputClassName, 'sy-mobile-line-input sy-mobile-textarea-input')}\n data-testid={`textareafield-input-${fieldId}`}\n >\n <TextArea\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n autoSize={autoSize ?? (minRows || maxRows ? { minRows, maxRows } : undefined)}\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';\nimport { toAntdOptions } from '../shared/optionDisplay';\n\nexport function SelectFieldPC({\n fieldId,\n value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n options,\n allowClear,\n showSearch,\n optionFilterProp,\n optionLabelProp,\n placement,\n variant,\n size,\n coloredOptions,\n onChange,\n}: SelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? (controlledValue as OptionItem | null)\n : (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 showSearch={showSearch}\n optionFilterProp={optionFilterProp || 'label'}\n optionLabelProp={optionLabelProp}\n placement={placement}\n variant={variant}\n size={size}\n options={toAntdOptions(options, coloredOptions)}\n onChange={handleChange}\n data-testid={`selectfield-input-${fieldId}`}\n />\n );\n}\n","import React from 'react';\nimport { Tag } from 'antd';\nimport type { OptionItem } from '../../types';\n\nconst PRESET_COLORS: Record<string, string> = {\n processing: 'blue',\n success: 'green',\n error: 'red',\n warning: 'gold',\n};\n\nconst LEGACY_LIGHT_COLORS: Record<string, string> = {\n '#e0f0ff': 'blue',\n '#cce5ff': 'blue',\n '#d4f7d4': 'green',\n '#d4edda': 'green',\n '#fff3cd': 'gold',\n '#f8d7da': 'red',\n '#f5c6cb': 'red',\n '#fde8e8': 'red',\n '#d1ecf1': 'cyan',\n '#e2d9f3': 'purple',\n};\n\nfunction normalizeColor(color: string) {\n const normalized = color.trim().toLowerCase();\n return PRESET_COLORS[normalized] || LEGACY_LIGHT_COLORS[normalized] || color;\n}\n\nexport function renderOptionLabel(option: OptionItem, coloredOptions?: boolean) {\n if (!coloredOptions || !option.color) return option.label;\n return (\n <Tag color={normalizeColor(option.color)} className=\"sy-option-color-tag\">\n {option.label}\n </Tag>\n );\n}\n\nexport function toAntdOptions(options: OptionItem[], coloredOptions?: boolean) {\n return options.map((option) => ({\n ...option,\n label: renderOptionLabel(option, coloredOptions),\n }));\n}\n\nfunction optionValue(option: any) {\n return String(option?.value ?? option?.id ?? option?.key ?? option?.label ?? option ?? '');\n}\n\nexport function resolveReadonlyOptionItems(value: unknown, sourceOptions?: OptionItem[]) {\n const values = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n const sourceMap = new Map((sourceOptions || []).map((option) => [String(option.value), option]));\n return values\n .map((item) => {\n const rawValue = optionValue(item);\n if (!rawValue) return null;\n const matched = sourceMap.get(rawValue);\n if (typeof item === 'object' && item !== null) {\n const option = item as OptionItem & { name?: string; title?: string };\n return {\n ...matched,\n ...option,\n value: rawValue,\n label: String(option.label ?? option.name ?? option.title ?? matched?.label ?? rawValue),\n color: option.color ?? matched?.color,\n } as OptionItem;\n }\n return {\n ...matched,\n value: rawValue,\n label: String(matched?.label ?? rawValue),\n } as OptionItem;\n })\n .filter(Boolean) as OptionItem[];\n}\n\nexport function renderReadonlyOptions(\n options: OptionItem[],\n coloredOptions?: boolean,\n tagWhenPlain = false,\n) {\n if (options.length === 0) return '--';\n if (!coloredOptions && !tagWhenPlain) return options.map((option) => option.label).join(', ');\n return (\n <span className=\"sy-option-readonly-list\">\n {options.map((option) =>\n coloredOptions && option.color ? (\n <React.Fragment key={option.value}>\n {renderOptionLabel(option, coloredOptions)}\n </React.Fragment>\n ) : (\n <Tag key={option.value}>{option.label}</Tag>\n ),\n )}\n </span>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport type { SelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n MobileBottomSheet,\n MobileFieldTrigger,\n MobileSearchBox,\n MobileSheetFooter,\n} from '../shared/MobileField';\nimport { renderOptionLabel } from '../shared/optionDisplay';\n\nexport function SelectFieldMobile({\n fieldId,\n value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n options,\n allowClear,\n coloredOptions,\n onChange,\n}: SelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? (controlledValue as OptionItem | null)\n : (formData[fieldId] as OptionItem | null | undefined);\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n const [search, setSearch] = useState('');\n const [tempValue, setTempValue] = useState<OptionItem | null>(value ?? null);\n\n const filteredOptions = useMemo(() => {\n const keyword = search.trim().toLowerCase();\n if (!keyword) return options;\n return options.filter((option) =>\n String(option.label ?? option.value)\n .toLowerCase()\n .includes(keyword),\n );\n }, [options, search]);\n\n const openSheet = () => {\n if (disabled) return;\n setTempValue(value ?? null);\n setSearch('');\n setVisible(true);\n };\n\n const handleConfirm = () => {\n setFieldValue(fieldId, tempValue);\n onChange?.(tempValue);\n setVisible(false);\n };\n\n const handleClear = () => {\n setTempValue(null);\n setFieldValue(fieldId, null);\n onChange?.(null);\n };\n\n return (\n <div className={inputClassName} data-testid={`selectfield-input-${fieldId}`}>\n <MobileFieldTrigger\n value={value?.label}\n placeholder={placeholder ?? '请选择'}\n disabled={disabled}\n clearable={allowClear}\n onClick={openSheet}\n onClear={handleClear}\n testId={`selectfield-trigger-${fieldId}`}\n />\n <MobileBottomSheet\n visible={visible}\n onClose={() => setVisible(false)}\n height=\"80vh\"\n testId={`selectfield-popup-${fieldId}`}\n >\n <div className=\"sy-mobile-option-sheet\">\n <div className=\"sy-mobile-option-search\">\n <MobileSearchBox value={search} onChange={setSearch} />\n </div>\n <div className=\"sy-mobile-option-list\">\n {filteredOptions.map((option) => {\n const active = tempValue?.value === option.value;\n return (\n <button\n type=\"button\"\n key={option.value}\n className={`sy-mobile-option-row ${active ? 'is-active' : ''}`}\n disabled={option.disabled}\n onClick={() => setTempValue(option)}\n data-testid={`selectfield-option-${option.value}`}\n >\n <span className=\"sy-mobile-option-check is-radio\" aria-hidden=\"true\" />\n <span className=\"sy-mobile-option-label\">\n {renderOptionLabel(option, coloredOptions)}\n </span>\n </button>\n );\n })}\n </div>\n <MobileSheetFooter onCancel={() => setVisible(false)} onConfirm={handleConfirm} />\n </div>\n </MobileBottomSheet>\n </div>\n );\n}\n","import React from 'react';\nimport { Popup } from 'antd-mobile';\nimport { CloseCircleFilled, RightOutlined, SearchOutlined } from '@ant-design/icons';\n\nfunction joinClassNames(...classes: Array<string | undefined | false | null>) {\n return classes.filter(Boolean).join(' ');\n}\n\nexport interface MobileFieldTriggerProps {\n value?: React.ReactNode;\n placeholder?: React.ReactNode;\n disabled?: boolean;\n className?: string;\n contentClassName?: string;\n testId?: string;\n showArrow?: boolean;\n clearable?: boolean;\n onClick?: () => void;\n onClear?: () => void;\n}\n\nexport function MobileFieldTrigger({\n value,\n placeholder = '请选择',\n disabled,\n className,\n contentClassName,\n testId,\n showArrow = true,\n clearable,\n onClick,\n onClear,\n}: MobileFieldTriggerProps) {\n const hasValue = value !== undefined && value !== null && value !== '';\n\n return (\n <button\n type=\"button\"\n className={joinClassNames('sy-mobile-field-trigger', disabled && 'is-disabled', className)}\n disabled={disabled}\n onClick={onClick}\n data-testid={testId}\n >\n <span\n className={joinClassNames(\n 'sy-mobile-field-trigger-text',\n !hasValue && 'is-placeholder',\n contentClassName,\n )}\n >\n {hasValue ? value : placeholder}\n </span>\n {clearable && hasValue && !disabled ? (\n <span\n role=\"button\"\n tabIndex={0}\n data-testid={testId ? `${testId}-clear` : undefined}\n className=\"sy-mobile-field-clear\"\n onClick={(event) => {\n event.stopPropagation();\n onClear?.();\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.stopPropagation();\n onClear?.();\n }\n }}\n aria-label=\"清空\"\n >\n <CloseCircleFilled />\n </span>\n ) : showArrow ? (\n <RightOutlined className=\"sy-mobile-field-arrow\" aria-hidden=\"true\" />\n ) : null}\n </button>\n );\n}\n\nexport interface MobileBottomSheetProps {\n visible: boolean;\n onClose: () => void;\n children: React.ReactNode;\n className?: string;\n bodyClassName?: string;\n height?: string | number;\n closeOnMaskClick?: boolean;\n testId?: string;\n}\n\nexport function MobileBottomSheet({\n visible,\n onClose,\n children,\n className,\n bodyClassName,\n height,\n closeOnMaskClick = true,\n testId,\n}: MobileBottomSheetProps) {\n return (\n <Popup\n visible={visible}\n position=\"bottom\"\n closeOnMaskClick={closeOnMaskClick}\n onMaskClick={onClose}\n onClose={onClose}\n destroyOnClose\n getContainer={null}\n showCloseButton={false}\n className={joinClassNames('sy-mobile-bottom-sheet-popup', className)}\n bodyClassName={joinClassNames('sy-mobile-bottom-sheet', bodyClassName)}\n bodyStyle={height ? { height } : undefined}\n >\n <div className=\"sy-mobile-bottom-sheet-content\" data-testid={testId}>\n {children}\n </div>\n </Popup>\n );\n}\n\nexport interface MobileSheetHeaderProps {\n title?: React.ReactNode;\n cancelText?: React.ReactNode;\n confirmText?: React.ReactNode;\n onCancel?: () => void;\n onConfirm?: () => void;\n confirmDisabled?: boolean;\n confirmTestId?: string;\n}\n\nexport function MobileSheetHeader({\n title,\n cancelText = '取消',\n confirmText = '确定',\n onCancel,\n onConfirm,\n confirmDisabled,\n confirmTestId,\n}: MobileSheetHeaderProps) {\n return (\n <div className=\"sy-mobile-sheet-header\">\n <button type=\"button\" className=\"sy-mobile-sheet-action\" onClick={onCancel}>\n {cancelText}\n </button>\n <div className=\"sy-mobile-sheet-title\">{title}</div>\n <button\n type=\"button\"\n className=\"sy-mobile-sheet-action is-primary\"\n disabled={confirmDisabled}\n onClick={onConfirm}\n data-testid={confirmTestId}\n >\n {confirmText}\n </button>\n </div>\n );\n}\n\nexport interface MobileSheetFooterProps {\n selectedCount?: number;\n onCancel: () => void;\n onConfirm: () => void;\n confirmDisabled?: boolean;\n confirmText?: string;\n}\n\nexport function MobileSheetFooter({\n selectedCount,\n onCancel,\n onConfirm,\n confirmDisabled,\n confirmText = '确定',\n}: MobileSheetFooterProps) {\n return (\n <div className=\"sy-mobile-sheet-footer\">\n {selectedCount !== undefined ? (\n <div className=\"sy-mobile-sheet-count\">\n 当前已选中 <span>{selectedCount}</span> 项\n </div>\n ) : null}\n <div className=\"sy-mobile-sheet-footer-actions\">\n <button type=\"button\" className=\"sy-mobile-sheet-button\" onClick={onCancel}>\n 取消\n </button>\n <button\n type=\"button\"\n className=\"sy-mobile-sheet-button is-primary\"\n disabled={confirmDisabled}\n onClick={onConfirm}\n >\n {confirmText}\n </button>\n </div>\n </div>\n );\n}\n\nexport interface MobileSearchBoxProps {\n value: string;\n placeholder?: string;\n onChange: (value: string) => void;\n}\n\nexport function MobileSearchBox({ value, placeholder = '搜索', onChange }: MobileSearchBoxProps) {\n return (\n <div className=\"sy-mobile-search\">\n <span className=\"sy-mobile-search-icon\" aria-hidden=\"true\">\n <SearchOutlined />\n </span>\n <input\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n data-testid=\"sy-mobile-search-input\"\n />\n </div>\n );\n}\n","import React from 'react';\nimport type { SelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { renderReadonlyOptions, resolveReadonlyOptionItems } from '../shared/optionDisplay';\n\nexport function SelectFieldReadonly({\n fieldId,\n readonlyClassName,\n coloredOptions,\n options,\n}: SelectFieldProps) {\n const { formData } = useFormContext();\n const value = resolveReadonlyOptionItems(formData[fieldId], options);\n const display = renderReadonlyOptions(value, coloredOptions);\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';\nimport { toAntdOptions } from '../shared/optionDisplay';\n\nexport function MultiSelectFieldPC({\n fieldId,\n value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n options,\n allowClear,\n showSearch,\n maxCount,\n maxTagCount,\n maxTagTextLength,\n optionFilterProp,\n optionLabelProp,\n placement,\n variant,\n size,\n coloredOptions,\n onChange,\n}: MultiSelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? ((controlledValue as OptionItem[] | undefined) ?? [])\n : ((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 allowClear={allowClear}\n showSearch={showSearch}\n maxCount={maxCount}\n maxTagCount={maxTagCount}\n maxTagTextLength={maxTagTextLength}\n optionFilterProp={optionFilterProp || 'label'}\n optionLabelProp={optionLabelProp}\n placement={placement}\n variant={variant}\n size={size}\n options={toAntdOptions(options, coloredOptions)}\n onChange={handleChange}\n data-testid={`multiselectfield-input-${fieldId}`}\n />\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport type { MultiSelectFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n MobileBottomSheet,\n MobileFieldTrigger,\n MobileSearchBox,\n MobileSheetFooter,\n} from '../shared/MobileField';\nimport { renderOptionLabel } from '../shared/optionDisplay';\n\nexport function MultiSelectFieldMobile({\n fieldId,\n value: controlledValue,\n placeholder,\n inputClassName,\n behavior,\n options,\n maxCount,\n allowClear,\n coloredOptions,\n onChange,\n}: MultiSelectFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? ((controlledValue as OptionItem[] | undefined) ?? [])\n : ((formData[fieldId] as OptionItem[] | undefined) ?? []);\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n const [search, setSearch] = useState('');\n const [tempValues, setTempValues] = useState<OptionItem[]>(value);\n\n const filteredOptions = useMemo(() => {\n const keyword = search.trim().toLowerCase();\n if (!keyword) return options;\n return options.filter((option) =>\n String(option.label ?? option.value)\n .toLowerCase()\n .includes(keyword),\n );\n }, [options, search]);\n\n const tempValueSet = useMemo(\n () => new Set(tempValues.map((option) => option.value)),\n [tempValues],\n );\n\n const openSheet = () => {\n if (disabled) return;\n setTempValues(value);\n setSearch('');\n setVisible(true);\n };\n\n const toggleOption = (option: OptionItem) => {\n const exists = tempValueSet.has(option.value);\n if (exists) {\n setTempValues((current) => current.filter((item) => item.value !== option.value));\n return;\n }\n if (maxCount && tempValues.length >= maxCount) return;\n setTempValues((current) => [...current, option]);\n };\n\n const commitValue = (nextValue: OptionItem[]) => {\n setFieldValue(fieldId, nextValue);\n onChange?.(nextValue);\n };\n\n const handleConfirm = () => {\n commitValue(tempValues);\n setVisible(false);\n };\n\n const handleClear = () => {\n setTempValues([]);\n commitValue([]);\n };\n\n return (\n <div className={inputClassName} data-testid={`multiselectfield-input-${fieldId}`}>\n <MobileFieldTrigger\n value={value.length ? value.map((option) => option.label).join(', ') : undefined}\n placeholder={placeholder ?? '请选择'}\n disabled={disabled}\n clearable={allowClear}\n onClick={openSheet}\n onClear={handleClear}\n testId={`multiselectfield-trigger-${fieldId}`}\n />\n <MobileBottomSheet\n visible={visible}\n onClose={() => setVisible(false)}\n height=\"80vh\"\n testId={`multiselectfield-popup-${fieldId}`}\n >\n <div className=\"sy-mobile-option-sheet\">\n <div className=\"sy-mobile-option-search\">\n <MobileSearchBox value={search} onChange={setSearch} />\n </div>\n <div className=\"sy-mobile-option-list\">\n {filteredOptions.map((option) => {\n const active = tempValueSet.has(option.value);\n const optionDisabled =\n option.disabled || Boolean(maxCount && tempValues.length >= maxCount && !active);\n return (\n <button\n type=\"button\"\n key={option.value}\n className={`sy-mobile-option-row ${active ? 'is-active' : ''}`}\n disabled={optionDisabled}\n onClick={() => toggleOption(option)}\n data-testid={`multiselectfield-option-${option.value}`}\n >\n <span className=\"sy-mobile-option-check is-checkbox\" aria-hidden=\"true\" />\n <span className=\"sy-mobile-option-label\">\n {renderOptionLabel(option, coloredOptions)}\n </span>\n </button>\n );\n })}\n </div>\n <MobileSheetFooter onCancel={() => setVisible(false)} onConfirm={handleConfirm} />\n </div>\n </MobileBottomSheet>\n </div>\n );\n}\n","import React from 'react';\nimport type { MultiSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { renderReadonlyOptions, resolveReadonlyOptionItems } from '../shared/optionDisplay';\n\nexport function MultiSelectFieldReadonly({\n fieldId,\n readonlyClassName,\n coloredOptions,\n options,\n}: MultiSelectFieldProps) {\n const { formData } = useFormContext();\n const value = resolveReadonlyOptionItems(formData[fieldId], options);\n const display = renderReadonlyOptions(value, coloredOptions, true);\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';\nimport { renderOptionLabel } from '../shared/optionDisplay';\n\nexport function RadioFieldPC({\n fieldId,\n value: controlledValue,\n inputClassName,\n behavior,\n options,\n direction,\n optionType,\n buttonStyle,\n size,\n coloredOptions,\n onChange,\n}: RadioFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? (controlledValue as OptionItem | null)\n : (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 const className = [inputClassName, coloredOptions ? 'sy-option-group-colored' : undefined]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Radio.Group\n className={className}\n value={value?.value ?? undefined}\n disabled={disabled}\n optionType={optionType}\n buttonStyle={buttonStyle}\n size={size}\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 {renderOptionLabel(o, coloredOptions)}\n </Radio>\n ))}\n </Radio.Group>\n );\n}\n","import React from 'react';\nimport type { RadioFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { renderOptionLabel } from '../shared/optionDisplay';\n\nexport function RadioFieldMobile({\n fieldId,\n value: controlledValue,\n inputClassName,\n behavior,\n options,\n direction,\n coloredOptions,\n onChange,\n}: RadioFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? (controlledValue as OptionItem | null)\n : (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 <div\n className={`sy-mobile-choice-group ${\n direction === 'vertical' ? 'is-vertical' : 'is-horizontal'\n }`}\n data-testid=\"antd-mobile-radio-group\"\n data-disabled={disabled ? 'true' : undefined}\n onClick={(event) => {\n if (disabled) return;\n const target = event.target as HTMLElement;\n const optionValue = target.getAttribute('data-radio-value');\n if (!optionValue) return;\n const option = options.find((item) => item.value === optionValue);\n if (option?.disabled) return;\n handleChange(optionValue);\n }}\n >\n {options.map((option) => {\n const active = value?.value === option.value;\n const optionDisabled = disabled || option.disabled;\n return (\n <button\n key={option.value}\n type=\"button\"\n className={`sy-mobile-choice-item is-radio ${active ? 'is-active' : ''}`}\n disabled={optionDisabled}\n onClick={(event) => {\n event.stopPropagation();\n if (optionDisabled) return;\n handleChange(option.value);\n }}\n data-radio-value={option.value}\n >\n <span className=\"sy-mobile-choice-control\" aria-hidden=\"true\" />\n <span className=\"sy-mobile-choice-label\">\n {renderOptionLabel(option, coloredOptions)}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport type { RadioFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { renderReadonlyOptions, resolveReadonlyOptionItems } from '../shared/optionDisplay';\n\nexport function RadioFieldReadonly({\n fieldId,\n readonlyClassName,\n coloredOptions,\n options,\n}: RadioFieldProps) {\n const { formData } = useFormContext();\n const value = resolveReadonlyOptionItems(formData[fieldId], options);\n const display = renderReadonlyOptions(value, coloredOptions);\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';\nimport { renderOptionLabel } from '../shared/optionDisplay';\n\nexport function CheckboxFieldPC({\n fieldId,\n value: controlledValue,\n inputClassName,\n behavior,\n options,\n direction,\n maxCount,\n coloredOptions,\n onChange,\n}: CheckboxFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? ((controlledValue as OptionItem[] | undefined) ?? [])\n : ((formData[fieldId] as OptionItem[] | undefined) ?? []);\n const disabled = behavior === 'DISABLED';\n const selectedValues = value.map((v) => v.value);\n const reachedMax = Boolean(maxCount && selectedValues.length >= maxCount);\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 const className = [inputClassName, coloredOptions ? 'sy-option-group-colored' : undefined]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Checkbox.Group\n className={className}\n value={selectedValues}\n disabled={disabled}\n onChange={handleChange}\n data-testid={`checkboxfield-input-${fieldId}`}\n style={style}\n >\n {options.map((o) => (\n <Checkbox\n key={o.value}\n value={o.value}\n disabled={disabled || (reachedMax && !selectedValues.includes(o.value))}\n >\n {renderOptionLabel(o, coloredOptions)}\n </Checkbox>\n ))}\n </Checkbox.Group>\n );\n}\n","import React from 'react';\nimport type { CheckboxFieldProps, OptionItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { renderOptionLabel } from '../shared/optionDisplay';\n\nexport function CheckboxFieldMobile({\n fieldId,\n value: controlledValue,\n inputClassName,\n behavior,\n options,\n direction,\n maxCount,\n coloredOptions,\n onChange,\n}: CheckboxFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value =\n controlledValue !== undefined\n ? ((controlledValue as OptionItem[] | undefined) ?? [])\n : ((formData[fieldId] as OptionItem[] | undefined) ?? []);\n const disabled = behavior === 'DISABLED';\n const selectedValues = value.map((v) => v.value);\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 <div\n className={`sy-mobile-choice-group ${\n direction === 'vertical' ? 'is-vertical' : 'is-horizontal'\n }`}\n data-testid=\"antd-mobile-checkbox-group\"\n data-disabled={disabled ? 'true' : undefined}\n onClick={(event) => {\n if (disabled) return;\n const target = event.target as HTMLElement;\n const optionValue = target.getAttribute('data-checkbox-value');\n if (!optionValue) return;\n const active = selectedValues.includes(optionValue);\n const option = options.find((item) => item.value === optionValue);\n if (\n option?.disabled ||\n Boolean(maxCount && selectedValues.length >= maxCount && !active)\n ) {\n return;\n }\n const nextValues = active\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue];\n handleChange(nextValues);\n }}\n >\n {options.map((option) => {\n const active = selectedValues.includes(option.value);\n const optionDisabled =\n disabled ||\n option.disabled ||\n Boolean(maxCount && selectedValues.length >= maxCount && !active);\n return (\n <button\n key={option.value}\n type=\"button\"\n className={`sy-mobile-choice-item is-checkbox ${active ? 'is-active' : ''}`}\n disabled={optionDisabled}\n onClick={(event) => {\n event.stopPropagation();\n if (optionDisabled) return;\n const nextValues = active\n ? selectedValues.filter((item) => item !== option.value)\n : [...selectedValues, option.value];\n handleChange(nextValues);\n }}\n data-checkbox-value={option.value}\n >\n <span className=\"sy-mobile-choice-control\" aria-hidden=\"true\" />\n <span className=\"sy-mobile-choice-label\">\n {renderOptionLabel(option, coloredOptions)}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport type { CheckboxFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { renderReadonlyOptions, resolveReadonlyOptionItems } from '../shared/optionDisplay';\n\nexport function CheckboxFieldReadonly({\n fieldId,\n readonlyClassName,\n coloredOptions,\n options,\n}: CheckboxFieldProps) {\n const { formData } = useFormContext();\n const value = resolveReadonlyOptionItems(formData[fieldId], options);\n const display = renderReadonlyOptions(value, coloredOptions, true);\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 zhCN from 'antd/lib/date-picker/locale/zh_CN.js';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getDisabledDate } from './dateRestrictionUtils';\nimport { getDateDisplayFormat, shouldShowDateTime } from './dateFormat';\n\nexport function DateFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n dateRestriction,\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 = getDateDisplayFormat(dateFormat, showTime);\n const inferredShowTime = shouldShowDateTime(dateFormat, showTime);\n const pickerValue = value && dayjs(value).isValid() ? dayjs(value) : null;\n const disabledDate = getDisabledDate(dateRestriction);\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 locale={zhCN}\n format={format}\n showTime={inferredShowTime}\n disabledDate={disabledDate}\n onChange={handleChange}\n data-testid={`datefield-input-${fieldId}`}\n />\n );\n}\n","import dayjs, { type Dayjs } from 'dayjs';\nimport type { DateRestrictionConfig } from '../../types';\n\n/**\n * 根据日期限制配置生成 antd DatePicker 的 disabledDate 函数\n */\nexport function getDisabledDate(\n restriction?: DateRestrictionConfig,\n): ((current: Dayjs) => boolean) | undefined {\n if (!restriction || restriction.type === 'none') return undefined;\n\n return (current: Dayjs) => {\n switch (restriction.type) {\n case 'todayAndAfter':\n return current.isBefore(dayjs().startOf('day'));\n case 'todayAndBefore':\n return current.isAfter(dayjs().endOf('day'));\n case 'custom': {\n const beforeStart = restriction.customStart\n ? current.isBefore(dayjs(restriction.customStart).startOf('day'))\n : false;\n const afterEnd = restriction.customEnd\n ? current.isAfter(dayjs(restriction.customEnd).endOf('day'))\n : false;\n return beforeStart || afterEnd;\n }\n default:\n return false;\n }\n };\n}\n\n/**\n * 根据日期限制配置计算 min/max 日期(用于移动端 antd-mobile DatePicker)\n */\nexport function getDateMinMax(restriction?: DateRestrictionConfig): { min?: Date; max?: Date } {\n if (!restriction || restriction.type === 'none') return {};\n\n switch (restriction.type) {\n case 'todayAndAfter':\n return { min: dayjs().startOf('day').toDate() };\n case 'todayAndBefore':\n return { max: dayjs().endOf('day').toDate() };\n case 'custom': {\n const result: { min?: Date; max?: Date } = {};\n if (restriction.customStart) {\n result.min = dayjs(restriction.customStart).startOf('day').toDate();\n }\n if (restriction.customEnd) {\n result.max = dayjs(restriction.customEnd).endOf('day').toDate();\n }\n return result;\n }\n default:\n return {};\n }\n}\n","import dayjs from 'dayjs';\nimport './dateLocale';\n\nexport function formatHasTime(format?: string) {\n return Boolean(format && /[HhmsSA]/.test(format));\n}\n\nexport function getDateDisplayFormat(dateFormat?: string, showTime?: boolean) {\n if (dateFormat) return dateFormat;\n return showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD';\n}\n\nexport function shouldShowDateTime(dateFormat?: string, showTime?: boolean) {\n if (dateFormat) return formatHasTime(dateFormat);\n return Boolean(showTime);\n}\n\nexport function formatDateValue(value: unknown, dateFormat?: string, showTime?: boolean) {\n if (value === undefined || value === null || value === '') return '--';\n const date = dayjs(value as string | number | Date);\n if (!date.isValid()) return String(value);\n return date.format(getDateDisplayFormat(dateFormat, showTime));\n}\n\nexport function normalizeDateRangeValue(value: unknown): { start: any; end: any } | null {\n if (Array.isArray(value)) {\n return { start: value[0] ?? '', end: value[1] ?? '' };\n }\n if (value && typeof value === 'object') {\n const record = value as Record<string, any>;\n return {\n start: record.start ?? record.startTime ?? record.begin ?? record[0] ?? '',\n end: record.end ?? record.endTime ?? record.finish ?? record[1] ?? '',\n };\n }\n return null;\n}\n\nexport function dateRangeToSubmitValue(value: unknown): [any, any] | null {\n const range = normalizeDateRangeValue(value);\n if (!range) return null;\n const start = range.start === '' || range.start === undefined ? null : range.start;\n const end = range.end === '' || range.end === undefined ? null : range.end;\n if (start === null && end === null) return null;\n return [start, end];\n}\n","import dayjs from 'dayjs';\nimport 'dayjs/locale/zh-cn.js';\n\ndayjs.locale('zh-cn');\n","import React, { useState } from 'react';\nimport { Calendar } from 'antd-mobile';\nimport dayjs from 'dayjs';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getDateMinMax } from './dateRestrictionUtils';\nimport { formatDateValue, getDateDisplayFormat, shouldShowDateTime } from './dateFormat';\nimport { MobileBottomSheet, MobileFieldTrigger, MobileSheetHeader } from '../shared/MobileField';\nimport { formatMobileTime, MobileTimePickerView } from '../shared/MobileDatePicker';\n\nexport function DateFieldMobile({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n dateRestriction,\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 [mode, setMode] = useState<'date' | 'time'>('date');\n const format = getDateDisplayFormat(dateFormat, showTime);\n const inferredShowTime = shouldShowDateTime(dateFormat, showTime);\n const pickerValue = value && dayjs(value).isValid() ? dayjs(value).toDate() : new Date();\n const [tempDate, setTempDate] = useState<Date>(pickerValue);\n const { min, max } = getDateMinMax(dateRestriction);\n\n const openPicker = () => {\n if (disabled) return;\n setTempDate(pickerValue);\n setMode('date');\n setVisible(true);\n };\n\n const mergeDatePart = (date: Date | null) => {\n if (!date) return;\n const current = dayjs(tempDate);\n setTempDate(\n dayjs(date)\n .hour(current.hour())\n .minute(current.minute())\n .second(current.second())\n .millisecond(0)\n .toDate(),\n );\n };\n\n const handleConfirm = () => {\n const dateStr = dayjs(tempDate).format(format);\n setFieldValue(fieldId, dateStr);\n onChange?.(dateStr);\n setVisible(false);\n };\n\n const handleClear = () => {\n setFieldValue(fieldId, '');\n onChange?.('');\n };\n\n return (\n <div className={inputClassName} data-testid={`datefield-input-${fieldId}`}>\n <MobileFieldTrigger\n value={value ? formatDateValue(value, dateFormat, showTime) : undefined}\n placeholder={placeholder || '请选择日期'}\n disabled={disabled}\n clearable={Boolean(value)}\n onClick={openPicker}\n onClear={handleClear}\n testId={`datefield-trigger-${fieldId}`}\n />\n <MobileBottomSheet\n visible={visible}\n onClose={() => setVisible(false)}\n testId={`datefield-popup-${fieldId}`}\n >\n <div className=\"sy-mobile-date-sheet\">\n <MobileSheetHeader\n onCancel={() => setVisible(false)}\n onConfirm={handleConfirm}\n confirmTestId={`datefield-confirm-${fieldId}`}\n />\n {mode === 'time' ? (\n <>\n <MobileTimePickerView value={tempDate} onChange={setTempDate} />\n <div className=\"sy-mobile-date-time-footer\">\n <span>选择时间</span>\n <button type=\"button\" className=\"sy-mobile-time-pill is-active\">\n {formatMobileTime(tempDate)}\n </button>\n </div>\n </>\n ) : (\n <>\n <Calendar\n selectionMode=\"single\"\n value={tempDate}\n min={min}\n max={max}\n allowClear={false}\n onChange={mergeDatePart}\n />\n {inferredShowTime ? (\n <div className=\"sy-mobile-date-time-footer\">\n <button\n type=\"button\"\n className=\"sy-mobile-date-time-label\"\n onClick={() => setMode('time')}\n data-testid={`datefield-time-trigger-${fieldId}`}\n >\n 选择时间\n </button>\n <button\n type=\"button\"\n className=\"sy-mobile-time-pill\"\n onClick={() => setMode('time')}\n >\n {formatMobileTime(tempDate)}\n </button>\n </div>\n ) : null}\n </>\n )}\n </div>\n </MobileBottomSheet>\n </div>\n );\n}\n","import React from 'react';\nimport { PickerView } from 'antd-mobile';\nimport dayjs from 'dayjs';\n\ntype PickerValue = string | number | null;\n\nconst pad2 = (value: number) => String(value).padStart(2, '0');\n\nconst hourOptions = Array.from({ length: 24 }, (_, hour) => ({\n label: `${hour}时`,\n value: pad2(hour),\n}));\nconst minuteOptions = Array.from({ length: 60 }, (_, minute) => ({\n label: `${minute}分`,\n value: pad2(minute),\n}));\nconst secondOptions = Array.from({ length: 60 }, (_, second) => ({\n label: `${second}秒`,\n value: pad2(second),\n}));\n\nexport function formatMobileTime(date: Date) {\n return dayjs(date).format('HH:mm:ss');\n}\n\nexport function getTimePickerValue(date: Date): PickerValue[] {\n return [dayjs(date).format('HH'), dayjs(date).format('mm'), dayjs(date).format('ss')];\n}\n\nexport function applyTimePickerValue(base: Date, value: PickerValue[]) {\n const [hour, minute, second] = value;\n return dayjs(base)\n .hour(Number(hour ?? 0))\n .minute(Number(minute ?? 0))\n .second(Number(second ?? 0))\n .millisecond(0)\n .toDate();\n}\n\nexport function MobileTimePickerView({\n value,\n onChange,\n}: {\n value: Date;\n onChange: (value: Date) => void;\n}) {\n return (\n <PickerView\n columns={[hourOptions, minuteOptions, secondOptions]}\n value={getTimePickerValue(value)}\n onChange={(nextValue) => onChange(applyTimePickerValue(value, nextValue))}\n className=\"sy-mobile-time-picker\"\n renderLabel={(item) => item.label}\n />\n );\n}\n\nfunction resolveDateRange(center: Date, min?: Date, max?: Date) {\n const centerDay = dayjs(center).startOf('day');\n const minDay = min ? dayjs(min).startOf('day') : undefined;\n const maxDay = max ? dayjs(max).startOf('day') : undefined;\n let start =\n minDay && minDay.isAfter(centerDay.subtract(365, 'day'))\n ? minDay\n : centerDay.subtract(365, 'day');\n let end =\n maxDay && maxDay.isBefore(centerDay.add(365, 'day')) ? maxDay : centerDay.add(365, 'day');\n\n if (end.isBefore(start)) {\n end = start;\n }\n\n if (end.diff(start, 'day') > 730) {\n start =\n minDay && minDay.isAfter(centerDay.subtract(365, 'day'))\n ? minDay\n : centerDay.subtract(365, 'day');\n end = start.add(730, 'day');\n if (maxDay && end.isAfter(maxDay)) {\n end = maxDay;\n start = end.subtract(730, 'day');\n if (minDay && start.isBefore(minDay)) start = minDay;\n }\n }\n\n return { start, end };\n}\n\nfunction getDateOptions(center: Date, min?: Date, max?: Date) {\n const { start, end } = resolveDateRange(center, min, max);\n const total = end.diff(start, 'day');\n return Array.from({ length: total + 1 }, (_, index) => {\n const date = start.add(index, 'day');\n return {\n label: date.format('YYYY-MM-DD'),\n value: date.format('YYYY-MM-DD'),\n };\n });\n}\n\nexport function getDateTimePickerValue(date: Date): PickerValue[] {\n return [dayjs(date).format('YYYY-MM-DD'), ...getTimePickerValue(date)];\n}\n\nexport function applyDateTimePickerValue(base: Date, value: PickerValue[]) {\n const [dateValue, hour, minute, second] = value;\n const date = dayjs(String(dateValue || dayjs(base).format('YYYY-MM-DD')));\n return date\n .hour(Number(hour ?? 0))\n .minute(Number(minute ?? 0))\n .second(Number(second ?? 0))\n .millisecond(0)\n .toDate();\n}\n\nexport function MobileDateTimePickerView({\n value,\n min,\n max,\n onChange,\n}: {\n value: Date;\n min?: Date;\n max?: Date;\n onChange: (value: Date) => void;\n}) {\n const columns = React.useMemo(\n () => [getDateOptions(value, min, max), hourOptions, minuteOptions, secondOptions],\n [value, min, max],\n );\n\n return (\n <PickerView\n columns={columns}\n value={getDateTimePickerValue(value)}\n onChange={(nextValue) => onChange(applyDateTimePickerValue(value, nextValue))}\n className=\"sy-mobile-time-picker sy-mobile-date-time-picker\"\n renderLabel={(item) => item.label}\n />\n );\n}\n","import React from 'react';\nimport type { DateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { formatDateValue } from './dateFormat';\n\nexport function DateFieldReadonly({\n fieldId,\n readonlyClassName,\n dateFormat,\n showTime,\n}: DateFieldProps) {\n const { formData } = useFormContext();\n const value = formData[fieldId] as string | undefined;\n const display = formatDateValue(value, dateFormat, showTime);\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 zhCN from 'antd/lib/date-picker/locale/zh_CN.js';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getDisabledDate } from '../DateField/dateRestrictionUtils';\nimport {\n getDateDisplayFormat,\n normalizeDateRangeValue,\n shouldShowDateTime,\n} from '../DateField/dateFormat';\n\nconst { RangePicker } = DatePicker;\n\nexport function CascadeDateFieldPC({\n fieldId,\n placeholder,\n inputClassName,\n behavior,\n dateFormat,\n showTime,\n dateRestriction,\n onChange,\n}: CascadeDateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = normalizeDateRangeValue(formData[fieldId]);\n const disabled = behavior === 'DISABLED';\n const format = getDateDisplayFormat(dateFormat, showTime);\n const inferredShowTime = shouldShowDateTime(dateFormat, showTime);\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 const disabledDate = getDisabledDate(dateRestriction);\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 locale={zhCN}\n format={format}\n showTime={inferredShowTime}\n disabledDate={disabledDate}\n onChange={handleChange}\n data-testid={`cascadedatefield-input-${fieldId}`}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { Calendar } from 'antd-mobile';\nimport dayjs from 'dayjs';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { getDateMinMax } from '../DateField/dateRestrictionUtils';\nimport {\n formatDateValue,\n getDateDisplayFormat,\n normalizeDateRangeValue,\n shouldShowDateTime,\n} from '../DateField/dateFormat';\nimport { MobileBottomSheet, MobileFieldTrigger, MobileSheetHeader } from '../shared/MobileField';\nimport { MobileDateTimePickerView } from '../shared/MobileDatePicker';\n\nexport function CascadeDateFieldMobile({\n fieldId,\n inputClassName,\n behavior,\n startLabel,\n endLabel,\n dateFormat,\n showTime,\n dateRestriction,\n onChange,\n}: CascadeDateFieldProps) {\n const { formData, setFieldValue } = useFormContext();\n const value = normalizeDateRangeValue(formData[fieldId]);\n const disabled = behavior === 'DISABLED';\n const [visible, setVisible] = useState(false);\n const [tempRange, setTempRange] = useState<[Date, Date] | null>(null);\n const [timeStep, setTimeStep] = useState<'start' | 'end'>('start');\n const [tempStart, setTempStart] = useState<Date>(new Date());\n const [tempEnd, setTempEnd] = useState<Date>(new Date());\n const format = getDateDisplayFormat(dateFormat, showTime);\n const inferredShowTime = shouldShowDateTime(dateFormat, showTime);\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 const { min, max } = getDateMinMax(dateRestriction);\n\n const hasValue = Boolean(value?.start || value?.end);\n const displayValue =\n value?.start && value?.end\n ? `${formatDateValue(value.start, dateFormat, showTime)} - ${formatDateValue(\n value.end,\n dateFormat,\n showTime,\n )}`\n : undefined;\n\n const openPicker = () => {\n if (disabled) return;\n if (inferredShowTime) {\n const fallbackStart = startValue ?? new Date();\n const fallbackEnd =\n endValue && dayjs(endValue).isAfter(fallbackStart) ? endValue : fallbackStart;\n setTempStart(fallbackStart);\n setTempEnd(fallbackEnd);\n setTimeStep('start');\n } else {\n setTempRange(startValue && endValue ? [startValue, endValue] : null);\n }\n setVisible(true);\n };\n\n const commitRange = (startDate: Date, endDate: Date) => {\n const newVal = {\n start: dayjs(startDate).format(format),\n end: dayjs(endDate).format(format),\n };\n setFieldValue(fieldId, newVal);\n onChange?.(newVal);\n setVisible(false);\n };\n\n const handleDateConfirm = () => {\n if (!tempRange) {\n setFieldValue(fieldId, null);\n onChange?.(null);\n setVisible(false);\n return;\n }\n commitRange(tempRange[0], tempRange[1]);\n };\n\n const handleTimeConfirm = () => {\n if (timeStep === 'start') {\n const nextEnd = dayjs(tempEnd).isBefore(tempStart) ? tempStart : tempEnd;\n setTempEnd(nextEnd);\n setTimeStep('end');\n return;\n }\n commitRange(tempStart, dayjs(tempEnd).isBefore(tempStart) ? tempStart : tempEnd);\n };\n\n const handleClear = () => {\n setFieldValue(fieldId, null);\n onChange?.(null);\n };\n\n const handleRangeChange = (dateRange: [Date, Date] | null) => {\n setTempRange(dateRange);\n };\n\n const updateTempStart = (nextStart: Date) => {\n setTempStart(nextStart);\n if (dayjs(tempEnd).isBefore(nextStart)) {\n setTempEnd(nextStart);\n }\n };\n\n const updateTempEnd = (nextEnd: Date) => {\n setTempEnd(dayjs(nextEnd).isBefore(tempStart) ? tempStart : nextEnd);\n };\n\n const endMin = min && dayjs(min).isAfter(tempStart) ? min : tempStart;\n\n return (\n <div className={inputClassName} data-testid={`cascadedatefield-input-${fieldId}`}>\n <MobileFieldTrigger\n value={displayValue}\n placeholder={\n startLabel || endLabel\n ? `${startLabel || '开始日期'} - ${endLabel || '结束日期'}`\n : '请选择日期区间'\n }\n contentClassName={inferredShowTime ? 'sy-mobile-date-range-value' : undefined}\n disabled={disabled}\n clearable={hasValue}\n onClick={openPicker}\n onClear={handleClear}\n testId={`cascadedatefield-trigger-${fieldId}`}\n />\n <MobileBottomSheet\n visible={visible}\n onClose={() => setVisible(false)}\n testId={`cascadedatefield-popup-${fieldId}`}\n >\n <div className=\"sy-mobile-date-sheet\">\n <MobileSheetHeader\n title={\n inferredShowTime\n ? timeStep === 'start'\n ? '选择开始时间'\n : '选择结束时间'\n : undefined\n }\n confirmText={inferredShowTime && timeStep === 'start' ? '下一步' : '确定'}\n onCancel={() => setVisible(false)}\n onConfirm={inferredShowTime ? handleTimeConfirm : handleDateConfirm}\n confirmTestId={`cascadedatefield-confirm-${fieldId}`}\n />\n {inferredShowTime ? (\n <MobileDateTimePickerView\n value={timeStep === 'start' ? tempStart : tempEnd}\n min={timeStep === 'start' ? min : endMin}\n max={max}\n onChange={timeStep === 'start' ? updateTempStart : updateTempEnd}\n />\n ) : (\n <Calendar\n selectionMode=\"range\"\n value={tempRange}\n min={min}\n max={max}\n allowClear={false}\n onChange={handleRangeChange}\n />\n )}\n </div>\n </MobileBottomSheet>\n </div>\n );\n}\n","import React from 'react';\nimport type { CascadeDateFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { formatDateValue, normalizeDateRangeValue } from '../DateField/dateFormat';\n\nexport function CascadeDateFieldReadonly({\n fieldId,\n readonlyClassName,\n dateFormat,\n showTime,\n}: CascadeDateFieldProps) {\n const { formData } = useFormContext();\n const value = normalizeDateRangeValue(formData[fieldId]);\n const display =\n value && value.start && value.end\n ? `${formatDateValue(value.start, dateFormat, showTime)} ~ ${formatDateValue(value.end, dateFormat, showTime)}`\n : '--';\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 } from 'antd';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n FileActionButton,\n FileStatusText,\n FileTypeIcon,\n PaperClipOutlined,\n} from '../shared/FileDisplay';\nimport {\n createUid,\n dedupeAttachmentItems,\n getAttachmentItemIdentity,\n getFileExtension,\n isImageFile,\n normalizeAttachmentItem,\n} from '../shared/fieldFormat';\nimport { collectTransferFiles } from '../shared/fileTransfer';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => {\n const uid = file.uid || createUid('attachment');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nconst PREVIEW_PAGE_EXTENSIONS = [\n 'pdf',\n 'xls',\n 'xlsx',\n 'csv',\n 'txt',\n 'json',\n 'xml',\n 'log',\n 'md',\n 'doc',\n 'docx',\n 'ppt',\n 'pptx',\n];\n\nfunction canPreview(item: AttachmentItem) {\n const ext = getFileExtension(item.name);\n return (\n isImageFile(item.name, item.contentType) ||\n ['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext) ||\n PREVIEW_PAGE_EXTENSIONS.includes(ext)\n );\n}\n\nexport function AttachmentFieldPC({\n fieldId,\n behavior,\n maxCount,\n accept,\n maxSize,\n bucketName = 'attachments',\n multiple = true,\n allowedTypes,\n showPreview = true,\n showDownload = true,\n showFileSize = true,\n showFileTypeBadge = true,\n previewPagePath = '/file-preview',\n onChange,\n}: AttachmentFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = React.useMemo(\n () =>\n dedupeAttachmentItems(\n Array.isArray(formData[fieldId]) ? (formData[fieldId] as AttachmentItem[]) : [],\n ),\n [fieldId, formData],\n );\n const valueRef = React.useRef(value);\n const disabled = behavior === 'DISABLED';\n\n React.useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const setValue = (items: AttachmentItem[]) => {\n const nextItems = dedupeAttachmentItems(items).slice(0, maxCount ?? Infinity);\n valueRef.current = nextItems;\n setFieldValue(fieldId, nextItems);\n onChange?.(nextItems);\n };\n\n const replaceItem = (target: AttachmentItem, nextItem: AttachmentItem) => {\n const targetKeys = new Set(\n [target.id, target.uid, target.objectName, getAttachmentItemIdentity(target)].filter(Boolean),\n );\n let replaced = false;\n const nextItems = valueRef.current.map((item) => {\n const currentKeys = [item.id, item.uid, item.objectName, getAttachmentItemIdentity(item)];\n if (currentKeys.some((key) => key && targetKeys.has(key))) {\n replaced = true;\n return nextItem;\n }\n return item;\n });\n if (!replaced) nextItems.push(nextItem);\n setValue(nextItems);\n };\n\n const handleRemove = (file: any) => {\n const fileKey = String(file.uid || file.id || file.objectName || '');\n const removed = valueRef.current.find(\n (item) => item.id === fileKey || item.uid === fileKey || item.objectName === fileKey,\n );\n const newValue = valueRef.current.filter(\n (item) => item.id !== fileKey && item.uid !== fileKey && item.objectName !== fileKey,\n );\n setValue(newValue);\n if (removed?.objectName) {\n api.deleteFile(removed.objectName, removed.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const resolvePreviewUrl = async (item: AttachmentItem) => {\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n const ticketValue = typeof ticket === 'string' ? { previewUrl: ticket } : ticket;\n if (ticketValue?.previewPageUrl && ticketValue?.ticket) {\n const separator = ticketValue.previewPageUrl.includes('?') ? '&' : '?';\n return `${ticketValue.previewPageUrl}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n if (ticketValue?.ticket && PREVIEW_PAGE_EXTENSIONS.includes(getFileExtension(item.name))) {\n const separator = previewPagePath.includes('?') ? '&' : '?';\n return `${previewPagePath}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n return ticketValue?.previewUrl || ticketValue?.url || '';\n }\n return item.previewUrl || item.url || '';\n };\n\n const resolveDownloadUrl = async (item: AttachmentItem) => {\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n return typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || '';\n }\n return item.downloadUrl || item.url || '';\n };\n\n const handlePreview = async (file: any) => {\n const item = valueRef.current.find(\n (current) =>\n current.id === file.uid || current.uid === file.uid || current.objectName === file.uid,\n );\n const url = item ? await resolvePreviewUrl(item) : file.url;\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const handleDownload = async (item: AttachmentItem) => {\n const url = await resolveDownloadUrl(item);\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const beforeUpload = (file: any) => {\n if (maxCount && valueRef.current.length >= maxCount) {\n return false;\n }\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 uploadAttachmentFile = async (\n currentFile: File & { uid?: string },\n callbacks?: {\n onProgress?: (event: { percent: number }) => void;\n onSuccess?: (item: AttachmentItem) => void;\n onError?: (error: Error) => void;\n },\n ) => {\n const localItem = createLocalItem(currentFile);\n const currentValue = valueRef.current.filter(\n (item) => item.id !== localItem.id && item.uid !== localItem.uid,\n );\n const nextValue = multiple ? [...currentValue, localItem] : [localItem];\n setValue(nextValue);\n try {\n const uploaded = await api.uploadFile(currentFile, bucketName, (percent) => {\n callbacks?.onProgress?.({ percent });\n replaceItem(localItem, { ...localItem, percent, status: 'uploading' });\n });\n const completed = normalizeAttachmentItem(\n {\n ...uploaded,\n status: 'done',\n percent: 100,\n extension: uploaded.extension || getFileExtension(uploaded.name || localItem.name),\n },\n localItem,\n );\n replaceItem(localItem, completed);\n callbacks?.onSuccess?.(completed);\n } catch (error: any) {\n const failed = {\n ...localItem,\n status: 'error' as const,\n error: error?.message || '上传失败',\n };\n replaceItem(localItem, failed);\n callbacks?.onError?.(error);\n }\n };\n\n const customRequest = async ({ file, onProgress, onSuccess, onError }: any) => {\n await uploadAttachmentFile(file as File & { uid?: string }, { onProgress, onSuccess, onError });\n };\n\n const uploadTransferFiles = (files: File[]) => {\n files.forEach((file) => {\n if (beforeUpload(file) === false) return;\n void uploadAttachmentFile(file as File & { uid?: string });\n });\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const files = collectTransferFiles(event.clipboardData?.files, event.clipboardData?.items);\n if (!files.length) return;\n event.preventDefault();\n uploadTransferFiles(files);\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\n const files = collectTransferFiles(event.dataTransfer?.files, event.dataTransfer?.items);\n uploadTransferFiles(files);\n };\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'copy';\n };\n\n return (\n <div className=\"sy-attachment-field\" data-testid={`attachmentfield-enhanced-${fieldId}`}>\n <div className=\"sy-upload-inline sy-attachment-upload-inline\">\n <Upload\n data-testid={`attachmentfield-input-${fieldId}`}\n fileList={[]}\n customRequest={customRequest}\n accept={accept}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\n showUploadList={false}\n onRemove={handleRemove}\n onPreview={handlePreview}\n beforeUpload={beforeUpload}\n >\n <button\n type=\"button\"\n className=\"sy-upload-button\"\n disabled={disabled}\n data-testid={`attachmentfield-upload-btn-${fieldId}`}\n >\n <PaperClipOutlined />\n 上传文件\n </button>\n </Upload>\n <div\n className={`sy-upload-paste-zone${disabled ? ' is-disabled' : ''}`}\n tabIndex={disabled ? -1 : 0}\n aria-label=\"拖拽或点击后粘贴图片\"\n data-testid={`attachmentfield-paste-zone-${fieldId}`}\n onPaste={handlePaste}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n >\n <span>拖拽或点击后粘贴图片</span>\n </div>\n </div>\n {value.length > 0 && (\n <div className=\"sy-file-list\" data-testid={`attachmentfield-rich-list-${fieldId}`}>\n {value.map((item, index) => {\n const itemKey =\n getAttachmentItemIdentity(item) || `${fieldId}-attachment-${String(index)}`;\n return (\n <div\n className=\"sy-file-item\"\n key={`${itemKey}-${index}`}\n data-testid={`attachmentfield-item-${itemKey}`}\n >\n <FileTypeIcon item={item} />\n <div className=\"sy-file-meta\">\n <span className=\"sy-file-name\" title={item.name}>\n {item.name}\n </span>\n <FileStatusText\n item={item}\n showFileSize={showFileSize}\n showFileTypeBadge={showFileTypeBadge}\n />\n </div>\n <div className=\"sy-file-actions\">\n {showPreview && canPreview(item) && (\n <FileActionButton\n type=\"preview\"\n disabled={item.status !== 'done'}\n onClick={() => handlePreview({ uid: item.uid || item.id, url: item.url })}\n />\n )}\n {showDownload && (\n <FileActionButton\n type=\"download\"\n disabled={item.status !== 'done'}\n onClick={() => handleDownload(item)}\n />\n )}\n <FileActionButton\n type=\"remove\"\n disabled={disabled}\n onClick={() => handleRemove({ uid: item.uid || item.id })}\n testId={`attachmentfield-remove-${itemKey}`}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport {\n AudioOutlined,\n CloseOutlined,\n DownloadOutlined,\n EyeOutlined,\n FileExcelOutlined,\n FileImageOutlined,\n FileOutlined,\n FilePdfOutlined,\n FilePptOutlined,\n FileTextOutlined,\n FileUnknownOutlined,\n FileWordOutlined,\n FileZipOutlined,\n PaperClipOutlined,\n PlusOutlined,\n UploadOutlined,\n VideoCameraOutlined,\n} from '@ant-design/icons';\nimport type { AttachmentItem } from '../../types';\nimport { formatFileSize, getFileCategory, getFileExtension } from './fieldFormat';\n\nexport { PaperClipOutlined, PlusOutlined, UploadOutlined };\n\nexport function FileTypeIcon({\n item,\n className,\n}: {\n item: Pick<AttachmentItem, 'name' | 'contentType'>;\n className?: string;\n}) {\n const category = getFileCategory(item.name, item.contentType);\n const extension = getFileExtension(item.name);\n const icon =\n category === 'image' ? (\n <FileImageOutlined />\n ) : category === 'video' ? (\n <VideoCameraOutlined />\n ) : category === 'audio' ? (\n <AudioOutlined />\n ) : category === 'pdf' ? (\n <FilePdfOutlined />\n ) : category === 'excel' ? (\n <FileExcelOutlined />\n ) : category === 'word' ? (\n <FileWordOutlined />\n ) : category === 'ppt' ? (\n <FilePptOutlined />\n ) : category === 'archive' ? (\n <FileZipOutlined />\n ) : category === 'text' || category === 'code' ? (\n <FileTextOutlined />\n ) : extension ? (\n <FileOutlined />\n ) : (\n <FileUnknownOutlined />\n );\n\n return (\n <span className={`sy-file-icon sy-file-icon-${category} ${className || ''}`} aria-hidden=\"true\">\n {icon}\n {category !== 'image' && extension ? <span>{extension.toUpperCase()}</span> : null}\n </span>\n );\n}\n\nexport function FileActionButton({\n type,\n disabled,\n onClick,\n testId,\n}: {\n type: 'preview' | 'download' | 'remove';\n disabled?: boolean;\n onClick?: () => void;\n testId?: string;\n}) {\n const label = type === 'preview' ? '预览' : type === 'download' ? '下载' : '删除';\n const icon =\n type === 'preview' ? (\n <EyeOutlined />\n ) : type === 'download' ? (\n <DownloadOutlined />\n ) : (\n <CloseOutlined />\n );\n\n return (\n <button\n type=\"button\"\n className={`sy-file-action sy-file-action-${type}`}\n disabled={disabled}\n onClick={onClick}\n data-testid={testId}\n aria-label={label}\n title={label}\n >\n {icon}\n <span className=\"sy-sr-only\">{label}</span>\n </button>\n );\n}\n\nexport function FileStatusText({\n item,\n showFileSize = true,\n showFileTypeBadge = true,\n}: {\n item: AttachmentItem;\n showFileSize?: boolean;\n showFileTypeBadge?: boolean;\n}) {\n const extension = getFileExtension(item.name);\n const text =\n item.status === 'uploading'\n ? `上传中 ${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : [\n showFileTypeBadge && extension ? extension.toUpperCase() : '',\n showFileSize ? formatFileSize(item.size) : '',\n ]\n .filter(Boolean)\n .join(' · ') || '已上传';\n\n return <span className=\"sy-file-sub\">{text}</span>;\n}\n","import type { AttachmentItem, DepartmentTreeNode, UserDisplayFormat, UserItem } from '../../types';\n\nexport const EMPTY_TEXT = '--';\n\nexport function createUid(prefix = 'field') {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function getUserId(user: Partial<UserItem> | any): string {\n if (typeof user === 'string' || typeof user === 'number') return String(user).trim();\n return String(user?.id || user?.userId || user?.userid || user?.value || user?.key || '').trim();\n}\n\nexport function getUserName(user: Partial<UserItem> | any): string {\n if (typeof user === 'string' || typeof user === 'number') return String(user).trim();\n return String(\n user?.name || user?.label || user?.title || user?.username || user?.nickname || getUserId(user),\n );\n}\n\nexport function normalizeUser(user: any): UserItem {\n const id = getUserId(user);\n const source = typeof user === 'object' && user !== null ? user : {};\n return {\n ...source,\n id,\n name: getUserName({ ...source, id }),\n };\n}\n\nexport function normalizeUserArray(value: any): UserItem[] {\n const source = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n return source.map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function getDepartmentId(node: Partial<DepartmentTreeNode> | any): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node).trim();\n return String(\n node?.id || node?.departmentId || node?.deptId || node?.value || node?.key || '',\n ).trim();\n}\n\nexport function getDepartmentName(node: Partial<DepartmentTreeNode> | any): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node).trim();\n return String(\n node?.name ||\n node?.label ||\n node?.title ||\n node?.deptName ||\n node?.departmentName ||\n getDepartmentId(node),\n );\n}\n\nexport function normalizeDepartmentNode(node: any): DepartmentTreeNode {\n const id = getDepartmentId(node);\n const source = typeof node === 'object' && node !== null ? node : {};\n const name = getDepartmentName({ ...source, id });\n const hasChildren =\n typeof node?.hasChildren === 'boolean'\n ? node.hasChildren\n : Array.isArray(node?.children) && node.children.length > 0;\n const children = Array.isArray(node?.children)\n ? node.children.map((child: any) => normalizeDepartmentNode(child))\n : undefined;\n return {\n ...source,\n id,\n name,\n key: String(node?.key || id),\n title: String(node?.title || name),\n hasChildren,\n isLeaf: typeof node?.isLeaf === 'boolean' ? node.isLeaf : !hasChildren,\n children,\n };\n}\n\nexport function normalizeDepartmentArray(value: any): DepartmentTreeNode[] {\n const source = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n return source.map(normalizeDepartmentNode).filter((dept) => getDepartmentId(dept));\n}\n\nexport function flattenDepartments(nodes: DepartmentTreeNode[]) {\n const result: Array<{ id: string; name: string; node: DepartmentTreeNode }> = [];\n const walk = (items: DepartmentTreeNode[]) => {\n for (const node of items) {\n const id = getDepartmentId(node);\n if (id) result.push({ id, name: getDepartmentName(node), node });\n if (node.children?.length) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function formatUserDisplay(user: UserItem, format?: UserDisplayFormat): string {\n const normalized = normalizeUser(user);\n if (!format || format === 'name') return normalized.name;\n switch (format) {\n case 'nameWithJobNumber':\n return normalized.jobNumber\n ? `${normalized.name}(${normalized.jobNumber})`\n : normalized.name;\n case 'nameWithDepartment':\n return normalized.departments?.[0]?.name\n ? `${normalized.name}(${normalized.departments[0].name})`\n : normalized.name;\n default:\n return normalized.name;\n }\n}\n\n/**\n * 获取部门全路径(从根节点到目标节点)\n */\nexport function getDepartmentFullPath(deptId: string, treeData?: DepartmentTreeNode[]): string {\n if (!treeData) return '';\n const path: string[] = [];\n\n function findPath(nodes: DepartmentTreeNode[], target: string): boolean {\n for (const node of nodes) {\n path.push(getDepartmentName(node));\n if (getDepartmentId(node) === target) return true;\n if (node.children && findPath(node.children, target)) return true;\n path.pop();\n }\n return false;\n }\n\n findPath(treeData, deptId);\n return path.join('/');\n}\n\n/**\n * 过滤部门树,只保留指定部门及其子树\n */\nexport function filterTreeByScope(\n treeData: DepartmentTreeNode[],\n scopeType?: 'all' | 'specified',\n specifiedDepts?: string[],\n): DepartmentTreeNode[] {\n if (!scopeType || scopeType === 'all' || !specifiedDepts?.length) {\n return treeData;\n }\n const specifiedSet = new Set(specifiedDepts);\n\n function filterNodes(nodes: DepartmentTreeNode[]): DepartmentTreeNode[] {\n const result: DepartmentTreeNode[] = [];\n for (const node of nodes) {\n const nodeId = getDepartmentId(node);\n if (specifiedSet.has(nodeId)) {\n // 保留此节点及其全部子树\n result.push(node);\n } else if (node.children?.length) {\n // 递归检查子节点\n const filteredChildren = filterNodes(node.children);\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n }\n return result;\n }\n\n return filterNodes(treeData);\n}\n\nexport function formatFileSize(bytes?: number): string {\n if (!bytes) return '';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${Number(value.toFixed(value >= 10 || index === 0 ? 0 : 1))} ${units[index]}`;\n}\n\nexport function getFileExtension(fileName?: string): string {\n return (\n String(fileName || '')\n .split('.')\n .pop()\n ?.toLowerCase() || ''\n );\n}\n\nexport function isImageFile(fileName?: string, contentType?: string): boolean {\n return (\n String(contentType || '').startsWith('image/') ||\n ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp'].includes(getFileExtension(fileName))\n );\n}\n\nexport function getFileCategory(fileName?: string, contentType?: string) {\n const ext = getFileExtension(fileName);\n if (isImageFile(fileName, contentType)) return 'image';\n if (['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext)) return 'video';\n if (['mp3', 'wav', 'aac', 'flac', 'm4a', 'ogg'].includes(ext)) return 'audio';\n if (ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv'].includes(ext)) return 'excel';\n if (['doc', 'docx'].includes(ext)) return 'word';\n if (['ppt', 'pptx'].includes(ext)) return 'ppt';\n if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) return 'archive';\n if (['txt', 'json', 'xml', 'log', 'md'].includes(ext)) return 'text';\n if (['js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'less', 'java', 'py'].includes(ext)) {\n return 'code';\n }\n return 'file';\n}\n\nexport function normalizeAttachmentItem(\n item: any,\n fallback?: Partial<AttachmentItem>,\n): AttachmentItem {\n const id = String(item?.id || item?.uid || item?.objectName || fallback?.id || createUid('file'));\n const name = String(item?.name || item?.originalName || fallback?.name || item?.fileName || id);\n return {\n ...fallback,\n ...item,\n id,\n uid: String(item?.uid || item?.id || fallback?.uid || id),\n name,\n originalName: item?.originalName || fallback?.originalName || name,\n url: String(item?.url || item?.downloadUrl || item?.previewUrl || fallback?.url || ''),\n status: item?.status || fallback?.status || 'done',\n size: item?.size ?? fallback?.size,\n percent: item?.percent ?? fallback?.percent,\n contentType: item?.contentType || item?.mimeType || fallback?.contentType,\n mimeType: item?.mimeType || item?.contentType || fallback?.mimeType,\n extension: item?.extension || fallback?.extension || getFileExtension(name),\n };\n}\n\nexport function getAttachmentItemIdentity(item: Partial<AttachmentItem> | any): string {\n return String(item?.uid || item?.id || item?.objectName || item?.url || item?.name || '');\n}\n\nexport function dedupeAttachmentItems(items: AttachmentItem[]): AttachmentItem[] {\n const result: AttachmentItem[] = [];\n const indexes = new Map<string, number>();\n\n for (const item of items) {\n const key = getAttachmentItemIdentity(item);\n if (!key) {\n result.push(item);\n continue;\n }\n\n const existingIndex = indexes.get(key);\n if (existingIndex === undefined) {\n indexes.set(key, result.length);\n result.push(item);\n continue;\n }\n\n result[existingIndex] = {\n ...result[existingIndex],\n ...item,\n };\n }\n\n return result;\n}\n","export function collectTransferFiles(\n files?: FileList | null,\n items?: DataTransferItemList | null,\n): File[] {\n const directFiles = Array.from(files ?? []);\n const itemFiles = Array.from(items ?? [])\n .map((item) => (item.kind === 'file' ? item.getAsFile() : null))\n .filter((file): file is File => Boolean(file));\n return Array.from(new Set([...directFiles, ...itemFiles]));\n}\n","import React from 'react';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n FileActionButton,\n FileStatusText,\n FileTypeIcon,\n UploadOutlined,\n} from '../shared/FileDisplay';\nimport {\n createUid,\n dedupeAttachmentItems,\n getAttachmentItemIdentity,\n getFileExtension,\n isImageFile,\n normalizeAttachmentItem,\n} from '../shared/fieldFormat';\n\nconst PREVIEW_PAGE_EXTENSIONS = [\n 'pdf',\n 'xls',\n 'xlsx',\n 'csv',\n 'txt',\n 'json',\n 'xml',\n 'log',\n 'md',\n 'doc',\n 'docx',\n 'ppt',\n 'pptx',\n];\n\nconst createLocalItem = (file: File): AttachmentItem => {\n const uid = createUid('attachment');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nfunction canPreview(item: AttachmentItem) {\n const ext = getFileExtension(item.name);\n return (\n isImageFile(item.name, item.contentType) ||\n ['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext) ||\n PREVIEW_PAGE_EXTENSIONS.includes(ext)\n );\n}\n\nexport function AttachmentFieldMobile({\n fieldId,\n behavior,\n maxCount,\n accept,\n maxSize,\n bucketName = 'attachments',\n multiple = true,\n allowedTypes,\n showPreview = true,\n showDownload = true,\n showFileSize = true,\n showFileTypeBadge = true,\n previewPagePath = '/file-preview',\n onChange,\n}: AttachmentFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = React.useMemo(\n () =>\n dedupeAttachmentItems(\n Array.isArray(formData[fieldId]) ? (formData[fieldId] as AttachmentItem[]) : [],\n ),\n [fieldId, formData],\n );\n const valueRef = React.useRef(value);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const disabled = behavior === 'DISABLED';\n\n React.useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const setValue = (items: AttachmentItem[]) => {\n const nextItems = dedupeAttachmentItems(items).slice(0, maxCount ?? Infinity);\n valueRef.current = nextItems;\n setFieldValue(fieldId, nextItems);\n onChange?.(nextItems);\n };\n\n const replaceItem = (target: AttachmentItem, nextItem: AttachmentItem) => {\n const targetKeys = new Set(\n [target.id, target.uid, target.objectName, getAttachmentItemIdentity(target)].filter(Boolean),\n );\n let replaced = false;\n const nextItems = valueRef.current.map((item) => {\n const currentKeys = [item.id, item.uid, item.objectName, getAttachmentItemIdentity(item)];\n if (currentKeys.some((key) => key && targetKeys.has(key))) {\n replaced = true;\n return nextItem;\n }\n return item;\n });\n if (!replaced) nextItems.push(nextItem);\n setValue(nextItems);\n };\n\n const validateFile = (file: File) => {\n if (maxCount && valueRef.current.length >= maxCount) return false;\n if (maxSize && file.size / 1024 / 1024 > maxSize) return false;\n const ext = getFileExtension(file.name);\n if (allowedTypes?.length && ext && !allowedTypes.includes(ext)) return false;\n return true;\n };\n\n const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files || []).filter(validateFile);\n event.target.value = '';\n if (!files.length) return;\n\n const localItems = files.map(createLocalItem);\n setValue(multiple ? [...valueRef.current, ...localItems] : localItems.slice(0, 1));\n\n files.forEach((file, index) => {\n const localItem = localItems[index];\n api\n .uploadFile(file, bucketName, (percent) => {\n replaceItem(localItem, { ...localItem, percent, status: 'uploading' });\n })\n .then((uploaded) => {\n replaceItem(\n localItem,\n normalizeAttachmentItem(\n {\n ...uploaded,\n status: 'done',\n percent: 100,\n extension: uploaded.extension || getFileExtension(uploaded.name || localItem.name),\n },\n localItem,\n ),\n );\n })\n .catch((error: any) => {\n replaceItem(localItem, {\n ...localItem,\n status: 'error',\n error: error?.message || '上传失败',\n });\n });\n });\n };\n\n const handleRemove = (item: AttachmentItem) => {\n const itemKey = item.uid || item.id || item.objectName;\n const next = valueRef.current.filter(\n (current) =>\n current.id !== itemKey && current.uid !== itemKey && current.objectName !== itemKey,\n );\n setValue(next);\n if (item.objectName) {\n api.deleteFile(item.objectName, item.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const resolvePreviewUrl = async (item: AttachmentItem) => {\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n const ticketValue = typeof ticket === 'string' ? { previewUrl: ticket } : ticket;\n if (ticketValue?.previewPageUrl && ticketValue?.ticket) {\n const separator = ticketValue.previewPageUrl.includes('?') ? '&' : '?';\n return `${ticketValue.previewPageUrl}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n if (ticketValue?.ticket && PREVIEW_PAGE_EXTENSIONS.includes(getFileExtension(item.name))) {\n const separator = previewPagePath.includes('?') ? '&' : '?';\n return `${previewPagePath}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n }\n return ticketValue?.previewUrl || ticketValue?.url || '';\n }\n return item.previewUrl || item.url || '';\n };\n\n const resolveDownloadUrl = async (item: AttachmentItem) => {\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n return typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || '';\n }\n return item.downloadUrl || item.url || '';\n };\n\n const openUrl = (url: string) => {\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <div className=\"sy-attachment-field\" data-testid={`attachmentfield-mobile-${fieldId}`}>\n {(!maxCount || value.length < maxCount) && (\n <button\n type=\"button\"\n className={`sy-mobile-upload-button ${disabled ? 'is-disabled' : ''}`}\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n data-testid={`attachmentfield-upload-btn-${fieldId}`}\n >\n <UploadOutlined />\n 上传文件\n </button>\n )}\n <input\n ref={inputRef}\n className=\"sy-mobile-hidden-input\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n onChange={handleFileSelect}\n data-testid={`attachmentfield-file-input-${fieldId}`}\n />\n {value.length > 0 && (\n <div className=\"sy-file-list\" data-testid={`attachmentfield-list-${fieldId}`}>\n {value.map((item, index) => {\n const itemKey =\n getAttachmentItemIdentity(item) || `${fieldId}-attachment-${String(index)}`;\n return (\n <div\n className=\"sy-file-item\"\n key={`${itemKey}-${index}`}\n data-testid={`attachmentfield-item-${itemKey}`}\n >\n <FileTypeIcon item={item} />\n <div className=\"sy-file-meta\">\n <span className=\"sy-file-name\" title={item.name}>\n {item.name}\n </span>\n <FileStatusText\n item={item}\n showFileSize={showFileSize}\n showFileTypeBadge={showFileTypeBadge}\n />\n </div>\n <div className=\"sy-file-actions\">\n {showPreview && canPreview(item) && (\n <FileActionButton\n type=\"preview\"\n disabled={item.status !== 'done'}\n onClick={async () => openUrl(await resolvePreviewUrl(item))}\n />\n )}\n {showDownload && (\n <FileActionButton\n type=\"download\"\n disabled={item.status !== 'done'}\n onClick={async () => openUrl(await resolveDownloadUrl(item))}\n />\n )}\n <FileActionButton\n type=\"remove\"\n disabled={disabled}\n onClick={() => handleRemove(item)}\n testId={`attachmentfield-remove-${itemKey}`}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { AttachmentFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { FileActionButton, FileStatusText, FileTypeIcon } from '../shared/FileDisplay';\nimport { getFileExtension, isImageFile } from '../shared/fieldFormat';\n\nconst getTicketUrl = (ticket: any, fallback?: string) =>\n typeof ticket === 'string'\n ? ticket\n : ticket?.previewUrl || ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || fallback;\n\nconst PREVIEW_PAGE_EXTENSIONS = [\n 'pdf',\n 'xls',\n 'xlsx',\n 'csv',\n 'txt',\n 'json',\n 'xml',\n 'log',\n 'md',\n 'doc',\n 'docx',\n 'ppt',\n 'pptx',\n];\n\nfunction canPreview(item: AttachmentItem) {\n const ext = getFileExtension(item.name);\n return (\n isImageFile(item.name, item.contentType) ||\n ['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext) ||\n PREVIEW_PAGE_EXTENSIONS.includes(ext)\n );\n}\n\nexport function AttachmentFieldReadonly({\n fieldId,\n readonlyClassName,\n bucketName = 'attachments',\n showPreview = true,\n showDownload = true,\n showFileSize = true,\n showFileTypeBadge = false,\n previewPagePath = '/file-preview',\n}: AttachmentFieldProps) {\n const { formData, api } = useFormContext();\n const { isMobile } = useDeviceDetect();\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 const previewFile = async (item: AttachmentItem) => {\n let url = item.previewUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n const ticketValue = typeof ticket === 'string' ? { previewUrl: ticket } : ticket;\n if (ticketValue?.previewPageUrl && ticketValue?.ticket) {\n const separator = ticketValue.previewPageUrl.includes('?') ? '&' : '?';\n url = `${ticketValue.previewPageUrl}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n } else if (\n ticketValue?.ticket &&\n PREVIEW_PAGE_EXTENSIONS.includes(getFileExtension(item.name))\n ) {\n const separator = previewPagePath.includes('?') ? '&' : '?';\n url = `${previewPagePath}${separator}ticket=${encodeURIComponent(ticketValue.ticket)}`;\n } else {\n url = getTicketUrl(ticketValue, url);\n }\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const downloadFile = async (item: AttachmentItem) => {\n let url = item.downloadUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n url = getTicketUrl(ticket, url);\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const rootClassName = [\n readonlyClassName || 'sy-field-readonly-value',\n 'sy-readonly-files',\n 'sy-readonly-attachments',\n isMobile ? 'is-mobile' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClassName} data-testid={`attachmentfield-readonly-${fieldId}`}>\n <div className=\"sy-file-list\">\n {value.map((item, index) => {\n const itemKey = item.id || item.uid || `${fieldId}-readonly-attachment-${String(index)}`;\n const canAct = item.status !== 'uploading' && item.status !== 'error';\n return (\n <div\n key={`${itemKey}-${index}`}\n className=\"sy-file-item\"\n data-testid={`attachmentfield-readonly-item-${itemKey}`}\n >\n <FileTypeIcon item={item} />\n <div className=\"sy-file-meta\">\n <a\n className=\"sy-file-name\"\n href={item.downloadUrl || item.url || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={item.name}\n onClick={(event) => {\n if (!item.objectName) return;\n event.preventDefault();\n void downloadFile(item);\n }}\n >\n {item.name}\n </a>\n <FileStatusText\n item={item}\n showFileSize={showFileSize}\n showFileTypeBadge={showFileTypeBadge}\n />\n </div>\n <div className=\"sy-file-actions\">\n {showPreview && canPreview(item) && (\n <FileActionButton\n type=\"preview\"\n disabled={!canAct}\n onClick={() => {\n void previewFile(item);\n }}\n />\n )}\n {showDownload && (\n <FileActionButton\n type=\"download\"\n disabled={!canAct}\n onClick={() => {\n void downloadFile(item);\n }}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { ImageFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { ImageFieldPC } from './ImageFieldPC';\nimport { ImageFieldMobile } from './ImageFieldMobile';\nimport { ImageFieldReadonly } from './ImageFieldReadonly';\n\nexport function ImageField(props: ImageFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: ImageFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <ImageFieldReadonly {...childProps} />\n ) : isMobile ? (\n <ImageFieldMobile {...childProps} />\n ) : (\n <ImageFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport { Upload } from 'antd';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FileActionButton, UploadOutlined } from '../shared/FileDisplay';\nimport {\n createUid,\n dedupeAttachmentItems,\n formatFileSize,\n getAttachmentItemIdentity,\n getFileExtension,\n normalizeAttachmentItem,\n} from '../shared/fieldFormat';\nimport { collectTransferFiles } from '../shared/fileTransfer';\n\nconst createLocalItem = (file: File & { uid?: string }): AttachmentItem => {\n const uid = file.uid || createUid('image');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nfunction ImageThumbContent({ item }: { item: AttachmentItem }) {\n const [imageFailed, setImageFailed] = React.useState(false);\n const src = item.previewUrl || item.url;\n\n React.useEffect(() => {\n setImageFailed(false);\n }, [src]);\n\n if (src && !imageFailed) {\n return (\n <>\n <img src={src} alt={item.name} onError={() => setImageFailed(true)} />\n {item.status === 'uploading' && (\n <span className=\"sy-image-state\">{Math.round(item.percent ?? 0)}%</span>\n )}\n </>\n );\n }\n\n return (\n <span className=\"sy-image-state\">\n {item.status === 'uploading'\n ? `${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : item.name || '图片'}\n </span>\n );\n}\n\nexport function ImageFieldPC({\n fieldId,\n behavior,\n maxCount,\n accept,\n bucketName = 'images',\n multiple = true,\n maxSize,\n showPreviewIcon = true,\n showRemoveIcon = true,\n showDownloadIcon = true,\n onChange,\n}: ImageFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = React.useMemo(\n () =>\n dedupeAttachmentItems(\n Array.isArray(formData[fieldId]) ? (formData[fieldId] as AttachmentItem[]) : [],\n ),\n [fieldId, formData],\n );\n const valueRef = React.useRef(value);\n const disabled = behavior === 'DISABLED';\n\n React.useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const setValue = (items: AttachmentItem[]) => {\n const nextItems = dedupeAttachmentItems(items).slice(0, maxCount ?? Infinity);\n valueRef.current = nextItems;\n setFieldValue(fieldId, nextItems);\n onChange?.(nextItems);\n };\n\n const replaceItem = (target: AttachmentItem, nextItem: AttachmentItem) => {\n const targetKeys = new Set(\n [target.id, target.uid, target.objectName, getAttachmentItemIdentity(target)].filter(Boolean),\n );\n let replaced = false;\n const nextItems = valueRef.current.map((item) => {\n const currentKeys = [item.id, item.uid, item.objectName, getAttachmentItemIdentity(item)];\n if (currentKeys.some((key) => key && targetKeys.has(key))) {\n replaced = true;\n return nextItem;\n }\n return item;\n });\n if (!replaced) nextItems.push(nextItem);\n setValue(nextItems);\n };\n\n const handleRemove = (file: any) => {\n const fileKey = String(file.uid || file.id || file.objectName || '');\n const removed = valueRef.current.find(\n (item) => item.id === fileKey || item.uid === fileKey || item.objectName === fileKey,\n );\n const newValue = valueRef.current.filter(\n (item) => item.id !== fileKey && item.uid !== fileKey && item.objectName !== fileKey,\n );\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 = valueRef.current.find(\n (current) =>\n current.id === file.uid || current.uid === file.uid || current.objectName === file.uid,\n );\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 =\n typeof ticket === 'string'\n ? ticket\n : ticket?.previewUrl || ticket?.url || ticket?.downloadUrl || '';\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const handleDownload = async (item: AttachmentItem) => {\n let url = item.downloadUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n url =\n typeof ticket === 'string'\n ? ticket\n : ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || '';\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const beforeUpload = (file: File) => {\n if (maxCount && valueRef.current.length >= maxCount) {\n return false;\n }\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 uploadImageFile = async (\n currentFile: File & { uid?: string },\n callbacks?: {\n onProgress?: (event: { percent: number }) => void;\n onSuccess?: (item: AttachmentItem) => void;\n onError?: (error: Error) => void;\n },\n ) => {\n const localItem = createLocalItem(currentFile);\n const currentValue = valueRef.current.filter(\n (item) => item.id !== localItem.id && item.uid !== localItem.uid,\n );\n const nextValue = multiple ? [...currentValue, localItem] : [localItem];\n setValue(nextValue);\n try {\n const uploaded = await api.uploadFile(currentFile, bucketName, (percent) => {\n callbacks?.onProgress?.({ percent });\n replaceItem(localItem, { ...localItem, percent, status: 'uploading' });\n });\n const completed = normalizeAttachmentItem(\n {\n ...uploaded,\n url: uploaded.previewUrl || uploaded.url || localItem.url,\n previewUrl: uploaded.previewUrl || uploaded.url || localItem.url,\n status: 'done',\n percent: 100,\n },\n localItem,\n );\n replaceItem(localItem, completed);\n callbacks?.onSuccess?.(completed);\n } catch (error: any) {\n const failed = {\n ...localItem,\n status: 'error' as const,\n error: error?.message || '上传失败',\n };\n replaceItem(localItem, failed);\n callbacks?.onError?.(error);\n }\n };\n\n const customRequest = async ({ file, onProgress, onSuccess, onError }: any) => {\n await uploadImageFile(file as File & { uid?: string }, { onProgress, onSuccess, onError });\n };\n\n const uploadTransferFiles = (files: File[]) => {\n files.forEach((file) => {\n if (beforeUpload(file) === false) return;\n void uploadImageFile(file as File & { uid?: string });\n });\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const files = collectTransferFiles(event.clipboardData?.files, event.clipboardData?.items);\n if (!files.length) return;\n event.preventDefault();\n uploadTransferFiles(files);\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\n const files = collectTransferFiles(event.dataTransfer?.files, event.dataTransfer?.items);\n uploadTransferFiles(files);\n };\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'copy';\n };\n\n const canUpload = !maxCount || value.length < maxCount;\n\n return (\n <div className=\"sy-image-field\" data-testid={`imagefield-enhanced-${fieldId}`}>\n {canUpload && (\n <div className=\"sy-upload-inline sy-image-upload-inline\">\n <Upload\n data-testid={`imagefield-input-${fieldId}`}\n fileList={[]}\n customRequest={customRequest}\n accept={accept ?? 'image/*'}\n maxCount={maxCount}\n multiple={multiple}\n disabled={disabled}\n showUploadList={false}\n onRemove={handleRemove}\n onPreview={handlePreview}\n beforeUpload={beforeUpload}\n >\n <button\n type=\"button\"\n className=\"sy-upload-button\"\n disabled={disabled}\n data-testid={`imagefield-upload-btn-${fieldId}`}\n >\n <UploadOutlined />\n 图片上传\n </button>\n </Upload>\n <div\n className={`sy-upload-paste-zone${disabled ? ' is-disabled' : ''}`}\n tabIndex={disabled ? -1 : 0}\n aria-label=\"拖拽或Ctrl+V粘贴图片\"\n data-testid={`imagefield-paste-zone-${fieldId}`}\n onPaste={handlePaste}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n >\n 拖拽或Ctrl+V粘贴图片\n </div>\n </div>\n )}\n {value.length > 0 && (\n <div\n className=\"sy-file-list sy-image-file-list\"\n data-testid={`imagefield-rich-grid-${fieldId}`}\n >\n {value.map((item, index) => {\n const itemKey = getAttachmentItemIdentity(item) || `${fieldId}-image-${String(index)}`;\n const canAct = item.status === 'done';\n return (\n <div\n key={`${itemKey}-${index}`}\n className=\"sy-file-item sy-image-file-item\"\n data-testid={`imagefield-thumb-${itemKey}`}\n >\n <button\n type=\"button\"\n className=\"sy-image-file-thumb\"\n disabled={!canAct && !(item.previewUrl || item.url)}\n onClick={() =>\n handlePreview({\n uid: item.uid || item.id,\n url: item.url,\n thumbUrl: item.previewUrl,\n })\n }\n >\n <ImageThumbContent item={item} />\n </button>\n <div className=\"sy-file-meta\">\n <span className=\"sy-file-name\" title={item.name}>\n {item.name}\n </span>\n <span className=\"sy-file-sub\">\n {item.status === 'uploading'\n ? `上传中 ${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : formatFileSize(item.size)}\n </span>\n </div>\n <div className=\"sy-file-actions\">\n {showPreviewIcon && (\n <FileActionButton\n type=\"preview\"\n disabled={!canAct}\n onClick={() =>\n handlePreview({\n uid: item.uid || item.id,\n url: item.url,\n thumbUrl: item.previewUrl,\n })\n }\n />\n )}\n {showDownloadIcon && (\n <FileActionButton\n type=\"download\"\n disabled={!canAct}\n onClick={() => handleDownload(item)}\n />\n )}\n {showRemoveIcon && (\n <FileActionButton\n type=\"remove\"\n disabled={disabled}\n onClick={() => handleRemove({ uid: item.uid || item.id })}\n testId={`remove-btn-${itemKey}`}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FileActionButton, PlusOutlined } from '../shared/FileDisplay';\nimport {\n createUid,\n dedupeAttachmentItems,\n getAttachmentItemIdentity,\n getFileExtension,\n normalizeAttachmentItem,\n} from '../shared/fieldFormat';\n\nconst createLocalItem = (file: File): AttachmentItem => {\n const uid = createUid('image');\n return {\n id: uid,\n uid,\n url: typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : '',\n name: file.name,\n status: 'uploading',\n size: file.size,\n percent: 0,\n contentType: file.type,\n mimeType: file.type,\n extension: getFileExtension(file.name),\n };\n};\n\nfunction ImageThumbContent({ item }: { item: AttachmentItem }) {\n const [imageFailed, setImageFailed] = React.useState(false);\n const src = item.previewUrl || item.url;\n\n React.useEffect(() => {\n setImageFailed(false);\n }, [src]);\n\n if (src && !imageFailed) {\n return (\n <>\n <img src={src} alt={item.name} onError={() => setImageFailed(true)} />\n {item.status === 'uploading' && (\n <span className=\"sy-image-state\">{Math.round(item.percent ?? 0)}%</span>\n )}\n </>\n );\n }\n\n return (\n <span className=\"sy-image-state\">\n {item.status === 'uploading'\n ? `${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : item.name || '图片'}\n </span>\n );\n}\n\nexport function ImageFieldMobile({\n fieldId,\n behavior,\n maxCount,\n accept,\n bucketName = 'images',\n multiple = true,\n maxSize,\n showPreviewIcon = true,\n showRemoveIcon = true,\n onChange,\n}: ImageFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const value = React.useMemo(\n () =>\n dedupeAttachmentItems(\n Array.isArray(formData[fieldId]) ? (formData[fieldId] as AttachmentItem[]) : [],\n ),\n [fieldId, formData],\n );\n const valueRef = React.useRef(value);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const disabled = behavior === 'DISABLED';\n\n React.useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const setValue = (items: AttachmentItem[]) => {\n const nextItems = dedupeAttachmentItems(items).slice(0, maxCount ?? Infinity);\n valueRef.current = nextItems;\n setFieldValue(fieldId, nextItems);\n onChange?.(nextItems);\n };\n\n const replaceItem = (target: AttachmentItem, nextItem: AttachmentItem) => {\n const targetKeys = new Set(\n [target.id, target.uid, target.objectName, getAttachmentItemIdentity(target)].filter(Boolean),\n );\n let replaced = false;\n const nextItems = valueRef.current.map((item) => {\n const currentKeys = [item.id, item.uid, item.objectName, getAttachmentItemIdentity(item)];\n if (currentKeys.some((key) => key && targetKeys.has(key))) {\n replaced = true;\n return nextItem;\n }\n return item;\n });\n if (!replaced) nextItems.push(nextItem);\n setValue(nextItems);\n };\n\n const validateFile = (file: File) => {\n if (maxCount && valueRef.current.length >= maxCount) return false;\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\n const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files || []).filter(validateFile);\n event.target.value = '';\n if (!files.length) return;\n\n const localItems = files.map(createLocalItem);\n setValue(multiple ? [...valueRef.current, ...localItems] : localItems.slice(0, 1));\n\n files.forEach((file, index) => {\n const localItem = localItems[index];\n api\n .uploadFile(file, bucketName, (percent) => {\n replaceItem(localItem, { ...localItem, percent, status: 'uploading' });\n })\n .then((uploaded) => {\n replaceItem(\n localItem,\n normalizeAttachmentItem(\n {\n ...uploaded,\n url: uploaded.previewUrl || uploaded.url || localItem.url,\n previewUrl: uploaded.previewUrl || uploaded.url || localItem.url,\n status: 'done',\n percent: 100,\n },\n localItem,\n ),\n );\n })\n .catch((error: any) => {\n replaceItem(localItem, {\n ...localItem,\n status: 'error',\n error: error?.message || '上传失败',\n });\n });\n });\n };\n\n const handleRemove = (item: AttachmentItem) => {\n const itemKey = item.uid || item.id || item.objectName;\n const next = valueRef.current.filter(\n (current) =>\n current.id !== itemKey && current.uid !== itemKey && current.objectName !== itemKey,\n );\n setValue(next);\n if (item.objectName) {\n api.deleteFile(item.objectName, item.bucketName || bucketName).catch(() => undefined);\n }\n };\n\n const resolvePreviewUrl = async (item: AttachmentItem) => {\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n return typeof ticket === 'string'\n ? ticket\n : ticket?.previewUrl || ticket?.url || ticket?.downloadUrl || '';\n }\n return item.previewUrl || item.url || '';\n };\n\n const openUrl = (url: string) => {\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <div className=\"sy-image-field\" data-testid={`imagefield-mobile-${fieldId}`}>\n <input\n ref={inputRef}\n className=\"sy-mobile-hidden-input\"\n type=\"file\"\n accept={accept ?? 'image/*'}\n multiple={multiple}\n disabled={disabled}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n onChange={handleFileSelect}\n data-testid={`imagefield-file-input-${fieldId}`}\n />\n <div className=\"sy-mobile-image-grid\" data-testid={`imagefield-grid-${fieldId}`}>\n {value.map((item, index) => {\n const itemKey = getAttachmentItemIdentity(item) || `${fieldId}-image-${String(index)}`;\n const canAct = item.status === 'done';\n return (\n <div\n key={`${itemKey}-${index}`}\n className=\"sy-mobile-image-card\"\n data-testid={`imagefield-thumb-${itemKey}`}\n >\n <div className=\"sy-mobile-image-thumb\">\n <button\n type=\"button\"\n className=\"sy-image-preview\"\n disabled={(!canAct && !(item.previewUrl || item.url)) || !showPreviewIcon}\n onClick={async () => openUrl(await resolvePreviewUrl(item))}\n >\n <ImageThumbContent item={item} />\n </button>\n {showRemoveIcon && (\n <FileActionButton\n type=\"remove\"\n disabled={disabled}\n onClick={() => handleRemove(item)}\n testId={`imagefield-remove-${itemKey}`}\n />\n )}\n </div>\n <div className=\"sy-mobile-image-name\" title={item.name}>\n {item.name}\n </div>\n </div>\n );\n })}\n {(!maxCount || value.length < maxCount) && (\n <button\n type=\"button\"\n className=\"sy-mobile-image-upload-tile\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n data-testid={`imagefield-upload-btn-${fieldId}`}\n >\n <PlusOutlined />\n <span>图片上传</span>\n </button>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport type { ImageFieldProps, AttachmentItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { FileActionButton } from '../shared/FileDisplay';\nimport { formatFileSize } from '../shared/fieldFormat';\n\nconst getTicketUrl = (ticket: any, fallback?: string) =>\n typeof ticket === 'string'\n ? ticket\n : ticket?.previewUrl || ticket?.downloadUrl || ticket?.relayUrl || ticket?.url || fallback;\n\nfunction ImageThumbContent({ item, testId }: { item: AttachmentItem; testId?: string }) {\n const [imageFailed, setImageFailed] = React.useState(false);\n const src = item.previewUrl || item.url;\n\n React.useEffect(() => {\n setImageFailed(false);\n }, [src]);\n\n if (src && !imageFailed) {\n return (\n <>\n <img src={src} alt={item.name} data-testid={testId} onError={() => setImageFailed(true)} />\n {item.status === 'uploading' && (\n <span className=\"sy-image-state\">{Math.round(item.percent ?? 0)}%</span>\n )}\n </>\n );\n }\n\n return (\n <span className=\"sy-image-state\" data-testid={testId}>\n {item.status === 'uploading'\n ? `${Math.round(item.percent ?? 0)}%`\n : item.status === 'error'\n ? item.error || '上传失败'\n : item.name || '图片'}\n </span>\n );\n}\n\nexport function ImageFieldReadonly({\n fieldId,\n readonlyClassName,\n bucketName = 'images',\n showPreviewIcon = true,\n showDownloadIcon = true,\n}: ImageFieldProps) {\n const { formData, api } = useFormContext();\n const { isMobile } = useDeviceDetect();\n const value = (formData[fieldId] as AttachmentItem[] | undefined) ?? [];\n const [previewUrl, setPreviewUrl] = React.useState('');\n const [previewName, setPreviewName] = React.useState('');\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 const previewImage = async (item: AttachmentItem) => {\n let url = item.previewUrl || item.url;\n if (item.objectName) {\n const ticket = await api.createFileAccessTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n 'preview',\n );\n url = getTicketUrl(ticket, url);\n }\n if (url) {\n setPreviewUrl(url);\n setPreviewName(item.name);\n }\n };\n\n const downloadImage = async (item: AttachmentItem) => {\n let url = item.downloadUrl || item.url || item.previewUrl;\n if (item.objectName) {\n const ticket = await api.createDownloadTicket(\n item.bucketName || bucketName,\n item.objectName,\n item.name,\n );\n url = getTicketUrl(ticket, url);\n }\n if (url) window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const rootClassName = [\n readonlyClassName || 'sy-field-readonly-value',\n 'sy-image-field',\n 'sy-readonly-files',\n 'sy-readonly-images',\n isMobile ? 'is-mobile' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isMobile) {\n return (\n <div className={rootClassName} data-testid={`imagefield-readonly-${fieldId}`}>\n <div className=\"sy-mobile-image-grid\" data-testid={`imagefield-readonly-grid-${fieldId}`}>\n {value.map((item, index) => {\n const itemKey = item.id || item.uid || `${fieldId}-readonly-image-${String(index)}`;\n const canAct = item.status !== 'uploading' && item.status !== 'error';\n return (\n <div className=\"sy-mobile-image-card\" key={`${itemKey}-${index}`}>\n <div className=\"sy-mobile-image-thumb\">\n <button\n type=\"button\"\n className=\"sy-image-preview\"\n disabled={(!canAct && !(item.previewUrl || item.url)) || !showPreviewIcon}\n data-testid={`imagefield-readonly-image-action-${itemKey}`}\n onClick={() => previewImage(item)}\n >\n <ImageThumbContent item={item} testId={`imagefield-readonly-img-${itemKey}`} />\n </button>\n </div>\n <div className=\"sy-mobile-image-name\" title={item.name}>\n {item.name}\n </div>\n </div>\n );\n })}\n </div>\n {previewUrl && (\n <div className=\"sy-image-preview-overlay\" role=\"dialog\" aria-label=\"图片预览\">\n <button\n type=\"button\"\n className=\"sy-image-preview-mask\"\n aria-label=\"关闭图片预览\"\n onClick={() => setPreviewUrl('')}\n />\n <div className=\"sy-image-preview-dialog\">\n <button\n type=\"button\"\n className=\"sy-image-preview-close\"\n aria-label=\"关闭图片预览\"\n onClick={() => setPreviewUrl('')}\n >\n ×\n </button>\n <img src={previewUrl} alt={previewName || '图片预览'} />\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={rootClassName} data-testid={`imagefield-readonly-${fieldId}`}>\n <div className=\"sy-file-list sy-image-file-list\">\n {value.map((item, index) => {\n const itemKey = item.id || item.uid || `${fieldId}-readonly-image-${String(index)}`;\n const canAct = item.status !== 'uploading' && item.status !== 'error';\n return (\n <div\n key={`${itemKey}-${index}`}\n className=\"sy-file-item sy-image-file-item\"\n data-testid={`imagefield-readonly-item-${itemKey}`}\n >\n <button\n type=\"button\"\n className=\"sy-image-file-thumb\"\n disabled={!canAct && !(item.previewUrl || item.url)}\n data-testid={`imagefield-readonly-image-action-${itemKey}`}\n onClick={() => previewImage(item)}\n >\n <ImageThumbContent item={item} testId={`imagefield-readonly-img-${itemKey}`} />\n </button>\n <div className=\"sy-file-meta\">\n <span className=\"sy-file-name\" title={item.name}>\n {item.name}\n {item.size ? (\n <span className=\"sy-file-size-inline\">({formatFileSize(item.size)})</span>\n ) : null}\n </span>\n </div>\n <div className=\"sy-file-actions\">\n {showPreviewIcon && (\n <FileActionButton\n type=\"preview\"\n disabled={!canAct}\n onClick={() => {\n void previewImage(item);\n }}\n />\n )}\n {showDownloadIcon && (\n <FileActionButton\n type=\"download\"\n disabled={!canAct}\n onClick={() => {\n void downloadImage(item);\n }}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n {previewUrl && (\n <div className=\"sy-image-preview-overlay\" role=\"dialog\" aria-label=\"图片预览\">\n <button\n type=\"button\"\n className=\"sy-image-preview-mask\"\n aria-label=\"关闭图片预览\"\n onClick={() => setPreviewUrl('')}\n />\n <div className=\"sy-image-preview-dialog\">\n <button\n type=\"button\"\n className=\"sy-image-preview-close\"\n aria-label=\"关闭图片预览\"\n onClick={() => setPreviewUrl('')}\n >\n ×\n </button>\n <img src={previewUrl} alt={previewName || '图片预览'} />\n </div>\n </div>\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';\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 {isMobile ? <SubFormFieldMobile {...childProps} /> : <SubFormFieldPC {...childProps} />}\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 =\n behavior === 'DISABLED' || behavior === 'READONLY'\n ? behavior\n : (column.behavior ?? 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) => 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 if (resolvedBehavior === 'READONLY') {\n return <span data-testid={fallbackTestId}>{stringifyFallbackValue(cellValue) || '--'}</span>;\n }\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';\n\nexport function SubFormColumnLabel({ label, required }: { label: string; required?: boolean }) {\n return (\n <>\n {required ? (\n <span className=\"sy-field-required\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n {label}\n </>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { SubFormCell } from './SubFormCell';\nimport { SubFormColumnLabel } from './SubFormColumnLabel';\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 visibleColumns = columns.filter((col) => col.behavior !== 'HIDDEN');\n const readonly = behavior === 'READONLY';\n const disabled = behavior === 'DISABLED' || readonly;\n\n const handleAddRow = () => {\n if (maxRows && rows.length >= maxRows) return;\n const emptyRow: Record<string, any> = {};\n visibleColumns.forEach((col) => {\n emptyRow[col.fieldId] = col.defaultValue ?? '';\n });\n const newRows = [...rows, emptyRow];\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleRemoveRow = (index: number) => {\n if (minRows && rows.length <= minRows) return;\n const newRows = rows.filter((_, i) => i !== index);\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleCellChange = (rowIndex: number, colId: string, value: any) => {\n const newRows = rows.map((row, i) => (i === rowIndex ? { ...row, [colId]: value } : row));\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const addDisabled = disabled || Boolean(maxRows && rows.length >= maxRows);\n\n return (\n <div className=\"sy-subform sy-subform-pc\" data-testid={`subformfield-pc-${fieldId}`}>\n <div className=\"sy-subform-toolbar\">\n <span className=\"sy-subform-row-count\">共 {rows.length} 行</span>\n {!readonly && (\n <button\n type=\"button\"\n disabled={addDisabled}\n className=\"sy-subform-add-button\"\n onClick={handleAddRow}\n data-testid={`subformfield-add-${fieldId}`}\n >\n + 新增明细\n </button>\n )}\n </div>\n <div className=\"sy-subform-table-wrap\">\n <table className=\"sy-subform-table\" data-testid={`subformfield-table-${fieldId}`}>\n <thead>\n <tr>\n {visibleColumns.map((col) => (\n <th key={col.fieldId}>\n <SubFormColumnLabel label={col.label} required={col.required} />\n </th>\n ))}\n {!readonly && <th>操作</th>}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} data-testid={`subformfield-row-${fieldId}-${rowIndex}`}>\n {visibleColumns.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 {!readonly && (\n <td>\n <button\n type=\"button\"\n disabled={disabled || Boolean(minRows && rows.length <= minRows)}\n className=\"sy-subform-link-button sy-subform-danger-button\"\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {rows.length === 0 && <div className=\"sy-subform-empty\">暂无数据</div>}\n </div>\n );\n}\n","import React from 'react';\nimport type { SubFormFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { SubFormCell } from './SubFormCell';\nimport { SubFormColumnLabel } from './SubFormColumnLabel';\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 visibleColumns = columns.filter((col) => col.behavior !== 'HIDDEN');\n const readonly = behavior === 'READONLY';\n const disabled = behavior === 'DISABLED' || readonly;\n\n const handleAddRow = () => {\n if (maxRows && rows.length >= maxRows) return;\n const emptyRow: Record<string, any> = {};\n visibleColumns.forEach((col) => {\n emptyRow[col.fieldId] = col.defaultValue ?? '';\n });\n const newRows = [...rows, emptyRow];\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleRemoveRow = (index: number) => {\n if (minRows && rows.length <= minRows) return;\n const newRows = rows.filter((_, i) => i !== index);\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const handleCellChange = (rowIndex: number, colId: string, value: any) => {\n const newRows = rows.map((row, i) => (i === rowIndex ? { ...row, [colId]: value } : row));\n setFieldValue(fieldId, newRows);\n onChange?.(newRows);\n };\n\n const addDisabled = disabled || Boolean(maxRows && rows.length >= maxRows);\n\n return (\n <div className=\"sy-subform sy-subform-mobile\" data-testid={`subformfield-mobile-${fieldId}`}>\n <div className=\"sy-subform-toolbar\">\n <span className=\"sy-subform-row-count\">共 {rows.length} 行</span>\n {!readonly && (\n <button\n type=\"button\"\n disabled={addDisabled}\n className=\"sy-subform-add-button\"\n onClick={handleAddRow}\n data-testid={`subformfield-mobile-add-${fieldId}`}\n >\n + 新增明细\n </button>\n )}\n </div>\n {rows.map((row, rowIndex) => (\n <div\n className=\"sy-subform-card\"\n key={rowIndex}\n data-testid={`subformfield-card-${fieldId}-${rowIndex}`}\n >\n <div className=\"sy-subform-card-head\">\n <strong>第 {rowIndex + 1} 行</strong>\n {!readonly && (\n <button\n type=\"button\"\n disabled={disabled || Boolean(minRows && rows.length <= minRows)}\n className=\"sy-subform-link-button sy-subform-danger-button\"\n onClick={() => handleRemoveRow(rowIndex)}\n data-testid={`subformfield-mobile-remove-${fieldId}-${rowIndex}`}\n >\n 删除\n </button>\n )}\n </div>\n {visibleColumns.map((col) => (\n <div className=\"sy-subform-mobile-cell\" key={col.fieldId}>\n <label>\n <SubFormColumnLabel label={col.label} required={col.required} />\n </label>\n <SubFormCell\n parentFieldId={fieldId}\n rowIndex={rowIndex}\n column={col}\n row={row}\n behavior={behavior}\n fallbackTestId={`subformfield-mobile-cell-${fieldId}-${rowIndex}-${col.fieldId}`}\n onCellChange={handleCellChange}\n />\n </div>\n ))}\n </div>\n ))}\n {rows.length === 0 && <div className=\"sy-subform-empty\">暂无数据</div>}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { UserSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { UserSelectFieldPC } from './UserSelectFieldPC';\nimport { UserSelectFieldMobile } from './UserSelectFieldMobile';\nimport { UserSelectFieldReadonly } from './UserSelectFieldReadonly';\n\nexport function UserSelectField(props: UserSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n defaultValue,\n className,\n labelClassName,\n tipsClassName,\n } = props;\n\n const { fieldBehaviors, setFieldValue, formData, registerField, unregisterField } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const childProps: UserSelectFieldProps = { ...props, behavior };\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <UserSelectFieldReadonly {...childProps} />\n ) : isMobile ? (\n <UserSelectFieldMobile {...childProps} />\n ) : (\n <UserSelectFieldPC {...childProps} />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Select } from 'antd';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n getUserId,\n normalizeUser,\n normalizeUserArray,\n formatUserDisplay,\n} from '../shared/fieldFormat';\nimport { UserPicker } from '../shared/UserPicker';\n\nexport function UserSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = true,\n searchable = true,\n dataSource = [],\n treeData,\n allowClear = true,\n maxCount,\n notFoundContent = '暂无数据',\n displayFormat,\n onChange,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeUserArray(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const [optionsSource, setOptionsSource] = useState<UserItem[]>(() =>\n dataSource.map(normalizeUser),\n );\n const [loading, setLoading] = useState(false);\n const [pickerOpen, setPickerOpen] = useState(false);\n const pickerDataSource = dataSource.length > 0 ? dataSource : undefined;\n\n useEffect(() => {\n if (dataSource.length) {\n setOptionsSource(dataSource.map(normalizeUser));\n }\n }, [dataSource]);\n\n useEffect(() => {\n setOptionsSource((current) => {\n const merged = [...current];\n let changed = false;\n for (const item of value) {\n if (!merged.some((existing) => getUserId(existing) === getUserId(item))) {\n merged.push(item);\n changed = true;\n }\n }\n return changed ? merged : current;\n });\n }, [value]);\n\n useEffect(() => {\n const missing = value.filter((item) => getUserId(item) && getUserNameLikeId(item));\n if (missing.length === 0) return;\n let cancelled = false;\n Promise.all(\n missing.map((item) =>\n api\n .getUserById(getUserId(item))\n .then(normalizeUser)\n .catch(() => item),\n ),\n ).then((resolved) => {\n if (cancelled) return;\n const resolvedMap = new Map(resolved.map((item) => [getUserId(item), item]));\n const next = value.map((item) => resolvedMap.get(getUserId(item)) || item);\n if (next.some((item, index) => item.name !== value[index]?.name)) {\n setFieldValue(fieldId, next);\n }\n setOptionsSource((current) => {\n const merged = [...current];\n let changed = false;\n for (const item of next) {\n if (!merged.some((existing) => getUserId(existing) === getUserId(item))) {\n merged.push(item);\n changed = true;\n }\n }\n return changed ? merged : current;\n });\n });\n return () => {\n cancelled = true;\n };\n }, [api, fieldId, setFieldValue, value]);\n\n const fetchUsers = async (keyword?: string) => {\n if (dataSource.length) return;\n setLoading(true);\n try {\n const users = await api.getUserList(\n keyword ? { name: keyword, username: keyword } : undefined,\n );\n setOptionsSource(users.map(normalizeUser));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchUsers();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleChange = (selectedIds: string | string[]) => {\n const ids = Array.isArray(selectedIds) ? selectedIds : [selectedIds];\n const selected = ids\n .map(\n (id) =>\n optionsSource.find((u) => getUserId(u) === id) ?? value.find((u) => getUserId(u) === id),\n )\n .filter(Boolean) as UserItem[];\n const result = multiple ? selected.slice(0, maxCount ?? selected.length) : selected.slice(0, 1);\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const handlePickerConfirm = (items: UserItem[]) => {\n const result = multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1);\n const normalized = result.map(normalizeUser);\n setOptionsSource((current) => {\n const merged = [...current];\n for (const item of normalized) {\n if (!merged.some((existing) => getUserId(existing) === getUserId(item))) merged.push(item);\n }\n return merged;\n });\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const options = useMemo(\n () =>\n optionsSource.map((u) => ({\n value: getUserId(u),\n label: formatUserDisplay(u, displayFormat),\n })),\n [optionsSource, displayFormat],\n );\n const selectValue = multiple ? value.map(getUserId) : value[0] ? getUserId(value[0]) : undefined;\n\n return (\n <div className=\"sy-select-with-picker\">\n <Select\n className={inputClassName}\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n allowClear={allowClear}\n maxCount={maxCount}\n showSearch={searchable}\n filterOption={dataSource.length ? undefined : false}\n onSearch={searchable ? fetchUsers : undefined}\n loading={loading}\n notFoundContent={loading ? '加载中...' : notFoundContent}\n options={options}\n onChange={handleChange}\n data-testid={`userselectfield-input-${fieldId}`}\n />\n <button\n type=\"button\"\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={() => setPickerOpen(true)}\n data-testid={`userselectfield-picker-trigger-${fieldId}`}\n >\n 选择\n </button>\n {pickerOpen && (\n <UserPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple={multiple}\n value={value}\n dataSource={pickerDataSource}\n treeData={treeData}\n displaySearch={searchable}\n onConfirm={handlePickerConfirm}\n onCancel={() => undefined}\n />\n )}\n </div>\n );\n}\n\nfunction getUserNameLikeId(user: UserItem) {\n const id = getUserId(user);\n return Boolean(id && (!user.name || user.name === id));\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Avatar,\n Button,\n Checkbox,\n Empty,\n Input,\n List,\n Modal,\n Pagination,\n Space,\n Spin,\n Tag,\n Tree,\n} from 'antd';\nimport { SearchOutlined, TeamOutlined, UserOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi, UserItem } from '../../types';\nimport {\n getDepartmentId,\n getDepartmentName,\n getUserId,\n getUserName,\n normalizeUser,\n} from './fieldFormat';\nimport { useLazyDepartmentTree } from './useLazyDepartmentTree';\n\nconst DEFAULT_MEMBER_PAGE_SIZE = 10;\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\ninterface UserPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: UserItem[];\n dataSource?: UserItem[];\n treeData?: DepartmentTreeNode[];\n displaySearch?: boolean;\n loadAllWhenNoDepartment?: boolean;\n onConfirm: (items: UserItem[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeUsers(users?: UserItem[]) {\n return (users || []).map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function UserPickerPanel({\n api,\n multiple = true,\n value,\n dataSource,\n treeData,\n displaySearch = true,\n loadAllWhenNoDepartment = true,\n onConfirm,\n onCancel,\n mobile = false,\n}: UserPickerPanelProps) {\n const {\n treeData: deptTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [departmentKeyword, setDepartmentKeyword] = useState('');\n const [memberKeyword, setMemberKeyword] = useState('');\n const [mobileKeyword, setMobileKeyword] = useState('');\n const [currentDeptId, setCurrentDeptId] = useState('');\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [members, setMembers] = useState<UserItem[]>(() => normalizeUsers(dataSource));\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(DEFAULT_MEMBER_PAGE_SIZE);\n const [memberTotal, setMemberTotal] = useState(() => normalizeUsers(dataSource).length);\n const [memberReloadKey, setMemberReloadKey] = useState(0);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<UserItem[]>(() => normalizeUsers(value));\n const selectedIds = selected.map(getUserId);\n const MobileSearchBar = getMobileComponent('SearchBar');\n const activeMemberKeyword = (mobile ? mobileKeyword : memberKeyword).trim();\n const staticUsers = useMemo(() => normalizeUsers(dataSource), [dataSource]);\n const hasStaticUserSource = staticUsers.length > 0;\n\n useEffect(() => {\n if (mobile) return;\n if (currentDeptId || deptTreeData.length === 0) return;\n setExpandedKeys(deptTreeData.map((node) => getDepartmentId(node)));\n if (loadAllWhenNoDepartment) {\n setCurrentDeptId(getDepartmentId(deptTreeData[0]));\n }\n }, [currentDeptId, deptTreeData, loadAllWhenNoDepartment, mobile]);\n\n useEffect(() => {\n setMemberPage(1);\n }, [activeMemberKeyword, currentDeptId, dataSource, mobile]);\n\n const handleDepartmentSelect = useCallback((deptId: string) => {\n const nextDeptId = String(deptId || '');\n setCurrentDeptId(nextDeptId);\n setMemberKeyword('');\n setMemberPage(1);\n setMemberReloadKey((current) => current + 1);\n }, []);\n\n useEffect(() => {\n let active = true;\n const keyword = activeMemberKeyword;\n if (hasStaticUserSource) {\n const lower = keyword.toLowerCase();\n const filtered = staticUsers.filter((user) =>\n keyword ? getUserName(user).toLowerCase().includes(lower) : true,\n );\n const start = (memberPage - 1) * memberPageSize;\n setMembers(filtered.slice(start, start + memberPageSize));\n setMemberTotal(filtered.length);\n setLoading(false);\n return;\n }\n if (!loadAllWhenNoDepartment && !keyword && !currentDeptId) {\n setMembers([]);\n setMemberTotal(0);\n setLoading(false);\n return;\n }\n setLoading(true);\n const timer = setTimeout(\n () => {\n const pageParams = { page: memberPage, pageSize: memberPageSize };\n const request = keyword\n ? api\n .getUserList({\n keyword,\n name: keyword,\n username: keyword,\n ...pageParams,\n })\n .then((users) => ({\n items: users,\n total: Array.isArray(users) ? users.length : 0,\n ...pageParams,\n }))\n : currentDeptId\n ? api.getDepartmentMembersPage\n ? api.getDepartmentMembersPage(currentDeptId, pageParams)\n : api.getDepartmentMembers(currentDeptId).then((users) => ({\n items: users,\n total: users.length,\n ...pageParams,\n }))\n : api.getUserList(pageParams).then((users) => ({\n items: users,\n total: Array.isArray(users) ? users.length : 0,\n ...pageParams,\n }));\n request\n .then((result) => {\n if (!active) return;\n const items = Array.isArray(result) ? result : result.items;\n setMembers(normalizeUsers(items as UserItem[]));\n setMemberTotal(Number(Array.isArray(result) ? result.length : result.total) || 0);\n })\n .catch(() => {\n if (active) {\n setMembers([]);\n setMemberTotal(0);\n }\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n },\n keyword ? 250 : 0,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [\n activeMemberKeyword,\n api,\n currentDeptId,\n hasStaticUserSource,\n loadAllWhenNoDepartment,\n memberPage,\n memberPageSize,\n memberReloadKey,\n staticUsers,\n ]);\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: Array<{ id: string; name: string }> = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileDepartments = useMemo(() => {\n const keyword = mobileKeyword.trim().toLowerCase();\n if (keyword) {\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(keyword))\n .map((item) => item.node);\n }\n if (!currentDeptId) return deptTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, deptTreeData, flatNodes, mobileKeyword, nodeMap]);\n\n const toggleUser = (user: UserItem, checked: boolean) => {\n const normalized = normalizeUser(user);\n const id = getUserId(normalized);\n if (!id) return;\n if (multiple) {\n setSelected((prev) => {\n if (checked)\n return prev.some((item) => getUserId(item) === id) ? prev : [...prev, normalized];\n return prev.filter((item) => getUserId(item) !== id);\n });\n return;\n }\n setSelected(checked ? [normalized] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-user-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length} 人</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={getUserId(item)} closable onClose={() => toggleUser(item, false)}>\n {getUserName(item)}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n const renderMemberList = () => (\n <div className=\"sy-user-picker-member-panel\">\n <Spin spinning={loading} wrapperClassName=\"sy-user-picker-member-spin\">\n <div className=\"sy-user-picker-list\">\n <List\n dataSource={members}\n locale={{ emptyText: '暂无成员' }}\n renderItem={(user) => {\n const id = getUserId(user);\n const checked = selectedIds.includes(id);\n return (\n <List.Item key={id}>\n <label className=\"sy-user-picker-row\">\n <Checkbox\n checked={checked}\n onChange={(event) => toggleUser(user, event.target.checked)}\n />\n <Avatar size={36} src={user.avatar} icon={!user.avatar && <UserOutlined />} />\n <span>{getUserName(user)}</span>\n </label>\n </List.Item>\n );\n }}\n />\n </div>\n <div className=\"sy-user-picker-pagination\">\n <span>共 {memberTotal} 人</span>\n <Pagination\n size=\"small\"\n current={memberPage}\n pageSize={memberPageSize}\n total={memberTotal}\n showSizeChanger\n pageSizeOptions={[10, 20, 50, 100]}\n onChange={(page, pageSize) => {\n setMemberPage(page);\n setMemberPageSize(pageSize);\n }}\n />\n </div>\n </Spin>\n </div>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-user-picker sy-user-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择成员</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar\n placeholder=\"搜索部门或成员\"\n value={mobileKeyword}\n onChange={setMobileKeyword}\n />\n ) : (\n <input value={mobileKeyword} onChange={(event) => setMobileKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => handleDepartmentSelect('')}>\n 通讯录\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => handleDepartmentSelect(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileDepartments}\n locale={{ emptyText: null }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n return (\n <List.Item\n key={id}\n onClick={async () => {\n await loadChildren(id);\n handleDepartmentSelect(id);\n setMobileKeyword('');\n }}\n >\n <List.Item.Meta avatar={<TeamOutlined />} title={getDepartmentName(node)} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderMemberList()}\n {renderSelected()}\n </div>\n );\n }\n\n const lowerDepartmentKeyword = departmentKeyword.trim().toLowerCase();\n const filteredTreeData = lowerDepartmentKeyword\n ? deptTreeData.filter((node) =>\n getDepartmentName(node).toLowerCase().includes(lowerDepartmentKeyword),\n )\n : deptTreeData;\n\n return (\n <div className=\"sy-user-picker\">\n <div className=\"sy-user-picker-main\">\n <div className=\"sy-user-picker-depts\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={departmentKeyword}\n onChange={(event) => setDepartmentKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n selectedKeys={currentDeptId ? [currentDeptId] : []}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onSelect={(keys, info: any) =>\n handleDepartmentSelect(String(info?.node?.key || keys[0] || ''))\n }\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={460}\n />\n </Spin>\n </div>\n <div className=\"sy-user-picker-members\">\n {displaySearch && (\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索成员\"\n value={memberKeyword}\n onChange={(event) => setMemberKeyword(event.target.value)}\n />\n )}\n {renderMemberList()}\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface UserPickerProps extends Omit<UserPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function UserPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: UserPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <UserPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择成员\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(980px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DataNode } from 'antd/es/tree';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from './fieldFormat';\n\nexport interface LazyDepartmentNode extends DataNode, DepartmentTreeNode {\n key: string;\n title: string;\n childrenLoaded?: boolean;\n children?: LazyDepartmentNode[];\n}\n\nexport interface LazyDepartmentFlatNode {\n id: string;\n name: string;\n node: LazyDepartmentNode;\n path: Array<{ id: string; name: string }>;\n}\n\nconst toLazyNode = (node: DepartmentTreeNode): LazyDepartmentNode => {\n const normalized = normalizeDepartmentNode(node);\n const id = getDepartmentId(normalized);\n const name = getDepartmentName(normalized);\n const children = normalized.children?.map(toLazyNode);\n const hasChildren = normalized.hasChildren ?? Boolean(children?.length);\n return {\n ...normalized,\n id,\n name,\n key: id,\n title: name,\n hasChildren,\n isLeaf: normalized.isLeaf ?? !hasChildren,\n childrenLoaded: Boolean(children?.length) || normalized.isLeaf === true || !hasChildren,\n children,\n };\n};\n\nconst replaceChildren = (\n nodes: LazyDepartmentNode[],\n parentId: string,\n children: LazyDepartmentNode[],\n): LazyDepartmentNode[] =>\n nodes.map((node) => {\n if (getDepartmentId(node) === parentId) {\n return {\n ...node,\n children,\n hasChildren: children.length > 0,\n isLeaf: children.length === 0,\n childrenLoaded: true,\n };\n }\n return node.children?.length\n ? { ...node, children: replaceChildren(node.children, parentId, children) }\n : node;\n });\n\nfunction buildIndexes(nodes: LazyDepartmentNode[]) {\n const nodeMap = new Map<string, LazyDepartmentNode>();\n const parentMap = new Map<string, string | null>();\n const flatNodes: LazyDepartmentFlatNode[] = [];\n\n const walk = (\n list: LazyDepartmentNode[],\n parentId: string | null,\n path: Array<{ id: string; name: string }>,\n ) => {\n for (const node of list) {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const nextPath = [...path, { id, name }];\n nodeMap.set(id, node);\n parentMap.set(id, parentId);\n flatNodes.push({ id, name, node, path: nextPath });\n if (node.children?.length) walk(node.children, id, nextPath);\n }\n };\n\n walk(nodes, null, []);\n return { nodeMap, parentMap, flatNodes };\n}\n\nexport function useLazyDepartmentTree(\n api: FormRuntimeApi,\n configuredTreeData?: DepartmentTreeNode[],\n) {\n const [treeData, setTreeDataState] = useState<LazyDepartmentNode[]>(() =>\n (configuredTreeData || []).map(toLazyNode),\n );\n const [treeLoading, setTreeLoading] = useState(false);\n const treeDataRef = useRef(treeData);\n const rootsLoadedRef = useRef(Boolean(configuredTreeData?.length));\n const rootPromiseRef = useRef<Promise<LazyDepartmentNode[]> | null>(null);\n const childPromiseRef = useRef<Record<string, Promise<LazyDepartmentNode[]> | undefined>>({});\n\n const setTreeData = useCallback(\n (next: LazyDepartmentNode[] | ((prev: LazyDepartmentNode[]) => LazyDepartmentNode[])) => {\n const resolved = typeof next === 'function' ? next(treeDataRef.current) : next;\n treeDataRef.current = resolved;\n setTreeDataState(resolved);\n return resolved;\n },\n [],\n );\n\n useEffect(() => {\n if (!configuredTreeData) return;\n const next = configuredTreeData.map(toLazyNode);\n rootsLoadedRef.current = next.length > 0;\n setTreeData(next);\n }, [configuredTreeData, setTreeData]);\n\n const loadRootDepartments = useCallback(async () => {\n if (rootsLoadedRef.current) return treeDataRef.current;\n if (rootPromiseRef.current) return rootPromiseRef.current;\n setTreeLoading(true);\n const promise = api\n .getDepartmentRoots()\n .then((nodes) => {\n const next = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n rootsLoadedRef.current = true;\n setTreeData(next);\n return next;\n })\n .finally(() => {\n rootPromiseRef.current = null;\n setTreeLoading(false);\n });\n rootPromiseRef.current = promise;\n return promise;\n }, [api, setTreeData]);\n\n const loadChildren = useCallback(\n async (parentId: string) => {\n const id = String(parentId || '');\n if (!id) return [];\n const current = flattenDepartments(treeDataRef.current).find((item) => item.id === id)\n ?.node as LazyDepartmentNode | undefined;\n if (!current || current.childrenLoaded || current.isLeaf || current.hasChildren === false) {\n return current?.children || [];\n }\n if (childPromiseRef.current[id]) return childPromiseRef.current[id];\n const promise = api\n .getDepartmentChildren(id)\n .then((nodes) => {\n const children = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n setTreeData((prev) => replaceChildren(prev, id, children));\n return children;\n })\n .finally(() => {\n delete childPromiseRef.current[id];\n });\n childPromiseRef.current[id] = promise;\n return promise;\n },\n [api, setTreeData],\n );\n\n const indexes = useMemo(() => buildIndexes(treeData), [treeData]);\n\n useEffect(() => {\n void loadRootDepartments();\n }, [loadRootDepartments]);\n\n return {\n treeData,\n treeLoading,\n ...indexes,\n loadRootDepartments,\n loadChildren,\n };\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n getUserId,\n normalizeUser,\n normalizeUserArray,\n formatUserDisplay,\n} from '../shared/fieldFormat';\nimport { UserPicker } from '../shared/UserPicker';\nimport { MobileFieldTrigger } from '../shared/MobileField';\n\nconst getMobilePopup = () => {\n try {\n return (MobileAntd as any).Popup;\n } catch {\n return undefined;\n }\n};\n\nexport function UserSelectFieldMobile({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = true,\n dataSource = [],\n treeData,\n allowClear = true,\n maxCount,\n displayFormat,\n onChange,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeUserArray(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const [showPicker, setShowPicker] = useState(false);\n const [optionsSource, setOptionsSource] = useState<UserItem[]>(() =>\n dataSource.map(normalizeUser),\n );\n const pickerDataSource = dataSource.length > 0 ? dataSource : undefined;\n\n useEffect(() => {\n if (dataSource.length) {\n setOptionsSource(dataSource.map(normalizeUser));\n }\n }, [dataSource]);\n\n useEffect(() => {\n setOptionsSource((current) => {\n const merged = [...current];\n let changed = false;\n for (const item of value) {\n if (!merged.some((existing) => getUserId(existing) === getUserId(item))) {\n merged.push(item);\n changed = true;\n }\n }\n return changed ? merged : current;\n });\n }, [value]);\n\n const ensureUsers = async () => {\n if (dataSource.length || optionsSource.length) return;\n const users = await api.getUserList();\n setOptionsSource(users.map(normalizeUser));\n };\n\n const handleSelect = (userId: string) => {\n const user = optionsSource.find((u) => getUserId(u) === userId);\n /* v8 ignore next */\n if (!user) return;\n\n let newValue: UserItem[];\n if (multiple) {\n const exists = value.some((u) => getUserId(u) === userId);\n newValue = exists ? value.filter((u) => getUserId(u) !== userId) : [...value, user];\n newValue = newValue.slice(0, maxCount ?? newValue.length);\n } else {\n newValue = [user];\n setShowPicker(false);\n }\n setFieldValue(fieldId, newValue);\n onChange?.(newValue);\n };\n\n const handleConfirm = (items: UserItem[]) => {\n const next = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n normalizeUser,\n );\n setFieldValue(fieldId, next);\n onChange?.(next);\n setShowPicker(false);\n };\n\n const openPicker = () => {\n if (disabled) return;\n setShowPicker(true);\n void ensureUsers();\n };\n\n const handleClear = () => {\n setFieldValue(fieldId, []);\n onChange?.([]);\n setShowPicker(false);\n };\n\n const displayValue = value.length\n ? value.map((u) => formatUserDisplay(u, displayFormat)).join(', ')\n : undefined;\n\n return (\n <div className={inputClassName} data-testid={`userselectfield-mobile-${fieldId}`}>\n <MobileFieldTrigger\n value={displayValue}\n placeholder={placeholder ?? '请选择'}\n disabled={disabled}\n clearable={allowClear}\n onClick={openPicker}\n onClear={handleClear}\n testId={`userselectfield-mobile-trigger-${fieldId}`}\n />\n {showPicker && getMobilePopup() ? (\n <UserPicker\n api={api}\n open={showPicker}\n onOpenChange={setShowPicker}\n mobile\n multiple={multiple}\n value={value}\n dataSource={pickerDataSource}\n treeData={treeData}\n onConfirm={handleConfirm}\n onCancel={() => setShowPicker(false)}\n />\n ) : showPicker ? (\n <ul data-testid={`userselectfield-mobile-list-${fieldId}`}>\n {optionsSource.map((user) => (\n <li key={getUserId(user)}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(getUserId(user))}\n data-testid={`userselectfield-mobile-option-${getUserId(user)}`}\n >\n {formatUserDisplay(user, displayFormat)}\n {value.some((u) => getUserId(u) === getUserId(user)) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import React, { useEffect, useMemo } from 'react';\nimport type { UserSelectFieldProps, UserItem } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n formatUserDisplay,\n getUserId,\n normalizeUser,\n normalizeUserArray,\n} from '../shared/fieldFormat';\n\nexport function UserSelectFieldReadonly({\n fieldId,\n readonlyClassName,\n displayFormat,\n}: UserSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeUserArray(rawValue), [rawValue]);\n\n useEffect(() => {\n const missing = value.filter((item) => getUserNameLikeId(item));\n if (missing.length === 0) return;\n let cancelled = false;\n Promise.all(\n missing.map((item) =>\n api\n .getUserById(getUserId(item))\n .then(normalizeUser)\n .catch(() => item),\n ),\n ).then((resolved) => {\n if (cancelled) return;\n const resolvedMap = new Map(resolved.map((item) => [getUserId(item), item]));\n const next = value.map((item) => resolvedMap.get(getUserId(item)) || item);\n if (next.some((item, index) => item.name !== value[index]?.name)) {\n setFieldValue(fieldId, next);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [api, fieldId, setFieldValue, value]);\n\n const display =\n value.length > 0 ? value.map((u) => formatUserDisplay(u, displayFormat)).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\nfunction getUserNameLikeId(user: UserItem) {\n const id = getUserId(user);\n return Boolean(id && (!user.name || user.name === id));\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, useMemo, useRef, useState } from 'react';\nimport { TreeSelect } from 'antd';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n getDepartmentFullPath,\n filterTreeByScope,\n normalizeDepartmentArray,\n} from '../shared/fieldFormat';\nimport { DepartmentPicker } from '../shared/DepartmentPicker';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nfunction toDepartmentValue(item: any) {\n const normalized = normalizeDepartmentNode(item);\n return { id: getDepartmentId(normalized), name: getDepartmentName(normalized) };\n}\n\nfunction convertTreeData(nodes: DepartmentTreeNode[]): any[] {\n return nodes.map((node) => ({\n value: getDepartmentId(node),\n title: getDepartmentName(node),\n isLeaf: node.isLeaf ?? !node.hasChildren,\n children: node.children ? convertTreeData(node.children) : undefined,\n }));\n}\n\nexport function DepartmentSelectFieldPC({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = false,\n treeData,\n allowClear = true,\n maxCount,\n showFullPath,\n scopeType,\n specifiedDepts,\n onChange,\n}: DepartmentSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeDepartmentArray(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const configuredTreeData = treeData ?? EMPTY_TREE_DATA;\n const remoteLoadedRef = useRef(false);\n const [loadedTreeData, setLoadedTreeData] = useState<DepartmentTreeNode[]>(configuredTreeData);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData.map(normalizeDepartmentNode));\n return;\n }\n if (remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n api\n .getDepartmentRoots()\n .then((nodes) =>\n setLoadedTreeData((nodes as DepartmentTreeNode[]).map(normalizeDepartmentNode)),\n );\n }, [api, configuredTreeData]);\n\n // 应用范围过滤\n const scopedTreeData = filterTreeByScope(loadedTreeData, scopeType, specifiedDepts);\n const allDepts = flattenDepartments(scopedTreeData);\n\n const handleChange = (selectedValue: any) => {\n const selectedValues = Array.isArray(selectedValue)\n ? selectedValue\n : selectedValue\n ? [selectedValue]\n : [];\n const selected = selectedValues\n .map((item) => {\n const id = String(item?.value ?? item);\n const label = item?.label;\n const matched =\n allDepts.find((dept) => dept.id === id) ??\n value.find((dept) => getDepartmentId(dept) === id);\n const labelText =\n typeof label === 'string' || typeof label === 'number' ? String(label) : undefined;\n return { id, name: labelText || matched?.name || id };\n })\n .filter((item) => item.id);\n const result = (\n multiple ? selected.slice(0, maxCount ?? selected.length) : selected.slice(0, 1)\n ).map(toDepartmentValue);\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const handlePickerConfirm = (items: { id: string; name: string }[]) => {\n const result = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n toDepartmentValue,\n );\n setFieldValue(fieldId, result);\n onChange?.(result);\n };\n\n const treeDataConverted = convertTreeData(scopedTreeData);\n const selectValue = multiple\n ? value.map((d) => ({\n value: getDepartmentId(d),\n label: showFullPath\n ? getDepartmentFullPath(getDepartmentId(d), scopedTreeData) || getDepartmentName(d)\n : getDepartmentName(d),\n }))\n : value[0]\n ? {\n value: getDepartmentId(value[0]),\n label: showFullPath\n ? getDepartmentFullPath(getDepartmentId(value[0]), scopedTreeData) ||\n getDepartmentName(value[0])\n : getDepartmentName(value[0]),\n }\n : undefined;\n\n return (\n <div className=\"sy-select-with-picker\">\n <TreeSelect\n className={inputClassName}\n style={{ width: '100%' }}\n multiple={multiple}\n maxCount={maxCount}\n allowClear={allowClear}\n labelInValue\n treeData={treeDataConverted}\n value={selectValue}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleChange}\n loadData={async (node: any) => {\n if (configuredTreeData.length) return;\n const children = await api.getDepartmentChildren(String(node.value));\n setLoadedTreeData((current) => {\n const attach = (items: DepartmentTreeNode[]): DepartmentTreeNode[] =>\n items.map((item) => {\n const id = getDepartmentId(item);\n if (id === String(node.value)) {\n return {\n ...item,\n children: (children as DepartmentTreeNode[]).map(normalizeDepartmentNode),\n };\n }\n return item.children ? { ...item, children: attach(item.children) } : item;\n });\n return attach(current);\n });\n }}\n treeDefaultExpandAll={Boolean(configuredTreeData.length)}\n data-testid={`deptselectfield-input-${fieldId}`}\n />\n <button\n type=\"button\"\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={() => setPickerOpen(true)}\n data-testid={`deptselectfield-picker-trigger-${fieldId}`}\n >\n 选择\n </button>\n {pickerOpen && (\n <DepartmentPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple={multiple}\n value={value}\n treeData={treeData}\n onConfirm={handlePickerConfirm}\n onCancel={() => undefined}\n />\n )}\n </div>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { Button, Checkbox, Empty, Input, List, Modal, Space, Spin, Tag, Tree } from 'antd';\nimport type { TreeProps } from 'antd';\nimport { ApartmentOutlined, SearchOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport { getDepartmentId, getDepartmentName } from './fieldFormat';\nimport { useLazyDepartmentTree, type LazyDepartmentNode } from './useLazyDepartmentTree';\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\nexport interface DepartmentValue {\n id: string;\n name: string;\n}\n\ninterface DepartmentPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: DepartmentValue[];\n treeData?: DepartmentTreeNode[];\n onConfirm: (items: DepartmentValue[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeSelection(items: DepartmentValue[]) {\n return items\n .map((item) => ({ id: String(item.id || ''), name: String(item.name || item.id || '') }))\n .filter((item) => item.id);\n}\n\nfunction matchSearch(nodes: LazyDepartmentNode[], keyword: string): LazyDepartmentNode[] {\n if (!keyword) return nodes;\n const lower = keyword.toLowerCase();\n return nodes\n .map((node) => {\n const name = getDepartmentName(node);\n const children = node.children ? matchSearch(node.children, keyword) : undefined;\n if (name.toLowerCase().includes(lower) || children?.length) {\n return { ...node, children };\n }\n return null;\n })\n .filter(Boolean) as LazyDepartmentNode[];\n}\n\nexport function DepartmentPickerPanel({\n api,\n multiple = false,\n value,\n treeData,\n onConfirm,\n onCancel,\n mobile = false,\n}: DepartmentPickerPanelProps) {\n const {\n treeData: loadedTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [keyword, setKeyword] = useState('');\n const [selected, setSelected] = useState<DepartmentValue[]>(() => normalizeSelection(value));\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [currentDeptId, setCurrentDeptId] = useState<string | null>(null);\n const selectedIds = selected.map((item) => item.id);\n const MobileSearchBar = getMobileComponent('SearchBar');\n\n const filteredTreeData = useMemo(\n () => matchSearch(loadedTreeData, keyword.trim()),\n [keyword, loadedTreeData],\n );\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: DepartmentValue[] = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileList = useMemo(() => {\n if (keyword.trim()) {\n const lower = keyword.trim().toLowerCase();\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(lower))\n .map((item) => item.node);\n }\n if (!currentDeptId) return loadedTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, flatNodes, keyword, loadedTreeData, nodeMap]);\n\n const upsertSelected = (department: DepartmentValue, checked: boolean) => {\n if (multiple) {\n setSelected((prev) => {\n if (checked) {\n return prev.some((item) => item.id === department.id) ? prev : [...prev, department];\n }\n return prev.filter((item) => item.id !== department.id);\n });\n return;\n }\n setSelected(checked ? [department] : []);\n };\n\n const handleTreeCheck: TreeProps['onCheck'] = (keys) => {\n const checkedKeys = Array.isArray(keys) ? keys : keys.checked;\n const next = checkedKeys\n .map((key) => {\n const node = nodeMap.get(String(key));\n return node ? { id: getDepartmentId(node), name: getDepartmentName(node) } : undefined;\n })\n .filter(Boolean) as DepartmentValue[];\n setSelected(next);\n };\n\n const handleTreeSelect: TreeProps['onSelect'] = (keys) => {\n const id = String(keys[0] || '');\n const node = id ? nodeMap.get(id) : undefined;\n setSelected(node ? [{ id, name: getDepartmentName(node) }] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-org-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length}</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={item.id} closable onClose={() => upsertSelected(item, false)}>\n {item.name}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-org-picker sy-org-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择部门</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar placeholder=\"搜索部门\" value={keyword} onChange={setKeyword} />\n ) : (\n <input value={keyword} onChange={(event) => setKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => setCurrentDeptId(null)}>\n 部门\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => setCurrentDeptId(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileList}\n locale={{ emptyText: '暂无部门' }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const selectedNow = selectedIds.includes(id);\n const hasChildren = Boolean(node.hasChildren && !node.isLeaf);\n return (\n <List.Item\n key={id}\n actions={[\n <Checkbox\n key=\"select\"\n checked={selectedNow}\n onChange={(event) => upsertSelected({ id, name }, event.target.checked)}\n />,\n hasChildren ? (\n <button\n key=\"children\"\n type=\"button\"\n onClick={async () => {\n await loadChildren(id);\n setCurrentDeptId(id);\n setKeyword('');\n }}\n >\n 下级\n </button>\n ) : null,\n ]}\n >\n <List.Item.Meta avatar={<ApartmentOutlined />} title={name} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderSelected()}\n </div>\n );\n }\n\n return (\n <div className=\"sy-org-picker\">\n <div className=\"sy-org-picker-main\">\n <div className=\"sy-org-picker-tree\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={keyword}\n onChange={(event) => setKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n checkable={multiple}\n checkedKeys={multiple ? selectedIds : undefined}\n selectedKeys={multiple ? undefined : selectedIds}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onCheck={multiple ? handleTreeCheck : undefined}\n onSelect={multiple ? undefined : handleTreeSelect}\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={480}\n />\n </Spin>\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface DepartmentPickerProps extends Omit<DepartmentPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function DepartmentPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: DepartmentPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <DepartmentPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择部门\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(760px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentSelectFieldProps, DepartmentTreeNode } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n normalizeDepartmentArray,\n getDepartmentFullPath,\n filterTreeByScope,\n} from '../shared/fieldFormat';\nimport { DepartmentPicker } from '../shared/DepartmentPicker';\nimport { MobileFieldTrigger } from '../shared/MobileField';\n\nconst EMPTY_TREE_DATA: DepartmentTreeNode[] = [];\n\nfunction toDepartmentValue(item: any) {\n const normalized = normalizeDepartmentNode(item);\n return { id: getDepartmentId(normalized), name: getDepartmentName(normalized) };\n}\n\nconst getMobilePopup = () => {\n try {\n return (MobileAntd as any).Popup;\n } catch {\n return undefined;\n }\n};\n\nexport function DepartmentSelectFieldMobile({\n fieldId,\n behavior,\n placeholder,\n inputClassName,\n multiple = false,\n treeData,\n allowClear = true,\n maxCount,\n showFullPath,\n scopeType,\n specifiedDepts,\n onChange,\n}: DepartmentSelectFieldProps) {\n const { formData, setFieldValue, api } = useFormContext();\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeDepartmentArray(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const [showPicker, setShowPicker] = useState(false);\n const configuredTreeData = treeData ?? EMPTY_TREE_DATA;\n const remoteLoadedRef = useRef(false);\n const [loadedTreeData, setLoadedTreeData] = useState<DepartmentTreeNode[]>(configuredTreeData);\n\n useEffect(() => {\n if (configuredTreeData.length) {\n setLoadedTreeData(configuredTreeData.map(normalizeDepartmentNode));\n }\n }, [configuredTreeData]);\n\n const ensureDepartments = async () => {\n if (configuredTreeData.length || loadedTreeData.length || remoteLoadedRef.current) return;\n remoteLoadedRef.current = true;\n const roots = await api.getDepartmentRoots();\n setLoadedTreeData((roots as DepartmentTreeNode[]).map(normalizeDepartmentNode));\n };\n\n // 应用范围过滤\n const scopedTreeData = filterTreeByScope(loadedTreeData, scopeType, specifiedDepts);\n const allDepts = flattenDepartments(scopedTreeData);\n\n const handleSelect = (deptId: string) => {\n const dept = allDepts.find((d) => d.id === deptId);\n /* v8 ignore next */\n if (!dept) return;\n const selectedDept = normalizeDepartmentNode(dept.node ?? dept);\n\n let newValue: DepartmentTreeNode[];\n if (multiple) {\n const exists = value.some((d) => getDepartmentId(d) === deptId);\n newValue = exists\n ? value.filter((d) => getDepartmentId(d) !== deptId)\n : [...value, selectedDept];\n newValue = newValue.slice(0, maxCount ?? newValue.length);\n } else {\n newValue = [selectedDept];\n setShowPicker(false);\n }\n const normalized = newValue.map(toDepartmentValue);\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const handleConfirm = (items: { id: string; name: string }[]) => {\n const next = (multiple ? items.slice(0, maxCount ?? items.length) : items.slice(0, 1)).map(\n toDepartmentValue,\n );\n setFieldValue(fieldId, next);\n onChange?.(next);\n setShowPicker(false);\n };\n\n const openPicker = () => {\n if (disabled) return;\n setShowPicker(true);\n void ensureDepartments();\n };\n\n const handleClear = () => {\n setFieldValue(fieldId, []);\n onChange?.([]);\n setShowPicker(false);\n };\n\n const displayValue = value.length\n ? value\n .map((d) =>\n showFullPath\n ? getDepartmentFullPath(getDepartmentId(d), scopedTreeData) || getDepartmentName(d)\n : getDepartmentName(d),\n )\n .join(', ')\n : undefined;\n\n return (\n <div className={inputClassName} data-testid={`deptselectfield-mobile-${fieldId}`}>\n <MobileFieldTrigger\n value={displayValue}\n placeholder={placeholder ?? '请选择'}\n disabled={disabled}\n clearable={allowClear}\n onClick={openPicker}\n onClear={handleClear}\n testId={`deptselectfield-mobile-trigger-${fieldId}`}\n />\n {showPicker && getMobilePopup() ? (\n <DepartmentPicker\n api={api}\n open={showPicker}\n onOpenChange={setShowPicker}\n mobile\n multiple={multiple}\n value={value}\n treeData={treeData}\n onConfirm={handleConfirm}\n onCancel={() => setShowPicker(false)}\n />\n ) : showPicker ? (\n <ul data-testid={`deptselectfield-mobile-list-${fieldId}`}>\n {allDepts.map((dept) => (\n <li key={dept.id}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(dept.id)}\n data-testid={`deptselectfield-mobile-option-${dept.id}`}\n >\n {getDepartmentName(dept)}\n {value.some((d) => getDepartmentId(d) === dept.id) ? ' ✓' : ''}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { DepartmentSelectFieldProps } from '../../types';\nimport { useFormContext } from '../../core/FormContext';\nimport {\n getDepartmentFullPath,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentArray,\n} from '../shared/fieldFormat';\n\nexport function DepartmentSelectFieldReadonly({\n fieldId,\n readonlyClassName,\n showFullPath,\n treeData,\n}: DepartmentSelectFieldProps) {\n const { formData } = useFormContext();\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeDepartmentArray(rawValue), [rawValue]);\n\n const display =\n value.length > 0\n ? value\n .map((d) =>\n showFullPath\n ? getDepartmentFullPath(getDepartmentId(d), treeData) || getDepartmentName(d)\n : getDepartmentName(d),\n )\n .join(', ')\n : '--';\n\n return (\n <div\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`deptselectfield-readonly-${fieldId}`}\n >\n {display}\n </div>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Cascader } from 'antd';\nimport type { CascadeSelectFieldProps, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst toValuePath = (value: any, multiple?: boolean) => {\n if (!value) return multiple ? [] : [];\n if (multiple && Array.isArray(value) && Array.isArray(value[0])) {\n return value.map((path: OptionItem[]) => path.map((item) => item.value));\n }\n if (Array.isArray(value)) return value.map((item) => item.value);\n return [];\n};\n\nconst normalizePath = (selectedOptions?: any[]) =>\n (selectedOptions ?? []).map((item) => ({\n label: String(item?.label ?? item?.title ?? item?.value ?? ''),\n value: String(item?.value ?? ''),\n }));\n\nexport function CascadeSelectField(props: CascadeSelectFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n options = [],\n multiple = false,\n allowClear = true,\n changeOnSelect,\n showSearch,\n fieldNames,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] ?? (multiple ? [] : []);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n const readonlyText = Array.isArray(value)\n ? (multiple && Array.isArray(value[0]) ? value.flat() : value)\n .map((item: any) => item?.label ?? item?.value ?? item)\n .join(' / ')\n : '--';\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`cascadeselectfield-readonly-${fieldId}`}\n >\n {readonlyText || '--'}\n </div>\n ) : (\n <Cascader\n className={inputClassName}\n style={{ width: '100%' }}\n options={options}\n multiple={multiple}\n allowClear={allowClear}\n changeOnSelect={changeOnSelect}\n showSearch={showSearch}\n fieldNames={fieldNames as any}\n disabled={behavior === 'DISABLED'}\n placeholder={placeholder}\n value={toValuePath(value, multiple) as any}\n onChange={(_nextValue: any, selectedOptions: any) => {\n const next = multiple\n ? ((selectedOptions as any[][]) ?? []).map((path) => normalizePath(path))\n : normalizePath(selectedOptions as any[]);\n setFieldValue(fieldId, next);\n onChange?.(next);\n }}\n data-testid={`cascadeselectfield-input-${fieldId}`}\n />\n )}\n </FieldWrapper>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Cascader, Input, Space, Spin } from 'antd';\nimport * as MobileAntd from 'antd-mobile';\nimport type { AddressFieldProps, AddressValue, OptionItem } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\n\nconst LEVELS = ['province', 'city', 'district', 'street'] as const;\n\ntype AddressLevel = (typeof LEVELS)[number];\ntype AddressOption = OptionItem & {\n level?: AddressLevel;\n isLeaf?: boolean;\n children?: AddressOption[];\n};\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\nconst modeDepth = (mode?: AddressFieldProps['mode']) => {\n if (mode === 'province-city') return 2;\n if (mode === 'province-city-district-street' || mode === 'province-city-district-street-detail') {\n return 4;\n }\n return 3;\n};\n\nconst activeLevels = (mode?: AddressFieldProps['mode']) => LEVELS.slice(0, modeDepth(mode));\n\nconst valueToPath = (value?: AddressValue) =>\n LEVELS.map((level) => value?.[level]?.value).filter(Boolean) as string[];\n\nconst normalizeDivision = (item: any, level: AddressLevel, depth: number, index: number) => ({\n label: String(item.name || item.label || item.adcode || item.value),\n value: String(item.adcode || item.value || item.id),\n level,\n isLeaf: index + 1 >= depth || item.isLeaf === true,\n});\n\nconst composeFullAddress = (value?: AddressValue, levels: readonly AddressLevel[] = LEVELS) => {\n if (!value) return '';\n return [...levels.map((level) => value[level]?.label), value.detail].filter(Boolean).join('');\n};\n\nexport function AddressField(props: AddressFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n defaultValue,\n mode = 'province-city-district',\n detailPlaceholder = '请输入详细地址',\n allowClear = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as AddressValue | undefined;\n const [options, setOptions] = useState<AddressOption[]>([]);\n const [loadingRoots, setLoadingRoots] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileLevelIndex, setMobileLevelIndex] = useState(0);\n const [mobileOptions, setMobileOptions] = useState<AddressOption[]>([]);\n const [mobileLoading, setMobileLoading] = useState(false);\n const [tempValue, setTempValue] = useState<AddressValue | undefined>();\n const depth = modeDepth(mode);\n const levels = useMemo(() => activeLevels(mode), [mode]);\n const detailEnabled = mode === 'province-city-district-street-detail';\n const disabled = behavior === 'DISABLED';\n const MobilePopup = getMobileComponent('Popup');\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const loadDivisions = async (\n parentAdcode: string | undefined,\n level: AddressLevel,\n index: number,\n ) => {\n const list = await api.getChinaDivisions(parentAdcode);\n return list.map((item: any) => normalizeDivision(item, level, depth, index));\n };\n\n useEffect(() => {\n setLoadingRoots(true);\n loadDivisions(undefined, 'province', 0)\n .then(setOptions)\n .finally(() => setLoadingRoots(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, depth]);\n\n useEffect(() => {\n if (!mobileOpen) return;\n const level = levels[mobileLevelIndex] || 'province';\n const parentLevel = levels[mobileLevelIndex - 1];\n const parentAdcode = parentLevel ? tempValue?.[parentLevel]?.value : undefined;\n setMobileLoading(true);\n loadDivisions(parentAdcode, level, mobileLevelIndex)\n .then(setMobileOptions)\n .finally(() => setMobileLoading(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mobileOpen, mobileLevelIndex, tempValue, levels]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setAddressValue = (next: AddressValue | undefined) => {\n const normalized = next\n ? { ...next, fullAddress: composeFullAddress(next, levels) }\n : undefined;\n setFieldValue(fieldId, normalized);\n onChange?.(normalized);\n };\n\n const display = value?.fullAddress || composeFullAddress(value, levels) || '--';\n\n const renderDetailInput = (\n currentValue?: AddressValue,\n onCommit?: (next?: AddressValue) => void,\n ) =>\n detailEnabled ? (\n <Input\n value={currentValue?.detail ?? ''}\n disabled={disabled}\n placeholder={detailPlaceholder}\n onChange={(event) => {\n const next = {\n ...(currentValue ?? {}),\n detail: event.target.value,\n };\n onCommit?.(next);\n }}\n />\n ) : null;\n\n const mobilePicker = MobilePopup ? (\n <MobilePopup\n visible={mobileOpen}\n onMaskClick={() => setMobileOpen(false)}\n bodyStyle={{ height: '80vh' }}\n >\n <div className=\"sy-address-mobile\">\n <div className=\"sy-address-mobile-head\">\n <button\n type=\"button\"\n disabled={mobileLevelIndex === 0}\n onClick={() => setMobileLevelIndex((prev) => Math.max(0, prev - 1))}\n >\n 返回\n </button>\n <strong>{['省份', '城市', '区县', '街道'][mobileLevelIndex] || '地址'}</strong>\n <button type=\"button\" onClick={() => setMobileOpen(false)}>\n 关闭\n </button>\n </div>\n <div className=\"sy-address-mobile-path\">\n {levels.map((level, index) => (\n <button\n type=\"button\"\n key={level}\n className={index === mobileLevelIndex ? 'is-active' : undefined}\n disabled={!tempValue?.[level] && index > 0}\n onClick={() => setMobileLevelIndex(index)}\n >\n {tempValue?.[level]?.label || ['省', '市', '区', '街道'][index]}\n </button>\n ))}\n </div>\n <div className=\"sy-address-mobile-list\">\n {mobileLoading ? (\n <Spin />\n ) : mobileOptions.length ? (\n mobileOptions.map((option) => (\n <button\n type=\"button\"\n key={option.value}\n className={\n tempValue?.[option.level || 'province']?.value === option.value\n ? 'is-active'\n : undefined\n }\n onClick={() => {\n const level = levels[mobileLevelIndex];\n if (!level) return;\n const next: AddressValue = { ...(tempValue ?? {}) };\n next[level] = { label: option.label, value: option.value };\n levels.slice(mobileLevelIndex + 1).forEach((laterLevel) => {\n delete next[laterLevel];\n });\n setTempValue(next);\n if (mobileLevelIndex < levels.length - 1) {\n setMobileLevelIndex(mobileLevelIndex + 1);\n }\n }}\n >\n {option.label}\n </button>\n ))\n ) : (\n <div className=\"sy-empty\">暂无数据</div>\n )}\n </div>\n {detailEnabled && (\n <div className=\"sy-address-mobile-detail\">\n {renderDetailInput(tempValue, (next) => setTempValue(next))}\n </div>\n )}\n <div className=\"sy-address-mobile-footer\">\n <Button onClick={() => setMobileOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n onClick={() => {\n setAddressValue(tempValue);\n setMobileOpen(false);\n }}\n >\n 确定\n </Button>\n </div>\n </div>\n </MobilePopup>\n ) : null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div className=\"sy-field-readonly-value\" data-testid={`addressfield-readonly-${fieldId}`}>\n {display}\n </div>\n ) : isMobile && MobilePopup ? (\n <div\n className={inputClassName}\n style={{ minWidth: 0, maxWidth: '100%' }}\n data-testid={`addressfield-input-${fieldId}`}\n >\n <Space.Compact style={{ width: '100%' }}>\n <Button\n className=\"sy-address-mobile-trigger\"\n style={{ flex: 1, textAlign: 'left' }}\n disabled={disabled}\n onClick={() => {\n setTempValue(value);\n setMobileLevelIndex(0);\n setMobileOpen(true);\n }}\n >\n {display === '--' ? props.placeholder || '请选择地址' : display}\n </Button>\n {allowClear && (\n <Button disabled={disabled} onClick={() => setAddressValue(undefined)}>\n 清空\n </Button>\n )}\n </Space.Compact>\n {mobilePicker}\n </div>\n ) : (\n <div className={inputClassName} data-testid={`addressfield-input-${fieldId}`}>\n <Cascader\n style={{ width: '100%' }}\n options={options}\n allowClear={allowClear}\n disabled={disabled}\n value={valueToPath(value)}\n placeholder={props.placeholder || '请选择地址'}\n loading={loadingRoots}\n loadData={async (selectedOptions) => {\n const target = selectedOptions[selectedOptions.length - 1] as AddressOption;\n const nextLevel = levels[selectedOptions.length] ?? 'street';\n const children = await loadDivisions(target.value, nextLevel, selectedOptions.length);\n target.children = children;\n setOptions([...options]);\n }}\n onChange={(_path, selectedOptions) => {\n if (!selectedOptions?.length) {\n setAddressValue(undefined);\n return;\n }\n const next: AddressValue = {};\n selectedOptions.forEach((item: any, index) => {\n const level = levels[index];\n if (level) next[level] = { label: item.label, value: item.value };\n });\n next.detail = value?.detail;\n setAddressValue(next);\n }}\n />\n {renderDetailInput(value, setAddressValue)}\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Button, Drawer, Input, Modal, Select, Space, Spin, Table, Tag } from 'antd';\nimport type { ColumnsType, TablePaginationConfig } from 'antd/es/table';\nimport type { AssociationFormFieldProps, AssociationValue } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\n\ntype AssociationRecord = Record<string, any> & {\n __associationLabel: string;\n __associationValue: string | number;\n};\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nconst normalizeValues = (value: any): AssociationValue[] => {\n if (!value) return [];\n return (Array.isArray(value) ? value : [value]).filter(\n (item) => item && item.value !== undefined && item.value !== null,\n );\n};\n\nconst normalizeCellValue = (value: any) => {\n if (value === undefined || value === null || value === '') return '--';\n if (typeof value === 'object') {\n if ('label' in value) return String(value.label ?? '--');\n if ('name' in value) return String(value.name ?? '--');\n return JSON.stringify(value);\n }\n return String(value);\n};\n\nconst normalizeSearchResult = (result: any) => {\n const payload = result?.data ?? result?.result ?? result ?? {};\n const list = Array.isArray(payload)\n ? payload\n : payload.list || payload.items || payload.records || payload.data || [];\n return {\n list: Array.isArray(list) ? list : [],\n total: payload.total ?? payload.totalCount ?? payload.count ?? list.length ?? 0,\n };\n};\n\nconst stableSerialize = (value: any) => {\n try {\n return JSON.stringify(value, (_key, item) => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return item;\n return Object.keys(item)\n .sort()\n .reduce<Record<string, any>>((next, key) => {\n next[key] = item[key];\n return next;\n }, {});\n });\n } catch {\n return String(value);\n }\n};\n\nexport function AssociationFormField(props: AssociationFormFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n associationForm,\n multiple = false,\n allowClear = true,\n showSearch = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const rawValue = formData[fieldId];\n const value = useMemo(() => normalizeValues(rawValue), [rawValue]);\n const disabled = behavior === 'DISABLED';\n const [options, setOptions] = useState<AssociationValue[]>([]);\n const [selectLoading, setSelectLoading] = useState(false);\n const [selectorOpen, setSelectorOpen] = useState(false);\n const [tableLoading, setTableLoading] = useState(false);\n const [tableData, setTableData] = useState<AssociationRecord[]>([]);\n const [keyword, setKeyword] = useState('');\n const [pagination, setPagination] = useState({\n current: 1,\n pageSize: DEFAULT_PAGE_SIZE,\n total: 0,\n });\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);\n const [selectedRecords, setSelectedRecords] = useState<AssociationRecord[]>([]);\n const formDataRef = useRef(formData);\n const associationFormRef = useRef(associationForm);\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 useEffect(() => {\n formDataRef.current = formData;\n }, [formData]);\n\n useEffect(() => {\n associationFormRef.current = associationForm;\n }, [associationForm]);\n\n const associationAppType = associationForm?.appType;\n const associationFormUuid = associationForm?.formUuid;\n const associationMainFieldId = associationForm?.mainFieldId;\n const canQuery = Boolean(associationAppType && associationFormUuid);\n const filterRulesKey = useMemo(\n () => stableSerialize(associationForm?.dataFilterRules || []),\n [associationForm?.dataFilterRules],\n );\n const currentFieldFilterKey = useMemo(() => {\n const rules = associationForm?.dataFilterRules || [];\n return stableSerialize(\n rules.map((rule) => {\n if (rule?.valueType !== 'currentField' || !rule.currentFieldKey) return null;\n return [rule.currentFieldKey, formData[rule.currentFieldKey]];\n }),\n );\n }, [formData, associationForm?.dataFilterRules]);\n const filterDependencyKey = useMemo(\n () => `${filterRulesKey}:${currentFieldFilterKey}`,\n [currentFieldFilterKey, filterRulesKey],\n );\n\n const normalizeRecord = useCallback(\n (record: Record<string, any>): AssociationRecord => {\n const mainFieldValue = associationMainFieldId ? record?.[associationMainFieldId] : undefined;\n const labelText = normalizeCellValue(mainFieldValue);\n const valueId =\n record?.formInstId ??\n record?.formInstID ??\n record?.bizObjectId ??\n record?.id ??\n record?.dataId ??\n record?.uuid ??\n labelText;\n return {\n ...record,\n __associationLabel: labelText,\n __associationValue: valueId,\n };\n },\n [associationMainFieldId],\n );\n\n const toValue = useCallback(\n (record: AssociationRecord): AssociationValue => ({\n label: record.__associationLabel,\n value: record.__associationValue,\n record,\n }),\n [],\n );\n\n const buildFilters = useCallback(() => {\n void filterDependencyKey;\n const rules = associationFormRef.current?.dataFilterRules || [];\n const currentFormData = formDataRef.current;\n return rules\n .map((rule) => {\n if (!rule?.key) return null;\n const sourceValue =\n rule.valueType === 'currentField' && rule.currentFieldKey\n ? currentFormData[rule.currentFieldKey]\n : rule.value;\n if (sourceValue === undefined || sourceValue === null || sourceValue === '') return null;\n return {\n key: rule.key,\n operator: rule.operator || 'EQ',\n componentName: rule.componentName,\n value:\n typeof sourceValue === 'object' && 'value' in sourceValue\n ? sourceValue.value\n : sourceValue,\n };\n })\n .filter(Boolean);\n }, [filterDependencyKey]);\n\n const fetchRecords = useCallback(\n async (params?: { currentPage?: number; pageSize?: number; searchKeyWord?: string }) => {\n if (!canQuery) return { list: [] as AssociationRecord[], total: 0 };\n const filters = buildFilters();\n const result = await api.advancedSearch({\n appType: associationAppType,\n formUuid: associationFormUuid,\n currentPage: params?.currentPage || 1,\n pageSize: params?.pageSize || DEFAULT_PAGE_SIZE,\n searchKeyWord: params?.searchKeyWord,\n ...(filters.length\n ? {\n filters: JSON.stringify(filters),\n conditionType: associationFormRef.current?.dataFilterConditionType || 'AND',\n }\n : {}),\n });\n const normalized = normalizeSearchResult(result);\n return {\n list: normalized.list.map((record: any) => normalizeRecord(record)),\n total: normalized.total,\n };\n },\n [api, associationAppType, associationFormUuid, buildFilters, canQuery, normalizeRecord],\n );\n\n const loadOptions = useCallback(\n async (searchKeyWord?: string) => {\n setSelectLoading(true);\n try {\n const result = await fetchRecords({ currentPage: 1, pageSize: 20, searchKeyWord });\n setOptions(result.list.map(toValue));\n } finally {\n setSelectLoading(false);\n }\n },\n [fetchRecords, toValue],\n );\n\n const loadTable = useCallback(\n async (next?: Partial<typeof pagination> & { searchKeyWord?: string }) => {\n setTableLoading(true);\n const current = next?.current || 1;\n const pageSize = next?.pageSize || pagination.pageSize;\n try {\n const result = await fetchRecords({\n currentPage: current,\n pageSize,\n searchKeyWord: next?.searchKeyWord ?? keyword,\n });\n setTableData(result.list);\n setPagination({ current, pageSize, total: result.total });\n } finally {\n setTableLoading(false);\n }\n },\n [fetchRecords, keyword, pagination.pageSize],\n );\n\n useEffect(() => {\n void loadOptions();\n }, [loadOptions]);\n\n useEffect(() => {\n setSelectedRowKeys(value.map((item) => item.value));\n setSelectedRecords(\n value\n .map((item) =>\n item.record ? normalizeRecord(item.record as Record<string, any>) : undefined,\n )\n .filter(Boolean) as AssociationRecord[],\n );\n }, [normalizeRecord, value]);\n\n const applyDataFilling = useCallback(\n (next: AssociationValue[]) => {\n if (!associationForm?.dataFillingEnabled && !associationForm?.dataFillingRules?.mainRules) {\n return;\n }\n const sourceRecord = next[0]?.record;\n if (!sourceRecord) return;\n (associationForm?.dataFillingRules?.mainRules || []).forEach((rule) => {\n if (!rule?.source || !rule?.target) return;\n setFieldValue(rule.target, sourceRecord[rule.source]);\n });\n },\n [associationForm?.dataFillingEnabled, associationForm?.dataFillingRules, setFieldValue],\n );\n\n const commitSelection = useCallback(\n (next: AssociationValue[]) => {\n const normalized = multiple ? next : next.slice(0, 1);\n setFieldValue(fieldId, normalized);\n applyDataFilling(normalized);\n onChange?.(normalized);\n },\n [applyDataFilling, fieldId, multiple, onChange, setFieldValue],\n );\n\n const selectorColumns: ColumnsType<AssociationRecord> = useMemo(() => {\n const configured = associationForm?.selectorColumns || [];\n if (configured.length) {\n return configured\n .map((column) => {\n if (typeof column === 'string') {\n return { title: column, dataIndex: column, key: column, ellipsis: true };\n }\n return {\n title: column.title || column.dataIndex,\n dataIndex: column.dataIndex,\n key: column.key || column.dataIndex,\n width: column.width,\n ellipsis: column.ellipsis ?? true,\n render: (cellValue: any, record: AssociationRecord) =>\n column.dataIndex === associationForm?.mainFieldId\n ? normalizeCellValue(record.__associationLabel)\n : normalizeCellValue(cellValue),\n };\n })\n .filter(Boolean) as ColumnsType<AssociationRecord>;\n }\n const mainFieldId = associationForm?.mainFieldId;\n return [\n {\n title: '主字段',\n dataIndex: mainFieldId || '__associationLabel',\n key: mainFieldId || '__associationLabel',\n ellipsis: true,\n render: (_cellValue: any, record: AssociationRecord) =>\n normalizeCellValue(record.__associationLabel),\n },\n {\n title: 'ID',\n dataIndex: '__associationValue',\n key: '__associationValue',\n ellipsis: true,\n render: (_cellValue: any, record: AssociationRecord) =>\n normalizeCellValue(record.__associationValue),\n },\n ];\n }, [associationForm?.mainFieldId, associationForm?.selectorColumns]);\n\n const selectOptions = useMemo(\n () =>\n [...options, ...value]\n .filter(\n (item, index, list) =>\n list.findIndex((candidate) => candidate.value === item.value) === index,\n )\n .map((item) => ({ label: item.label, value: item.value })),\n [options, value],\n );\n\n if (behavior === 'HIDDEN') return null;\n\n const readonlyContent = value.map((item) => item.label).join(', ') || '--';\n const openSelector = () => {\n if (disabled) return;\n setSelectorOpen(true);\n void loadTable({ current: 1 });\n };\n const picker = (\n <div className=\"sy-association-selector\">\n <Input.Search\n allowClear\n enterButton=\"搜索\"\n value={keyword}\n placeholder={associationForm?.mainFieldId ? '搜索关联数据' : '搜索'}\n onChange={(event) => {\n setKeyword(event.target.value);\n if (!event.target.value) void loadTable({ current: 1, searchKeyWord: '' });\n }}\n onSearch={(searchKeyWord) => {\n setKeyword(searchKeyWord);\n void loadTable({ current: 1, searchKeyWord });\n }}\n />\n <Table<AssociationRecord>\n rowKey=\"__associationValue\"\n dataSource={tableData}\n columns={selectorColumns}\n loading={tableLoading}\n size=\"small\"\n pagination={{\n current: pagination.current,\n pageSize: pagination.pageSize,\n total: pagination.total,\n onChange: (current, pageSize) => void loadTable({ current, pageSize }),\n }}\n rowSelection={{\n type: multiple ? 'checkbox' : 'radio',\n preserveSelectedRowKeys: true,\n selectedRowKeys,\n onChange: (keys, rows) => {\n setSelectedRowKeys(keys);\n setSelectedRecords(rows as AssociationRecord[]);\n },\n }}\n onChange={(nextPagination: TablePaginationConfig) => {\n void loadTable({\n current: nextPagination.current,\n pageSize: nextPagination.pageSize,\n });\n }}\n onRow={(record) => ({\n onClick: () => {\n if (multiple) {\n const exists = selectedRowKeys.includes(record.__associationValue);\n setSelectedRowKeys(\n exists\n ? selectedRowKeys.filter((item) => item !== record.__associationValue)\n : [...selectedRowKeys, record.__associationValue],\n );\n setSelectedRecords(\n exists\n ? selectedRecords.filter(\n (item) => item.__associationValue !== record.__associationValue,\n )\n : [...selectedRecords, record],\n );\n return;\n }\n setSelectedRowKeys([record.__associationValue]);\n setSelectedRecords([record]);\n },\n onDoubleClick: () => {\n commitSelection([toValue(record)]);\n setSelectorOpen(false);\n },\n })}\n scroll={{ x: true }}\n />\n {selectedRecords.length > 0 && (\n <div className=\"sy-association-selected\">\n {selectedRecords.map((record) => (\n <Tag\n key={record.__associationValue}\n closable={!disabled}\n onClose={(event) => {\n event.preventDefault();\n setSelectedRowKeys((prev) =>\n prev.filter((key) => key !== record.__associationValue),\n );\n setSelectedRecords((prev) =>\n prev.filter((item) => item.__associationValue !== record.__associationValue),\n );\n }}\n >\n {record.__associationLabel}\n </Tag>\n ))}\n </div>\n )}\n </div>\n );\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n {behavior === 'READONLY' ? (\n <div\n className=\"sy-field-readonly-value\"\n data-testid={`associationformfield-readonly-${fieldId}`}\n >\n {readonlyContent}\n </div>\n ) : (\n <div className={`sy-select-with-picker ${inputClassName || ''}`}>\n <Select\n style={{ width: '100%' }}\n mode={multiple ? 'multiple' : undefined}\n allowClear={allowClear}\n showSearch={showSearch}\n filterOption={false}\n onSearch={showSearch ? loadOptions : undefined}\n disabled={disabled}\n placeholder={placeholder}\n loading={selectLoading}\n notFoundContent={selectLoading ? <Spin size=\"small\" /> : undefined}\n options={selectOptions}\n value={multiple ? value.map((item) => item.value) : value[0]?.value}\n onChange={(nextValue) => {\n const ids = (Array.isArray(nextValue) ? nextValue : [nextValue]).filter(\n (item) => item !== undefined && item !== null,\n );\n const next = ids\n .map(\n (id) =>\n options.find((item) => item.value === id) ??\n value.find((item) => item.value === id),\n )\n .filter(Boolean) as AssociationValue[];\n commitSelection(next);\n }}\n data-testid={`associationformfield-input-${fieldId}`}\n />\n <Button\n className=\"sy-picker-trigger\"\n disabled={disabled}\n onClick={openSelector}\n data-testid={`associationformfield-picker-trigger-${fieldId}`}\n >\n 选择\n </Button>\n {value.length > 0 && (\n <Button disabled={disabled} onClick={() => commitSelection([])}>\n 清空\n </Button>\n )}\n </div>\n )}\n {isMobile ? (\n <Drawer\n title={associationForm?.formUuid || '选择关联数据'}\n placement=\"bottom\"\n height=\"80%\"\n open={selectorOpen}\n onClose={() => setSelectorOpen(false)}\n destroyOnClose\n footer={\n <Space style={{ width: '100%', justifyContent: 'flex-end' }}>\n <Button onClick={() => setSelectorOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n onClick={() => {\n commitSelection(selectedRecords.map(toValue));\n setSelectorOpen(false);\n }}\n >\n 确定\n </Button>\n </Space>\n }\n >\n {picker}\n </Drawer>\n ) : (\n <Modal\n title={associationForm?.formUuid || '选择关联数据'}\n open={selectorOpen}\n width={760}\n onCancel={() => setSelectorOpen(false)}\n onOk={() => {\n commitSelection(selectedRecords.map(toValue));\n setSelectorOpen(false);\n }}\n okButtonProps={{ disabled: selectedRecords.length === 0 }}\n destroyOnClose\n >\n {picker}\n </Modal>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Extension, type Editor } from '@tiptap/core';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Image from '@tiptap/extension-image';\nimport Link from '@tiptap/extension-link';\nimport Color from '@tiptap/extension-color';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport FontFamily from '@tiptap/extension-font-family';\nimport Highlight from '@tiptap/extension-highlight';\nimport CharacterCount from '@tiptap/extension-character-count';\nimport TaskList from '@tiptap/extension-task-list';\nimport TaskItem from '@tiptap/extension-task-item';\nimport Superscript from '@tiptap/extension-superscript';\nimport Subscript from '@tiptap/extension-subscript';\nimport CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';\nimport { Table } from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport { common, createLowlight } from 'lowlight';\nimport { Button, Input, InputNumber, Modal, Select, Space, Tooltip } from 'antd';\nimport {\n AlignCenterOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n BoldOutlined,\n ClearOutlined,\n CodeOutlined,\n HighlightOutlined,\n ItalicOutlined,\n LinkOutlined,\n OrderedListOutlined,\n PictureOutlined,\n RedoOutlined,\n StrikethroughOutlined,\n TableOutlined,\n UnderlineOutlined,\n UndoOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport type {\n EditorChoiceOption,\n EditorFieldProps,\n EditorToolbarAction,\n FormRuntimeApi,\n} from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\nimport { useDeviceDetect } from '../../hooks/useDeviceDetect';\nimport { normalizeRichTextHtml } from '../../utils/richText';\n\nconst lowlight = createLowlight(common);\n\nconst FontSize = Extension.create({\n name: 'fontSize',\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) => element.style.fontSize || null,\n renderHTML: (attributes) => {\n if (!attributes.fontSize) return {};\n return { style: `font-size: ${attributes.fontSize}` };\n },\n },\n },\n },\n ];\n },\n});\n\nconst DEFAULT_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp'];\n\nconst DEFAULT_FONT_FAMILIES: EditorChoiceOption[] = [\n { label: '默认字体', value: '' },\n { label: 'Arial', value: 'Arial, sans-serif' },\n { label: 'Inter', value: 'Inter, sans-serif' },\n { label: '宋体', value: 'SimSun, serif' },\n { label: '微软雅黑', value: 'Microsoft YaHei, sans-serif' },\n { label: '等宽字体', value: 'Menlo, Consolas, monospace' },\n];\n\nconst DEFAULT_FONT_SIZES: EditorChoiceOption[] = [\n { label: '12px', value: '12px' },\n { label: '14px', value: '14px' },\n { label: '16px', value: '16px' },\n { label: '18px', value: '18px' },\n { label: '24px', value: '24px' },\n { label: '32px', value: '32px' },\n];\n\nconst DEFAULT_COLOR_PRESETS = [\n '#111827',\n '#6b7280',\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#1677ff',\n '#8b5cf6',\n];\n\nconst TOOLBAR_PRESETS: Record<'minimal' | 'basic' | 'full', EditorToolbarAction[]> = {\n minimal: ['bold', 'italic', 'link', 'bulletList', 'orderedList', 'undo', 'redo'],\n basic: [\n 'undo',\n 'redo',\n 'heading',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'bulletList',\n 'orderedList',\n 'link',\n 'image',\n ],\n full: [\n 'undo',\n 'redo',\n 'heading',\n 'fontFamily',\n 'fontSize',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'superscript',\n 'subscript',\n 'color',\n 'highlight',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'blockquote',\n 'codeBlock',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'link',\n 'image',\n 'imageUrl',\n 'table',\n 'addColumnBefore',\n 'addColumnAfter',\n 'deleteColumn',\n 'addRowBefore',\n 'addRowAfter',\n 'deleteRow',\n 'toggleHeaderRow',\n 'deleteTable',\n 'clear',\n ],\n};\n\nconst KNOWN_ACTIONS = new Set<EditorToolbarAction>(TOOLBAR_PRESETS.full);\n\nconst normalizeToolbarConfig = (\n config?: EditorFieldProps['toolbarConfig'],\n): EditorToolbarAction[] => {\n if (Array.isArray(config)) {\n return (config as string[]).filter((item): item is EditorToolbarAction =>\n KNOWN_ACTIONS.has(item as EditorToolbarAction),\n );\n }\n if (config === 'minimal' || config === 'basic' || config === 'full') {\n return TOOLBAR_PRESETS[config];\n }\n return TOOLBAR_PRESETS.full;\n};\n\nconst countCharacters = (editor: Editor) => {\n const characters = (editor.storage as any)?.characterCount?.characters;\n return typeof characters === 'function' ? characters() : editor.getText().length;\n};\n\nconst getImageUrl = async (\n api: Partial<FormRuntimeApi> | undefined,\n file: File,\n bucketName: string,\n) => {\n if (typeof api?.uploadFile !== 'function') {\n throw new Error('当前环境不支持图片上传');\n }\n const uploaded = await api.uploadFile(file, bucketName);\n if (uploaded.previewUrl || uploaded.url) return uploaded.previewUrl || uploaded.url;\n if (uploaded.bucketName && uploaded.objectName) {\n if (typeof api.createFileAccessTicket !== 'function') {\n throw new Error('当前环境不支持图片预览');\n }\n const ticket = await api.createFileAccessTicket(\n uploaded.bucketName,\n uploaded.objectName,\n uploaded.name,\n 'preview',\n );\n return typeof ticket === 'string'\n ? ticket\n : ticket?.previewUrl || ticket?.url || ticket?.downloadUrl || '';\n }\n return '';\n};\n\nconst isImageAllowed = (file: File, allowedTypes: string[]) => {\n if (!allowedTypes.length) return true;\n const lowerName = file.name.toLowerCase();\n return allowedTypes.some((type) => {\n const normalized = type.toLowerCase();\n if (normalized.startsWith('.')) return lowerName.endsWith(normalized);\n return file.type.toLowerCase() === normalized;\n });\n};\n\nconst isSupportedUrl = (value: string, allowImageData = false) => {\n const trimmed = value.trim();\n if (!trimmed) return false;\n if (/^(https?:\\/\\/|mailto:|tel:|\\/|#)/i.test(trimmed)) return true;\n return allowImageData && /^(data:image\\/|blob:)/i.test(trimmed);\n};\n\nfunction ToolbarButton({\n active,\n disabled,\n icon,\n label,\n text,\n onClick,\n}: {\n active?: boolean;\n disabled?: boolean;\n icon?: React.ReactNode;\n label: string;\n text?: React.ReactNode;\n onClick: () => void;\n}) {\n return (\n <Tooltip title={label}>\n <Button\n size=\"small\"\n type={active ? 'primary' : 'default'}\n icon={icon}\n disabled={disabled}\n aria-label={label}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onClick}\n >\n {text}\n </Button>\n </Tooltip>\n );\n}\n\nfunction EditorToolbar({\n editor,\n actions,\n disabled,\n fontFamilies,\n fontSizes,\n colorPresets,\n onPickImage,\n onOpenImageUrl,\n onOpenLink,\n onOpenTable,\n}: {\n editor: Editor | null;\n actions: EditorToolbarAction[];\n disabled?: boolean;\n fontFamilies: EditorChoiceOption[];\n fontSizes: EditorChoiceOption[];\n colorPresets: string[];\n onPickImage: () => void;\n onOpenImageUrl: () => void;\n onOpenLink: () => void;\n onOpenTable: () => void;\n}) {\n if (!editor || actions.length === 0) return null;\n\n const has = (action: EditorToolbarAction) => actions.includes(action);\n const can = (editor as any).can?.();\n const canUndo = typeof can?.undo === 'function' ? can.undo() : true;\n const canRedo = typeof can?.redo === 'function' ? can.redo() : true;\n const textStyle = editor.getAttributes('textStyle');\n const linkActive = editor.isActive('link');\n const tableActive = editor.isActive('table');\n const blockValue = editor.isActive('heading', { level: 1 })\n ? 'h1'\n : editor.isActive('heading', { level: 2 })\n ? 'h2'\n : editor.isActive('heading', { level: 3 })\n ? 'h3'\n : editor.isActive('codeBlock')\n ? 'codeBlock'\n : 'p';\n\n return (\n <div className=\"sy-editor-toolbar\" role=\"toolbar\" aria-label=\"编辑器工具栏\">\n {(has('undo') || has('redo')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('undo') && (\n <ToolbarButton\n label=\"撤销\"\n icon={<UndoOutlined />}\n disabled={disabled || !canUndo}\n onClick={() => editor.chain().focus().undo().run()}\n />\n )}\n {has('redo') && (\n <ToolbarButton\n label=\"重做\"\n icon={<RedoOutlined />}\n disabled={disabled || !canRedo}\n onClick={() => editor.chain().focus().redo().run()}\n />\n )}\n </div>\n )}\n\n {(has('heading') || has('fontFamily') || has('fontSize')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('heading') && (\n <Select\n className=\"sy-editor-toolbar-select\"\n size=\"small\"\n value={blockValue}\n disabled={disabled}\n style={{ width: 104 }}\n options={[\n { label: '正文', value: 'p' },\n { label: '标题 1', value: 'h1' },\n { label: '标题 2', value: 'h2' },\n { label: '标题 3', value: 'h3' },\n { label: '代码块', value: 'codeBlock' },\n ]}\n onChange={(value) => {\n if (value === 'p') editor.chain().focus().setParagraph().run();\n if (value === 'h1') editor.chain().focus().toggleHeading({ level: 1 }).run();\n if (value === 'h2') editor.chain().focus().toggleHeading({ level: 2 }).run();\n if (value === 'h3') editor.chain().focus().toggleHeading({ level: 3 }).run();\n if (value === 'codeBlock') editor.chain().focus().toggleCodeBlock().run();\n }}\n />\n )}\n {has('fontFamily') && (\n <Select\n className=\"sy-editor-toolbar-select\"\n size=\"small\"\n value={textStyle.fontFamily || ''}\n disabled={disabled}\n style={{ width: 126 }}\n options={fontFamilies}\n onChange={(value) => {\n if (value) editor.chain().focus().setFontFamily(value).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n />\n )}\n {has('fontSize') && (\n <Select\n className=\"sy-editor-toolbar-select\"\n size=\"small\"\n value={textStyle.fontSize || undefined}\n placeholder=\"字号\"\n disabled={disabled}\n style={{ width: 86 }}\n options={fontSizes}\n onChange={(value) =>\n editor.chain().focus().setMark('textStyle', { fontSize: value }).run()\n }\n />\n )}\n </div>\n )}\n\n {(has('bold') ||\n has('italic') ||\n has('underline') ||\n has('strike') ||\n has('superscript') ||\n has('subscript')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('bold') && (\n <ToolbarButton\n label=\"加粗\"\n icon={<BoldOutlined />}\n disabled={disabled}\n active={editor.isActive('bold')}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n )}\n {has('italic') && (\n <ToolbarButton\n label=\"斜体\"\n icon={<ItalicOutlined />}\n disabled={disabled}\n active={editor.isActive('italic')}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n )}\n {has('underline') && (\n <ToolbarButton\n label=\"下划线\"\n icon={<UnderlineOutlined />}\n disabled={disabled}\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n />\n )}\n {has('strike') && (\n <ToolbarButton\n label=\"删除线\"\n icon={<StrikethroughOutlined />}\n disabled={disabled}\n active={editor.isActive('strike')}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n />\n )}\n {has('superscript') && (\n <ToolbarButton\n label=\"上标\"\n text=\"x²\"\n disabled={disabled}\n active={editor.isActive('superscript')}\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n />\n )}\n {has('subscript') && (\n <ToolbarButton\n label=\"下标\"\n text=\"x₂\"\n disabled={disabled}\n active={editor.isActive('subscript')}\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n />\n )}\n </div>\n )}\n\n {(has('color') || has('highlight')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('color') && (\n <>\n <Tooltip title=\"文字颜色\">\n <input\n type=\"color\"\n className=\"sy-editor-color\"\n title=\"文字颜色\"\n disabled={disabled}\n value={textStyle.color || '#111827'}\n onChange={(event) => editor.chain().focus().setColor(event.target.value).run()}\n />\n </Tooltip>\n <Space.Compact size=\"small\" className=\"sy-editor-color-presets\">\n {colorPresets.slice(0, 8).map((color) => (\n <button\n key={color}\n type=\"button\"\n className=\"sy-editor-swatch\"\n style={{ backgroundColor: color }}\n disabled={disabled}\n title={color}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => editor.chain().focus().setColor(color).run()}\n />\n ))}\n </Space.Compact>\n </>\n )}\n {has('highlight') && (\n <ToolbarButton\n label=\"高亮\"\n icon={<HighlightOutlined />}\n disabled={disabled}\n active={editor.isActive('highlight')}\n onClick={() => editor.chain().focus().toggleHighlight({ color: '#fff3bf' }).run()}\n />\n )}\n </div>\n )}\n\n {(has('bulletList') ||\n has('orderedList') ||\n has('taskList') ||\n has('blockquote') ||\n has('codeBlock')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('bulletList') && (\n <ToolbarButton\n label=\"无序列表\"\n icon={<UnorderedListOutlined />}\n disabled={disabled}\n active={editor.isActive('bulletList')}\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n />\n )}\n {has('orderedList') && (\n <ToolbarButton\n label=\"有序列表\"\n icon={<OrderedListOutlined />}\n disabled={disabled}\n active={editor.isActive('orderedList')}\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n />\n )}\n {has('taskList') && (\n <ToolbarButton\n label=\"任务列表\"\n text=\"任务\"\n disabled={disabled}\n active={editor.isActive('taskList')}\n onClick={() => editor.chain().focus().toggleTaskList().run()}\n />\n )}\n {has('blockquote') && (\n <ToolbarButton\n label=\"引用\"\n text=\"引用\"\n disabled={disabled}\n active={editor.isActive('blockquote')}\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n />\n )}\n {has('codeBlock') && (\n <ToolbarButton\n label=\"代码块\"\n icon={<CodeOutlined />}\n disabled={disabled}\n active={editor.isActive('codeBlock')}\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n />\n )}\n </div>\n )}\n\n {(has('alignLeft') || has('alignCenter') || has('alignRight')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('alignLeft') && (\n <ToolbarButton\n label=\"左对齐\"\n icon={<AlignLeftOutlined />}\n disabled={disabled}\n active={editor.isActive({ textAlign: 'left' })}\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n />\n )}\n {has('alignCenter') && (\n <ToolbarButton\n label=\"居中\"\n icon={<AlignCenterOutlined />}\n disabled={disabled}\n active={editor.isActive({ textAlign: 'center' })}\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n />\n )}\n {has('alignRight') && (\n <ToolbarButton\n label=\"右对齐\"\n icon={<AlignRightOutlined />}\n disabled={disabled}\n active={editor.isActive({ textAlign: 'right' })}\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n />\n )}\n </div>\n )}\n\n {(has('link') || has('image') || has('imageUrl')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('link') && (\n <ToolbarButton\n label={linkActive ? '编辑链接' : '插入链接'}\n icon={<LinkOutlined />}\n disabled={disabled}\n active={linkActive}\n onClick={onOpenLink}\n />\n )}\n {has('image') && (\n <ToolbarButton\n label=\"上传图片\"\n icon={<PictureOutlined />}\n disabled={disabled}\n onClick={onPickImage}\n />\n )}\n {has('imageUrl') && (\n <ToolbarButton\n label=\"插入图片 URL\"\n text=\"URL\"\n disabled={disabled}\n onClick={onOpenImageUrl}\n />\n )}\n </div>\n )}\n\n {(has('table') ||\n has('addColumnBefore') ||\n has('addColumnAfter') ||\n has('deleteColumn') ||\n has('addRowBefore') ||\n has('addRowAfter') ||\n has('deleteRow') ||\n has('toggleHeaderRow') ||\n has('deleteTable')) && (\n <div className=\"sy-editor-toolbar-group\">\n {has('table') && (\n <ToolbarButton\n label=\"插入表格\"\n icon={<TableOutlined />}\n disabled={disabled}\n active={tableActive}\n onClick={onOpenTable}\n />\n )}\n {has('addColumnBefore') && (\n <ToolbarButton\n label=\"左侧加列\"\n text=\"左列\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().addColumnBefore().run()}\n />\n )}\n {has('addColumnAfter') && (\n <ToolbarButton\n label=\"右侧加列\"\n text=\"右列\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().addColumnAfter().run()}\n />\n )}\n {has('deleteColumn') && (\n <ToolbarButton\n label=\"删除列\"\n text=\"删列\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().deleteColumn().run()}\n />\n )}\n {has('addRowBefore') && (\n <ToolbarButton\n label=\"上方加行\"\n text=\"上行\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().addRowBefore().run()}\n />\n )}\n {has('addRowAfter') && (\n <ToolbarButton\n label=\"下方加行\"\n text=\"下行\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().addRowAfter().run()}\n />\n )}\n {has('deleteRow') && (\n <ToolbarButton\n label=\"删除行\"\n text=\"删行\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().deleteRow().run()}\n />\n )}\n {has('toggleHeaderRow') && (\n <ToolbarButton\n label=\"切换表头\"\n text=\"表头\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().toggleHeaderRow().run()}\n />\n )}\n {has('deleteTable') && (\n <ToolbarButton\n label=\"删除表格\"\n text=\"删表\"\n disabled={disabled || !tableActive}\n onClick={() => editor.chain().focus().deleteTable().run()}\n />\n )}\n </div>\n )}\n\n {has('clear') && (\n <div className=\"sy-editor-toolbar-group\">\n <ToolbarButton\n label=\"清除格式\"\n icon={<ClearOutlined />}\n disabled={disabled}\n onClick={() => editor.chain().focus().unsetAllMarks().clearNodes().run()}\n />\n </div>\n )}\n </div>\n );\n}\n\nconst escapeHtml = (value: string) =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n\nconst isEditorDestroyed = (editor: Editor | null) => Boolean((editor as any)?.isDestroyed);\n\nconst getSafeEditorHtml = (editor: Editor) => {\n if (isEditorDestroyed(editor)) return '';\n try {\n return editor.isEmpty ? '' : editor.getHTML();\n } catch {\n const text = editor.getText?.() || '';\n return text ? `<p>${escapeHtml(text)}</p>` : '';\n }\n};\n\nexport interface RichTextEditorCoreProps {\n value?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n rows?: number;\n maxLength?: number;\n height?: number | string;\n toolbarConfig?: EditorFieldProps['toolbarConfig'];\n uploadBucketName?: string;\n maxImageSize?: number;\n allowedImageTypes?: string[];\n fontFamilies?: EditorChoiceOption[];\n fontSizes?: EditorChoiceOption[];\n colorPresets?: string[];\n api?: Partial<FormRuntimeApi>;\n inputClassName?: string;\n fieldId?: string;\n mobile?: boolean;\n}\n\nexport function RichTextEditorCore({\n value = '',\n onChange,\n disabled,\n inputClassName,\n placeholder,\n rows = 8,\n maxLength,\n height,\n toolbarConfig,\n uploadBucketName = 'images',\n maxImageSize = 10,\n allowedImageTypes = DEFAULT_IMAGE_TYPES,\n fontFamilies = DEFAULT_FONT_FAMILIES,\n fontSizes = DEFAULT_FONT_SIZES,\n colorPresets = DEFAULT_COLOR_PRESETS,\n api,\n fieldId = 'richText',\n mobile = false,\n}: RichTextEditorCoreProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [uploading, setUploading] = useState(false);\n const [uploadError, setUploadError] = useState('');\n const [charCount, setCharCount] = useState(0);\n const [linkOpen, setLinkOpen] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n const [linkError, setLinkError] = useState('');\n const [imageUrlOpen, setImageUrlOpen] = useState(false);\n const [imageUrl, setImageUrl] = useState('');\n const [imageAlt, setImageAlt] = useState('');\n const [imageTitle, setImageTitle] = useState('');\n const [imageUrlError, setImageUrlError] = useState('');\n const [tableOpen, setTableOpen] = useState(false);\n const [tableRows, setTableRows] = useState(3);\n const [tableCols, setTableCols] = useState(3);\n const onChangeRef = useRef(onChange);\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n const actions = useMemo(() => normalizeToolbarConfig(toolbarConfig), [toolbarConfig]);\n const visibleActions = mobile ? [] : actions;\n const extensions = useMemo(\n () => [\n StarterKit.configure({\n heading: { levels: [1, 2, 3] },\n codeBlock: false,\n link: false,\n underline: false,\n }),\n Underline,\n Superscript,\n Subscript,\n TextStyle,\n FontFamily.configure({ types: ['textStyle'] }),\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n Link.configure({ openOnClick: false, autolink: true, linkOnPaste: true }),\n Placeholder.configure({ placeholder: placeholder || '请输入内容' }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Image.configure({\n allowBase64: false,\n HTMLAttributes: { class: 'sy-editor-image' },\n }),\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n TaskList,\n TaskItem.configure({ nested: true }),\n CharacterCount.configure(maxLength ? { limit: maxLength } : {}),\n CodeBlockLowlight.configure({ lowlight }),\n ],\n [maxLength, placeholder],\n );\n\n const updateHtml = useCallback((next: string) => {\n onChangeRef.current?.(next);\n }, []);\n\n const editor = useEditor(\n {\n extensions,\n content: value || '',\n editable: !disabled,\n parseOptions: {\n preserveWhitespace: 'full',\n },\n onUpdate: ({ editor: currentEditor }) => {\n if (isEditorDestroyed(currentEditor)) return;\n const nextCharCount = countCharacters(currentEditor);\n setCharCount(nextCharCount);\n if (maxLength && nextCharCount > maxLength) {\n currentEditor.commands.undo();\n return;\n }\n updateHtml(getSafeEditorHtml(currentEditor));\n },\n editorProps: {\n attributes: {\n class: 'sy-editor-prose',\n 'data-testid': `editorfield-input-${fieldId}`,\n },\n },\n },\n [fieldId, extensions, disabled, maxLength, updateHtml],\n );\n\n useEffect(() => {\n if (!editor || isEditorDestroyed(editor)) return;\n editor.setEditable(!disabled);\n }, [disabled, editor]);\n\n useEffect(() => {\n if (!editor || isEditorDestroyed(editor)) return;\n const currentHtml = getSafeEditorHtml(editor);\n if ((value || '') !== currentHtml) {\n editor.commands.setContent(value || '', { emitUpdate: false });\n }\n setCharCount(countCharacters(editor));\n }, [editor, value]);\n\n const insertImageFiles = useCallback(\n async (files: File[]) => {\n if (!editor || isEditorDestroyed(editor) || disabled || files.length === 0) return;\n const validFiles = files.filter((file) => {\n if (!isImageAllowed(file, allowedImageTypes)) return false;\n if (maxImageSize && file.size > maxImageSize * 1024 * 1024) return false;\n return true;\n });\n if (validFiles.length !== files.length) {\n setUploadError(`图片仅支持 ${allowedImageTypes.join(', ')},且不能超过 ${maxImageSize}MB`);\n } else {\n setUploadError('');\n }\n if (!validFiles.length) return;\n setUploading(true);\n try {\n for (const file of validFiles) {\n const url = await getImageUrl(api, file, uploadBucketName);\n if (url) {\n editor.chain().focus().setImage({ src: url, alt: file.name, title: file.name }).run();\n }\n }\n } catch (error) {\n setUploadError(error instanceof Error ? error.message : '图片上传失败');\n } finally {\n setUploading(false);\n }\n },\n [allowedImageTypes, api, disabled, editor, maxImageSize, uploadBucketName],\n );\n\n const openLinkModal = useCallback(() => {\n if (!editor || isEditorDestroyed(editor)) return;\n setLinkUrl(editor.getAttributes('link').href || '');\n setLinkError('');\n setLinkOpen(true);\n }, [editor]);\n\n const confirmLink = () => {\n if (!editor || isEditorDestroyed(editor)) return;\n const nextUrl = linkUrl.trim();\n if (!nextUrl) {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n setLinkOpen(false);\n return;\n }\n if (!isSupportedUrl(nextUrl)) {\n setLinkError('请输入 http(s)、mailto、tel、/ 或 # 开头的链接');\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: nextUrl }).run();\n setLinkOpen(false);\n };\n\n const removeLink = () => {\n if (!editor || isEditorDestroyed(editor)) return;\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n setLinkOpen(false);\n };\n\n const openImageUrlModal = useCallback(() => {\n setImageUrl('');\n setImageAlt('');\n setImageTitle('');\n setImageUrlError('');\n setImageUrlOpen(true);\n }, []);\n\n const confirmImageUrl = () => {\n if (!editor || isEditorDestroyed(editor)) return;\n const src = imageUrl.trim();\n if (!isSupportedUrl(src, true)) {\n setImageUrlError('请输入有效图片地址');\n return;\n }\n editor\n .chain()\n .focus()\n .setImage({ src, alt: imageAlt.trim() || undefined, title: imageTitle.trim() || undefined })\n .run();\n setImageUrlOpen(false);\n };\n\n const confirmTable = () => {\n if (!editor || isEditorDestroyed(editor)) return;\n editor\n .chain()\n .focus()\n .insertTable({\n rows: Math.max(1, tableRows),\n cols: Math.max(1, tableCols),\n withHeaderRow: true,\n })\n .run();\n setTableOpen(false);\n };\n\n const minHeight =\n typeof height === 'number'\n ? height\n : typeof height === 'string'\n ? height\n : Math.max(160, rows * 32);\n const showFooter = !mobile || uploading || !!uploadError;\n\n return (\n <>\n <div className={inputClassName} data-testid={`editorfield-shell-${fieldId}`}>\n <div className={`sy-editor ${disabled ? 'is-disabled' : ''} ${mobile ? 'is-mobile' : ''}`}>\n <EditorToolbar\n editor={editor}\n actions={visibleActions}\n disabled={disabled || uploading}\n fontFamilies={fontFamilies}\n fontSizes={fontSizes}\n colorPresets={colorPresets}\n onPickImage={() => inputRef.current?.click()}\n onOpenImageUrl={openImageUrlModal}\n onOpenLink={openLinkModal}\n onOpenTable={() => setTableOpen(true)}\n />\n <div\n className=\"sy-editor-body\"\n style={{ minHeight }}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) {\n event.preventDefault();\n if (!isEditorDestroyed(editor)) {\n editor?.chain().focus('end').run();\n }\n }\n }}\n onPasteCapture={(event) => {\n const files = Array.from(event.clipboardData?.files || []).filter((file) =>\n file.type.startsWith('image/'),\n );\n if (files.length) {\n event.preventDefault();\n void insertImageFiles(files);\n }\n }}\n onDropCapture={(event) => {\n const files = Array.from(event.dataTransfer?.files || []).filter((file) =>\n file.type.startsWith('image/'),\n );\n if (files.length) {\n event.preventDefault();\n void insertImageFiles(files);\n }\n }}\n >\n <EditorContent editor={editor} />\n </div>\n <input\n ref={inputRef}\n className=\"sy-editor-file-input\"\n data-testid={`editorfield-file-input-${fieldId}`}\n type=\"file\"\n accept={allowedImageTypes.join(',')}\n aria-hidden=\"true\"\n hidden\n multiple\n tabIndex={-1}\n style={{ display: 'none' }}\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n event.target.value = '';\n void insertImageFiles(files);\n }}\n />\n </div>\n {showFooter && (\n <div className=\"sy-editor-footer\">\n <span className={uploadError ? 'sy-editor-footer-error' : undefined}>\n {uploading ? '图片上传中...' : uploadError}\n </span>\n {!mobile && (\n <span>\n {charCount}\n {maxLength ? `/${maxLength}` : ' 字'}\n </span>\n )}\n </div>\n )}\n </div>\n\n <Modal\n title=\"编辑链接\"\n open={linkOpen}\n onCancel={() => setLinkOpen(false)}\n onOk={confirmLink}\n footer={\n <Space>\n <Button onClick={() => setLinkOpen(false)}>取消</Button>\n <Button danger disabled={!editor?.isActive('link')} onClick={removeLink}>\n 移除链接\n </Button>\n <Button type=\"primary\" onClick={confirmLink}>\n 确定\n </Button>\n </Space>\n }\n >\n <Input\n autoFocus\n placeholder=\"https://example.com\"\n value={linkUrl}\n status={linkError ? 'error' : undefined}\n onChange={(event) => {\n setLinkUrl(event.target.value);\n setLinkError('');\n }}\n onPressEnter={confirmLink}\n />\n {linkError && <div className=\"sy-field-error\">{linkError}</div>}\n </Modal>\n\n <Modal\n title=\"插入图片 URL\"\n open={imageUrlOpen}\n onCancel={() => setImageUrlOpen(false)}\n onOk={confirmImageUrl}\n okText=\"插入\"\n >\n <div className=\"sy-editor-modal-form\">\n <Input\n autoFocus\n placeholder=\"https://example.com/image.png\"\n value={imageUrl}\n status={imageUrlError ? 'error' : undefined}\n onChange={(event) => {\n setImageUrl(event.target.value);\n setImageUrlError('');\n }}\n />\n <Input\n placeholder=\"Alt 文本\"\n value={imageAlt}\n onChange={(event) => setImageAlt(event.target.value)}\n />\n <Input\n placeholder=\"Title\"\n value={imageTitle}\n onChange={(event) => setImageTitle(event.target.value)}\n />\n {imageUrlError && <div className=\"sy-field-error\">{imageUrlError}</div>}\n </div>\n </Modal>\n\n <Modal\n title=\"插入表格\"\n open={tableOpen}\n onCancel={() => setTableOpen(false)}\n onOk={confirmTable}\n okText=\"插入\"\n >\n <div className=\"sy-editor-modal-form sy-editor-table-size\">\n <label>\n 行数\n <InputNumber\n min={1}\n max={20}\n value={tableRows}\n onChange={(value) => setTableRows(value || 1)}\n />\n </label>\n <label>\n 列数\n <InputNumber\n min={1}\n max={12}\n value={tableCols}\n onChange={(value) => setTableCols(value || 1)}\n />\n </label>\n </div>\n </Modal>\n </>\n );\n}\n\nexport function EditorField(props: EditorFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n inputClassName,\n placeholder,\n defaultValue,\n rows,\n maxLength,\n height,\n toolbarConfig,\n uploadBucketName,\n maxImageSize,\n allowedImageTypes,\n fontFamilies,\n fontSizes,\n colorPresets,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const { isMobile } = useDeviceDetect();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const rawValue = (formData[fieldId] as string | undefined) ?? '';\n const value = normalizeRichTextHtml(rawValue);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, normalizeRichTextHtml(defaultValue));\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n useEffect(() => {\n if (rawValue && rawValue !== value) {\n setFieldValue(fieldId, value);\n }\n }, [fieldId, rawValue, setFieldValue, value]);\n\n const updateHtml = useCallback(\n (next: string) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n },\n [fieldId, onChange, setFieldValue],\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 sy-editor-readonly\"\n data-testid={`editorfield-readonly-${fieldId}`}\n dangerouslySetInnerHTML={{ __html: value || '--' }}\n />\n ) : (\n <RichTextEditorCore\n fieldId={fieldId}\n value={value}\n onChange={updateHtml}\n disabled={behavior === 'DISABLED'}\n inputClassName={inputClassName}\n placeholder={placeholder}\n rows={rows}\n maxLength={maxLength}\n height={height}\n toolbarConfig={toolbarConfig}\n uploadBucketName={uploadBucketName}\n maxImageSize={maxImageSize}\n allowedImageTypes={allowedImageTypes}\n fontFamilies={fontFamilies}\n fontSizes={fontSizes}\n colorPresets={colorPresets}\n api={api}\n mobile={isMobile}\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\nconst getDingTalkApi = () => {\n if (typeof window === 'undefined') return undefined;\n return (window as any).dd || (window as any).dingtalk || (window as any).DingTalkPC;\n};\n\nconst isDingTalkEnvironment = () => {\n if (typeof navigator === 'undefined') return false;\n return /DingTalk/i.test(navigator.userAgent || '') || Boolean(getDingTalkApi());\n};\n\nconst normalizeDingTalkLocation = (res: any): LocationValue => ({\n latitude: Number(res.latitude),\n longitude: Number(res.longitude),\n address: res.address || res.snippet || res.title || res.poiName,\n city: res.city,\n district: res.adName || res.district,\n province: res.province,\n name: res.title || res.poiName || res.address,\n accuracy: res.accuracy ? Number(res.accuracy) : undefined,\n source: 'dingTalk',\n time: Date.now(),\n});\n\nexport function LocationField(props: LocationFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n defaultValue,\n allowClear = true,\n locateButtonText = '获取定位',\n clearButtonText = '清空',\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as LocationValue | undefined;\n const [locating, setLocating] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setValue = (next?: LocationValue) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const ensureDingTalkReady = async () => {\n const dingTalk = getDingTalkApi();\n if (!dingTalk) throw new Error('当前环境不支持钉钉定位');\n if (typeof dingTalk.config !== 'function') return dingTalk;\n const currentUrl =\n typeof window !== 'undefined' ? window.location.href.split('#')[0] : undefined;\n const signature = currentUrl ? await api.getDingTalkSignature(currentUrl) : undefined;\n dingTalk.config({\n agentId: signature?.agentId,\n corpId: signature?.corpId,\n timeStamp: signature?.timeStamp || signature?.timestamp,\n nonceStr: signature?.nonceStr,\n signature: signature?.signature,\n jsApiList: ['getLocation', 'locateInMap', 'device.geolocation.get', 'biz.map.locate'],\n });\n await new Promise<void>((resolve, reject) => {\n if (typeof dingTalk.ready !== 'function') {\n resolve();\n return;\n }\n dingTalk.ready(() => resolve());\n if (typeof dingTalk.error === 'function') dingTalk.error((err: any) => reject(err));\n setTimeout(resolve, 3000);\n });\n return dingTalk;\n };\n\n const locateWithDingTalk = async () => {\n const dingTalk = await ensureDingTalkReady();\n return new Promise<LocationValue>((resolve, reject) => {\n const options = {\n type: 1,\n useCache: true,\n coordinate: '1',\n cacheTimeout: 20,\n withReGeocode: true,\n targetAccuracy: '200',\n success: (res: any) => resolve(normalizeDingTalkLocation(res)),\n fail: (err: any) => reject(err || new Error('定位失败')),\n complete: () => undefined,\n };\n if (typeof dingTalk.getLocation === 'function') {\n dingTalk.getLocation(options);\n return;\n }\n if (typeof dingTalk.device?.geolocation?.get === 'function') {\n dingTalk.device.geolocation.get(options);\n return;\n }\n reject(new Error('当前钉钉版本不支持定位'));\n });\n };\n\n const locateWithBrowser = async () =>\n new Promise<LocationValue>((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('当前浏览器不支持定位'));\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (position) => {\n resolve({\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n source: 'browser',\n time: Date.now(),\n });\n },\n (geoError) => reject(geoError || new Error('定位失败')),\n { enableHighAccuracy: true, timeout: 10000 },\n );\n });\n\n const locate = async () => {\n setLocating(true);\n setError('');\n try {\n const next = isDingTalkEnvironment()\n ? await locateWithDingTalk().catch(() => locateWithBrowser())\n : await locateWithBrowser();\n setValue(next);\n } catch (currentError) {\n setError(currentError instanceof Error ? currentError.message : '定位失败');\n } finally {\n setLocating(false);\n }\n };\n\n const display = value\n ? value.address || value.name || `${value.latitude.toFixed(6)}, ${value.longitude.toFixed(6)}`\n : '--';\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <div className=\"sy-location-field\" data-testid={`locationfield-${fieldId}`}>\n <div className=\"sy-field-readonly-value\">{display}</div>\n {value?.accuracy !== undefined && (\n <div className=\"sy-location-meta\">精度约 {Math.round(value.accuracy)} 米</div>\n )}\n {error && <div className=\"sy-field-error\">{error}</div>}\n {behavior !== 'READONLY' && (\n <Space>\n <Button\n type=\"primary\"\n loading={locating}\n disabled={behavior === 'DISABLED'}\n onClick={locate}\n >\n {locateButtonText}\n </Button>\n {allowClear && (\n <Button\n disabled={behavior === 'DISABLED'}\n onClick={() => {\n setError('');\n setValue(undefined);\n }}\n >\n {clearButtonText}\n </Button>\n )}\n </Space>\n )}\n </div>\n </FieldWrapper>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button, Modal, Space } from 'antd';\nimport type {\n DigitalSignatureFieldProps,\n DigitalSignatureValue,\n SignaturePoint,\n} from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst CANVAS_HEIGHT = 260;\n\nconst computeSHA512 = async (text: string) => {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buffer = await crypto.subtle.digest('SHA-512', new TextEncoder().encode(text));\n return Array.from(new Uint8Array(buffer))\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n let hash = 0;\n for (let index = 0; index < text.length; index += 1) {\n hash = (hash << 5) - hash + text.charCodeAt(index);\n hash |= 0;\n }\n return `fallback-${Math.abs(hash).toString(16)}`;\n};\n\nexport function DigitalSignatureField(props: DigitalSignatureFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n defaultValue,\n bucketName = 'signatures',\n allowClear = true,\n onChange,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField, api } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'NORMAL';\n const value = formData[fieldId] as DigitalSignatureValue | undefined;\n const [open, setOpen] = useState(false);\n const [saving, setSaving] = useState(false);\n const [drawn, setDrawn] = useState(false);\n const [error, setError] = useState('');\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const drawingRef = useRef(false);\n const pointsRef = useRef<SignaturePoint[]>([]);\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n const prepareCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const cssWidth = Math.max(1, rect.width || canvas.parentElement?.clientWidth || 640);\n const cssHeight = CANVAS_HEIGHT;\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n canvas.width = Math.floor(cssWidth * dpr);\n canvas.height = Math.floor(cssHeight * dpr);\n canvas.style.width = '100%';\n canvas.style.height = `${cssHeight}px`;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, cssWidth, cssHeight);\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, cssWidth, cssHeight);\n ctx.lineWidth = 2.4;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.strokeStyle = '#111827';\n }, []);\n\n useEffect(() => {\n if (!open) return;\n pointsRef.current = [];\n setDrawn(false);\n setError('');\n requestAnimationFrame(() => requestAnimationFrame(prepareCanvas));\n }, [open, prepareCanvas]);\n\n if (behavior === 'HIDDEN') return null;\n\n const setValue = (next?: DigitalSignatureValue) => {\n setFieldValue(fieldId, next);\n onChange?.(next);\n };\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n event.preventDefault();\n const canvas = event.currentTarget;\n const rect = canvas.getBoundingClientRect();\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const scaleX = rect.width ? canvas.width / rect.width : dpr;\n const scaleY = rect.height ? canvas.height / rect.height : dpr;\n return {\n x: ((event.clientX - rect.left) * scaleX) / dpr,\n y: ((event.clientY - rect.top) * scaleY) / dpr,\n t: Date.now(),\n };\n };\n\n const stopDrawing = (event?: React.PointerEvent<HTMLCanvasElement>) => {\n event?.preventDefault();\n if (event?.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n drawingRef.current = false;\n };\n\n const clearCanvas = () => {\n pointsRef.current = [];\n setDrawn(false);\n setError('');\n prepareCanvas();\n };\n\n const save = async () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (!pointsRef.current.length) {\n setError('请先完成签名');\n return;\n }\n setSaving(true);\n setError('');\n try {\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!blob) throw new Error('生成签名图片失败');\n const file = new File([blob], `signature-${Date.now()}.png`, { type: 'image/png' });\n const uploaded = await api.uploadFile(file, bucketName);\n const payload: Omit<DigitalSignatureValue, 'hash'> = {\n url: uploaded.url,\n bucketName: uploaded.bucketName || bucketName,\n objectName: uploaded.objectName,\n previewUrl: uploaded.previewUrl || uploaded.url,\n points: pointsRef.current.slice(),\n timestamp: Date.now(),\n };\n const hash = await computeSHA512(JSON.stringify(payload));\n setValue({ ...payload, hash });\n setOpen(false);\n } catch (saveError) {\n setError(saveError instanceof Error ? saveError.message : '签名保存失败');\n } finally {\n setSaving(false);\n }\n };\n\n const previewUrl = value?.previewUrl || value?.url;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <div className=\"sy-signature-field\" data-testid={`digitalsignaturefield-${fieldId}`}>\n {previewUrl ? (\n <button\n type=\"button\"\n className=\"sy-signature-preview\"\n onClick={() => setOpen(behavior !== 'READONLY')}\n disabled={behavior === 'READONLY'}\n >\n <img src={previewUrl} alt={label} />\n </button>\n ) : (\n <span className=\"sy-field-readonly-value\">--</span>\n )}\n {value?.hash && (\n <div className=\"sy-signature-hash\">SHA-512: {value.hash.slice(0, 24)}...</div>\n )}\n {behavior !== 'READONLY' && (\n <Space>\n <Button disabled={behavior === 'DISABLED'} onClick={() => setOpen(true)}>\n {previewUrl ? '重新签名' : '开始签名'}\n </Button>\n {allowClear && (\n <Button disabled={behavior === 'DISABLED'} onClick={() => setValue(undefined)}>\n 清空\n </Button>\n )}\n </Space>\n )}\n <Modal\n open={open}\n title={label}\n onCancel={() => setOpen(false)}\n onOk={save}\n confirmLoading={saving}\n okButtonProps={{ disabled: !drawn }}\n width={720}\n destroyOnClose\n afterOpenChange={(nextOpen) => {\n if (nextOpen) requestAnimationFrame(() => requestAnimationFrame(prepareCanvas));\n }}\n >\n <div className=\"sy-signature-canvas-wrap\">\n <canvas\n ref={canvasRef}\n style={{\n width: '100%',\n height: CANVAS_HEIGHT,\n border: '1px solid #d9d9d9',\n touchAction: 'none',\n userSelect: 'none',\n }}\n onPointerDown={(event) => {\n event.preventDefault();\n event.currentTarget.setPointerCapture?.(event.pointerId);\n drawingRef.current = true;\n const point = getPoint(event);\n pointsRef.current.push(point);\n const ctx = event.currentTarget.getContext('2d');\n if (ctx) {\n ctx.beginPath();\n ctx.fillStyle = '#111827';\n if (typeof ctx.arc === 'function') {\n ctx.arc(point.x, point.y, 0.8, 0, Math.PI * 2);\n ctx.fill();\n } else {\n ctx.fillRect(point.x, point.y, 1, 1);\n }\n }\n setDrawn(true);\n }}\n onPointerMove={(event) => {\n event.preventDefault();\n if (!drawingRef.current) return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n const last = pointsRef.current[pointsRef.current.length - 1];\n const next = getPoint(event);\n if (ctx && last) {\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(next.x, next.y);\n ctx.stroke();\n }\n pointsRef.current.push(next);\n }}\n onPointerUp={(event) => {\n stopDrawing(event);\n }}\n onPointerCancel={stopDrawing}\n onPointerLeave={stopDrawing}\n data-testid={`digitalsignaturefield-canvas-${fieldId}`}\n />\n {error && <div className=\"sy-field-error\">{error}</div>}\n <Button onClick={clearCanvas} disabled={saving}>\n 清空画布\n </Button>\n </div>\n </Modal>\n </div>\n </FieldWrapper>\n );\n}\n","import React, { useEffect } from 'react';\nimport type { JSONFieldProps } from '../../types';\nimport { FieldWrapper } from '../../core/FieldWrapper';\nimport { useFormContext } from '../../core/FormContext';\n\nconst formatJson = (value: any) => {\n if (value === undefined || value === null || value === '') return '--';\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nexport function JSONField(props: JSONFieldProps) {\n const {\n fieldId,\n label,\n behavior: propBehavior,\n required,\n tips,\n className,\n labelClassName,\n tipsClassName,\n readonlyClassName,\n defaultValue,\n } = props;\n const { formData, fieldBehaviors, setFieldValue, registerField, unregisterField } =\n useFormContext();\n const behavior = propBehavior ?? fieldBehaviors[fieldId] ?? 'READONLY';\n const value = formData[fieldId];\n\n useEffect(() => {\n registerField(fieldId);\n if (defaultValue !== undefined && formData[fieldId] === undefined) {\n setFieldValue(fieldId, defaultValue);\n }\n return () => unregisterField(fieldId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fieldId]);\n\n if (behavior === 'HIDDEN') return null;\n\n return (\n <FieldWrapper\n fieldId={fieldId}\n label={label}\n required={required}\n tips={tips}\n className={className}\n labelClassName={labelClassName}\n tipsClassName={tipsClassName}\n >\n <pre\n className={readonlyClassName || 'sy-field-readonly-value'}\n data-testid={`jsonfield-readonly-${fieldId}`}\n >\n {formatJson(value)}\n </pre>\n </FieldWrapper>\n );\n}\n","import type React from 'react';\nimport { TextField } from '../fields/TextField';\nimport { NumberField } from '../fields/NumberField';\nimport { TextAreaField } from '../fields/TextAreaField';\nimport { SelectField } from '../fields/SelectField';\nimport { MultiSelectField } from '../fields/MultiSelectField';\nimport { RadioField } from '../fields/RadioField';\nimport { CheckboxField } from '../fields/CheckboxField';\nimport { DateField } from '../fields/DateField';\nimport { CascadeDateField } from '../fields/CascadeDateField';\nimport { AttachmentField } from '../fields/AttachmentField';\nimport { ImageField } from '../fields/ImageField';\nimport { SubFormField } from '../fields/SubFormField';\nimport { UserSelectField } from '../fields/UserSelectField';\nimport { DepartmentSelectField } from '../fields/DepartmentSelectField';\nimport { CascadeSelectField } from '../fields/CascadeSelectField';\nimport { AddressField } from '../fields/AddressField';\nimport { AssociationFormField } from '../fields/AssociationFormField';\nimport { EditorField } from '../fields/EditorField';\nimport { SerialNumberField } from '../fields/SerialNumberField';\nimport { LocationField } from '../fields/LocationField';\nimport { DigitalSignatureField } from '../fields/DigitalSignatureField';\nimport { JSONField } from '../fields/JSONField';\n\nexport const defaultComponentRegistry: Record<string, React.ComponentType<any>> = {\n TextField,\n NumberField,\n TextAreaField,\n SelectField,\n MultiSelectField,\n RadioField,\n CheckboxField,\n DateField,\n CascadeDateField,\n AttachmentField,\n ImageField,\n SubFormField,\n UserSelectField,\n EmployeeSelectField: UserSelectField,\n DepartmentSelectField,\n TextareaField: TextAreaField,\n CascadeSelectField,\n AddressField,\n AssociationFormField,\n EditorField,\n SerialNumberField,\n LocationField,\n DigitalSignatureField,\n JSONField,\n};\n","import type {\n FieldBehavior,\n FormEffect,\n FormEffectAction,\n FormEffectCondition,\n OptionItem,\n} 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 action of evaluateEffectActions(effects, formData)) {\n const target = getFieldTarget(action);\n if (!target) continue;\n\n switch (action.action) {\n case 'show':\n result[target] = 'NORMAL';\n break;\n case 'hide':\n result[target] = 'HIDDEN';\n break;\n case 'enable':\n result[target] = 'NORMAL';\n break;\n case 'disable':\n result[target] = 'DISABLED';\n break;\n default:\n break;\n }\n }\n\n return result;\n}\n\nexport function evaluateEffectActions(\n effects: FormEffect[] = [],\n formData: Record<string, any>,\n): FormEffectAction[] {\n const actions: FormEffectAction[] = [];\n\n for (const effect of effects) {\n if (evaluateCondition(effect.when, formData)) {\n actions.push(...effect.then);\n }\n }\n\n return actions;\n}\n\nexport function evaluateFieldOverrides(\n effects: FormEffect[] = [],\n formData: Record<string, any>,\n): Record<string, Record<string, any>> {\n const result: Record<string, Record<string, any>> = {};\n\n for (const action of evaluateEffectActions(effects, formData)) {\n const target = getFieldTarget(action);\n if (!target) continue;\n\n switch (action.action) {\n case 'setRequired':\n result[target] = { ...result[target], required: Boolean(action.value) };\n break;\n case 'setOptions':\n result[target] = {\n ...result[target],\n options: Array.isArray(action.value) ? action.value : [],\n };\n break;\n default:\n break;\n }\n }\n\n return result;\n}\n\nexport function evaluateLayoutBehaviors(\n effects: FormEffect[] = [],\n formData: Record<string, any>,\n): Record<string, FieldBehavior> {\n const result: Record<string, FieldBehavior> = {};\n\n for (const action of evaluateEffectActions(effects, formData)) {\n const target = getLayoutTarget(action);\n if (!target) continue;\n\n if (action.action === 'show') {\n result[target] = 'NORMAL';\n } else if (action.action === 'hide') {\n result[target] = 'HIDDEN';\n }\n }\n\n return result;\n}\n\nexport function getValueActions(\n effects: FormEffect[] = [],\n formData: Record<string, any>,\n): Array<{ fieldId: string; action: 'setValue' | 'clearValue'; value?: any }> {\n return evaluateEffectActions(effects, formData)\n .map((action) => {\n const fieldId = getFieldTarget(action);\n if (!fieldId || (action.action !== 'setValue' && action.action !== 'clearValue')) {\n return null;\n }\n return { fieldId, action: action.action, value: action.value };\n })\n .filter(Boolean) as Array<{ fieldId: string; action: 'setValue' | 'clearValue'; value?: any }>;\n}\n\nexport function evaluateCondition(\n when: FormEffectCondition,\n formData: Record<string, any>,\n): boolean {\n if ('all' in when) {\n return when.all.every((item) => evaluateCondition(item, formData));\n }\n if ('any' in when) {\n return when.any.some((item) => evaluateCondition(item, formData));\n }\n if ('not' in when) {\n return !evaluateCondition(when.not, formData);\n }\n\n const fieldValue = formData[when.field];\n const normalizedFieldValue = normalizeComparableValue(fieldValue);\n const normalizedExpectedValue = normalizeComparableValue(when.value);\n\n switch (when.operator) {\n case 'eq':\n return isEqualValue(normalizedFieldValue, normalizedExpectedValue);\n case 'ne':\n return !isEqualValue(normalizedFieldValue, normalizedExpectedValue);\n case 'in':\n return includesValue(normalizedExpectedValue, normalizedFieldValue);\n case 'notIn':\n return !includesValue(normalizedExpectedValue, normalizedFieldValue);\n case 'contains':\n return includesValue(normalizedFieldValue, normalizedExpectedValue);\n case 'empty':\n return isEmptyValue(fieldValue);\n case 'notEmpty':\n return !isEmptyValue(fieldValue);\n case 'between':\n return isBetween(normalizedFieldValue, normalizedExpectedValue);\n case 'changed':\n return true;\n default:\n return false;\n }\n}\n\nfunction getFieldTarget(action: FormEffectAction): string | undefined {\n if ('field' in action) {\n return action.field;\n }\n if (action.targetType === 'layout') {\n return undefined;\n }\n return action.target;\n}\n\nfunction getLayoutTarget(action: FormEffectAction): string | undefined {\n if ('target' in action && action.targetType === 'layout') {\n return action.target;\n }\n return undefined;\n}\n\nfunction normalizeComparableValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map(normalizeComparableValue);\n }\n if (value && typeof value === 'object') {\n const option = value as Partial<OptionItem>;\n if (option.value !== undefined) {\n return option.value;\n }\n }\n return value;\n}\n\nfunction isEqualValue(left: any, right: any): boolean {\n if (Array.isArray(left) || Array.isArray(right)) {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n return left === right;\n}\n\nfunction includesValue(collection: any, candidate: any): boolean {\n if (Array.isArray(collection)) {\n if (Array.isArray(candidate)) {\n return candidate.some((item) => collection.some((entry) => isEqualValue(entry, item)));\n }\n return collection.some((entry) => isEqualValue(entry, candidate));\n }\n\n if (typeof collection === 'string') {\n return String(collection).includes(String(candidate ?? ''));\n }\n\n return false;\n}\n\nfunction isEmptyValue(value: any): boolean {\n return (\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nfunction isBetween(fieldValue: any, expectedValue: any): boolean {\n if (!Array.isArray(expectedValue) || expectedValue.length < 2) {\n return false;\n }\n const [min, max] = expectedValue;\n const comparable =\n typeof fieldValue === 'number' ? fieldValue : new Date(String(fieldValue)).getTime();\n const minValue = typeof min === 'number' ? min : new Date(String(min)).getTime();\n const maxValue = typeof max === 'number' ? max : new Date(String(max)).getTime();\n if ([comparable, minValue, maxValue].some((item) => Number.isNaN(item))) {\n return false;\n }\n return comparable >= minValue && comparable <= maxValue;\n}\n","import type { ValidationPreset, ValidationRule } from '../types';\n\n/**\n * 预设校验规则常量\n */\nexport const VALIDATION_PRESETS: Record<ValidationPreset, { pattern: RegExp; message: string }> = {\n phone: {\n pattern: /^1[3-9]\\d{9}$/,\n message: '请输入正确的手机号码',\n },\n idCard: {\n pattern: /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/,\n message: '请输入正确的身份证号码',\n },\n email: {\n pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: '请输入正确的邮箱地址',\n },\n url: {\n pattern: /^https?:\\/\\/.+/,\n message: '请输入正确的URL地址',\n },\n bankCard: {\n pattern: /^\\d{16,19}$/,\n message: '请输入正确的银行卡号',\n },\n};\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 // Preset check\n if (rule.preset !== undefined) {\n const preset = VALIDATION_PRESETS[rule.preset];\n if (preset && !preset.pattern.test(String(value))) {\n return rule.message || preset.message;\n }\n }\n\n // MinLength check\n if (rule.minLength !== undefined) {\n const lengthValue =\n typeof value === 'number'\n ? String(value).replace('-', '').replace('.', '').length\n : undefined;\n if (typeof value === 'string' && value.length < rule.minLength) {\n return rule.message || `最少输入 ${rule.minLength} 个字符`;\n }\n if (lengthValue !== undefined && lengthValue < rule.minLength) {\n return rule.message || `最少输入 ${rule.minLength} 位数字`;\n }\n }\n\n // MaxLength check\n if (rule.maxLength !== undefined) {\n const lengthValue =\n typeof value === 'number'\n ? String(value).replace('-', '').replace('.', '').length\n : undefined;\n if (typeof value === 'string' && value.length > rule.maxLength) {\n return rule.message || `最多输入 ${rule.maxLength} 个字符`;\n }\n if (lengthValue !== undefined && lengthValue > rule.maxLength) {\n return rule.message || `最多输入 ${rule.maxLength} 位数字`;\n }\n }\n\n // Custom validator\n if (rule.validator) {\n try {\n await rule.validator(value);\n } catch (e: any) {\n return e?.message || rule.message || '校验失败';\n }\n }\n }\n\n return null;\n}\n\n/**\n * Validate all fields in a form.\n * Returns a map of fieldId → error message for fields that have errors.\n */\nexport async function validateAllFields(\n formData: Record<string, any>,\n fieldRules: Record<string, ValidationRule[]>,\n): Promise<Record<string, string>> {\n const errors: Record<string, string> = {};\n\n const entries = Object.entries(fieldRules);\n const results = await Promise.all(\n entries.map(([fieldId, rules]) => validateField(formData[fieldId], rules)),\n );\n\n entries.forEach(([fieldId], index) => {\n const error = results[index];\n if (error) {\n errors[fieldId] = error;\n }\n });\n\n return errors;\n}\n","import type {\n AttachmentItem,\n FormRuntimeApi,\n FormRuntimeApiConfig,\n RuntimeRequestConfig,\n RuntimeResponse,\n} from '../types';\n\nconst DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\nconst CHUNK_UPLOAD_THRESHOLD = 10 * 1024 * 1024;\n\nconst trimTrailingSlash = (value?: string) => String(value || '').replace(/\\/$/, '');\n\nconst getDefaultBaseUrl = () => {\n const globalEnv = (globalThis as any).process?.env;\n const envBaseUrl = globalEnv?.FORM_API_BASE_URL || globalEnv?.BASE_API_URL;\n if (envBaseUrl) return trimTrailingSlash(envBaseUrl);\n\n const browserGlobal = typeof window !== 'undefined' ? (window as any) : undefined;\n const windowBaseUrl =\n browserGlobal?.FORM_API_BASE_URL ||\n browserGlobal?.BASE_API_URL ||\n browserGlobal?.__FORM_API_BASE_URL__ ||\n browserGlobal?.__LOWCODE_API_BASE_URL__;\n if (windowBaseUrl) return trimTrailingSlash(windowBaseUrl);\n\n return typeof window !== 'undefined' ? '/service' : '';\n};\n\nconst appendQuery = (url: string, params?: Record<string, any>) => {\n if (!params) return url;\n const search = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null || value === '') return;\n if (Array.isArray(value)) {\n value.forEach((item) => search.append(key, String(item)));\n return;\n }\n search.append(key, String(value));\n });\n const query = search.toString();\n if (!query) return url;\n return `${url}${url.includes('?') ? '&' : '?'}${query}`;\n};\n\nconst joinUrl = (baseUrl: string, url: string) => {\n if (/^https?:\\/\\//i.test(url)) return url;\n return `${trimTrailingSlash(baseUrl)}${url.startsWith('/') ? url : `/${url}`}`;\n};\n\nconst normalizeRuntimeFileUrl = (baseUrl: string, value: any) => {\n if (typeof value !== 'string' || !value) return value;\n if (/^(https?:)?\\/\\//i.test(value) || /^(blob|data):/i.test(value)) return value;\n if (!value.startsWith('/file/')) return value;\n return joinUrl(baseUrl, value);\n};\n\nconst normalizeFilePayloadUrls = (baseUrl: string, payload: any) => {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return payload;\n return {\n ...payload,\n url: normalizeRuntimeFileUrl(baseUrl, payload.url),\n downloadUrl: normalizeRuntimeFileUrl(baseUrl, payload.downloadUrl),\n relayUrl: normalizeRuntimeFileUrl(baseUrl, payload.relayUrl),\n previewUrl: normalizeRuntimeFileUrl(baseUrl, payload.previewUrl),\n metadataUrl: normalizeRuntimeFileUrl(baseUrl, payload.metadataUrl),\n previewPageUrl: payload.previewPageUrl,\n };\n};\n\nconst normalizeFileTicketResult = (baseUrl: string, payload: any) =>\n typeof payload === 'string'\n ? normalizeRuntimeFileUrl(baseUrl, payload)\n : normalizeFilePayloadUrls(baseUrl, payload);\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 normalizeFormInstancePayload = (payload: Record<string, any>): Record<string, any> => {\n const { formInstanceId, ...rest } = payload || {};\n return {\n ...rest,\n formInstId: payload?.formInstId || formInstanceId,\n };\n};\n\nconst unwrapBusinessResponse = (response: RuntimeResponse<any> | any) => {\n const result = response?.data || response?.result || response;\n if (result?.success === false) {\n throw new Error(result.message || response?.message || '请求失败');\n }\n return result;\n};\n\nconst normalizeUploadData = (\n data: any,\n file: File,\n bucketName: string,\n baseUrl = '',\n): 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: normalizeRuntimeFileUrl(baseUrl, item?.url) || '',\n downloadUrl: normalizeRuntimeFileUrl(baseUrl, item?.downloadUrl),\n previewUrl: normalizeRuntimeFileUrl(baseUrl, item?.previewUrl),\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, baseUrl));\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 baseUrl: 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, baseUrl);\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, baseUrl, 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 normalizeFileTicketResult(baseUrl, 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 normalizeFileTicketResult(baseUrl, 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 getDepartmentMembersPage: async (id, params) => {\n const page = params?.page ?? 1;\n const pageSize = params?.pageSize ?? 20;\n const response = (await request<any>({\n url: `/department/${id}/members`,\n method: 'get',\n params: { page, pageSize },\n })) as RuntimeResponse<any>;\n const data = response.data || response.result;\n const items = Array.isArray(data) ? data : data?.items || data?.list || [];\n return {\n items,\n total: Number(data?.total ?? data?.count ?? items.length),\n page: Number(data?.page ?? page),\n pageSize: Number(data?.pageSize ?? pageSize),\n };\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 data = normalizeFormInstancePayload(payload);\n const response = (await request<any>({\n url: `/${data.appType}/v1/form/updateFormData.json`,\n method: 'post',\n data,\n })) as RuntimeResponse<any>;\n return unwrapBusinessResponse(response);\n },\n };\n\n return { ...defaults, ...overrides, request };\n}\n","import type {\n OptionItem,\n OptionSourceConfig,\n LinkedFormOptionConfig,\n DataLinkageConfig,\n FormRuntimeConfig,\n RuntimeDataQueryParams,\n} from '../types';\n\nfunction normalizeOptionItem(row: Record<string, any>, fieldId: string): OptionItem | null {\n const rawValue = row?.[fieldId] ?? row?.value;\n if (rawValue === undefined || rawValue === null || rawValue === '') return null;\n\n if (typeof rawValue === 'object' && !Array.isArray(rawValue)) {\n const value = rawValue.value ?? rawValue.id ?? rawValue.key ?? rawValue.label;\n const label = rawValue.label ?? rawValue.name ?? rawValue.title ?? rawValue.value ?? value;\n if (value === undefined || value === null || value === '') return null;\n return { value: String(value), label: String(label ?? value) };\n }\n\n const fallbackLabel = row?.label;\n return {\n value: String(rawValue),\n label:\n fallbackLabel === undefined || fallbackLabel === null\n ? String(rawValue)\n : String(fallbackLabel),\n };\n}\n\nfunction extractComparableValue(value: any): any {\n if (value === undefined || value === null || value === '') return value;\n if (Array.isArray(value)) {\n return value\n .map(extractComparableValue)\n .filter((item) => item !== undefined && item !== null && item !== '');\n }\n if (typeof value === 'object') {\n if ('start' in value || 'end' in value) {\n return [value.start, value.end].filter(\n (item) => item !== undefined && item !== null && item !== '',\n );\n }\n return (\n value.value ??\n value.id ??\n value.key ??\n value.userId ??\n value.userid ??\n value.departmentId ??\n value.deptId ??\n value.label ??\n value.name\n );\n }\n return value;\n}\n\nfunction normalizeFilterOperator(operator: string | undefined, value: any) {\n const normalized = operator === 'neq' ? 'ne' : operator || 'eq';\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n (normalized === 'eq' || normalized === 'contains')\n ) {\n return 'in';\n }\n return normalized;\n}\n\n/**\n * 解析选项数据源,返回选项列表\n */\nexport async function resolveOptions(\n config: OptionSourceConfig,\n runtime: FormRuntimeConfig | undefined,\n formData: Record<string, any>,\n): Promise<OptionItem[]> {\n switch (config.type) {\n case 'custom':\n return []; // custom 类型直接用 props.options\n case 'linkedForm':\n if (!config.linkedForm) return [];\n return resolveLinkedFormOptions(config.linkedForm, runtime);\n case 'dataLinkage':\n if (!config.dataLinkage) return [];\n return resolveDataLinkageOptions(config.dataLinkage, runtime, formData);\n default:\n return [];\n }\n}\n\n/**\n * 关联表单数据:页面加载时获取指定表单的字段数据作为选项\n */\nasync function resolveLinkedFormOptions(\n config: LinkedFormOptionConfig,\n runtime: FormRuntimeConfig | undefined,\n): Promise<OptionItem[]> {\n if (!runtime?.fetchFormData) return [];\n\n try {\n // 构建 filters:将 LinkedFormOptionConfig 的 filters 转换为带值的条件\n const filters: RuntimeDataQueryParams['filters'] =\n config.filters?.map((f) => ({\n fieldId: f.fieldId,\n operator: normalizeFilterOperator(f.operator, extractComparableValue(f.value)),\n value: extractComparableValue(f.value),\n })) || [];\n\n const result = await runtime.fetchFormData({\n formUuid: config.formUuid,\n appType: runtime.appType || '',\n filters,\n sort: config.sortField\n ? { field: config.sortField, order: config.sortOrder || 'asc' }\n : undefined,\n fieldId: config.fieldId,\n deduplicate: config.deduplicate,\n pageSize: 200,\n });\n\n // 从结果中提取选项\n const items = result.data\n .map((row: any) => normalizeOptionItem(row, config.fieldId))\n .filter((item): item is OptionItem => Boolean(item));\n\n // 前端去重\n if (config.deduplicate) {\n const seen = new Set<string>();\n return items.filter((item) => {\n if (seen.has(item.value)) return false;\n seen.add(item.value);\n return true;\n });\n }\n\n return items;\n } catch (e) {\n console.error('[FormComponents] resolveLinkedFormOptions failed:', e);\n return [];\n }\n}\n\n/**\n * 数据联动:根据当前表单字段值匹配联动表单数据\n */\nasync function resolveDataLinkageOptions(\n config: DataLinkageConfig,\n runtime: FormRuntimeConfig | undefined,\n formData: Record<string, any>,\n): Promise<OptionItem[]> {\n if (!runtime?.fetchFormData) return [];\n\n try {\n // 方案A:在调用处完成值注入,将 localFieldId 的当前值作为 filter value\n const filters: RuntimeDataQueryParams['filters'] = config.conditions.map((condition) => {\n const value = extractComparableValue(formData[condition.localFieldId]);\n return {\n fieldId: condition.remoteFieldId,\n operator: normalizeFilterOperator(condition.operator, value),\n value,\n };\n });\n\n const result = await runtime.fetchFormData({\n formUuid: config.formUuid,\n appType: runtime.appType || '',\n filters,\n conditionLogic: config.conditionLogic,\n fieldId: config.targetFieldId,\n deduplicate: config.deduplicate,\n pageSize: 200,\n });\n\n const items = result.data\n .map((row: any) => normalizeOptionItem(row, config.targetFieldId))\n .filter((item): item is OptionItem => Boolean(item));\n\n // 前端去重\n if (config.deduplicate) {\n const seen = new Set<string>();\n return items.filter((item) => {\n if (seen.has(item.value)) return false;\n seen.add(item.value);\n return true;\n });\n }\n\n return items;\n } catch (e) {\n console.error('[FormComponents] resolveDataLinkageOptions failed:', e);\n return [];\n }\n}\n\n/**\n * 解析默认值联动(用于非选择类字段的数据联动默认值)\n */\nexport async function resolveDefaultValueLinkage(\n config: {\n formUuid: string;\n targetFieldId: string;\n conditions: any[];\n conditionLogic?: string;\n },\n runtime: FormRuntimeConfig | undefined,\n formData: Record<string, any>,\n): Promise<any> {\n if (!runtime?.fetchFormData) return undefined;\n\n try {\n // 方案A:在调用处完成值注入\n const filters: RuntimeDataQueryParams['filters'] = config.conditions.map((condition: any) => {\n const value = extractComparableValue(formData[condition.localFieldId]);\n return {\n fieldId: condition.remoteFieldId,\n operator: normalizeFilterOperator(condition.operator, value),\n value,\n };\n });\n\n const result = await runtime.fetchFormData({\n formUuid: config.formUuid,\n appType: runtime.appType || '',\n filters,\n conditionLogic: config.conditionLogic as 'and' | 'or' | undefined,\n fieldId: config.targetFieldId,\n pageSize: 200,\n });\n\n // 返回第一条匹配数据的目标字段值\n if (result.data.length > 0) {\n return result.data[0][config.targetFieldId] ?? result.data[0].value ?? undefined;\n }\n return undefined;\n } catch (e) {\n console.error('[FormComponents] resolveDefaultValueLinkage failed:', e);\n return undefined;\n }\n}\n","import React from 'react';\nimport { useFormContext } from './FormContext';\nimport { useComponent } from './ComponentRegistry';\nimport { FormGrid, FormSection, FormSteps, FormTabs } from '../layout';\nimport type { FieldDefinition, FormLayoutNode, LayoutVisibleWhen } from '../types';\nimport { evaluateCondition } from './effects';\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-4 sy-gap-x-4',\n default: 'sy-gap-y-6 sy-gap-x-6',\n large: 'sy-gap-y-8 sy-gap-x-8',\n};\n\nconst defaultFullWidthComponents = new Set(['SubFormField', 'EditorField']);\n\nfunction getDefaultFieldWrapperClass(\n field: Pick<FieldDefinition, 'componentName'>,\n renderContext: LayoutRenderContext,\n hasExplicitGridColumn = false,\n) {\n if (renderContext === 'grid' || hasExplicitGridColumn) return undefined;\n return defaultFullWidthComponents.has(field.componentName)\n ? 'sy-layout-field-full'\n : 'sy-layout-field';\n}\n\nfunction shouldSpanImplicitGrid(field: Pick<FieldDefinition, 'componentName'>, columns: number) {\n return columns > 1 && defaultFullWidthComponents.has(field.componentName);\n}\n\nfunction getImplicitGridWrapperClass(\n field: Pick<FieldDefinition, 'componentName'>,\n columns: number,\n) {\n if (columns === 1) return getDefaultFieldWrapperClass(field, 'root');\n return shouldSpanImplicitGrid(field, columns) ? 'sy-layout-field-full' : undefined;\n}\n\nfunction getImplicitGridStyle(field: Pick<FieldDefinition, 'componentName'>, columns: number) {\n return shouldSpanImplicitGrid(field, columns) ? { gridColumn: '1 / -1' } : undefined;\n}\n\nfunction isImplicitFieldOnlyLayout(layout: FormLayoutNode[] | undefined): boolean {\n return Boolean(\n layout?.length &&\n layout.every((node) => node.type === 'field' && !node.span && !node.className),\n );\n}\n\nfunction FieldRenderer({\n field,\n fieldClassName,\n wrapperClassName,\n style,\n}: {\n field: FieldDefinition;\n fieldClassName?: string;\n wrapperClassName?: string;\n style?: React.CSSProperties;\n}) {\n const Component = useComponent(field.componentName);\n if (field.behavior === 'HIDDEN') return null;\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 const element = React.createElement(Component, {\n ...fieldProps,\n fieldId,\n className: fieldClassName ?? fieldProps.className,\n });\n return style || wrapperClassName ? (\n <div className={wrapperClassName} style={style}>\n {element}\n </div>\n ) : (\n element\n );\n}\n\ntype LayoutRenderContext = 'root' | 'section' | 'grid' | 'tabs' | 'steps';\n\nfunction LayoutNodeRenderer({\n node,\n fieldMap,\n fieldClassName,\n renderContext = 'root',\n}: {\n node: FormLayoutNode;\n fieldMap: Map<string, FieldDefinition>;\n fieldClassName?: string;\n renderContext?: LayoutRenderContext;\n}) {\n const { formData, fieldBehaviors, fieldOverrides, layoutBehaviors, dynamicOptions } =\n useFormContext();\n if (node.hidden || layoutBehaviors[node.id] === 'HIDDEN') return null;\n if (!isLayoutVisible(node.visibleWhen, formData)) return null;\n\n if (node.type === 'field') {\n const field = fieldMap.get(node.fieldId);\n if (!field) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[FormRenderer] layout references missing field \"${node.fieldId}\".`);\n }\n return null;\n }\n const mergedField = {\n ...field,\n ...(dynamicOptions[node.fieldId] ? { options: dynamicOptions[node.fieldId] } : {}),\n ...(fieldOverrides[node.fieldId] ?? {}),\n behavior: fieldBehaviors[node.fieldId] ?? field.behavior ?? 'NORMAL',\n };\n const gridColumn = node.span ? `span ${node.span} / span ${node.span}` : undefined;\n const wrapperClassName = getDefaultFieldWrapperClass(\n mergedField,\n renderContext,\n Boolean(gridColumn),\n );\n return (\n <FieldRenderer\n field={mergedField}\n fieldClassName={node.className ?? fieldClassName}\n wrapperClassName={wrapperClassName}\n style={gridColumn ? { gridColumn } : undefined}\n />\n );\n }\n\n if (node.type === 'section') {\n return (\n <FormSection\n title={node.title}\n description={node.description}\n variant={node.variant}\n accent={node.accent}\n iconKey={node.iconKey}\n collapsible={node.collapsible}\n defaultCollapsed={node.defaultCollapsed}\n contentClassName=\"sy-form-layout\"\n >\n {node.children.map((child) => (\n <LayoutNodeRenderer\n key={child.id}\n node={child}\n fieldMap={fieldMap}\n fieldClassName={fieldClassName}\n renderContext=\"section\"\n />\n ))}\n </FormSection>\n );\n }\n\n if (node.type === 'grid') {\n const cells = Array.isArray(node.cells) ? node.cells : [];\n\n return (\n <FormGrid\n columns={node.columns}\n gap={node.gap}\n columnGap={node.columnGap}\n rowGap={node.rowGap}\n columnRatios={node.columnRatios}\n >\n {cells.length > 0\n ? cells.map((cell, index) => (\n <div\n className=\"sy-grid-cell\"\n key={cell.key ?? `${node.id}-cell-${index}`}\n aria-hidden={cell.children.length === 0}\n >\n {cell.children.map((child) => (\n <LayoutNodeRenderer\n key={child.id}\n node={child}\n fieldMap={fieldMap}\n fieldClassName={fieldClassName}\n renderContext=\"grid\"\n />\n ))}\n </div>\n ))\n : node.children.map((child) => (\n <LayoutNodeRenderer\n key={child.id}\n node={child}\n fieldMap={fieldMap}\n fieldClassName={fieldClassName}\n renderContext=\"grid\"\n />\n ))}\n </FormGrid>\n );\n }\n\n if (node.type === 'tabs') {\n return (\n <FormTabs\n defaultActiveKey={node.defaultActiveKey}\n items={node.items.map((item) => ({\n key: item.key,\n label: item.label,\n children: (\n <div className=\"sy-form-layout\">\n {item.children.map((child) => (\n <LayoutNodeRenderer\n key={child.id}\n node={child}\n fieldMap={fieldMap}\n fieldClassName={fieldClassName}\n renderContext=\"tabs\"\n />\n ))}\n </div>\n ),\n }))}\n />\n );\n }\n\n return (\n <FormSteps\n items={node.items.map((item) => ({\n key: item.key,\n title: item.title,\n description: item.description,\n children: (\n <div className=\"sy-form-layout\">\n {item.children.map((child) => (\n <LayoutNodeRenderer\n key={child.id}\n node={child}\n fieldMap={fieldMap}\n fieldClassName={fieldClassName}\n renderContext=\"steps\"\n />\n ))}\n </div>\n ),\n }))}\n />\n );\n}\n\nexport function FormRenderer({\n className,\n fieldClassName,\n columns = 1,\n size = 'default',\n}: FormRendererProps) {\n const { schema, formData, fieldBehaviors, fieldOverrides, layoutBehaviors, dynamicOptions } =\n useFormContext();\n\n const gridClass = columnsClassMap[columns];\n const gapClass = sizeClassMap[size];\n const containerClassName = ['sy-form-renderer', 'sy-grid', gridClass, gapClass, className]\n .filter(Boolean)\n .join(' ');\n const fieldMap = React.useMemo(() => {\n return new Map(\n schema.fields.map((field) => [\n field.fieldId,\n {\n ...field,\n ...(dynamicOptions[field.fieldId] ? { options: dynamicOptions[field.fieldId] } : {}),\n ...(fieldOverrides[field.fieldId] ?? {}),\n behavior: fieldBehaviors[field.fieldId] ?? field.behavior ?? 'NORMAL',\n },\n ]),\n );\n }, [schema.fields, fieldBehaviors, fieldOverrides, dynamicOptions]);\n\n if (isImplicitFieldOnlyLayout(schema.layout)) {\n return (\n <div className={containerClassName} data-testid=\"form-renderer\">\n {schema.layout?.map((node) => {\n if (node.type !== 'field') return null;\n if (node.hidden || layoutBehaviors[node.id] === 'HIDDEN') return null;\n if (!isLayoutVisible(node.visibleWhen, formData)) return null;\n const field = fieldMap.get(node.fieldId);\n if (!field) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[FormRenderer] layout references missing field \"${node.fieldId}\".`);\n }\n return null;\n }\n return (\n <FieldRenderer\n key={node.id}\n field={field}\n fieldClassName={fieldClassName}\n wrapperClassName={getImplicitGridWrapperClass(field, columns)}\n style={getImplicitGridStyle(field, columns)}\n />\n );\n })}\n </div>\n );\n }\n\n if (schema.layout && schema.layout.length > 0) {\n const layoutClassName = ['sy-form-renderer', 'sy-form-layout', className]\n .filter(Boolean)\n .join(' ');\n return (\n <div className={layoutClassName} data-testid=\"form-renderer\">\n {schema.layout.map((node) => (\n <LayoutNodeRenderer\n key={node.id}\n node={node}\n fieldMap={fieldMap}\n fieldClassName={fieldClassName}\n renderContext=\"root\"\n />\n ))}\n </div>\n );\n }\n\n return (\n <div className={containerClassName} data-testid=\"form-renderer\">\n {schema.fields.map((field) => {\n const mergedField = fieldMap.get(field.fieldId) ?? field;\n return (\n <FieldRenderer\n key={field.fieldId}\n field={mergedField}\n fieldClassName={fieldClassName}\n wrapperClassName={getImplicitGridWrapperClass(mergedField, columns)}\n style={getImplicitGridStyle(mergedField, columns)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction isLayoutVisible(\n visibleWhen: LayoutVisibleWhen | LayoutVisibleWhen[] | undefined,\n formData: Record<string, any>,\n): boolean {\n if (!visibleWhen) return true;\n const conditions = Array.isArray(visibleWhen) ? visibleWhen : [visibleWhen];\n return conditions.every((condition) => evaluateCondition(condition, formData));\n}\n","import {\n CalendarOutlined,\n DesktopOutlined,\n FileTextOutlined,\n UserOutlined,\n} from '@ant-design/icons';\nimport React, { useState } from 'react';\n\nexport type FormSectionVariant = 'plain' | 'card';\nexport type FormSectionAccent = 'blue' | 'green';\nexport type FormSectionIconKey = 'user' | 'calendar' | 'file' | 'device';\n\nexport interface FormSectionProps {\n title: string;\n description?: string;\n variant?: FormSectionVariant;\n accent?: FormSectionAccent;\n icon?: React.ReactNode;\n iconKey?: FormSectionIconKey;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n className?: string;\n titleClassName?: string;\n contentClassName?: string;\n children: React.ReactNode;\n}\n\nconst sectionIconMap: Record<FormSectionIconKey, React.ComponentType> = {\n user: UserOutlined,\n calendar: CalendarOutlined,\n file: FileTextOutlined,\n device: DesktopOutlined,\n};\n\nfunction cn(...classes: Array<string | undefined | false>) {\n return classes.filter(Boolean).join(' ');\n}\n\nexport function FormSection({\n title,\n description,\n variant = 'plain',\n accent = 'blue',\n icon,\n iconKey,\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 const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!collapsible) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleToggle();\n }\n };\n\n const IconComponent = icon === undefined && iconKey ? sectionIconMap[iconKey] : undefined;\n const resolvedIcon = icon !== undefined ? icon : IconComponent ? <IconComponent /> : undefined;\n\n return (\n <section\n className={cn(\n 'sy-form-section',\n `sy-form-section-${variant}`,\n `sy-form-section-accent-${accent}`,\n className,\n )}\n data-testid=\"form-section\"\n data-collapsed={collapsed ? 'true' : 'false'}\n >\n <div\n className={cn('sy-form-section-header', titleClassName)}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n role={collapsible ? 'button' : undefined}\n aria-expanded={collapsible ? !collapsed : undefined}\n tabIndex={collapsible ? 0 : undefined}\n data-testid=\"form-section-header\"\n >\n <div className=\"sy-form-section-heading\">\n {variant === 'plain' && (\n <span className=\"sy-form-section-marker\" data-testid=\"form-section-marker\" />\n )}\n {variant === 'card' && resolvedIcon && (\n <span className=\"sy-form-section-icon\" data-testid=\"form-section-icon\">\n {resolvedIcon}\n </span>\n )}\n <div className=\"sy-form-section-title-block\">\n <h3 className=\"sy-form-section-title\">{title}</h3>\n {description && (\n <p className=\"sy-form-section-description\" data-testid=\"form-section-description\">\n {description}\n </p>\n )}\n </div>\n </div>\n {collapsible && (\n <span\n className=\"sy-form-section-arrow\"\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\n className={cn('sy-form-section-content', contentClassName)}\n data-testid=\"form-section-content\"\n >\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 | string;\n columnGap?: number | string;\n rowGap?: number | string;\n columnRatios?: 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\nfunction toCssGap(value: number | string | undefined, fallback: number | string) {\n const resolved = value ?? fallback;\n if (typeof resolved === 'number') return `${resolved}px`;\n const text = String(resolved).trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) return `${text}px`;\n return text;\n}\n\nexport function FormGrid({\n columns = 2,\n gap = 4,\n columnGap,\n rowGap,\n columnRatios,\n className,\n children,\n}: FormGridProps) {\n if (columnGap !== undefined || rowGap !== undefined || columnRatios?.length) {\n const ratios =\n columnRatios && columnRatios.length > 0\n ? columnRatios\n : Array.from({ length: columns }, () => 1);\n return (\n <div\n className={className ?? 'grid'}\n style={{\n display: 'grid',\n gridTemplateColumns: ratios.map((ratio) => `${ratio}fr`).join(' '),\n columnGap: toCssGap(columnGap, gap),\n rowGap: toCssGap(rowGap, gap),\n }}\n data-testid=\"form-grid\"\n >\n {children}\n </div>\n );\n }\n\n const colClass = columnClasses[columns];\n const numericGap =\n typeof gap === 'number' ? gap : Number.isFinite(Number(gap)) ? Number(gap) : undefined;\n const gapClass = numericGap !== undefined ? (gapClasses[numericGap] ?? `gap-${numericGap}`) : '';\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, { useEffect, useMemo } from 'react';\nimport * as Antd from 'antd';\nimport type { FormAppearanceConfig } from '../types';\nimport { useFormContext } from './FormContext';\n\nexport interface FormShellProps {\n children: React.ReactNode;\n appearance?: FormAppearanceConfig;\n className?: string;\n}\n\nfunction normalizeMaxWidth(maxWidth?: FormAppearanceConfig['maxWidth']) {\n if (maxWidth === undefined || maxWidth === null) return undefined;\n if (typeof maxWidth === 'number') return maxWidth;\n const presetMap: Record<string, string> = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n full: '100%',\n };\n return presetMap[maxWidth] || maxWidth;\n}\n\nfunction getAntForm(): any {\n try {\n const form = (Antd as any).Form;\n const hasMatchMedia = typeof window === 'undefined' || typeof window.matchMedia === 'function';\n return hasMatchMedia ? form : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function FormShell({ children, appearance, className }: FormShellProps) {\n const AntForm = getAntForm();\n const useAntForm = AntForm?.useForm || (() => [null]);\n const [form] = useAntForm();\n const { formData, setFieldValue } = useFormContext();\n const maxWidth = normalizeMaxWidth(appearance?.maxWidth);\n\n useEffect(() => {\n form?.setFieldsValue?.(formData);\n }, [form, formData]);\n\n const style = useMemo<React.CSSProperties | undefined>(() => {\n if (!maxWidth) return undefined;\n return {\n maxWidth,\n width: '100%',\n };\n }, [maxWidth]);\n\n if (!AntForm) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n\n return (\n <AntForm\n form={form}\n initialValues={formData}\n layout={appearance?.layout || 'vertical'}\n variant={appearance?.variant}\n size={appearance?.size}\n requiredMark={appearance?.requiredMark}\n colon={appearance?.colon}\n labelCol={appearance?.labelCol}\n wrapperCol={appearance?.wrapperCol}\n scrollToFirstError={appearance?.scrollToFirstError ?? true}\n className={className}\n style={style}\n onValuesChange={(changedValues: Record<string, any>) => {\n Object.entries(changedValues || {}).forEach(([fieldId, value]) => {\n setFieldValue(fieldId, value);\n });\n }}\n >\n {children}\n </AntForm>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { Button } from 'antd';\nimport { useFormContext } from './FormContext';\nimport { validateAndNotify } from './validationFeedback';\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, validateAllWithErrors, 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 validateAndNotify(validateAllWithErrors);\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, validateAllWithErrors]);\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 { message } from 'antd';\n\nfunction escapeCss(value: string) {\n return typeof CSS !== 'undefined' && CSS.escape\n ? CSS.escape(value)\n : value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\nexport function scrollToFirstError(errors: Record<string, string>) {\n const firstFieldId = Object.keys(errors)[0];\n if (!firstFieldId || typeof document === 'undefined') return;\n const target =\n document.querySelector(`[data-field-id=\"${escapeCss(firstFieldId)}\"]`) ||\n document.querySelector(`[data-field-id=\"${escapeCss(firstFieldId.split('.')[0])}\"]`);\n if (target && 'scrollIntoView' in target) {\n target.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n}\n\nexport function notifyValidationErrors(errors: Record<string, string>) {\n const firstMessage = Object.values(errors)[0] || '请完善必填项';\n try {\n message?.error?.(firstMessage);\n } catch {\n // Field-level errors remain visible if the host omits Ant Design static messages.\n }\n scrollToFirstError(errors);\n}\n\nexport async function validateAndNotify(\n validateAllWithErrors: () => Promise<Record<string, string>>,\n) {\n const errors = await validateAllWithErrors();\n if (Object.keys(errors).length > 0) {\n notifyValidationErrors(errors);\n return false;\n }\n return true;\n}\n","import React from 'react';\n\n/** Simple className merge utility */\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport interface FormContainerProps {\n title?: string;\n description?: string;\n children: React.ReactNode;\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n className?: string;\n}\n\nconst maxWidthClassMap: Record<string, string> = {\n sm: 'sy-form-container-sm',\n md: 'sy-form-container-md',\n lg: 'sy-form-container-lg',\n xl: 'sy-form-container-xl',\n full: 'sy-form-container-full',\n};\n\nexport function FormContainer({\n title,\n description,\n children,\n maxWidth = 'md',\n className,\n}: FormContainerProps) {\n const sizeClass = maxWidthClassMap[maxWidth];\n\n return (\n <div className={cn('sy-form-container', sizeClass, className)}>\n {(title || description) && (\n <div className=\"sy-form-header\">\n {title && <h2 className=\"sy-form-title\">{title}</h2>}\n {description && <p className=\"sy-form-description\">{description}</p>}\n </div>\n )}\n <div className=\"sy-form-body\">{children}</div>\n </div>\n );\n}\n","import type { ProcessStatus, StatusMeta, TaskStatus } from '../types';\n\n/** 流程状态元映射 */\nexport const PROCESS_STATUS_META: Record<ProcessStatus, StatusMeta> = {\n running: { label: '审批中', tone: 'brand' },\n waiting: { label: '等待中', tone: 'neutral' },\n exception: { label: '流程异常', tone: 'danger' },\n completed: { label: '已完成', tone: 'success' },\n terminated: { label: '已拒绝', tone: 'danger' },\n withdrawn: { label: '已撤销', tone: 'neutral' },\n pending: { label: '待处理', tone: 'brand' },\n cancelled: { label: '已取消', tone: 'neutral' },\n};\n\n/** 任务状态元映射 */\nexport const TASK_STATUS_META: Record<TaskStatus, StatusMeta> = {\n pending: { label: '待处理', tone: 'brand' },\n approved: { label: '已同意', tone: 'success' },\n rejected: { label: '已拒绝', tone: 'danger' },\n returned: { label: '已退回', tone: 'warning' },\n suspended: { label: '已挂起', tone: 'neutral' },\n cancelled: { label: '已取消', tone: 'neutral' },\n copied: { label: '已抄送', tone: 'neutral' },\n waiting: { label: '等待中', tone: 'neutral' },\n simulated: { label: '未开始', tone: 'neutral' },\n};\n","import type {\n ApprovalPermission,\n ApproveParams,\n ChangeRecordListResponse,\n ChangeRecordQueryParams,\n FormDataDeleteParams,\n FormDataQueryParams,\n FormInstanceData,\n FormRuntimeApi,\n InitiatorSelectCandidate,\n InitiatorSelectRequirement,\n PreviewParams,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessRoute,\n ProcessTask,\n ReturnableNode,\n ReturnableNodeResult,\n ReturnParams,\n ResubmitParams,\n RuntimeResponse,\n SaveTaskParams,\n TransferParams,\n ViewPermissionQueryParams,\n ViewPermissionSummary,\n WithdrawParams,\n} from '../types';\n\n// ============ 流程基础 ============\n\nconst hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key);\n\nconst isRuntimeEnvelope = (value: any): value is RuntimeResponse<any> =>\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n (hasOwn(value, 'code') ||\n hasOwn(value, 'success') ||\n hasOwn(value, 'data') ||\n hasOwn(value, 'result') ||\n hasOwn(value, 'message') ||\n hasOwn(value, 'error'));\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === '') return true;\n const normalized = Number(code);\n return Number.isFinite(normalized) ? normalized === 0 || normalized === 200 : false;\n};\n\nconst unwrapRuntimeResponse = <T = any>(response: RuntimeResponse<T> | any): T => {\n if (!isRuntimeEnvelope(response)) return response as T;\n\n if (response.success === false || !isSuccessCode(response.code)) {\n throw new Error(response.message || response.error || '请求失败');\n }\n\n if (hasOwn(response, 'data')) return response.data as T;\n if (hasOwn(response, 'result')) return response.result as T;\n return response as T;\n};\n\nconst withInitiatorSelectedApprovers = <T extends Record<string, any>>(\n payload: T,\n initiatorSelectedApprovers?: Record<string, string[]>,\n): T & {\n selectedApprovers?: Record<string, string[]>;\n initiatorSelectedApprovers?: Record<string, string[]>;\n} => {\n if (!initiatorSelectedApprovers) return payload;\n return {\n ...payload,\n selectedApprovers: initiatorSelectedApprovers,\n initiatorSelectedApprovers,\n };\n};\n\nconst normalizeProcessTask = (value: any): ProcessTask => {\n const taskId = value?.taskId ?? value?.id ?? value?.task_id ?? '';\n return {\n ...value,\n id: value?.id ?? taskId,\n taskId,\n nodeId: value?.nodeId ?? value?.node_id ?? '',\n nodeType: value?.nodeType ?? value?.node_type ?? 'approval',\n nodeName: value?.nodeName ?? value?.title ?? value?.name ?? value?.nodeId ?? '审批节点',\n status: value?.status ?? 'pending',\n assigneeId: value?.assigneeId ?? value?.assignee,\n };\n};\n\nconst normalizeProcessTasks = (value: any): ProcessTask[] => {\n if (Array.isArray(value)) return value.map(normalizeProcessTask);\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value.tasks)) return value.tasks.map(normalizeProcessTask);\n if (Array.isArray(value.currentTasks)) return value.currentTasks.map(normalizeProcessTask);\n if (Array.isArray(value.list)) return value.list.map(normalizeProcessTask);\n if (Array.isArray(value.items)) return value.items.map(normalizeProcessTask);\n if (Array.isArray(value.records)) return value.records.map(normalizeProcessTask);\n return [];\n};\n\nconst normalizePreviewAssignees = (value: any): Array<{ id: string; name: string }> => {\n if (Array.isArray(value?.assignees)) {\n return value.assignees\n .map((assignee: any) => {\n if (typeof assignee === 'string' || typeof assignee === 'number') {\n const id = String(assignee);\n return { id, name: id };\n }\n const id = String(\n assignee?.id ?? assignee?.userId ?? assignee?.userid ?? assignee?.assignee ?? '',\n );\n if (!id) return null;\n return {\n id,\n name: String(assignee?.name ?? assignee?.label ?? assignee?.userName ?? id),\n };\n })\n .filter(Boolean) as Array<{ id: string; name: string }>;\n }\n\n const assigneeId = value?.assignee ?? value?.assigneeId;\n if (assigneeId) {\n const id = String(assigneeId);\n return [\n {\n id,\n name: String(value?.assigneeName ?? value?.assignee_name ?? value?.userName ?? id),\n },\n ];\n }\n\n const ids = Array.isArray(value?.allAssignees) ? value.allAssignees : [];\n const names = Array.isArray(value?.allAssigneeNames) ? value.allAssigneeNames : [];\n\n return ids\n .map((id: any, index: number) => {\n const normalizedId = String(id ?? '');\n if (!normalizedId) return null;\n return {\n id: normalizedId,\n name: String(names[index] ?? (ids.length === 1 ? value?.assigneeName : undefined) ?? id),\n };\n })\n .filter(Boolean) as Array<{ id: string; name: string }>;\n};\n\nconst normalizePreviewRoutes = (value: any): ProcessRoute[] => {\n const raw = value?.data ?? value?.result ?? value;\n const list = Array.isArray(raw)\n ? raw\n : Array.isArray(raw?.routes)\n ? raw.routes\n : Array.isArray(raw?.tasks)\n ? raw.tasks\n : Array.isArray(raw?.nodes)\n ? raw.nodes\n : Array.isArray(raw?.items)\n ? raw.items\n : [];\n\n return list.map((route: any, index: number) => ({\n ...route,\n nodeId: String(route?.nodeId ?? route?.node_id ?? route?.id ?? `preview-${index}`),\n nodeName: String(\n route?.nodeName ?? route?.title ?? route?.name ?? route?.nodeId ?? `流程节点 ${index + 1}`,\n ),\n nodeType: route?.nodeType ?? route?.node_type ?? route?.type ?? 'approval',\n assignees: normalizePreviewAssignees(route),\n }));\n};\n\nconst normalizeInitiatorSelectCandidate = (value: any): InitiatorSelectCandidate => {\n const id = String(value?.id ?? value?.userId ?? value?.userid ?? value?.value ?? '');\n return {\n ...value,\n id,\n name: String(value?.name ?? value?.label ?? value?.username ?? id),\n };\n};\n\nconst normalizeInitiatorSelectRequirements = (value: any): InitiatorSelectRequirement[] => {\n const raw = value?.data ?? value?.result ?? value;\n const nodes = Array.isArray(raw?.nodes) ? raw.nodes : Array.isArray(raw) ? raw : [];\n return nodes\n .map((node: any) => ({\n ...node,\n nodeId: String(node?.nodeId ?? node?.id ?? ''),\n nodeName: String(node?.nodeName ?? node?.name ?? node?.title ?? node?.nodeId ?? ''),\n scope: node?.scope ?? node?.initiatorSelectScope ?? 'all',\n approvals: Array.isArray(node?.approvals) ? node.approvals : [],\n approvalNames: Array.isArray(node?.approvalNames) ? node.approvalNames : [],\n candidateUsers: Array.isArray(node?.candidateUsers)\n ? node.candidateUsers.map(normalizeInitiatorSelectCandidate).filter((user: any) => user.id)\n : undefined,\n }))\n .filter((node: InitiatorSelectRequirement) => node.nodeId);\n};\n\nconst normalizeProcessBasic = (value: any): ProcessBasicInfo => {\n const raw = value ?? {};\n const instance = raw.instance ?? raw;\n const currentTask = raw.currentTask ? normalizeProcessTask(raw.currentTask) : undefined;\n\n return {\n ...raw,\n instanceId: raw.instanceId ?? raw.id ?? instance.formInstanceId ?? instance.id,\n processStatus: raw.processStatus ?? raw.status ?? instance.processStatus ?? instance.status,\n formUuid: raw.formUuid ?? instance.formUuid ?? instance.definition?.formUuid,\n appType: raw.appType ?? instance.appType ?? instance.definition?.appType,\n title: raw.title ?? instance.title ?? instance.instanceTitle,\n originatorId: raw.originatorId ?? instance.originatorId ?? instance.startedBy,\n originatorName: raw.originatorName ?? instance.originatorName ?? instance.startedByName,\n originatorDepartment:\n raw.originatorDepartment ?? instance.originatorDepartment ?? instance.startedDepartmentName,\n createdAt: raw.createdAt ?? instance.createdAt ?? instance.startedAt,\n currentTask,\n isExecuting: raw.isExecuting ?? instance.isExecuting,\n };\n};\n\nconst normalizeApprovalPermission = (value: any): ApprovalPermission => {\n const raw = value ?? {};\n const currentTasks = normalizeProcessTasks(raw.currentTasks);\n const hasPermission = Boolean(raw.hasPermission ?? raw.isApprover ?? currentTasks.length > 0);\n\n return {\n ...raw,\n hasPermission,\n isApprover: Boolean(raw.isApprover ?? hasPermission),\n canUndo: Boolean(raw.canUndo ?? raw.canWithdraw),\n currentTasks,\n };\n};\n\nconst normalizeReturnableNodes = (value: any): ReturnableNode[] => {\n const raw = value?.candidates || value?.nodes || value?.data || value;\n if (!Array.isArray(raw)) return [];\n return raw.map((node) => ({\n ...node,\n nodeId: node?.nodeId || node?.id || '',\n nodeName: node?.nodeName || node?.name || node?.title || node?.id || '',\n }));\n};\n\nconst normalizeReturnableNodeResult = (value: any): ReturnableNodeResult => {\n const raw = value?.data || value || {};\n return {\n nodes: normalizeReturnableNodes(raw),\n policy: raw?.policy || null,\n };\n};\n\nconst normalizeProcessDefinition = (value: any): ProcessDefinition => {\n const raw = value?.definitionJson || value?.viewJson || value || {};\n const nodes = Array.isArray(raw.nodes) ? raw.nodes : [];\n const startNode = nodes.find((node: any) => node?.type === 'start' || node?.nodeType === 'start');\n return {\n ...raw,\n processId: raw.processId || raw.id || value?.id || '',\n flowConfig: raw.flowConfig || value?.flowConfig || {},\n startNodeId: raw.startNodeId || startNode?.id || value?.startNodeId,\n };\n};\n\n/** 获取流程基本信息 */\nexport async function getProcessBasic(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessBasicInfo> {\n const response = (await request<ProcessBasicInfo>({\n url: `/workflow/instance/${formInstId}/basic`,\n method: 'get',\n })) as RuntimeResponse<ProcessBasicInfo>;\n return normalizeProcessBasic(unwrapRuntimeResponse(response));\n}\n\n/** 获取流程进度(任务列表) */\nexport async function getProcessProgress(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessTask[]> {\n const response = (await request<any>({\n url: `/workflow/instance/${formInstId}/all-tasks`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return normalizeProcessTasks(unwrapRuntimeResponse(response));\n}\n\n/** 检查当前用户审批权限 */\nexport async function checkUserApproval(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ApprovalPermission> {\n const response = (await request<ApprovalPermission>({\n url: `/workflow/instance/${formInstId}/permission`,\n method: 'get',\n })) as RuntimeResponse<ApprovalPermission>;\n return normalizeApprovalPermission(unwrapRuntimeResponse(response));\n}\n\n// ============ 审批操作 ============\n\n/** 审批(同意/拒绝) */\nexport async function handleApproval(\n request: FormRuntimeApi['request'],\n params: ApproveParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/approve',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 撤销流程 */\nexport async function withdrawProcess(\n request: FormRuntimeApi['request'],\n params: WithdrawParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/instance/${params.instanceId}/withdraw`,\n method: 'put',\n data: { reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 转交任务 */\nexport async function transferTask(\n request: FormRuntimeApi['request'],\n params: TransferParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/transfer`,\n method: 'put',\n data: { newAssignee: params.newAssignee, reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 退回任务 */\nexport async function returnTask(\n request: FormRuntimeApi['request'],\n params: ReturnParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/return`,\n method: 'put',\n data: { targetNodeId: params.targetNodeId, reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 重新提交任务 */\nexport async function resubmitTask(\n request: FormRuntimeApi['request'],\n params: ResubmitParams,\n): Promise<any> {\n const initiatorSelectedApprovers = params.initiatorSelectedApprovers || params.selectedApprovers;\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit`,\n method: 'post',\n data: withInitiatorSelectedApprovers(\n {\n formUuid: params.formUuid,\n appType: params.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n },\n initiatorSelectedApprovers,\n ),\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 暂存任务 */\nexport async function saveTask(\n request: FormRuntimeApi['request'],\n params: SaveTaskParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/task/save',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取可退回节点 */\nexport async function getReturnableNodes(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNode[]> {\n const result = await getReturnableNodeResult(request, taskId);\n return result.nodes;\n}\n\n/** 获取可退回节点和退回策略 */\nexport async function getReturnableNodeResult(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNodeResult> {\n const response = (await request<ReturnableNode[]>({\n url: `/workflow/task/${taskId}/returnable-nodes`,\n method: 'get',\n })) as RuntimeResponse<ReturnableNode[]>;\n return normalizeReturnableNodeResult(unwrapRuntimeResponse(response));\n}\n\n// ============ 流程预览和定义 ============\n\n/** 预览流程路由 */\nexport async function previewProcess(\n request: FormRuntimeApi['request'],\n params: PreviewParams,\n): Promise<ProcessRoute[]> {\n const initiatorSelectedApprovers = params.initiatorSelectedApprovers || params.selectedApprovers;\n const response = (await request<ProcessRoute[]>({\n url: '/workflow/preview',\n method: 'post',\n data: withInitiatorSelectedApprovers(params, initiatorSelectedApprovers),\n })) as RuntimeResponse<ProcessRoute[]>;\n return normalizePreviewRoutes(unwrapRuntimeResponse(response));\n}\n\nexport async function getInitiatorSelectRequirements(\n request: FormRuntimeApi['request'],\n params: {\n formUuid: string;\n appType: string;\n data: Record<string, any>;\n submissionDepartmentId?: string;\n },\n): Promise<InitiatorSelectRequirement[]> {\n const response = (await request<any>({\n url: '/workflow/initiator-approver/requirements',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return normalizeInitiatorSelectRequirements(unwrapRuntimeResponse(response));\n}\n\nexport async function getResubmitInitiatorSelectRequirements(\n request: FormRuntimeApi['request'],\n params: {\n taskId: string;\n formUuid: string;\n appType: string;\n data: Record<string, any>;\n },\n): Promise<InitiatorSelectRequirement[]> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit/initiator-approver/requirements`,\n method: 'post',\n data: {\n formUuid: params.formUuid,\n appType: params.appType,\n data: params.data,\n },\n })) as RuntimeResponse<any>;\n return normalizeInitiatorSelectRequirements(unwrapRuntimeResponse(response));\n}\n\nexport async function getInitiatorSelectCandidates(\n request: FormRuntimeApi['request'],\n params: {\n formUuid: string;\n appType: string;\n nodeId: string;\n page?: number;\n pageSize?: number;\n keyword?: string;\n departmentId?: string;\n },\n): Promise<{\n items: InitiatorSelectCandidate[];\n total: number;\n page: number;\n pageSize: number;\n}> {\n const response = (await request<any>({\n url: '/workflow/initiator-select/candidates',\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n const raw = unwrapRuntimeResponse(response) || {};\n const items = Array.isArray(raw.items) ? raw.items : [];\n return {\n items: items\n .map(normalizeInitiatorSelectCandidate)\n .filter((user: InitiatorSelectCandidate) => user.id),\n total: Number(raw.total || items.length || 0),\n page: Number(raw.page || params.page || 1),\n pageSize: Number(raw.pageSize || params.pageSize || 50),\n };\n}\n\n/** 获取流程定义 */\nexport async function getProcessDefinition(\n request: FormRuntimeApi['request'],\n formUuid: string,\n): Promise<ProcessDefinition> {\n const response = (await request<ProcessDefinition>({\n url: '/workflow/definition/form',\n method: 'get',\n params: { formUuid },\n })) as RuntimeResponse<ProcessDefinition>;\n return normalizeProcessDefinition(unwrapRuntimeResponse(response));\n}\n\n/** 触发回调等待任务 */\nexport async function triggerCallbackTask(\n request: FormRuntimeApi['request'],\n params: { taskId: string; payload?: Record<string, any> },\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/callback`,\n method: 'post',\n data: params.payload || {},\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n// ============ 表单详情 ============\n\n/** 获取表单实例数据 */\nexport async function getFormData(\n request: FormRuntimeApi['request'],\n params: FormDataQueryParams,\n): Promise<FormInstanceData> {\n const response = (await request<FormInstanceData>({\n url: '/form/queryFormDataByFormInstanceId',\n method: 'get',\n params,\n })) as RuntimeResponse<FormInstanceData>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 删除表单数据 */\nexport async function deleteFormData(\n request: FormRuntimeApi['request'],\n params: FormDataDeleteParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: {\n appType: params.appType,\n formUuid: params.formUuid,\n formInstId: params.formInstanceId,\n },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取表单变更记录 */\nexport async function getChangeRecords(\n request: FormRuntimeApi['request'],\n params: ChangeRecordQueryParams,\n): Promise<ChangeRecordListResponse> {\n const response = (await request<ChangeRecordListResponse>({\n url: '/form/getFormDataChangeRecords',\n method: 'get',\n params,\n })) as RuntimeResponse<ChangeRecordListResponse>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取视图权限摘要 */\nexport async function getViewPermission(\n request: FormRuntimeApi['request'],\n params: ViewPermissionQueryParams,\n): Promise<ViewPermissionSummary> {\n const response = (await request<ViewPermissionSummary>({\n url: '/permission/form-group/view-permissions',\n method: 'get',\n params,\n })) as RuntimeResponse<ViewPermissionSummary>;\n return unwrapRuntimeResponse(response);\n}\n","import type { FieldDefinition, FormRuntimeApi, FormSchema, RuntimeResponse } from '../types';\n\nexport type DataManagementConfigScope = 'global' | 'personal';\nexport type DataManagementDensity = 'compact' | 'middle' | 'loose';\nexport type FilterLogic = 'AND' | 'OR';\nexport type SortDirection = 'ascend' | 'descend' | null;\n\nexport interface DataManagementField extends FieldDefinition {\n id: string;\n fieldId: string;\n componentName: string;\n label: string;\n width?: number;\n system?: boolean;\n processOnly?: boolean;\n displayable?: boolean;\n}\n\nexport interface DataManagementFilterRule {\n id: string;\n key: string;\n operator: string;\n value: any;\n componentName?: string;\n}\n\nexport interface DataManagementFilterGroup {\n id: string;\n logic: FilterLogic;\n rules: DataManagementFilterRule[];\n conditions: DataManagementFilterGroup[];\n}\n\nexport interface DataManagementSort {\n id: string;\n isAsc: 'y' | 'n';\n}\n\nexport interface DataManagementConfig {\n showFields?: string[];\n widths?: Record<string, number>;\n lockFieldIds?: string[];\n sort?: DataManagementSort[];\n filter?: {\n searchKeyWord?: string;\n group?: DataManagementFilterGroup;\n };\n density?: DataManagementDensity;\n detailOpenMode?: 'drawer' | 'newPage';\n pageSize?: number;\n showForcedConfig?: boolean;\n [key: string]: any;\n}\n\nexport interface DataManagementQuery {\n appType: string;\n formUuid: string;\n filters?: DataManagementFilterGroup;\n rawFilters?: string;\n conditionType?: FilterLogic;\n searchKeyWord?: string;\n currentPage?: number;\n pageSize?: number;\n order?: DataManagementSort[];\n instanceStatus?: string;\n}\n\nexport interface DataManagementListResult {\n records: any[];\n total: number;\n}\n\nexport interface DataManagementApiOptions {\n appType: string;\n formUuid: string;\n menuFormUuid?: string;\n scope?: DataManagementConfigScope;\n}\n\nconst unwrap = <T = any>(response: RuntimeResponse<T> | Blob | any): T => {\n if (response instanceof Blob) return response as T;\n if (response?.data?.result !== undefined) return response.data.result as T;\n if (response?.result !== undefined) return response.result as T;\n if (response?.data !== undefined) return response.data as T;\n return response as T;\n};\n\nconst pickData = (value: any) => value?.data ?? value?.result ?? value;\n\nconst normalizeComponentName = (field: any) =>\n field?.componentName ||\n field?.component_name ||\n field?.component_type ||\n field?.componentType ||\n field?.type ||\n 'TextField';\n\nconst normalizeField = (key: string, field: any, system = false): DataManagementField => ({\n ...field,\n id: field?.id || field?.fieldId || key,\n fieldId: field?.fieldId || field?.id || key,\n componentName: normalizeComponentName(field),\n label: field?.label || field?.title || field?.name || key,\n width: field?.width,\n system,\n});\n\nconst SYSTEM_VALUE_ALIASES: Record<string, string[]> = {\n formInstanceId: ['formInstanceId', 'formInstId', 'form_instance_id', 'processInstanceId'],\n instanceTitle: ['instanceTitle', 'instance_title', 'processInstanceTitle', 'title'],\n createdBy: ['createdBy', 'created_by', 'originator'],\n createdByName: ['createdByName', 'created_by_name', 'originatorName', 'creatorName'],\n createdByDepartmentId: ['createdByDepartmentId', 'created_by_department_id', 'originatorCorp'],\n createdByDepartmentName: [\n 'createdByDepartmentName',\n 'created_by_department_name',\n 'originatorDepartmentName',\n 'originatorCorpName',\n ],\n createdAt: ['createdAt', 'created_at', 'createTime', 'gmtCreate'],\n updatedAt: ['updatedAt', 'updated_at', 'modifiedTime', 'modifyTime', 'gmtModified'],\n};\n\nconst pickAliasValue = (record: any, aliases: string[]) => {\n for (const alias of aliases) {\n const value = record?.[alias];\n if (value !== undefined && value !== null && value !== '') return value;\n }\n return undefined;\n};\n\nconst normalizeDataManagementRecord = (record: any) => {\n if (!record || typeof record !== 'object' || Array.isArray(record)) return record;\n const normalized = { ...record };\n Object.entries(SYSTEM_VALUE_ALIASES).forEach(([targetKey, aliases]) => {\n if (normalized[targetKey] !== undefined && normalized[targetKey] !== null) return;\n const aliasValue = pickAliasValue(record, aliases);\n if (aliasValue !== undefined) normalized[targetKey] = aliasValue;\n });\n return normalized;\n};\n\nexport const PROCESS_INSTANCE_STATUS_OPTIONS = [\n { label: '待处理', value: 'pending' },\n { label: '审批中', value: 'running' },\n { label: '等待中', value: 'waiting' },\n { label: '流程异常', value: 'exception' },\n { label: '已完成', value: 'completed' },\n { label: '已拒绝', value: 'terminated' },\n { label: '已撤销', value: 'withdrawn' },\n];\n\nexport const APPROVAL_RESULT_OPTIONS = [\n { label: '审批中', value: 'processing' },\n { label: '同意', value: 'approved' },\n { label: '拒绝', value: 'rejected' },\n { label: '撤销', value: 'withdrawn' },\n { label: '异常', value: 'exception' },\n];\n\nconst PROCESS_SYSTEM_FIELDS: DataManagementField[] = [\n normalizeField(\n 'currentApprovalNodeName',\n {\n label: '当前审批节点',\n componentName: 'TextField',\n width: 140,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n normalizeField(\n 'processInstanceStatus',\n {\n label: '实例状态',\n componentName: 'SelectField',\n width: 110,\n options: PROCESS_INSTANCE_STATUS_OPTIONS,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n normalizeField(\n 'approvalResult',\n {\n label: '审批结果',\n componentName: 'SelectField',\n width: 110,\n options: APPROVAL_RESULT_OPTIONS,\n processOnly: true,\n displayable: true,\n },\n true,\n ),\n];\n\nconst BASE_SYSTEM_FIELDS: DataManagementField[] = [\n normalizeField(\n 'instanceTitle',\n { label: '实例标题', componentName: 'TextField', width: 220, displayable: true },\n true,\n ),\n normalizeField(\n 'createdByName',\n { label: '创建人', componentName: 'TextField', width: 130, displayable: true },\n true,\n ),\n normalizeField(\n 'createdByDepartmentName',\n { label: '创建人部门', componentName: 'TextField', width: 150, displayable: true },\n true,\n ),\n normalizeField(\n 'createdAt',\n { label: '创建时间', componentName: 'DateField', width: 170, displayable: true },\n true,\n ),\n normalizeField(\n 'updatedAt',\n { label: '更新时间', componentName: 'DateField', width: 170, displayable: true },\n true,\n ),\n];\n\nexport const getSystemFieldsForFormType = (formType?: string) =>\n formType === 'process' ? [...BASE_SYSTEM_FIELDS, ...PROCESS_SYSTEM_FIELDS] : BASE_SYSTEM_FIELDS;\n\nexport const normalizeDataManagementFields = (\n payload: any,\n): {\n fields: DataManagementField[];\n formType?: string;\n schema?: FormSchema;\n} => {\n const data = pickData(payload);\n const rawSchema = data?.schema || data?.formSchema || data?.publishedSchema || data;\n const schemaAppType = rawSchema?.formMeta?.appType || data?.appType;\n const schemaFormUuid = rawSchema?.formMeta?.formUuid || data?.formUuid;\n const schemaTitle =\n rawSchema?.formMeta?.title || data?.title || data?.name || data?.formName || schemaFormUuid;\n const formType =\n data?.formType ||\n data?.schema?.formType ||\n data?.schema?.template?.formType ||\n rawSchema?.template?.formType ||\n data?.type;\n const rawFields =\n data?.formFields ||\n data?.schema?.formFields ||\n data?.fields ||\n data?.schema?.fields ||\n data?.formSchema?.fields ||\n [];\n\n const fields = Array.isArray(rawFields)\n ? rawFields.map((field: any) => normalizeField(field?.fieldId || field?.id, field))\n : Object.entries(rawFields).map(([key, field]) => normalizeField(key, field));\n\n return {\n fields: fields.filter((field) => field.componentName !== 'PageSection'),\n formType,\n schema:\n rawSchema && Array.isArray(rawSchema.fields) && schemaAppType && schemaFormUuid\n ? ({\n ...rawSchema,\n formMeta: {\n formUuid: schemaFormUuid,\n appType: schemaAppType,\n title: schemaTitle,\n ...(rawSchema.formMeta || {}),\n },\n template: {\n type: 'standard',\n ...(rawSchema.template || {}),\n formType: rawSchema.template?.formType || formType,\n },\n } as FormSchema)\n : undefined,\n };\n};\n\nexport const normalizeDataManagementList = (payload: any): DataManagementListResult => {\n const data = unwrap<any>(payload);\n const body = data?.result || data;\n const records = body?.data || body?.records || body?.list || body?.items || [];\n const total = body?.totalCount ?? body?.total ?? body?.count ?? records.length;\n return {\n records: Array.isArray(records) ? records.map(normalizeDataManagementRecord) : [],\n total: Number(total) || 0,\n };\n};\n\nexport const buildFilterPayload = (group?: DataManagementFilterGroup): string | undefined => {\n if (!group) return undefined;\n const normalizeOperator = (operator?: string) => {\n const raw = String(operator || '').trim();\n const aliases: Record<string, string> = {\n contains: 'CONTAINS',\n eq: 'EQ',\n ne: 'NEQ',\n neq: 'NEQ',\n gt: 'GT',\n gte: 'GTE',\n lt: 'LT',\n lte: 'LTE',\n between: 'BETWEEN',\n in: 'IN',\n is_null: 'IS_NULL',\n is_not_null: 'IS_NOT_NULL',\n empty: 'IS_NULL',\n not_empty: 'IS_NOT_NULL',\n notEmpty: 'IS_NOT_NULL',\n };\n return aliases[raw] || aliases[raw.toLowerCase()] || raw.toUpperCase();\n };\n const isNoValueOperator = (operator?: string) =>\n ['IS_NULL', 'IS_NOT_NULL'].includes(normalizeOperator(operator));\n const hasRuleValue = (rule: DataManagementFilterRule) => {\n if (isNoValueOperator(rule.operator)) return true;\n if (Array.isArray(rule.value)) {\n return rule.value.some((item) => item !== undefined && item !== null && item !== '');\n }\n return rule.value !== undefined && rule.value !== null && rule.value !== '';\n };\n const trimGroup = (current: DataManagementFilterGroup): DataManagementFilterGroup => ({\n ...current,\n rules: (current.rules || [])\n .filter((rule) => rule.key && rule.operator && hasRuleValue(rule))\n .map((rule) => ({\n ...rule,\n operator: normalizeOperator(rule.operator),\n value: isNoValueOperator(rule.operator) ? null : rule.value,\n })),\n conditions: (current.conditions || [])\n .map(trimGroup)\n .filter((item) => item.rules.length > 0 || item.conditions.length > 0),\n });\n const payload = trimGroup(group);\n if (payload.rules.length === 0 && payload.conditions.length === 0) return undefined;\n return JSON.stringify(payload);\n};\n\nexport const normalizeColumnConfig = (\n cfg: DataManagementConfig | undefined,\n fields: DataManagementField[],\n): Required<Pick<DataManagementConfig, 'showFields' | 'widths' | 'lockFieldIds' | 'sort'>> & {\n density: DataManagementDensity;\n detailOpenMode: 'drawer' | 'newPage';\n pageSize: number;\n} => {\n const allowed = new Set(fields.map((field) => field.fieldId));\n const configured = Array.isArray(cfg?.showFields)\n ? cfg.showFields.filter((fieldId) => allowed.has(fieldId))\n : [];\n const defaultBusinessFields = fields\n .filter((field) => !field.system)\n .slice(0, 8)\n .map((field) => field.fieldId);\n const defaultSystemFields = fields\n .filter((field) => field.system && field.displayable)\n .map((field) => field.fieldId);\n const defaultShow = [...defaultBusinessFields, ...defaultSystemFields];\n\n return {\n showFields: configured.length > 0 ? configured : defaultShow,\n widths: cfg?.widths || {},\n lockFieldIds: cfg?.lockFieldIds || [],\n sort: Array.isArray(cfg?.sort) ? cfg.sort : [],\n density: cfg?.density || 'middle',\n detailOpenMode: cfg?.detailOpenMode === 'newPage' ? 'newPage' : 'drawer',\n pageSize: cfg?.pageSize || 10,\n };\n};\n\nexport async function getDataManagementSchema(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string },\n) {\n const response = await request({\n url: '/form/getFormSchemaAndPackages',\n method: 'get',\n params,\n });\n const result = normalizeDataManagementFields(response);\n if (result.schema) {\n result.schema = {\n ...result.schema,\n formMeta: {\n ...result.schema.formMeta,\n appType: result.schema.formMeta?.appType || params.appType,\n formUuid: result.schema.formMeta?.formUuid || params.formUuid,\n title: result.schema.formMeta?.title || params.formUuid,\n },\n };\n }\n return result;\n}\n\nexport async function getDataManagementConfig(\n request: FormRuntimeApi['request'],\n options: DataManagementApiOptions,\n): Promise<DataManagementConfig | undefined> {\n const targetFormUuid = options.menuFormUuid || options.formUuid;\n const personal = options.scope === 'personal';\n const response = await request<DataManagementConfig>({\n url: `/${options.appType}/v1/form/dataManagement/config/${personal ? 'personal/' : ''}get.json`,\n method: 'get',\n params: { formUuid: targetFormUuid },\n });\n return unwrap<DataManagementConfig>(response);\n}\n\nexport async function saveDataManagementConfig(\n request: FormRuntimeApi['request'],\n options: DataManagementApiOptions & { config: DataManagementConfig },\n) {\n const targetFormUuid = options.menuFormUuid || options.formUuid;\n const personal = options.scope === 'personal';\n const response = await request({\n url: `/${options.appType}/v1/form/dataManagement/config/${personal ? 'personal/' : ''}save.json`,\n method: 'post',\n data: { formUuid: targetFormUuid, config: options.config },\n });\n return unwrap(response);\n}\n\nexport async function advancedSearchDataManagement(\n request: FormRuntimeApi['request'],\n query: DataManagementQuery,\n): Promise<DataManagementListResult> {\n const response = await request({\n url: `/${query.appType}/v1/form/advancedSearch.json`,\n method: 'get',\n params: {\n appType: query.appType,\n formUuid: query.formUuid,\n filters: query.rawFilters ?? buildFilterPayload(query.filters),\n conditionType: query.conditionType,\n searchKeyWord: query.searchKeyWord,\n currentPage: query.currentPage || 1,\n pageSize: query.pageSize || 10,\n order: JSON.stringify(query.order || []),\n instanceStatus: query.instanceStatus,\n },\n });\n return normalizeDataManagementList(response);\n}\n\nexport async function deleteDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; formInstanceIds: string[] },\n) {\n const formInstId =\n params.formInstanceIds.length === 1 ? params.formInstanceIds[0] : params.formInstanceIds;\n const response = await request({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: {\n appType: params.appType,\n formUuid: params.formUuid,\n formInstId,\n formInstIds: params.formInstanceIds,\n formInstanceIds: params.formInstanceIds,\n },\n });\n return unwrap(response);\n}\n\nexport async function batchApproveDataManagementRows(\n request: FormRuntimeApi['request'],\n params: {\n appType: string;\n formUuid: string;\n formInstanceIds: string[];\n action: 'approved' | 'rejected';\n comments?: string;\n },\n) {\n const response = await request({\n url: '/workflow/approve/batch',\n method: 'post',\n data: {\n instanceIds: params.formInstanceIds,\n action: params.action,\n comments: params.comments,\n },\n });\n return unwrap(response);\n}\n\nexport async function exportDataManagementRows(\n request: FormRuntimeApi['request'],\n params: DataManagementQuery & {\n exportAll?: 'y' | 'n';\n embedImages?: 'y' | 'n';\n exportFields?: string[];\n },\n) {\n return request({\n url: `/${params.appType}/v1/form/advancedExport.xlsx`,\n method: 'get',\n responseType: 'blob',\n params: {\n appType: params.appType,\n formUuid: params.formUuid,\n filters: params.rawFilters ?? buildFilterPayload(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: JSON.stringify(params.order || []),\n instanceStatus: params.instanceStatus,\n exportAll: params.exportAll || 'n',\n embedImages: params.embedImages || 'n',\n exportFields: (params.exportFields || []).join(','),\n },\n });\n}\n\nexport async function downloadDataManagementImportTemplate(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string },\n) {\n return request({\n url: `/${params.appType}/v1/form/advancedExportTemplate.xlsx`,\n method: 'get',\n responseType: 'blob',\n params: {\n formUuid: params.formUuid,\n },\n });\n}\n\nexport async function importPreviewDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; fileBase64: string },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/importPreview.xlsx`,\n method: 'post',\n data: { formUuid: params.formUuid, fileBase64: params.fileBase64 },\n });\n return unwrap(response);\n}\n\nexport async function importDataManagementRows(\n request: FormRuntimeApi['request'],\n params: { appType: string; formUuid: string; fileBase64: string },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/import.xlsx`,\n method: 'post',\n data: { formUuid: params.formUuid, fileBase64: params.fileBase64 },\n });\n return unwrap(response);\n}\n\nexport async function getDataManagementTransferRecords(\n request: FormRuntimeApi['request'],\n params: {\n appType: string;\n formUuid: string;\n type: 'import' | 'export';\n currentPage?: number;\n pageSize?: number;\n },\n) {\n const response = await request({\n url: `/${params.appType}/v1/form/${params.type}Records.json`,\n method: 'get',\n params,\n });\n return normalizeDataManagementList(response);\n}\n","import React from 'react';\nimport { useFormContext } from '../../core/FormContext';\nimport type { FieldDefinition } from '../../types';\nimport { normalizeRichTextHtml } from '../../utils/richText';\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 getText = (item: any): string => {\n if (item === null || item === undefined || item === '') return '';\n if (typeof item !== 'object') return String(item);\n return String(\n item.label ||\n item.name ||\n item.title ||\n item.fullAddress ||\n item.text ||\n item.value ||\n item.id ||\n '',\n );\n };\n\n const formatObject = (value: Record<string, any>): React.ReactNode => {\n if (value.start || value.end) {\n return [value.start, value.end].filter(Boolean).join(' ~ ') || '--';\n }\n const text = getText(value);\n if (text) return text;\n return <pre className=\"sy-summary-json\">{JSON.stringify(value, null, 2)}</pre>;\n };\n\n const formatValue = (field: FieldDefinition, value: any): React.ReactNode => {\n if (value === null || value === undefined || value === '') return '--';\n if (field.componentName === 'EditorField') {\n const html = normalizeRichTextHtml(value);\n if (!html) return '--';\n return (\n <span\n className=\"sy-editor-readonly sy-summary-richtext\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n if (field.componentName === 'JSONField') {\n return typeof value === 'string' ? (\n value\n ) : (\n <pre className=\"sy-summary-json\">{JSON.stringify(value, null, 2)}</pre>\n );\n }\n if (field.componentName === 'CascadeDateField' && typeof value === 'object') {\n return formatObject(value);\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return '--';\n return value\n .map((item) => {\n if (Array.isArray(item)) return item.map(getText).filter(Boolean).join(' / ');\n if (typeof item === 'object') return getText(item) || JSON.stringify(item);\n return String(item);\n })\n .filter(Boolean)\n .join(', ');\n }\n if (typeof value === 'object') return formatObject(value);\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 <div className={valueClassName ?? 'text-sm text-gray-900'}>\n {formatValue(field, formData[field.fieldId])}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useRef } from 'react';\nimport type { FieldBehavior, FormSchema, FormEngineConfig, ValidationRule } from '../types';\nimport { evaluateEffects } from '../core/effects';\nimport { validateAllFields } from '../core/validation';\n\nexport interface UseFormEngineReturn {\n formData: Record<string, any>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n validateAll: () => Promise<boolean>;\n resetForm: () => void;\n mode: string;\n fieldBehaviors: Record<string, FieldBehavior>;\n fieldErrors: Record<string, string>;\n}\n\nexport function useFormEngine(schema: FormSchema, config: FormEngineConfig): UseFormEngineReturn {\n // Build initial values from schema defaults\n const initialValues = useMemo(() => {\n const values: Record<string, any> = {};\n for (const field of schema.fields) {\n if (field.defaultValue !== undefined) {\n values[field.fieldId] = field.defaultValue;\n }\n }\n return values;\n }, [schema]);\n\n const initialValuesRef = useRef(initialValues);\n const [formData, setFormData] = useState<Record<string, any>>({ ...initialValues });\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n\n // Compute field behaviors based on permissions and effects\n const fieldBehaviors = useMemo(() => {\n // Start with default behaviors from schema\n const baseBehaviors: Record<string, FieldBehavior> = {};\n for (const field of schema.fields) {\n baseBehaviors[field.fieldId] = field.behavior || 'NORMAL';\n }\n\n // Apply effects\n let computed = baseBehaviors;\n if (config.effects && config.effects.length > 0) {\n computed = evaluateEffects(config.effects, formData, baseBehaviors);\n }\n\n // Apply permissions (override effects)\n if (config.permissions?.fieldPermissions) {\n for (const [fieldId, behavior] of Object.entries(config.permissions.fieldPermissions)) {\n computed[fieldId] = behavior;\n }\n }\n\n // In readonly mode, all fields become READONLY unless HIDDEN\n if (config.mode === 'readonly') {\n for (const fieldId of Object.keys(computed)) {\n if (computed[fieldId] !== 'HIDDEN') {\n computed[fieldId] = 'READONLY';\n }\n }\n }\n\n return computed;\n }, [schema, config.effects, config.permissions, config.mode, formData]);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n // Clear error when value changes\n setFieldErrors((prev) => {\n if (prev[fieldId]) {\n const next = { ...prev };\n delete next[fieldId];\n return next;\n }\n return prev;\n });\n }, []);\n\n const getFieldValue = useCallback((fieldId: string) => formData[fieldId], [formData]);\n\n const getFormData = useCallback(() => ({ ...formData }), [formData]);\n\n const validateAll = useCallback(async () => {\n const fieldRules: Record<string, ValidationRule[]> = {};\n for (const field of schema.fields) {\n const rules: ValidationRule[] = [];\n if (field.required) {\n rules.push({ required: true, message: `${field.label}为必填项` });\n }\n if (field.rules) {\n rules.push(...field.rules);\n }\n if (rules.length > 0) {\n fieldRules[field.fieldId] = rules;\n }\n }\n\n const errors = await validateAllFields(formData, fieldRules);\n setFieldErrors(errors);\n return Object.keys(errors).length === 0;\n }, [schema, formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setFieldErrors({});\n }, []);\n\n return {\n formData,\n setFieldValue,\n getFieldValue,\n getFormData,\n validateAll,\n resetForm,\n mode: config.mode,\n fieldBehaviors,\n fieldErrors,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\n\nexport interface UseFormDataReturn {\n formData: Record<string, any>;\n setFieldValue: (fieldId: string, value: any) => void;\n getFieldValue: (fieldId: string) => any;\n getFormData: () => Record<string, any>;\n resetForm: () => void;\n dirtyFields: Set<string>;\n}\n\nexport function useFormData(initialValues: Record<string, any> = {}): UseFormDataReturn {\n const [formData, setFormData] = useState<Record<string, any>>({ ...initialValues });\n const [dirtyFields, setDirtyFields] = useState<Set<string>>(new Set());\n const initialValuesRef = useRef(initialValues);\n\n const setFieldValue = useCallback((fieldId: string, value: any) => {\n setFormData((prev) => ({ ...prev, [fieldId]: value }));\n setDirtyFields((prev) => {\n const next = new Set(prev);\n next.add(fieldId);\n return next;\n });\n }, []);\n\n const getFieldValue = useCallback(\n (fieldId: string) => {\n return formData[fieldId];\n },\n [formData],\n );\n\n const getFormData = useCallback(() => {\n return { ...formData };\n }, [formData]);\n\n const resetForm = useCallback(() => {\n setFormData({ ...initialValuesRef.current });\n setDirtyFields(new Set());\n }, []);\n\n return {\n formData,\n setFieldValue,\n getFieldValue,\n getFormData,\n resetForm,\n dirtyFields,\n };\n}\n","import { useMemo } from 'react';\nimport type { FieldBehavior, FormEffect } from '../types';\nimport { evaluateEffects } from '../core/effects';\n\nexport interface UseFieldBehaviorOptions {\n fieldId: string;\n permissions?: Record<string, FieldBehavior>;\n effects?: FormEffect[];\n formData: Record<string, any>;\n defaultBehavior?: FieldBehavior;\n}\n\n/**\n * Computes the final behavior for a field.\n * Priority: permissions > effects > defaultBehavior > 'NORMAL'\n */\nexport function useFieldBehavior({\n fieldId,\n permissions,\n effects,\n formData,\n defaultBehavior = 'NORMAL',\n}: UseFieldBehaviorOptions): FieldBehavior {\n return useMemo(() => {\n // If permissions explicitly define this field, that takes priority\n if (permissions && permissions[fieldId]) {\n return permissions[fieldId];\n }\n\n // Evaluate effects to see if they modify the behavior\n if (effects && effects.length > 0) {\n const baseBehaviors: Record<string, FieldBehavior> = { [fieldId]: defaultBehavior };\n const computed = evaluateEffects(effects, formData, baseBehaviors);\n return computed[fieldId] as FieldBehavior;\n }\n\n return defaultBehavior;\n }, [fieldId, permissions, effects, formData, defaultBehavior]);\n}\n","import { useState, useCallback } from 'react';\n\nexport interface SubmitConfig {\n beforeSubmit?: (values: Record<string, any>) => Promise<boolean | void>;\n afterSubmit?: (response: any) => Promise<void>;\n submitSuccessMode?: 'redirect' | 'stay' | 'callback';\n redirectUrl?: string;\n}\n\nexport interface UseFormSubmitReturn {\n submit: (formData: Record<string, any>, validateFn: () => Promise<boolean>) => Promise<void>;\n isSubmitting: boolean;\n submitError: string | null;\n}\n\nexport function useFormSubmit(config?: SubmitConfig): UseFormSubmitReturn {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const submit = useCallback(\n async (formData: Record<string, any>, validateFn: () => Promise<boolean>) => {\n setSubmitError(null);\n\n // Validate\n const isValid = await validateFn();\n if (!isValid) {\n setSubmitError('表单校验失败');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // beforeSubmit hook\n if (config?.beforeSubmit) {\n const result = await config.beforeSubmit(formData);\n if (result === false) {\n setIsSubmitting(false);\n return;\n }\n }\n\n // afterSubmit hook (simulates completion of submit)\n if (config?.afterSubmit) {\n await config.afterSubmit(formData);\n }\n } catch (e: any) {\n setSubmitError(e?.message || '提交失败');\n } finally {\n setIsSubmitting(false);\n }\n },\n [config],\n );\n\n return { submit, isSubmitting, submitError };\n}\n","import { useMemo, useCallback } from 'react';\nimport type {\n FieldBehavior,\n ProcessDefinition,\n ProcessTask,\n ViewPermissionSummary,\n} from '../types';\nimport { normalizeFieldBehaviors } from '../utils/permissions';\n\nexport interface UseFieldPermissionOptions {\n viewPermissions?: ViewPermissionSummary;\n processDefinition?: ProcessDefinition;\n currentTask?: ProcessTask;\n isApprover?: boolean;\n mode: 'readonly' | 'edit';\n}\n\nexport interface UseFieldPermissionReturn {\n fieldBehaviors: Record<string, FieldBehavior>;\n computeBehaviors: () => Record<string, FieldBehavior>;\n}\n\nconst normalizeBehavior = (value?: string): FieldBehavior => {\n if (value === 'EDITABLE') return 'NORMAL';\n if (value === 'READ_ONLY') return 'READONLY';\n if (value === 'DISABLED') return 'DISABLED';\n if (value === 'HIDDEN') return 'HIDDEN';\n if (value === 'NORMAL' || value === 'READONLY') return value;\n return 'READONLY';\n};\n\nconst normalizeFlowConfig = (config: any): Record<string, FieldBehavior> | null => {\n if (!config) return null;\n if (Array.isArray(config)) {\n const result: Record<string, FieldBehavior> = {};\n config.forEach((item) => {\n const fieldId = item?.fieldId || item?.field_id || item?.id;\n if (!fieldId) return;\n result[fieldId] = normalizeBehavior(item?.fieldBehavior || item?.behavior || item?.value);\n });\n return Object.keys(result).length > 0 ? result : null;\n }\n if (typeof config === 'object') {\n const result: Record<string, FieldBehavior> = {};\n Object.entries(config).forEach(([fieldId, value]) => {\n result[fieldId] = normalizeBehavior(\n typeof value === 'string'\n ? value\n : (value as any)?.fieldBehavior || (value as any)?.behavior,\n );\n });\n return result;\n }\n return null;\n};\n\n/**\n * 字段权限计算 hook\n * 根据不同场景(普通详情、流程审批等)计算字段行为映射\n */\nexport function useFieldPermission(options: UseFieldPermissionOptions): UseFieldPermissionReturn {\n const { viewPermissions, processDefinition, currentTask, isApprover, mode } = options;\n\n const computeBehaviors = useCallback((): Record<string, FieldBehavior> => {\n const behaviors: Record<string, FieldBehavior> = {};\n\n // 场景1:普通详情页,基于 viewPermissions + mode\n if (!currentTask && viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, mode);\n }\n\n // 场景2:流程-非审批人,全部 READONLY(除 HIDDEN 外)\n if (currentTask && !isApprover && viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, 'readonly');\n }\n\n // 场景3:流程-发起人修改(originator_return 节点)\n if (currentTask && isApprover && currentTask.nodeType === 'originator_return') {\n if (processDefinition?.flowConfig && processDefinition.startNodeId) {\n const startConfig = normalizeFlowConfig(\n processDefinition.flowConfig[processDefinition.startNodeId],\n );\n if (startConfig) {\n for (const [fieldId, behavior] of Object.entries(startConfig)) {\n behaviors[fieldId] = mode === 'edit' ? behavior : 'READONLY';\n }\n return behaviors;\n }\n }\n // 降级:如果无法获取 startNode 配置,全部可编辑\n if (viewPermissions) {\n for (const fieldId of Object.keys(viewPermissions.fieldPermissions)) {\n if (viewPermissions.fieldPermissions[fieldId] === 'FORM_FILED_HIDDEN') {\n behaviors[fieldId] = 'HIDDEN';\n } else {\n behaviors[fieldId] = mode === 'edit' ? 'NORMAL' : 'READONLY';\n }\n }\n }\n return behaviors;\n }\n\n // 场景4:流程-审批人,使用 currentTask.nodeId 对应的 fieldConfig\n if (currentTask && isApprover && processDefinition?.flowConfig) {\n const nodeConfig = normalizeFlowConfig(processDefinition.flowConfig[currentTask.nodeId]);\n if (nodeConfig) {\n for (const [fieldId, behavior] of Object.entries(nodeConfig)) {\n behaviors[fieldId] = mode === 'edit' ? behavior : 'READONLY';\n }\n return behaviors;\n }\n }\n\n // 兜底:基于 viewPermissions\n if (viewPermissions) {\n return normalizeFieldBehaviors(viewPermissions, mode);\n }\n\n return behaviors;\n }, [viewPermissions, processDefinition, currentTask, isApprover, mode]);\n\n const fieldBehaviors = useMemo(() => computeBehaviors(), [computeBehaviors]);\n\n return { fieldBehaviors, computeBehaviors };\n}\n","import type { FieldBehavior, ViewPermissionSummary } from '../types';\n\nconst OPERATION_ALIASES: Record<string, string> = {\n VIEW: 'view',\n EDIT: 'edit',\n DELETE: 'delete',\n VIEW_CHANGE_RECORDS: 'change_records',\n CHANGE_RECORDS: 'change_records',\n VIEW_PROCESS: 'workflow',\n WORKFLOW: 'workflow',\n};\n\nexport function normalizeOperation(operation?: string): string {\n const raw = String(operation || '').trim();\n if (!raw) return '';\n const upper = raw.toUpperCase();\n return OPERATION_ALIASES[upper] || raw.toLowerCase();\n}\n\nexport function hasViewOperation(operations: string[] | undefined, expected: string): boolean {\n const normalized = new Set((operations || []).map(normalizeOperation));\n return normalized.has(normalizeOperation(expected));\n}\n\nexport function normalizeFieldBehaviors(\n permissions: ViewPermissionSummary | null | undefined,\n mode: 'readonly' | 'edit',\n): Record<string, FieldBehavior> {\n const behaviors: Record<string, FieldBehavior> = {};\n Object.entries(permissions?.fieldPermissions || {}).forEach(([fieldId, value]) => {\n if (value === 'FORM_FILED_HIDDEN') {\n behaviors[fieldId] = 'HIDDEN';\n } else if (value === 'FORM_FILED_EDIT') {\n behaviors[fieldId] = mode === 'edit' ? 'NORMAL' : 'READONLY';\n } else {\n behaviors[fieldId] = 'READONLY';\n }\n });\n return behaviors;\n}\n\nexport function hasViewPermission(permissions: ViewPermissionSummary | null | undefined): boolean {\n const operations = permissions?.operations || [];\n return operations.length === 0 ? false : hasViewOperation(operations, 'view');\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { FieldBehavior, FormInstanceData, ViewPermissionSummary } from '../types';\nimport { getFormData, getViewPermission, deleteFormData } from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\nimport { extractFormValues, normalizeFormInstanceInfo } from '../utils/formInstanceData';\nimport { hasViewOperation, normalizeFieldBehaviors } from '../utils/permissions';\n\nexport interface UseFormDetailOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n fieldIds?: readonly string[];\n onPermissionDenied?: () => void;\n}\n\nexport interface UseFormDetailReturn {\n loading: boolean;\n mode: 'readonly' | 'edit';\n formData: Record<string, any> | null;\n instanceInfo: FormInstanceData | null;\n permissions: ViewPermissionSummary | null;\n fieldBehaviors: Record<string, FieldBehavior>;\n\n switchToEdit: () => void;\n switchToReadonly: () => void;\n saveChanges: (values: Record<string, any>) => Promise<boolean>;\n deleteInstance: () => Promise<boolean>;\n\n canEdit: boolean;\n canDelete: boolean;\n canViewChangeRecords: boolean;\n}\n\n/**\n * 详情页核心逻辑 hook\n * 处理数据加载、权限计算、模式切换、保存和删除\n */\nexport function useFormDetail(options: UseFormDetailOptions): UseFormDetailReturn {\n const { formUuid, appType, formInstanceId, fieldIds, onPermissionDenied } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [loading, setLoading] = useState(true);\n const [mode, setMode] = useState<'readonly' | 'edit'>('readonly');\n const [formData, setFormData] = useState<Record<string, any> | null>(null);\n const [instanceInfo, setInstanceInfo] = useState<FormInstanceData | null>(null);\n const [permissions, setPermissions] = useState<ViewPermissionSummary | null>(null);\n\n const mountedRef = useRef(true);\n const onPermissionDeniedRef = useRef(onPermissionDenied);\n const fieldIdsKey = fieldIds?.join('\\u0001') ?? '';\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n onPermissionDeniedRef.current = onPermissionDenied;\n }, [onPermissionDenied]);\n\n const loadData = useCallback(async () => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n const [permResult, formResult] = await Promise.all([\n getViewPermission(request, { formUuid, appType, formInstanceId }),\n getFormData(request, { formInstanceId, appType, formUuid }),\n ]);\n\n if (!mountedRef.current) return;\n\n // 检查是否有权限\n if (!permResult || !hasViewOperation(permResult.operations, 'view')) {\n onPermissionDeniedRef.current?.();\n }\n\n const normalizedInfo = normalizeFormInstanceInfo(formResult, {\n formUuid,\n appType,\n formInstanceId,\n });\n setPermissions(permResult);\n setInstanceInfo(normalizedInfo);\n setFormData(\n extractFormValues(formResult, fieldIdsKey ? fieldIdsKey.split('\\u0001') : undefined),\n );\n } catch (error) {\n console.error('[useFormDetail] Failed to load data:', error);\n if (mountedRef.current) {\n setPermissions(null);\n setInstanceInfo(null);\n setFormData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [request, formUuid, appType, formInstanceId, fieldIdsKey]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const fieldBehaviors = normalizeFieldBehaviors(permissions, mode);\n\n const canEdit = hasViewOperation(permissions?.operations, 'edit');\n const canDelete = hasViewOperation(permissions?.operations, 'delete');\n const canViewChangeRecords = hasViewOperation(permissions?.operations, 'change_records');\n\n const switchToEdit = useCallback(() => {\n // 切换到编辑模式时重新加载最新数据\n setMode('edit');\n loadData();\n }, [loadData]);\n\n const switchToReadonly = useCallback(() => {\n setMode('readonly');\n }, []);\n\n const saveChanges = useCallback(\n async (values: Record<string, any>): Promise<boolean> => {\n try {\n await api.updateFormData({\n formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(values),\n });\n if (mountedRef.current) {\n setFormData(values);\n setMode('readonly');\n }\n return true;\n } catch (error) {\n console.error('[useFormDetail] Failed to save changes:', error);\n return false;\n }\n },\n [api, formInstanceId, formUuid, appType],\n );\n\n const deleteInstance = useCallback(async (): Promise<boolean> => {\n try {\n await deleteFormData(request, { formInstanceId, appType, formUuid });\n return true;\n } catch (error) {\n console.error('[useFormDetail] Failed to delete instance:', error);\n return false;\n }\n }, [request, formInstanceId, appType, formUuid]);\n\n return {\n loading,\n mode,\n formData,\n instanceInfo,\n permissions,\n fieldBehaviors,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n canEdit,\n canDelete,\n canViewChangeRecords,\n };\n}\n","const FORM_INSTANCE_METADATA_KEYS = new Set([\n 'appType',\n 'code',\n 'createTime',\n 'created_at',\n 'createdAt',\n 'createdBy',\n 'created_by',\n 'created_by_department_id',\n 'created_by_department_name',\n 'created_by_name',\n 'createdByDepartmentId',\n 'createdByDepartmentName',\n 'createdByName',\n 'creator',\n 'data',\n 'error',\n 'formInstId',\n 'formInstanceId',\n 'formUuid',\n 'instanceTitle',\n 'message',\n 'modifiedTime',\n 'modifyTime',\n 'originator',\n 'originatorCorp',\n 'originatorCorpName',\n 'originatorDepartmentName',\n 'originatorName',\n 'processInstanceTitle',\n 'result',\n 'success',\n 'title',\n 'updated_at',\n 'updatedAt',\n]);\n\nconst isPlainRecord = (value: unknown): value is Record<string, any> =>\n Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n\nconst parseJsonRecord = (value: unknown): Record<string, any> | null => {\n if (typeof value !== 'string' || value.trim() === '') return null;\n try {\n const parsed = JSON.parse(value);\n return isPlainRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst pickKnownFields = (\n source: Record<string, any>,\n fieldIds?: readonly string[],\n): Record<string, any> => {\n if (fieldIds?.length) {\n const values: Record<string, any> = {};\n for (const fieldId of fieldIds) {\n if (Object.prototype.hasOwnProperty.call(source, fieldId)) {\n values[fieldId] = source[fieldId];\n }\n }\n return values;\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([key]) => !FORM_INSTANCE_METADATA_KEYS.has(key)),\n );\n};\n\nexport const extractFormValues = (\n formInstance: unknown,\n fieldIds?: readonly string[],\n): Record<string, any> | null => {\n if (!isPlainRecord(formInstance)) return null;\n\n const nestedCandidates = [\n formInstance.data,\n parseJsonRecord(formInstance.data),\n formInstance.formData,\n parseJsonRecord(formInstance.formData),\n formInstance.values,\n formInstance.fieldValues,\n parseJsonRecord(formInstance.formDataJson),\n parseJsonRecord(formInstance.dataJson),\n ];\n\n for (const candidate of nestedCandidates) {\n if (isPlainRecord(candidate)) {\n return pickKnownFields(candidate, fieldIds);\n }\n }\n\n const flatValues = pickKnownFields(formInstance, fieldIds);\n return Object.keys(flatValues).length > 0 ? flatValues : null;\n};\n\nconst firstValue = (source: Record<string, any>, keys: string[]) => {\n for (const key of keys) {\n const value = source[key];\n if (value !== undefined && value !== null && value !== '') return value;\n }\n return undefined;\n};\n\nexport const normalizeFormInstanceInfo = (\n formInstance: unknown,\n fallback?: { formUuid?: string; appType?: string; formInstanceId?: string },\n) => {\n if (!isPlainRecord(formInstance)) return null;\n\n const creator = isPlainRecord(formInstance.creator) ? formInstance.creator : {};\n const formInstanceId = firstValue(formInstance, [\n 'formInstanceId',\n 'formInstId',\n 'form_instance_id',\n 'id',\n ]);\n const createdByName = firstValue(formInstance, [\n 'createdByName',\n 'created_by_name',\n 'originatorName',\n 'creatorName',\n ]);\n const createdByDepartmentName = firstValue(formInstance, [\n 'createdByDepartmentName',\n 'created_by_department_name',\n 'originatorDepartmentName',\n 'originatorCorpName',\n ]);\n\n return {\n ...formInstance,\n formInstanceId: formInstanceId || fallback?.formInstanceId || '',\n formUuid: formInstance.formUuid || fallback?.formUuid || '',\n appType: formInstance.appType || fallback?.appType || '',\n data: isPlainRecord(formInstance.data) ? formInstance.data : {},\n title:\n firstValue(formInstance, [\n 'title',\n 'instanceTitle',\n 'instance_title',\n 'processInstanceTitle',\n ]) || undefined,\n instanceTitle:\n firstValue(formInstance, [\n 'instanceTitle',\n 'instance_title',\n 'processInstanceTitle',\n 'title',\n ]) || undefined,\n creator: {\n userId:\n creator.userId || creator.id || formInstance.createdBy || formInstance.originator || '',\n name: creator.name || createdByName || '',\n avatar: creator.avatar,\n department: creator.department || createdByDepartmentName || '',\n },\n createdBy: firstValue(formInstance, ['createdBy', 'created_by', 'originator']),\n createdByName,\n createdByDepartmentId: firstValue(formInstance, [\n 'createdByDepartmentId',\n 'created_by_department_id',\n 'originatorCorp',\n ]),\n createdByDepartmentName,\n createdAt:\n firstValue(formInstance, ['createdAt', 'created_at', 'createTime', 'gmtCreate']) || '',\n updatedAt: firstValue(formInstance, [\n 'updatedAt',\n 'updated_at',\n 'modifiedTime',\n 'modifyTime',\n 'gmtModified',\n ]),\n };\n};\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n FieldBehavior,\n FormInstanceData,\n ProcessAction,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessStatus,\n ProcessTask,\n ViewPermissionSummary,\n} from '../types';\nimport {\n getProcessBasic,\n getProcessProgress,\n checkUserApproval,\n getViewPermission,\n getFormData,\n getProcessDefinition,\n deleteFormData,\n} from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\nimport { useFieldPermission } from './useFieldPermission';\nimport { extractFormValues } from '../utils/formInstanceData';\nimport { hasViewOperation, hasViewPermission } from '../utils/permissions';\n\nexport interface UseProcessDetailOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n fieldIds?: readonly string[];\n}\n\nexport interface UseProcessDetailReturn {\n loading: boolean;\n processInfo: ProcessBasicInfo | null;\n processStatus: ProcessStatus | null;\n currentTask: ProcessTask | null;\n progressList: ProcessTask[];\n formData: Record<string, any> | null;\n instanceInfo: FormInstanceData | null;\n accessDenied: boolean;\n loadError: string | null;\n\n isApprover: boolean;\n activeActions: ProcessAction[];\n fieldBehaviors: Record<string, FieldBehavior>;\n mode: 'readonly' | 'edit';\n\n isOriginatorReturn: boolean;\n isProcessCompleted: boolean;\n canWithdraw: boolean;\n canEdit: boolean;\n canDelete: boolean;\n canViewWorkflow: boolean;\n canViewChangeRecords: boolean;\n dataVersion: number;\n\n switchToEdit: () => void;\n switchToReadonly: () => void;\n saveChanges: (values: Record<string, any>) => Promise<boolean>;\n deleteInstance: () => Promise<boolean>;\n refreshDetail: () => Promise<void>;\n refreshProgress: () => Promise<void>;\n}\n\nconst DEFAULT_APPROVAL_ACTIONS: ProcessAction[] = [\n { action: 'agree', name: { zh_CN: '同意' } },\n { action: 'rejected', name: { zh_CN: '拒绝' } },\n];\n\nconst WITHDRAW_ACTION: ProcessAction = { action: 'withdraw', name: { zh_CN: '撤销' } };\nconst FINAL_PROCESS_STATUSES = new Set<ProcessStatus>([\n 'completed',\n 'terminated',\n 'withdrawn',\n 'cancelled',\n]);\nconst EDITABLE_COMPLETED_STATUSES = new Set<ProcessStatus>(['completed', 'terminated']);\n\nfunction mergeCurrentTask(\n processTask: ProcessTask | null | undefined,\n approvalTask: ProcessTask | null | undefined,\n): ProcessTask | null {\n if (!approvalTask) return processTask ?? null;\n if (!processTask) return approvalTask;\n\n return {\n ...processTask,\n ...approvalTask,\n nodeName: processTask.nodeName || approvalTask.nodeName,\n title: processTask.title || approvalTask.title,\n actions: processTask.actions ?? approvalTask.actions,\n };\n}\n\n/**\n * 流程详情核心逻辑 hook\n */\nexport function useProcessDetail(options: UseProcessDetailOptions): UseProcessDetailReturn {\n const { formUuid, appType, formInstanceId, fieldIds } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [loading, setLoading] = useState(true);\n const [mode, setMode] = useState<'readonly' | 'edit'>('readonly');\n const [processInfo, setProcessInfo] = useState<ProcessBasicInfo | null>(null);\n const [progressList, setProgressList] = useState<ProcessTask[]>([]);\n const [formData, setFormData] = useState<Record<string, any> | null>(null);\n const [instanceInfo, setInstanceInfo] = useState<FormInstanceData | null>(null);\n const [accessDenied, setAccessDenied] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [isApprover, setIsApprover] = useState(false);\n const [canWithdraw, setCanWithdraw] = useState(false);\n const [approvalTasks, setApprovalTasks] = useState<ProcessTask[]>([]);\n const [permissions, setPermissions] = useState<ViewPermissionSummary | null>(null);\n const [processDefinition, setProcessDefinition] = useState<ProcessDefinition | null>(null);\n const [dataVersion, setDataVersion] = useState(0);\n\n const mountedRef = useRef(true);\n const fieldIdsKey = fieldIds?.join('\\u0001') ?? '';\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const currentTask = useMemo(\n () => mergeCurrentTask(processInfo?.currentTask, approvalTasks[0]),\n [processInfo?.currentTask, approvalTasks],\n );\n const processStatus = processInfo?.processStatus ?? null;\n\n const isProcessFinal = processStatus ? FINAL_PROCESS_STATUSES.has(processStatus) : false;\n const isOriginatorReturn = !isProcessFinal && currentTask?.nodeType === 'originator_return';\n const isProcessCompleted = processStatus ? EDITABLE_COMPLETED_STATUSES.has(processStatus) : false;\n const canEdit = hasViewOperation(permissions?.operations, 'edit');\n const canDelete = hasViewOperation(permissions?.operations, 'delete');\n const canViewWorkflow = hasViewOperation(permissions?.operations, 'workflow');\n const canViewChangeRecords = hasViewOperation(permissions?.operations, 'change_records');\n const fieldPermissionTask = isProcessFinal ? undefined : (currentTask ?? undefined);\n\n // 使用 useFieldPermission 计算字段行为\n const { fieldBehaviors } = useFieldPermission({\n viewPermissions: permissions ?? undefined,\n processDefinition: processDefinition ?? undefined,\n currentTask: fieldPermissionTask,\n isApprover: isProcessFinal ? false : isApprover,\n mode,\n });\n\n // 当前任务可执行的操作\n const activeActions: ProcessAction[] = useMemo(() => {\n if (!isApprover || isProcessFinal) return [];\n\n const actions =\n currentTask?.actions && currentTask.actions.length > 0\n ? [...currentTask.actions]\n : [...DEFAULT_APPROVAL_ACTIONS];\n\n if (canWithdraw && !actions.some((action) => action.action === 'withdraw')) {\n actions.push(WITHDRAW_ACTION);\n }\n\n return actions;\n }, [isApprover, isProcessFinal, currentTask?.actions, canWithdraw]);\n\n const loadData = useCallback(async () => {\n if (!mountedRef.current) return;\n setLoading(true);\n setAccessDenied(false);\n setLoadError(null);\n try {\n // 并行调用基础数据\n const [basicResult, approvalResult, permResult, formResult] = await Promise.all([\n getProcessBasic(request, formInstanceId),\n checkUserApproval(request, formInstanceId),\n getViewPermission(request, { formUuid, appType, formInstanceId }),\n getFormData(request, { formInstanceId, appType, formUuid }),\n ]);\n\n if (!mountedRef.current) return;\n\n if (!hasViewPermission(permResult)) {\n setAccessDenied(true);\n setProcessInfo(null);\n setIsApprover(false);\n setCanWithdraw(false);\n setApprovalTasks([]);\n setPermissions(permResult);\n setInstanceInfo(null);\n setFormData(null);\n setProgressList([]);\n setProcessDefinition(null);\n return;\n }\n\n setProcessInfo(basicResult);\n const nextProcessStatus = basicResult?.processStatus ?? null;\n const nextIsProcessFinal = nextProcessStatus\n ? FINAL_PROCESS_STATUSES.has(nextProcessStatus)\n : false;\n const nextCanWithdraw = Boolean(\n approvalResult?.canUndo &&\n nextProcessStatus === 'running' &&\n basicResult?.isExecuting !== true,\n );\n setIsApprover(nextIsProcessFinal ? false : (approvalResult?.isApprover ?? false));\n setCanWithdraw(nextCanWithdraw);\n setApprovalTasks(nextIsProcessFinal ? [] : (approvalResult?.currentTasks ?? []));\n setPermissions(permResult);\n setInstanceInfo(formResult);\n setFormData(\n extractFormValues(formResult, fieldIdsKey ? fieldIdsKey.split('\\u0001') : undefined),\n );\n setDataVersion((version) => version + 1);\n\n // 如果有流程查看权限,加载进度\n if (hasViewOperation(permResult?.operations, 'workflow')) {\n try {\n const progress = await getProcessProgress(request, formInstanceId);\n if (mountedRef.current) {\n setProgressList(progress);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load progress:', error);\n }\n }\n\n // 如果是审批人且需要字段配置,加载流程定义\n const task = mergeCurrentTask(basicResult?.currentTask, approvalResult?.currentTasks?.[0]);\n if (\n !nextIsProcessFinal &&\n approvalResult?.isApprover &&\n task &&\n (task.nodeType === 'originator_return' || task.nodeType === 'approval')\n ) {\n try {\n const definition = await getProcessDefinition(request, formUuid);\n if (mountedRef.current) {\n setProcessDefinition(definition);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load process definition:', error);\n }\n } else if (mountedRef.current) {\n setProcessDefinition(null);\n }\n } catch (error) {\n console.error('[useProcessDetail] Failed to load data:', error);\n if (mountedRef.current) {\n setLoadError(error instanceof Error ? error.message : '页面加载失败');\n setAccessDenied(false);\n setProcessInfo(null);\n setFormData(null);\n setInstanceInfo(null);\n setApprovalTasks([]);\n setProgressList([]);\n setProcessDefinition(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [request, formUuid, appType, formInstanceId, fieldIdsKey]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const switchToEdit = useCallback(() => {\n setMode('edit');\n void loadData();\n }, [loadData]);\n\n const switchToReadonly = useCallback(() => {\n setMode('readonly');\n }, []);\n\n const refreshDetail = useCallback(async () => {\n setMode('readonly');\n await loadData();\n }, [loadData]);\n\n const refreshProgress = useCallback(async () => {\n await refreshDetail();\n }, [refreshDetail]);\n\n const saveChanges = useCallback(\n async (values: Record<string, any>): Promise<boolean> => {\n try {\n await api.updateFormData({\n formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(values),\n });\n setMode('readonly');\n await loadData();\n return true;\n } catch (error) {\n console.error('[useProcessDetail] Failed to save changes:', error);\n return false;\n }\n },\n [api, formInstanceId, formUuid, appType, loadData],\n );\n\n const deleteInstance = useCallback(async (): Promise<boolean> => {\n try {\n await deleteFormData(request, { formInstanceId, appType, formUuid });\n return true;\n } catch (error) {\n console.error('[useProcessDetail] Failed to delete instance:', error);\n return false;\n }\n }, [request, formInstanceId, appType, formUuid]);\n\n return {\n loading,\n processInfo,\n processStatus,\n currentTask,\n progressList,\n formData,\n instanceInfo,\n accessDenied,\n loadError,\n isApprover,\n activeActions,\n fieldBehaviors,\n mode,\n isOriginatorReturn,\n isProcessCompleted,\n canWithdraw,\n canEdit,\n canDelete,\n canViewWorkflow,\n canViewChangeRecords,\n dataVersion,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n refreshDetail,\n refreshProgress,\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { InitiatorSelectedApprovers, ReturnPolicy, ReturnableNode } from '../types';\nimport {\n handleApproval,\n withdrawProcess,\n transferTask,\n returnTask,\n resubmitTask,\n saveTask,\n getReturnableNodeResult,\n triggerCallbackTask,\n} from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\n\nexport interface UseApprovalActionsOptions {\n formInstanceId: string;\n formUuid: string;\n appType: string;\n currentTaskId?: string;\n onActionComplete?: (action: string) => Promise<void> | void;\n getFormValues?: () => Record<string, any>;\n}\n\nexport interface UseApprovalActionsReturn {\n approve: (comments?: string) => Promise<boolean>;\n reject: (comments?: string) => Promise<boolean>;\n transfer: (userId: string, reason?: string) => Promise<boolean>;\n returnTo: (nodeId: string, reason?: string) => Promise<boolean>;\n withdraw: (reason?: string) => Promise<boolean>;\n save: () => Promise<boolean>;\n resubmit: (comments?: string, selectedApprovers?: InitiatorSelectedApprovers) => Promise<boolean>;\n callbackTask: (payload?: Record<string, any>) => Promise<boolean>;\n\n isLoading: boolean;\n currentAction: string | null;\n returnableNodes: ReturnableNode[];\n returnPolicy: ReturnPolicy | null;\n loadReturnableNodes: () => Promise<ReturnableNode[]>;\n}\n\n/**\n * 审批操作逻辑 hook\n */\nexport function useApprovalActions(options: UseApprovalActionsOptions): UseApprovalActionsReturn {\n const { formInstanceId, formUuid, appType, currentTaskId, onActionComplete, getFormValues } =\n options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [isLoading, setIsLoading] = useState(false);\n const [currentAction, setCurrentAction] = useState<string | null>(null);\n const [returnableNodes, setReturnableNodes] = useState<ReturnableNode[]>([]);\n const [returnPolicy, setReturnPolicy] = useState<ReturnPolicy | null>(null);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n const resetLoading = useCallback(() => {\n if (mountedRef.current) {\n setIsLoading(false);\n setCurrentAction(null);\n }\n }, []);\n\n const approve = useCallback(\n async (comments?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('approve');\n try {\n const formValues = getFormValues?.();\n await handleApproval(request, {\n instanceId: formInstanceId,\n action: 'approved',\n comments,\n appType,\n formUuid,\n updateFormDataJson: formValues ? JSON.stringify(formValues) : undefined,\n });\n await onActionComplete?.('approve');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] approve failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, appType, formUuid, getFormValues, onActionComplete, resetLoading],\n );\n\n const reject = useCallback(\n async (comments?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('reject');\n try {\n await handleApproval(request, {\n instanceId: formInstanceId,\n action: 'rejected',\n comments,\n });\n await onActionComplete?.('reject');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] reject failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, onActionComplete, resetLoading],\n );\n\n const transfer = useCallback(\n async (userId: string, reason?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] transfer failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('transfer');\n try {\n await transferTask(request, {\n taskId: currentTaskId,\n newAssignee: userId,\n reason,\n });\n await onActionComplete?.('transfer');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] transfer failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const returnTo = useCallback(\n async (nodeId: string, reason?: string): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] returnTo failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('return');\n try {\n await returnTask(request, {\n taskId: currentTaskId,\n targetNodeId: nodeId,\n reason,\n });\n await onActionComplete?.('return');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] returnTo failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const withdraw = useCallback(\n async (reason?: string): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('withdraw');\n try {\n await withdrawProcess(request, {\n instanceId: formInstanceId,\n reason,\n });\n await onActionComplete?.('withdraw');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] withdraw failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, formInstanceId, onActionComplete, resetLoading],\n );\n\n const save = useCallback(async (): Promise<boolean> => {\n setIsLoading(true);\n setCurrentAction('save');\n try {\n const formValues = getFormValues?.() ?? {};\n await saveTask(request, {\n instanceId: formInstanceId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(formValues),\n });\n await onActionComplete?.('save');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] save failed:', error);\n resetLoading();\n return false;\n }\n }, [request, formInstanceId, formUuid, appType, getFormValues, onActionComplete, resetLoading]);\n\n const resubmit = useCallback(\n async (comments?: string, selectedApprovers?: InitiatorSelectedApprovers): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] resubmit failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('resubmit');\n try {\n const formValues = getFormValues?.() ?? {};\n await resubmitTask(request, {\n taskId: currentTaskId,\n formUuid,\n appType,\n updateFormDataJson: JSON.stringify(formValues),\n comments,\n selectedApprovers,\n initiatorSelectedApprovers: selectedApprovers,\n });\n await onActionComplete?.('resubmit');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] resubmit failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, formUuid, appType, getFormValues, onActionComplete, resetLoading],\n );\n\n const callbackTask = useCallback(\n async (payload?: Record<string, any>): Promise<boolean> => {\n if (!currentTaskId) {\n console.error('[useApprovalActions] callbackTask failed: no currentTaskId');\n return false;\n }\n setIsLoading(true);\n setCurrentAction('callback');\n try {\n await triggerCallbackTask(request, {\n taskId: currentTaskId,\n payload,\n });\n await onActionComplete?.('callback');\n resetLoading();\n return true;\n } catch (error) {\n console.error('[useApprovalActions] callbackTask failed:', error);\n resetLoading();\n return false;\n }\n },\n [request, currentTaskId, onActionComplete, resetLoading],\n );\n\n const loadReturnableNodes = useCallback(async (): Promise<ReturnableNode[]> => {\n if (!currentTaskId) return [];\n try {\n const result = await getReturnableNodeResult(request, currentTaskId);\n if (mountedRef.current) {\n setReturnableNodes(result.nodes);\n setReturnPolicy(result.policy || null);\n }\n return result.nodes;\n } catch (error) {\n console.error('[useApprovalActions] loadReturnableNodes failed:', error);\n if (mountedRef.current) {\n setReturnableNodes([]);\n setReturnPolicy(null);\n }\n return [];\n }\n }, [request, currentTaskId]);\n\n return {\n approve,\n reject,\n transfer,\n returnTo,\n withdraw,\n save,\n resubmit,\n callbackTask,\n isLoading,\n currentAction,\n returnableNodes,\n returnPolicy,\n loadReturnableNodes,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { ChangeRecord, ChangeRecordListResponse } from '../types';\nimport { getChangeRecords } from '../core/processApi';\nimport { useFormContext } from '../core/FormContext';\n\nexport interface UseChangeRecordsOptions {\n formUuid: string;\n appType: string;\n formInstanceId: string;\n pageSize?: number;\n autoLoad?: boolean;\n}\n\nexport interface UseChangeRecordsReturn {\n records: ChangeRecord[];\n loading: boolean;\n total: number;\n page: number;\n loadMore: () => Promise<void>;\n refresh: () => Promise<void>;\n hasMore: boolean;\n}\n\nconst normalizeChangeRecordList = (value: any): ChangeRecordListResponse => {\n const body =\n value && typeof value === 'object' && !Array.isArray(value)\n ? Array.isArray(value.data) ||\n Array.isArray(value.records) ||\n Array.isArray(value.list) ||\n Array.isArray(value.items)\n ? value\n : (value.data ?? value.result ?? value)\n : value;\n const records = Array.isArray(body)\n ? body\n : (body?.records ?? body?.data ?? body?.list ?? body?.items ?? []);\n return {\n records: Array.isArray(records) ? records : [],\n total: Number(body?.total ?? body?.totalCount ?? body?.count ?? records.length) || 0,\n page: Number(body?.page ?? body?.currentPage ?? 1) || 1,\n pageSize: Number(body?.pageSize ?? body?.limit ?? 20) || 20,\n };\n};\n\n/**\n * 变更记录加载 hook\n */\nexport function useChangeRecords(options: UseChangeRecordsOptions): UseChangeRecordsReturn {\n const { formUuid, appType, formInstanceId, pageSize = 20, autoLoad = true } = options;\n const { api } = useFormContext();\n const request = api.request;\n\n const [records, setRecords] = useState<ChangeRecord[]>([]);\n const [loading, setLoading] = useState(false);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const fetchRecords = useCallback(\n async (pageNum: number, append: boolean) => {\n if (!mountedRef.current) return;\n setLoading(true);\n try {\n const result = await getChangeRecords(request, {\n formUuid,\n appType,\n formInstanceId,\n page: pageNum,\n pageSize,\n });\n if (!mountedRef.current) return;\n\n const normalized = normalizeChangeRecordList(result);\n if (append) {\n setRecords((prev) => [...prev, ...normalized.records]);\n } else {\n setRecords(normalized.records);\n }\n setTotal(normalized.total);\n setPage(normalized.page || pageNum);\n } catch (error) {\n console.error('[useChangeRecords] Failed to load change records:', error);\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [request, formUuid, appType, formInstanceId, pageSize],\n );\n\n useEffect(() => {\n if (autoLoad) {\n fetchRecords(1, false);\n }\n }, [autoLoad, fetchRecords]);\n\n const safeRecords = Array.isArray(records) ? records : [];\n const hasMore = safeRecords.length < total;\n\n const loadMore = useCallback(async () => {\n if (!hasMore || loading) return;\n await fetchRecords(page + 1, true);\n }, [hasMore, loading, page, fetchRecords]);\n\n const refresh = useCallback(async () => {\n setRecords([]);\n setPage(1);\n setTotal(0);\n await fetchRecords(1, false);\n }, [fetchRecords]);\n\n return {\n records: safeRecords,\n loading,\n total,\n page,\n loadMore,\n refresh,\n hasMore,\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseFormNavigationOptions {\n appType: string;\n formUuid: string;\n formType?: 'form' | 'process';\n mode?: 'redirect' | 'stay' | 'callback';\n redirectDelay?: number;\n basePath?: string;\n onStay?: (formInstId: string) => void;\n}\n\nexport interface UseFormNavigationReturn {\n navigateToDetail: (formInstId: string) => void;\n navigateToProcessDetail: (formInstId: string) => void;\n handlePostSubmit: (formInstId: string) => void;\n isRedirecting: boolean;\n countdown: number;\n cancelRedirect: () => void;\n}\n\n/**\n * 页面导航 hook\n */\nconst normalizeBasePath = (basePath?: string) => {\n const normalized = String(basePath || '').replace(/^\\/+|\\/+$/g, '');\n return normalized ? `/${normalized}` : '';\n};\n\nconst inferBasePath = (appType: string) => {\n if (typeof window === 'undefined') return '';\n const pathname = window.location?.pathname || '';\n const marker = `/${appType}/`;\n const markerIndex = pathname.indexOf(marker);\n if (markerIndex <= 0) return '';\n return pathname.slice(0, markerIndex);\n};\n\nconst buildDetailUrl = (\n appType: string,\n formUuid: string,\n formInstId: string,\n detailType: 'formDetail' | 'processDetail',\n basePath?: string,\n) => {\n const prefix = normalizeBasePath(basePath ?? inferBasePath(appType));\n return `${prefix}/${appType}/${detailType}/${formUuid}?formInstId=${encodeURIComponent(formInstId)}`;\n};\n\nexport function useFormNavigation(options: UseFormNavigationOptions): UseFormNavigationReturn {\n const {\n appType,\n formUuid,\n formType = 'form',\n mode = 'redirect',\n redirectDelay = 3000,\n basePath,\n onStay,\n } = options;\n\n const [isRedirecting, setIsRedirecting] = useState(false);\n const [countdown, setCountdown] = useState(0);\n\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const redirectTargetRef = useRef<string | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n };\n }, []);\n\n const navigateToDetail = useCallback(\n (formInstId: string) => {\n window.location.href = buildDetailUrl(appType, formUuid, formInstId, 'formDetail', basePath);\n },\n [appType, basePath, formUuid],\n );\n\n const navigateToProcessDetail = useCallback(\n (formInstId: string) => {\n window.location.href = buildDetailUrl(\n appType,\n formUuid,\n formInstId,\n 'processDetail',\n basePath,\n );\n },\n [appType, basePath, formUuid],\n );\n\n const startRedirectCountdown = useCallback(\n (targetUrl: string) => {\n const totalSeconds = Math.ceil(redirectDelay / 1000);\n setIsRedirecting(true);\n setCountdown(totalSeconds);\n redirectTargetRef.current = targetUrl;\n\n timerRef.current = setInterval(() => {\n if (!mountedRef.current) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return;\n }\n\n setCountdown((prev) => {\n const next = prev - 1;\n if (next <= 0) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setIsRedirecting(false);\n if (redirectTargetRef.current) {\n window.location.href = redirectTargetRef.current;\n }\n return 0;\n }\n return next;\n });\n }, 1000);\n },\n [redirectDelay],\n );\n\n const cancelRedirect = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setIsRedirecting(false);\n setCountdown(0);\n redirectTargetRef.current = null;\n }, []);\n\n const handlePostSubmit = useCallback(\n (formInstId: string) => {\n if (mode === 'stay') {\n onStay?.(formInstId);\n return;\n }\n\n if (mode === 'callback') {\n onStay?.(formInstId);\n return;\n }\n\n // redirect 模式\n const targetUrl = buildDetailUrl(\n appType,\n formUuid,\n formInstId,\n formType === 'process' ? 'processDetail' : 'formDetail',\n basePath,\n );\n\n startRedirectCountdown(targetUrl);\n },\n [mode, formType, appType, formUuid, basePath, onStay, startRedirectCountdown],\n );\n\n return {\n navigateToDetail,\n navigateToProcessDetail,\n handlePostSubmit,\n isRedirecting,\n countdown,\n cancelRedirect,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseDraftStorageOptions {\n appType: string;\n formUuid: string;\n autoRestore?: boolean;\n}\n\nexport interface UseDraftStorageReturn {\n hasDraft: boolean;\n draftData: Record<string, any> | null;\n draftTimestamp: number | null;\n saveDraft: (data: Record<string, any>) => void;\n restoreDraft: () => Record<string, any> | null;\n clearDraft: () => void;\n}\n\ninterface DraftPayload {\n data: Record<string, any>;\n ts: number;\n}\n\nfunction getDraftKey(appType: string, formUuid: string): string {\n return `${appType}__${formUuid}__draft`;\n}\n\nfunction readDraft(key: string): DraftPayload | null {\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as DraftPayload;\n if (parsed && typeof parsed.data === 'object' && typeof parsed.ts === 'number') {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 草稿暂存 hook\n * 使用 localStorage 存储表单草稿数据\n */\nexport function useDraftStorage(options: UseDraftStorageOptions): UseDraftStorageReturn {\n const { appType, formUuid, autoRestore = false } = options;\n const key = getDraftKey(appType, formUuid);\n\n const [hasDraft, setHasDraft] = useState(false);\n const [draftData, setDraftData] = useState<Record<string, any> | null>(null);\n const [draftTimestamp, setDraftTimestamp] = useState<number | null>(null);\n\n // 初始化时检测是否有 draft\n useEffect(() => {\n const stored = readDraft(key);\n if (stored) {\n setHasDraft(true);\n setDraftTimestamp(stored.ts);\n if (autoRestore) {\n setDraftData(stored.data);\n }\n } else {\n setHasDraft(false);\n setDraftData(null);\n setDraftTimestamp(null);\n }\n }, [key, autoRestore]);\n\n const saveDraft = useCallback(\n (data: Record<string, any>) => {\n const payload: DraftPayload = { data, ts: Date.now() };\n try {\n localStorage.setItem(key, JSON.stringify(payload));\n setHasDraft(true);\n setDraftData(data);\n setDraftTimestamp(payload.ts);\n } catch (error) {\n console.error('[useDraftStorage] Failed to save draft:', error);\n }\n },\n [key],\n );\n\n const restoreDraft = useCallback((): Record<string, any> | null => {\n const stored = readDraft(key);\n if (stored) {\n setDraftData(stored.data);\n return stored.data;\n }\n return null;\n }, [key]);\n\n const clearDraft = useCallback(() => {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('[useDraftStorage] Failed to clear draft:', error);\n }\n setHasDraft(false);\n setDraftData(null);\n setDraftTimestamp(null);\n }, [key]);\n\n return {\n hasDraft,\n draftData,\n draftTimestamp,\n saveDraft,\n restoreDraft,\n clearDraft,\n };\n}\n","import type { FormSchema } from '../types';\n\n/**\n * 类型安全的表单 Schema 定义辅助函数\n * 提供 TypeScript 类型推导和编辑器智能提示\n */\nexport function defineFormSchema(schema: FormSchema): FormSchema {\n return schema;\n}\n","import React from 'react';\n\nexport interface FormSummaryCardProps {\n title?: string;\n formInstanceId?: string;\n creator?: { name: string; avatar?: string; department?: string };\n createdAt?: string;\n status?: { label: string; tone: 'brand' | 'success' | 'danger' | 'neutral' | 'warning' };\n className?: string;\n children?: React.ReactNode;\n}\n\nconst toneClasses: Record<string, string> = {\n brand: 'bg-blue-50 text-blue-600',\n success: 'bg-green-50 text-green-600',\n danger: 'bg-red-50 text-red-600',\n neutral: 'bg-gray-100 text-gray-500',\n warning: 'bg-amber-50 text-amber-600',\n};\n\nexport const FormSummaryCard: React.FC<FormSummaryCardProps> = ({\n title,\n formInstanceId,\n creator,\n createdAt,\n status,\n className = '',\n children,\n}) => {\n const shortId = formInstanceId ? formInstanceId.slice(0, 8) : null;\n\n const renderAvatar = () => {\n if (!creator) return null;\n if (creator.avatar) {\n return (\n <img\n src={creator.avatar}\n alt={creator.name}\n className=\"w-7 h-7 rounded-full object-cover\"\n />\n );\n }\n const initial = creator.name.charAt(0);\n return (\n <span className=\"w-7 h-7 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center text-xs font-medium\">\n {initial}\n </span>\n );\n };\n\n return (\n <div className={`bg-white rounded-xl shadow-sm border border-gray-100 p-6 ${className}`}>\n <div className=\"flex items-start justify-between\">\n {/* Left */}\n <div className=\"min-w-0 flex-1\">\n {title && <h2 className=\"text-xl font-semibold text-gray-900 truncate\">{title}</h2>}\n {shortId && <span className=\"text-xs text-gray-400 mt-0.5 inline-block\">#{shortId}</span>}\n </div>\n {/* Right - Status Badge */}\n {status && (\n <span\n className={`px-2.5 py-0.5 rounded-full text-xs font-medium whitespace-nowrap ${toneClasses[status.tone] || toneClasses.neutral}`}\n >\n {status.label}\n </span>\n )}\n </div>\n\n {/* Creator info */}\n {creator && (\n <div className=\"flex items-center gap-2 mt-4 text-sm text-gray-600\">\n {renderAvatar()}\n <span className=\"font-medium\">{creator.name}</span>\n {creator.department && (\n <>\n <span className=\"text-gray-300\">·</span>\n <span>{creator.department}</span>\n </>\n )}\n {createdAt && (\n <>\n <span className=\"text-gray-300\">·</span>\n <span className=\"text-gray-400\">{createdAt}</span>\n </>\n )}\n </div>\n )}\n\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { Button, Empty, Pagination, Skeleton, Tag, Tooltip } from 'antd';\nimport {\n ArrowRightOutlined,\n DownOutlined,\n HistoryOutlined,\n ReloadOutlined,\n UpOutlined,\n} from '@ant-design/icons';\nimport type { ChangeRecord } from '../types';\n\nexport interface RecordChangePanelProps {\n records?: ChangeRecord[];\n loading?: boolean;\n total?: number;\n page?: number;\n pageSize?: number;\n defaultExpanded?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onRefresh?: () => void;\n onExpand?: () => void;\n onPageChange?: (page: number, pageSize: number) => void;\n className?: string;\n}\n\nconst sourceLabels: Record<string, string> = {\n frontend: '前端',\n integration: '集成',\n automation: '自动化',\n import: '导入',\n};\n\nconst typeLabels: Record<string, string> = {\n create: '新增',\n update: '修改',\n delete: '删除',\n};\n\nfunction formatValue(value: any): React.ReactNode {\n if (value === null || value === undefined || value === '')\n return <span className=\"text-ant-text-tertiary\">空</span>;\n if (Array.isArray(value)) {\n return (\n <span className=\"inline-flex flex-wrap gap-1\">\n {value.map((item, index) => (\n <Tag key={`${index}-${String(item)}`} className=\"m-0\">\n {String(\n typeof item === 'object' ? item.label || item.value || JSON.stringify(item) : item,\n )}\n </Tag>\n ))}\n </span>\n );\n }\n if (typeof value === 'object') {\n const label = value.label ?? value.value;\n return label ? String(label) : <code className=\"text-xs\">{JSON.stringify(value)}</code>;\n }\n return String(value);\n}\n\nfunction getInitial(name?: string) {\n return (\n String(name || '?')\n .trim()\n .slice(0, 1)\n .toUpperCase() || '?'\n );\n}\n\nexport const RecordChangePanel: React.FC<RecordChangePanelProps> = ({\n records = [],\n loading = false,\n total,\n page = 1,\n pageSize = 20,\n defaultExpanded = false,\n hasMore = false,\n onLoadMore,\n onRefresh,\n onExpand,\n onPageChange,\n className = '',\n}) => {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const count = total ?? records.length;\n\n const handleToggle = () => {\n const next = !expanded;\n setExpanded(next);\n if (next) onExpand?.();\n };\n\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"flex items-center justify-between gap-3 border-b border-ant-border-secondary px-5 py-4\">\n <button\n type=\"button\"\n className=\"flex min-w-0 items-center gap-2 bg-transparent p-0 text-left\"\n onClick={handleToggle}\n >\n <HistoryOutlined className=\"text-ant-primary\" />\n <span className=\"font-semibold text-ant-text\">变更记录</span>\n <span className=\"rounded-full bg-gray-100 px-2 py-0.5 text-xs text-ant-text-tertiary\">\n {count} 条\n </span>\n {expanded ? <UpOutlined className=\"text-xs\" /> : <DownOutlined className=\"text-xs\" />}\n </button>\n {expanded && (\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ReloadOutlined />}\n onClick={onRefresh}\n disabled={loading}\n >\n 刷新\n </Button>\n )}\n </div>\n\n {expanded ? (\n <div className=\"p-5\">\n {loading && records.length === 0 ? (\n <Skeleton active paragraph={{ rows: 3 }} />\n ) : records.length === 0 ? (\n <Empty description=\"暂无变更记录\" />\n ) : (\n <div className=\"space-y-4\">\n {records.map((record) => {\n const changes =\n record.changes && record.changes.length > 0\n ? record.changes\n : [\n {\n fieldKey: record.fieldId,\n fieldLabel: record.fieldLabel,\n beforeValue: record.oldValue,\n afterValue: record.newValue,\n },\n ];\n const operator = record.operatorName || (record.changeSource ? '系统' : '未知');\n const operatedAt = record.operatedAt || record.createdAt || '-';\n return (\n <article\n key={record.id || record.operationId}\n className=\"rounded-md border border-ant-border-secondary p-4\"\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-blue-50 text-sm font-semibold text-blue-700\">\n {getInitial(operator)}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {operator}\n {record.operatorDepartmentName && (\n <span className=\"ml-2 font-normal text-ant-text-tertiary\">\n {record.operatorDepartmentName}\n </span>\n )}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n 变更 {record.changedCount || changes.length} 项 · {operatedAt}\n </span>\n </span>\n </div>\n <span className=\"flex flex-wrap justify-end gap-2\">\n {record.changeType && (\n <Tag>{typeLabels[record.changeType] || record.changeType}</Tag>\n )}\n {record.changeSource && (\n <Tag color=\"blue\">\n {sourceLabels[record.changeSource] || record.changeSource}\n </Tag>\n )}\n {record.operationId && (\n <Tooltip title={`操作ID:${record.operationId}`}>\n <Tag>{record.operationId.slice(0, 8)}</Tag>\n </Tooltip>\n )}\n </span>\n </div>\n <div className=\"mt-4 space-y-3\">\n {changes.map((change) => (\n <div\n key={change.fieldKey || change.fieldLabel}\n className=\"grid gap-2 md:grid-cols-[160px_1fr]\"\n >\n <div className=\"text-sm font-medium text-ant-text-secondary\">\n {change.fieldLabel || change.fieldKey || '-'}\n </div>\n <div className=\"grid min-w-0 grid-cols-[1fr_auto_1fr] items-start gap-2 text-sm\">\n <div className=\"min-w-0 rounded bg-red-50 px-2 py-1 text-red-700\">\n {formatValue(change.beforeValue)}\n </div>\n <ArrowRightOutlined className=\"mt-1 text-xs text-ant-text-tertiary\" />\n <div className=\"min-w-0 rounded bg-emerald-50 px-2 py-1 text-emerald-700\">\n {formatValue(change.afterValue)}\n </div>\n </div>\n </div>\n ))}\n </div>\n </article>\n );\n })}\n </div>\n )}\n {onPageChange && count > pageSize ? (\n <div className=\"mt-4 flex justify-end\">\n <Pagination\n size=\"small\"\n current={page}\n pageSize={pageSize}\n total={count}\n onChange={onPageChange}\n showSizeChanger\n />\n </div>\n ) : hasMore ? (\n <Button block className=\"mt-4\" onClick={onLoadMore} loading={loading}>\n 加载更多\n </Button>\n ) : null}\n </div>\n ) : (\n <div className=\"px-5 py-4 text-sm text-ant-text-tertiary\">点击展开查看变更记录</div>\n )}\n </section>\n );\n};\n","import React from 'react';\nimport type { ChangeRecord } from '../types';\nimport { RecordChangePanel } from './RecordChangePanel';\n\nexport interface ChangeRecordsProps {\n records?: ChangeRecord[];\n loading?: boolean;\n defaultExpanded?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onExpand?: () => void;\n className?: string;\n renderItem?: (record: ChangeRecord) => React.ReactNode;\n}\n\nexport const ChangeRecords: React.FC<ChangeRecordsProps> = ({\n records = [],\n loading = false,\n defaultExpanded = false,\n hasMore = false,\n onLoadMore,\n onExpand,\n className = '',\n renderItem,\n}) => {\n if (renderItem) {\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"border-b border-ant-border-secondary px-5 py-4 font-semibold\">变更记录</div>\n <div className=\"p-5\">\n {records.length === 0 ? (\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">\n {loading ? '加载中...' : '暂无变更记录'}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {records.map((record) => (\n <div key={record.id}>{renderItem(record)}</div>\n ))}\n </div>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className=\"mt-4 w-full rounded-md border border-ant-border-secondary py-2 text-sm text-ant-primary\"\n onClick={onLoadMore}\n disabled={loading}\n >\n {loading ? '加载中...' : '加载更多'}\n </button>\n )}\n </div>\n </section>\n );\n }\n\n return (\n <RecordChangePanel\n records={records}\n loading={loading}\n defaultExpanded={defaultExpanded}\n hasMore={hasMore}\n onLoadMore={onLoadMore}\n onRefresh={onExpand}\n onExpand={onExpand}\n className={className}\n />\n );\n};\n","import React, { useMemo } from 'react';\nimport {\n ApiOutlined,\n CheckCircleFilled,\n ClockCircleOutlined,\n CloseCircleFilled,\n CodeOutlined,\n CopyOutlined,\n EditOutlined,\n FileTextOutlined,\n LoadingOutlined,\n NotificationOutlined,\n ReloadOutlined,\n RollbackOutlined,\n UserOutlined,\n} from '@ant-design/icons';\nimport type { ProcessTask, StatusMeta } from '../types';\nimport { TASK_STATUS_META } from '../core/constants';\n\nexport interface ApprovalTimelineProps {\n tasks: ProcessTask[];\n className?: string;\n renderNode?: (task: ProcessTask, index: number) => React.ReactNode;\n showRemarks?: boolean;\n compactMode?: boolean;\n showApproverInfo?: boolean;\n}\n\ntype VisualState =\n | 'completed'\n | 'current'\n | 'waiting'\n | 'future'\n | 'rejected'\n | 'returned'\n | 'neutral';\n\nconst systemNodeTypes = new Set([\n 'condition',\n 'condition_branch',\n 'js_code',\n 'data_retrieve_single',\n 'data_retrieve_batch',\n 'data_create',\n 'data_update',\n 'connector_call',\n 'loop_container',\n 'work_notification',\n 'dingtalk_card',\n 'system',\n]);\n\nconst systemLabels: Record<string, string> = {\n condition: '条件判断',\n condition_branch: '条件分支',\n js_code: 'JS 代码',\n data_retrieve_single: '数据读取',\n data_retrieve_batch: '批量读取',\n data_create: '数据创建',\n data_update: '数据更新',\n connector_call: '连接器调用',\n loop_container: '循环节点',\n work_notification: '工作通知',\n dingtalk_card: '钉钉卡片',\n system: '系统动作',\n};\n\nconst toneClasses: Record<StatusMeta['tone'] | 'return' | 'future', string> = {\n brand: 'bg-blue-600 text-white border-blue-600',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n return: 'bg-amber-50 text-amber-700 border-amber-200',\n future: 'bg-gray-50 text-gray-400 border-gray-200',\n};\n\nfunction groupTasks(tasks: ProcessTask[]) {\n const groups = new Map<string, ProcessTask[]>();\n tasks.forEach((task, index) => {\n const key = task.nodeVisitId || `${task.nodeId || 'node'}-${task.id || task.taskId || index}`;\n const group = groups.get(key) || [];\n group.push(task);\n groups.set(key, group);\n });\n return Array.from(groups.values()).map((group) => {\n const hasOrSignResult = group.some(\n (task) =>\n task.nodeType === 'approval' &&\n task.multiApproveMode === 'or' &&\n !task.isSimulated &&\n ['approved', 'rejected', 'returned'].includes(task.status),\n );\n if (!hasOrSignResult) return group;\n const outcome = group.filter(\n (task) => !task.isSimulated && ['approved', 'rejected', 'returned'].includes(task.status),\n );\n return outcome.length > 0 ? outcome : group;\n });\n}\n\nfunction isCompactNode(task: ProcessTask) {\n return (\n task.nodeType === 'start' ||\n task.nodeType === 'copy' ||\n task.nodeType === 'end' ||\n systemNodeTypes.has(task.nodeType)\n );\n}\n\nfunction getNodeTitle(task: ProcessTask) {\n if (task.nodeType === 'start') return task.title || task.nodeName || '流程提交';\n if (task.nodeType === 'originator_return') return task.title || task.nodeName || '发起人修改';\n if (task.nodeType === 'copy') return task.title || task.nodeName || '抄送通知';\n if (task.nodeType === 'callback_wait') return task.title || task.nodeName || '等待第三方回调';\n if (task.nodeType === 'end') return task.title || task.nodeName || '流程完成';\n if (systemNodeTypes.has(task.nodeType))\n return task.title || task.nodeName || systemLabels[task.nodeType] || '系统动作';\n return task.title || task.nodeName || '审批';\n}\n\nfunction getVisualState(task: ProcessTask, isFutureGroup: boolean): VisualState {\n if (isFutureGroup || task.isSimulated || task.status === 'simulated') return 'future';\n if (task.status === 'rejected') return 'rejected';\n if (task.status === 'returned') return 'returned';\n if (task.status === 'pending' || task.status === 'waiting' || task.canApprove)\n return task.canApprove ? 'current' : 'waiting';\n if (\n task.status === 'approved' ||\n task.status === 'copied' ||\n task.nodeType === 'start' ||\n task.nodeType === 'end'\n ) {\n return 'completed';\n }\n return 'neutral';\n}\n\nfunction getStatusMeta(task: ProcessTask, state: VisualState, compact: boolean): StatusMeta {\n if (state === 'future') return { label: '未开始', tone: 'neutral' };\n if (state === 'current')\n return { label: task.nodeType === 'callback_wait' ? '等待回调' : '审批中', tone: 'brand' };\n if (state === 'waiting') return { label: '等待处理中', tone: 'neutral' };\n if (state === 'rejected') return TASK_STATUS_META.rejected;\n if (state === 'returned') return TASK_STATUS_META.returned;\n if (task.nodeType === 'copy' || task.status === 'copied') return TASK_STATUS_META.copied;\n if (compact) return { label: '已完成', tone: 'neutral' };\n return TASK_STATUS_META[task.status] || TASK_STATUS_META.approved;\n}\n\nfunction getIcon(task: ProcessTask, state: VisualState) {\n if (state === 'current')\n return task.nodeType === 'callback_wait' ? <ClockCircleOutlined /> : <LoadingOutlined />;\n if (state === 'future' || state === 'waiting')\n return task.nodeType === 'approval' ? <UserOutlined /> : <ClockCircleOutlined />;\n if (state === 'rejected') return <CloseCircleFilled />;\n if (state === 'returned') return <RollbackOutlined />;\n switch (task.nodeType as string) {\n case 'start':\n return <FileTextOutlined />;\n case 'approval':\n return <CheckCircleFilled />;\n case 'originator_return':\n return <EditOutlined />;\n case 'copy':\n return <CopyOutlined />;\n case 'callback_wait':\n return <ClockCircleOutlined />;\n case 'js_code':\n return <CodeOutlined />;\n case 'connector_call':\n return <ApiOutlined />;\n case 'work_notification':\n case 'dingtalk_card':\n return <NotificationOutlined />;\n case 'data_retrieve_single':\n case 'data_retrieve_batch':\n case 'data_create':\n case 'data_update':\n case 'loop_container':\n return <ReloadOutlined />;\n default:\n return <CheckCircleFilled />;\n }\n}\n\nfunction getDotClass(state: VisualState) {\n const map: Record<VisualState, string> = {\n completed: 'border-emerald-500 text-emerald-600 bg-white',\n current: 'border-blue-600 bg-blue-600 text-white',\n waiting: 'border-gray-200 text-gray-300 bg-white',\n future: 'border-dashed border-gray-300 text-gray-300 bg-white',\n rejected: 'border-red-500 text-red-600 bg-white',\n returned: 'border-amber-500 text-amber-600 bg-white',\n neutral: 'border-gray-200 text-gray-400 bg-white',\n };\n return map[state];\n}\n\nexport const ApprovalTimeline: React.FC<ApprovalTimelineProps> = ({\n tasks,\n className = '',\n renderNode,\n showRemarks = true,\n compactMode = false,\n showApproverInfo = true,\n}) => {\n const taskList = useMemo(() => (Array.isArray(tasks) ? tasks : []), [tasks]);\n const groups = useMemo(() => groupTasks(taskList), [taskList]);\n\n if (taskList.length === 0) {\n return (\n <div\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container p-6 ${className}`}\n >\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">暂无审批记录</p>\n </div>\n );\n }\n\n if (renderNode) {\n return (\n <div className={className}>\n {taskList.map((task, index) => (\n <div key={task.taskId || task.id || index}>{renderNode(task, index)}</div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`approval-timeline ${className}`}>\n {groups.map((group, index) => {\n const node = group[0];\n const isLast = index === groups.length - 1;\n const isFutureGroup = group.some((task) => task.isSimulated || task.status === 'simulated');\n const compact = compactMode || isCompactNode(node);\n const state = getVisualState(node, isFutureGroup);\n const statusMeta = getStatusMeta(node, state, compact);\n const title = getNodeTitle(node);\n const time = node.actionAt || node.createdAt;\n\n return (\n <div\n key={node.nodeVisitId || `${node.nodeId}-${node.taskId}-${index}`}\n className={`relative flex gap-4 pb-5 ${isLast ? 'pb-0' : ''}`}\n >\n {!isLast && (\n <div\n className={`absolute bottom-0 left-[21px] top-11 w-px ${\n state === 'future'\n ? 'border-l border-dashed border-gray-300'\n : 'bg-ant-border-secondary'\n }`}\n />\n )}\n <div\n className={`relative z-10 flex h-11 w-11 shrink-0 items-center justify-center rounded-full border-2 shadow-[0_0_0_4px_var(--ant-color-bg-layout,#f5f5f5)] ${getDotClass(state)}`}\n >\n {getIcon(node, state)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div\n className={`rounded-lg border p-4 ${\n state === 'current'\n ? 'border-blue-300 bg-blue-50/60'\n : state === 'future'\n ? 'border-dashed border-gray-200 bg-gray-50/70'\n : 'border-ant-border-secondary bg-ant-bg-container'\n }`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"font-medium text-ant-text\">{title}</span>\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2 text-xs font-medium ${\n state === 'future' ? toneClasses.future : toneClasses[statusMeta.tone]\n }`}\n >\n {statusMeta.label}\n </span>\n {node.nodeType === 'originator_return' && (\n <span className=\"rounded-md bg-amber-50 px-2 py-1 text-xs text-amber-700\">\n 发起人操作\n </span>\n )}\n </div>\n {!isFutureGroup && time && (\n <span className=\"text-xs text-ant-text-tertiary\">{time}</span>\n )}\n </div>\n\n {showApproverInfo && !compact && group.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-3\">\n <span className=\"w-full text-xs font-medium text-ant-text-tertiary\">\n {state === 'current' || state === 'waiting' ? '当前审批人' : '处理人'}\n </span>\n {group.map((assignee) => (\n <span\n key={assignee.taskId || assignee.id}\n className=\"inline-flex min-w-0 items-center gap-2\"\n >\n <span className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-blue-50 text-xs font-semibold text-blue-700\">\n {assignee.assigneeName?.slice(0, 1) || '?'}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {assignee.assigneeName || '系统'}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n {assignee.departmentName ||\n assignee.actionAt ||\n assignee.createdAt ||\n ''}\n </span>\n </span>\n </span>\n ))}\n </div>\n )}\n\n {showApproverInfo && compact && (\n <div className=\"mt-2 text-sm text-ant-text-secondary\">\n {group\n .map((item) => item.assigneeName)\n .filter(Boolean)\n .join('、') ||\n (node.nodeType === 'start'\n ? '提交申请'\n : systemNodeTypes.has(node.nodeType)\n ? node.comments || '系统自动处理'\n : '')}\n </div>\n )}\n\n {showRemarks && node.comments && (\n <div\n className={`mt-3 border-l-2 pl-3 text-sm leading-6 ${\n state === 'rejected'\n ? 'border-red-300 text-red-700'\n : state === 'returned'\n ? 'border-amber-300 text-amber-700'\n : 'border-ant-border-secondary text-ant-text-secondary'\n }`}\n >\n {node.comments}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport { Form, Input, Modal, Select } from 'antd';\nimport {\n CheckOutlined,\n CloseOutlined,\n RollbackOutlined,\n SaveOutlined,\n SwapOutlined,\n} from '@ant-design/icons';\nimport type { ProcessAction, ReturnPolicy, ReturnableNode, UserItem } from '../types';\nimport type { ActionConfig } from './FormActionBar';\nimport { StickyActionBar } from './StickyActionBar';\nimport { FormContext } from '../core/FormContext';\nimport { createFormRuntimeApi } from '../core/runtimeApi';\nimport { UserPicker } from '../fields/shared/UserPicker';\nimport { getUserId, getUserName } from '../fields/shared/fieldFormat';\nimport { useDeviceDetect } from '../hooks/useDeviceDetect';\n\nexport interface ApprovalActionBarProps {\n actions: ProcessAction[];\n onApprove?: (comments?: string) => Promise<void> | void;\n onReject?: (comments?: string) => Promise<void> | void;\n onTransfer?: (userId: string, reason?: string) => Promise<void> | void;\n onReturn?: (nodeId: string, reason?: string) => Promise<void> | void;\n onWithdraw?: (reason?: string) => Promise<void> | void;\n onSave?: () => Promise<void> | void;\n onResubmit?: (comments?: string) => Promise<void> | void;\n onCallback?: () => Promise<void> | void;\n returnableNodes?: ReturnableNode[];\n returnPolicy?: ReturnPolicy | null;\n onLoadReturnableNodes?: () => Promise<ReturnableNode[] | void> | void;\n renderTransferSelector?: (props: {\n value?: string;\n onChange: (userId: string) => void;\n }) => React.ReactNode;\n renderReturnNodeLabel?: (node: ReturnableNode) => React.ReactNode;\n renderActionModalExtra?: (action: ProcessAction) => React.ReactNode;\n maxMobileButtons?: number;\n className?: string;\n inDrawer?: boolean;\n maxWidth?: number | string;\n}\n\ntype ModalAction = 'agree' | 'rejected' | 'withdraw' | 'transfer' | 'return' | 'resubmit' | null;\n\nconst actionPriority: Record<string, number> = {\n agree: 10,\n approved: 10,\n return: 20,\n transfer: 30,\n resubmit: 40,\n save: 80,\n withdraw: 90,\n rejected: 100,\n reject: 100,\n};\n\nfunction getActionLabel(action: ProcessAction) {\n return action.name?.zh_CN || action.text?.zh_CN || action.action;\n}\n\nfunction normalizeAction(action: string): ModalAction | 'save' | 'callback' {\n if (action === 'approved') return 'agree';\n if (action === 'reject') return 'rejected';\n if (\n action === 'agree' ||\n action === 'rejected' ||\n action === 'withdraw' ||\n action === 'transfer' ||\n action === 'return' ||\n action === 'resubmit'\n ) {\n return action;\n }\n if (action === 'save' || action === 'callback') return action;\n return 'agree';\n}\n\nfunction getModalTitle(action: ModalAction) {\n switch (action) {\n case 'agree':\n return '审批意见';\n case 'rejected':\n return '拒绝理由';\n case 'withdraw':\n return '撤销流程';\n case 'transfer':\n return '转交任务';\n case 'return':\n return '退回任务';\n case 'resubmit':\n return '重新提交';\n default:\n return '确认操作';\n }\n}\n\nfunction formatReturnPolicy(policy?: ReturnPolicy | null) {\n if (!policy?.resubmitMode) return null;\n return policy.resubmitMode === 'resume_current' ? '从当前节点审批' : '重新依次审批';\n}\n\nfunction DefaultTransferSelector({\n value,\n onChange,\n}: {\n value?: string;\n onChange: (userId: string) => void;\n}) {\n const formContext = React.useContext(FormContext);\n const { isMobile } = useDeviceDetect();\n const fallbackApi = useMemo(() => createFormRuntimeApi(), []);\n const api = formContext?.api ?? fallbackApi;\n const [open, setOpen] = useState(false);\n const [selectedUsers, setSelectedUsers] = useState<UserItem[]>([]);\n\n const selectedLabel = selectedUsers[0] ? getUserName(selectedUsers[0]) : value;\n\n return (\n <>\n <Input\n readOnly\n value={selectedLabel}\n onChange={() => undefined}\n placeholder=\"请选择转交用户\"\n addonAfter={\n <span className=\"cursor-pointer text-blue-600\" onClick={() => setOpen(true)}>\n 选择\n </span>\n }\n />\n <UserPicker\n api={api}\n open={open}\n onOpenChange={setOpen}\n mobile={isMobile}\n multiple={false}\n value={selectedUsers}\n onCancel={() => setOpen(false)}\n onConfirm={(items) => {\n const next = items.slice(0, 1);\n setSelectedUsers(next);\n const userId = next[0] ? getUserId(next[0]) : '';\n onChange(userId);\n }}\n />\n </>\n );\n}\n\nexport const ApprovalActionBar: React.FC<ApprovalActionBarProps> = ({\n actions,\n onApprove,\n onReject,\n onTransfer,\n onReturn,\n onWithdraw,\n onSave,\n onResubmit,\n onCallback,\n returnableNodes = [],\n returnPolicy,\n onLoadReturnableNodes,\n renderTransferSelector,\n renderReturnNodeLabel,\n renderActionModalExtra,\n maxMobileButtons = 2,\n className = '',\n inDrawer = false,\n maxWidth,\n}) => {\n const [form] = Form.useForm();\n const [modalAction, setModalAction] = useState<ModalAction>(null);\n const [activeAction, setActiveAction] = useState<ProcessAction | null>(null);\n const [loading, setLoading] = useState(false);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (actionPriority[a.action] ?? 50) - (actionPriority[b.action] ?? 50)),\n [actions],\n );\n\n const openModal = async (action: ProcessAction, target: ModalAction) => {\n setActiveAction(action);\n const defaultComments = action.remark?.content?.zh_CN;\n form.setFieldsValue({\n comments: defaultComments || '',\n reason: '',\n userId: undefined,\n nodeId: undefined,\n });\n if (target === 'return') {\n const loadedNodes = (await onLoadReturnableNodes?.()) || returnableNodes;\n if (loadedNodes.length === 1) {\n form.setFieldsValue({ nodeId: loadedNodes[0].nodeId || loadedNodes[0].id || '' });\n }\n }\n setModalAction(target);\n };\n\n const executeDirect = async (action: ProcessAction) => {\n const normalized = normalizeAction(action.action);\n if (normalized === 'save') {\n await onSave?.();\n return;\n }\n if (normalized === 'callback') {\n await onCallback?.();\n return;\n }\n if (normalized === 'agree') {\n await onApprove?.();\n return;\n }\n if (normalized === 'rejected') {\n await onReject?.();\n return;\n }\n if (normalized === 'resubmit') {\n await onResubmit?.();\n }\n };\n\n const handleActionClick = async (action: ProcessAction) => {\n const normalized = normalizeAction(action.action);\n if (normalized === 'save' || normalized === 'callback') {\n await executeDirect(action);\n return;\n }\n if (normalized === 'resubmit' && !action.remark?.popUp) {\n await executeDirect(action);\n return;\n }\n await openModal(action, normalized);\n };\n\n const handleOk = async () => {\n if (!modalAction) return;\n const values = await form.validateFields();\n setLoading(true);\n try {\n if (modalAction === 'agree') await onApprove?.(values.comments || undefined);\n if (modalAction === 'rejected') await onReject?.(values.comments || undefined);\n if (modalAction === 'withdraw')\n await onWithdraw?.(values.reason || values.comments || undefined);\n if (modalAction === 'transfer') await onTransfer?.(values.userId, values.reason || undefined);\n if (modalAction === 'return') await onReturn?.(values.nodeId, values.reason || undefined);\n if (modalAction === 'resubmit') await onResubmit?.(values.comments || undefined);\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const actionConfigs: ActionConfig[] = visibleActions.map((action) => {\n const normalized = normalizeAction(action.action);\n const danger = normalized === 'rejected' || normalized === 'withdraw';\n return {\n key: action.action,\n label: getActionLabel(action),\n type: normalized === 'agree' ? 'primary' : danger ? 'danger' : 'default',\n icon:\n normalized === 'agree' ? (\n <CheckOutlined />\n ) : normalized === 'rejected' ? (\n <CloseOutlined />\n ) : normalized === 'transfer' ? (\n <SwapOutlined />\n ) : normalized === 'return' || normalized === 'withdraw' ? (\n <RollbackOutlined />\n ) : normalized === 'save' ? (\n <SaveOutlined />\n ) : undefined,\n onClick: () => handleActionClick(action),\n placement: danger || normalized === 'save' ? 'right' : 'left',\n priority: actionPriority[action.action] ?? 50,\n } as ActionConfig;\n });\n\n const requiredComment =\n activeAction?.remark?.required || modalAction === 'rejected' || modalAction === 'withdraw';\n\n return (\n <>\n <StickyActionBar\n actions={actionConfigs}\n layoutMode=\"approval\"\n maxMobileButtons={maxMobileButtons}\n className={className}\n inDrawer={inDrawer}\n maxWidth={maxWidth}\n />\n <Modal\n getContainer={false}\n title={getModalTitle(modalAction)}\n open={modalAction !== null}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={loading}\n onOk={handleOk}\n onCancel={() => {\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n }}\n destroyOnHidden\n >\n <Form form={form} layout=\"vertical\">\n {modalAction === 'transfer' && (\n <Form.Item\n name=\"userId\"\n label=\"转交给\"\n rules={[{ required: true, message: '请选择转交用户' }]}\n >\n {renderTransferSelector ? (\n renderTransferSelector({\n value: form.getFieldValue('userId'),\n onChange: (userId) => form.setFieldsValue({ userId }),\n })\n ) : (\n <DefaultTransferSelector\n value={form.getFieldValue('userId')}\n onChange={(userId) => form.setFieldsValue({ userId })}\n />\n )}\n </Form.Item>\n )}\n {modalAction === 'return' && (\n <>\n {formatReturnPolicy(returnPolicy) && (\n <div className=\"mb-3 text-sm text-gray-500\">\n 退回后审批逻辑:{formatReturnPolicy(returnPolicy)}\n </div>\n )}\n <Form.Item\n name=\"nodeId\"\n label=\"退回到节点\"\n rules={[{ required: true, message: '请选择退回节点' }]}\n >\n <Select\n placeholder=\"请选择退回节点\"\n getPopupContainer={(triggerNode) => triggerNode.parentElement || document.body}\n options={returnableNodes.map((node) => ({\n value: node.nodeId || node.id || '',\n label: renderReturnNodeLabel\n ? renderReturnNodeLabel(node)\n : node.nodeName || node.name || node.nodeId || node.id,\n }))}\n />\n </Form.Item>\n </>\n )}\n <Form.Item\n name={\n modalAction === 'withdraw' || modalAction === 'transfer' || modalAction === 'return'\n ? 'reason'\n : 'comments'\n }\n label={\n modalAction === 'withdraw'\n ? '撤销原因'\n : modalAction === 'transfer'\n ? '转交原因'\n : modalAction === 'return'\n ? '退回原因'\n : '审批意见'\n }\n rules={[{ required: requiredComment, message: '请填写说明' }]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入说明\" />\n </Form.Item>\n {activeAction && renderActionModalExtra?.(activeAction)}\n </Form>\n </Modal>\n </>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Dropdown } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ActionConfig } from './FormActionBar';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface StickyActionBarProps {\n actions: ActionConfig[];\n className?: string;\n maxMobileButtons?: number;\n layoutMode?: 'default' | 'approval';\n align?: 'left' | 'center' | 'right';\n inDrawer?: boolean;\n maxWidth?: number | string;\n position?: 'sticky' | 'fixed' | 'inline';\n surface?: 'default' | 'transparent';\n}\n\nconst getActionPriority = (action: ActionConfig) => {\n const maybePriority = (action as ActionConfig & { priority?: number }).priority;\n if (typeof maybePriority === 'number') return maybePriority;\n if (action.type === 'primary') return 10;\n if (action.type === 'danger') return 90;\n return 50;\n};\n\nexport const StickyActionBar: React.FC<StickyActionBarProps> = ({\n actions,\n className = '',\n maxMobileButtons = 2,\n layoutMode = 'default',\n align = 'right',\n maxWidth = 1120,\n position = 'sticky',\n surface = 'default',\n}) => {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const update = () => setIsMobile(typeof window !== 'undefined' && window.innerWidth <= 768);\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, []);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => action.visible !== false)\n .sort((left, right) => getActionPriority(left) - getActionPriority(right)),\n [actions],\n );\n\n if (visibleActions.length === 0) return null;\n\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n const primaryMobile = visibleActions.slice(0, maxMobileButtons);\n const moreMobile = visibleActions.slice(maxMobileButtons);\n const desktopAlign = layoutMode === 'approval' ? 'center' : align;\n const desktopJustifyClass =\n desktopAlign === 'left'\n ? 'justify-start'\n : desktopAlign === 'center'\n ? 'justify-center'\n : 'justify-end';\n const positionClass =\n position === 'fixed'\n ? 'fixed bottom-0 left-0 right-0'\n : position === 'inline'\n ? 'relative'\n : 'sticky bottom-0';\n const surfaceClass =\n surface === 'transparent'\n ? 'border-t-0 bg-transparent shadow-none backdrop-blur-0'\n : 'border-t border-ant-border-secondary bg-ant-bg-container/95 shadow-[0_-8px_24px_rgba(15,23,42,0.06)] backdrop-blur';\n const spacingClass =\n surface === 'transparent'\n ? 'px-0 py-0'\n : 'px-4 py-3 supports-[padding:max(0px)]:pb-[max(0.75rem,env(safe-area-inset-bottom))]';\n\n const runAction = (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n }\n action.onClick();\n };\n\n const renderButton = (action: ActionConfig, mobile = false) => (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={action.loading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => runAction(action)}\n className={`${mobile ? 'min-w-0 flex-1' : 'min-w-[88px]'} rounded-md`}\n >\n {action.label}\n </Button>\n );\n\n return (\n <div className={`${positionClass} z-20 ${spacingClass} ${surfaceClass} ${className}`}>\n <div\n className={`mx-auto flex w-full items-center gap-3 ${\n !isMobile ? desktopJustifyClass : 'justify-end'\n }`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {isMobile ? (\n <>\n <div className=\"flex flex-1 gap-2\">\n {primaryMobile.map((action) => renderButton(action, true))}\n </div>\n {moreMobile.length > 0 && (\n <Dropdown\n trigger={['click']}\n placement=\"topRight\"\n menu={{\n items: moreMobile.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.type === 'danger',\n disabled: action.disabled,\n icon: action.icon,\n onClick: () => runAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />} className=\"rounded-md\">\n 更多\n </Button>\n </Dropdown>\n )}\n </>\n ) : layoutMode === 'approval' ? (\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n {visibleActions.map((action) => renderButton(action))}\n </div>\n ) : (\n <div className={`flex flex-wrap items-center ${desktopJustifyClass} gap-3`}>\n {visibleActions.map((action) => renderButton(action))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","export const confirmAction = (title?: string, content?: string) => {\n const message = [title, content].filter(Boolean).join('\\n') || '确认继续吗?';\n if (typeof window === 'undefined' || typeof window.confirm !== 'function') {\n return true;\n }\n\n try {\n return window.confirm(message);\n } catch {\n return true;\n }\n};\n","import React, { useMemo, useState } from 'react';\nimport { Button, Dropdown, Form, Input, Modal } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ProcessAction } from '../types';\n\nexport interface ApprovalActionsProps {\n actions: ProcessAction[];\n onApprove?: (comments?: string) => Promise<void> | void;\n onReject?: (comments?: string) => Promise<void> | void;\n onTransfer?: () => void;\n onReturn?: () => void;\n onWithdraw?: (reason?: string) => Promise<void> | void;\n onSave?: () => Promise<void> | void;\n layout?: 'horizontal' | 'vertical';\n maxVisible?: number;\n className?: string;\n}\n\ntype ModalAction = 'approve' | 'reject' | 'withdraw' | null;\n\nconst priority: Record<string, number> = {\n agree: 10,\n approved: 10,\n transfer: 20,\n return: 30,\n save: 40,\n withdraw: 90,\n rejected: 100,\n reject: 100,\n};\n\nconst getLabel = (action: ProcessAction) =>\n action.name?.zh_CN || action.text?.zh_CN || action.action;\n\nexport const ApprovalActions: React.FC<ApprovalActionsProps> = ({\n actions,\n onApprove,\n onReject,\n onTransfer,\n onReturn,\n onWithdraw,\n onSave,\n layout = 'horizontal',\n maxVisible = 3,\n className = '',\n}) => {\n const [form] = Form.useForm();\n const [modalAction, setModalAction] = useState<ModalAction>(null);\n const [activeAction, setActiveAction] = useState<ProcessAction | null>(null);\n const [loading, setLoading] = useState(false);\n const [saveLoading, setSaveLoading] = useState(false);\n\n const renderableActions = useMemo(\n () =>\n actions\n .filter((action) => !action.hidden)\n .sort((a, b) => (priority[a.action] ?? 50) - (priority[b.action] ?? 50)),\n [actions],\n );\n\n const openModal = (target: ModalAction, action: ProcessAction) => {\n setActiveAction(action);\n form.setFieldsValue({ comments: action.remark?.content?.zh_CN || '' });\n setModalAction(target);\n };\n\n const handleSave = async () => {\n setSaveLoading(true);\n try {\n await onSave?.();\n } finally {\n setSaveLoading(false);\n }\n };\n\n const handleAction = (action: ProcessAction) => {\n if (action.action === 'transfer') {\n onTransfer?.();\n return;\n }\n if (action.action === 'return') {\n onReturn?.();\n return;\n }\n if (action.action === 'save') {\n void handleSave();\n return;\n }\n if (action.action === 'withdraw') {\n openModal('withdraw', action);\n return;\n }\n if (action.action === 'rejected' || action.action === 'reject') {\n openModal('reject', action);\n return;\n }\n openModal('approve', action);\n };\n\n const handleConfirm = async () => {\n const values = await form.validateFields();\n setLoading(true);\n try {\n if (modalAction === 'approve') await onApprove?.(values.comments || undefined);\n if (modalAction === 'reject') await onReject?.(values.comments || undefined);\n if (modalAction === 'withdraw') await onWithdraw?.(values.comments || undefined);\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const visibleButtons = renderableActions.slice(0, maxVisible);\n const moreButtons = renderableActions.slice(maxVisible);\n const title =\n modalAction === 'approve' ? '审批意见' : modalAction === 'reject' ? '拒绝理由' : '撤销原因';\n\n const button = (action: ProcessAction) => (\n <Button\n key={action.action}\n type={action.action === 'agree' || action.action === 'approved' ? 'primary' : 'default'}\n danger={\n action.action === 'rejected' || action.action === 'reject' || action.action === 'withdraw'\n }\n onClick={() => handleAction(action)}\n loading={action.action === 'save' && saveLoading}\n >\n {getLabel(action)}\n </Button>\n );\n\n return (\n <>\n <div\n className={`${\n layout === 'horizontal'\n ? 'flex items-center justify-center gap-3'\n : 'flex flex-col items-center gap-2'\n } ${className}`}\n >\n {visibleButtons.map(button)}\n {moreButtons.length > 0 && (\n <Dropdown\n trigger={['click']}\n getPopupContainer={(triggerNode) => triggerNode.parentElement || document.body}\n menu={{\n items: moreButtons.map((action) => ({\n key: action.action,\n label: getLabel(action),\n danger:\n action.action === 'rejected' ||\n action.action === 'reject' ||\n action.action === 'withdraw',\n onClick: () => handleAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />}>更多</Button>\n </Dropdown>\n )}\n </div>\n <Modal\n getContainer={false}\n title={title}\n open={modalAction !== null}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={loading}\n onOk={handleConfirm}\n onCancel={() => {\n setModalAction(null);\n setActiveAction(null);\n form.resetFields();\n }}\n destroyOnHidden\n >\n <Form form={form} layout=\"vertical\">\n <Form.Item\n name=\"comments\"\n label={modalAction === 'approve' ? '审批意见' : '请输入理由'}\n rules={[\n {\n required: Boolean(activeAction?.remark?.required) || modalAction !== 'approve',\n message: '请填写说明',\n },\n ]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入说明\" />\n </Form.Item>\n </Form>\n </Modal>\n </>\n );\n};\n","import React, { useState } from 'react';\nimport { Button } from 'antd';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface ActionConfig {\n key: string;\n label: string;\n type?: 'primary' | 'default' | 'danger' | 'text';\n onClick: () => void | Promise<void>;\n loading?: boolean;\n disabled?: boolean;\n visible?: boolean;\n confirm?: { title: string; content: string; okText?: string; cancelText?: string };\n icon?: React.ReactNode;\n priority?: number;\n placement?: 'left' | 'right';\n}\n\nexport interface FormActionBarProps {\n actions: ActionConfig[];\n position?: 'bottom-fixed' | 'inline';\n className?: string;\n}\n\nexport const FormActionBar: React.FC<FormActionBarProps> = ({\n actions,\n position = 'bottom-fixed',\n className = '',\n}) => {\n const [loadingKeys, setLoadingKeys] = useState<Set<string>>(new Set());\n\n const visibleActions = actions.filter((a) => a.visible !== false);\n\n // Sort: danger first, primary last\n const sortedActions = [...visibleActions].sort((a, b) => {\n if (a.type === 'danger' && b.type !== 'danger') return -1;\n if (a.type !== 'danger' && b.type === 'danger') return 1;\n if (a.type === 'primary' && b.type !== 'primary') return 1;\n if (a.type !== 'primary' && b.type === 'primary') return -1;\n return 0;\n });\n\n const handleClick = async (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n await executeAction(action);\n } else {\n await executeAction(action);\n }\n };\n\n const executeAction = async (action: ActionConfig) => {\n setLoadingKeys((prev) => new Set(prev).add(action.key));\n try {\n await action.onClick();\n } finally {\n setLoadingKeys((prev) => {\n const next = new Set(prev);\n next.delete(action.key);\n return next;\n });\n }\n };\n\n const isFixed = position === 'bottom-fixed';\n\n const bar = (\n <div\n className={`${\n isFixed\n ? 'fixed bottom-0 left-0 right-0 z-50 backdrop-blur-lg bg-white/80 border-t border-gray-200 shadow-[0_-1px_3px_rgba(0,0,0,0.05)] px-6 py-3'\n : ''\n } ${className}`}\n >\n <div className=\"flex items-center justify-end gap-3 flex-wrap md:flex-nowrap\">\n {sortedActions.map((action) => {\n const isLoading = action.loading || loadingKeys.has(action.key);\n return (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={isLoading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => handleClick(action)}\n className=\"md:w-auto w-full\"\n >\n {action.label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n\n if (isFixed) {\n return (\n <>\n {bar}\n {/* Spacer to prevent content from being hidden behind fixed bar */}\n <div className=\"h-16\" />\n </>\n );\n }\n\n return bar;\n};\n","import React from 'react';\nimport { Alert, Empty, Spin } from 'antd';\n\nexport interface RuntimePageShellProps {\n children: React.ReactNode;\n actions?: React.ReactNode;\n loading?: boolean;\n loadingTip?: string;\n accessDenied?: boolean;\n error?: React.ReactNode;\n empty?: React.ReactNode;\n className?: string;\n contentClassName?: string;\n maxWidth?: number | string;\n inDrawer?: boolean;\n}\n\nexport const RuntimePageShell: React.FC<RuntimePageShellProps> = ({\n children,\n actions,\n loading = false,\n loadingTip = '正在加载页面...',\n accessDenied = false,\n error,\n empty,\n className = '',\n contentClassName = '',\n maxWidth = 1120,\n inDrawer = false,\n}) => {\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n\n const renderState = () => {\n if (loading) {\n return (\n <div className=\"min-h-[360px] flex items-center justify-center\">\n <Spin tip={loadingTip} />\n </div>\n );\n }\n if (accessDenied) {\n return <Empty description=\"无权限查看详情\" />;\n }\n if (error) {\n return <Alert type=\"error\" showIcon message=\"页面加载失败\" description={error} />;\n }\n if (empty) {\n return <>{empty}</>;\n }\n return children;\n };\n\n return (\n <div\n className={`sy-runtime-page flex min-h-screen flex-col bg-ant-bg-layout text-ant-text ${className}`}\n >\n <div\n className={`sy-runtime-page__content mx-auto flex w-full flex-1 flex-col p-0 md:px-6 md:py-6 md:pb-8 ${\n inDrawer ? 'md:px-4 md:py-4' : ''\n } ${contentClassName}`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {renderState()}\n </div>\n {actions}\n </div>\n );\n};\n","import React from 'react';\nimport { Avatar } from 'antd';\nimport { ApartmentOutlined, CalendarOutlined, FileTextOutlined } from '@ant-design/icons';\nimport type { StatusMeta } from '../types';\n\nexport interface SummaryPanelMetaItem {\n key: string;\n label: string;\n value?: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nexport interface SummaryPanelProps {\n title?: React.ReactNode;\n eyebrow?: React.ReactNode;\n showEyebrow?: boolean;\n status?: StatusMeta;\n creator?: { name?: string; avatar?: string; department?: string };\n createdAt?: React.ReactNode;\n metaItems?: SummaryPanelMetaItem[];\n className?: string;\n children?: React.ReactNode;\n}\n\nconst toneClasses: Record<StatusMeta['tone'], string> = {\n brand: 'bg-blue-50 text-blue-700 border-blue-200',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n};\n\nexport const SummaryPanel: React.FC<SummaryPanelProps> = ({\n title = '详情',\n eyebrow,\n showEyebrow = true,\n status,\n creator,\n createdAt,\n metaItems,\n className = '',\n children,\n}) => {\n const defaultItems: SummaryPanelMetaItem[] = [\n {\n key: 'creator',\n label: '创建人',\n value: creator?.name || '未知用户',\n icon: creator?.avatar ? (\n <Avatar size={24} src={creator.avatar} />\n ) : (\n <Avatar size={24}>{creator?.name?.slice(0, 1) || '表'}</Avatar>\n ),\n },\n {\n key: 'department',\n label: '所属部门',\n value: creator?.department || '-',\n icon: <ApartmentOutlined />,\n },\n {\n key: 'createdAt',\n label: '创建时间',\n value: createdAt || '-',\n icon: <CalendarOutlined />,\n },\n ];\n const items = metaItems || defaultItems;\n const mobileCreatorName = creator?.name || '未知用户';\n const mobileCreatorText = creator?.department\n ? `${mobileCreatorName}(${creator.department})`\n : mobileCreatorName;\n const showMobileIdentity =\n className.includes('sy-detail-summary-panel') && (creator || createdAt);\n\n return (\n <section\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container ${className}`}\n >\n <div className=\"sy-summary-panel-content p-5 md:p-6\">\n {(showEyebrow || status) && (\n <div className=\"sy-summary-status-row mb-2 flex items-center justify-between gap-3\">\n {showEyebrow ? (\n <div className=\"min-w-0 text-sm text-ant-text-tertiary\">\n {eyebrow || (\n <span className=\"inline-flex items-center gap-2\">\n <FileTextOutlined />\n 数据实例\n </span>\n )}\n </div>\n ) : (\n <span />\n )}\n {status && (\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2.5 text-xs font-medium ${\n toneClasses[status.tone] || toneClasses.neutral\n }`}\n >\n {status.label}\n </span>\n )}\n </div>\n )}\n <h1 className=\"sy-summary-title m-0 break-words text-2xl font-semibold leading-9 text-ant-text md:text-[28px]\">\n {title}\n </h1>\n {showMobileIdentity && (\n <div className=\"sy-summary-mobile-identity\">\n {creator && (\n <div className=\"sy-summary-mobile-person\">\n <span className=\"sy-summary-mobile-avatar\">\n {creator.avatar ? (\n <Avatar size={22} src={creator.avatar} />\n ) : (\n <Avatar size={22}>{creator.name?.slice(0, 1) || '表'}</Avatar>\n )}\n </span>\n <span className=\"sy-summary-mobile-person-name\">{mobileCreatorText}</span>\n </div>\n )}\n {createdAt && <div className=\"sy-summary-mobile-time\">{createdAt}</div>}\n </div>\n )}\n {items.length > 0 && (\n <div className=\"sy-summary-meta-list mt-5 grid grid-cols-1 gap-4 md:grid-cols-4\">\n {items.map((item) => (\n <div key={item.key} className=\"sy-summary-meta-item flex min-w-0 items-center gap-3\">\n {item.icon && (\n <span className=\"sy-summary-meta-icon inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-gray-100 text-ant-text-secondary\">\n {item.icon}\n </span>\n )}\n <span className=\"sy-summary-meta-body min-w-0\">\n <span className=\"sy-summary-meta-label block text-xs leading-5 text-ant-text-tertiary\">\n {item.label}\n </span>\n <span className=\"sy-summary-meta-value block break-words text-sm font-medium leading-6 text-ant-text\">\n {item.value || '-'}\n </span>\n </span>\n </div>\n ))}\n </div>\n )}\n {children && <div className=\"mt-5\">{children}</div>}\n </div>\n </section>\n );\n};\n","import React from 'react';\nimport { Button } from 'antd';\nimport { EditOutlined } from '@ant-design/icons';\n\nexport interface DraftManagerProps {\n hasDraft: boolean;\n draftTimestamp?: number | null;\n onRestore: () => void;\n onDiscard: () => void;\n className?: string;\n}\n\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return '刚刚';\n if (minutes < 60) return `${minutes}分钟前`;\n if (hours < 24) return `${hours}小时前`;\n return `${days}天前`;\n}\n\nexport const DraftManager: React.FC<DraftManagerProps> = ({\n hasDraft,\n draftTimestamp,\n onRestore,\n onDiscard,\n className = '',\n}) => {\n if (!hasDraft) return null;\n\n const timeLabel = draftTimestamp ? formatRelativeTime(draftTimestamp) : null;\n\n return (\n <div\n className={`bg-blue-50 border border-blue-200 rounded-lg p-4 animate-[slideDown_0.3s_ease-out] ${className}`}\n >\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <EditOutlined className=\"text-blue-500\" />\n <span>\n 检测到未提交的草稿\n {timeLabel && <span className=\"text-blue-500 ml-1\">(保存于 {timeLabel})</span>}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"text\" size=\"small\" onClick={onDiscard} className=\"!text-gray-500\">\n 丢弃\n </Button>\n <Button type=\"primary\" size=\"small\" onClick={onRestore}>\n 恢复填写\n </Button>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Modal, Skeleton, Button } from 'antd';\nimport { CheckCircleOutlined, UserOutlined } from '@ant-design/icons';\nimport type { ProcessRoute } from '../types';\n\nexport interface ProcessPreviewProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n routes: ProcessRoute[];\n loading?: boolean;\n}\n\nexport const ProcessPreview: React.FC<ProcessPreviewProps> = ({\n open,\n onClose,\n onConfirm,\n routes,\n loading = false,\n}) => {\n const routeList = Array.isArray(routes) ? routes : [];\n\n return (\n <Modal\n getContainer={false}\n title=\"流程预览\"\n open={open}\n onCancel={onClose}\n width={520}\n footer={\n <div className=\"flex justify-end gap-3\">\n <Button onClick={onClose}>取消</Button>\n <Button type=\"primary\" onClick={onConfirm} loading={loading}>\n 确认提交\n </Button>\n </div>\n }\n >\n {loading && routeList.length === 0 ? (\n <Skeleton active paragraph={{ rows: 4 }} />\n ) : routeList.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8\">暂无流程节点</p>\n ) : (\n <div className=\"py-2\">\n {routeList.map((route, index) => {\n const isLast = index === routeList.length - 1;\n return (\n <div key={route.nodeId} className=\"flex gap-3\">\n {/* Left timeline */}\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-blue-50 border-2 border-blue-400 flex items-center justify-center flex-shrink-0\">\n <CheckCircleOutlined className=\"text-blue-500 text-xs\" />\n </div>\n {!isLast && <div className=\"w-0.5 flex-1 bg-blue-200 mt-1\" />}\n </div>\n\n {/* Right content */}\n <div className={`flex-1 ${isLast ? 'pb-0' : 'pb-5'}`}>\n <div className=\"text-sm font-medium text-gray-900\">{route.nodeName}</div>\n {route.assignees && route.assignees.length > 0 && (\n <div className=\"mt-1 flex items-center gap-1.5 flex-wrap\">\n <UserOutlined className=\"text-gray-400 text-xs\" />\n {route.assignees.map((assignee) => (\n <span\n key={assignee.id}\n className=\"text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded\"\n >\n {assignee.name}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </Modal>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { TableProps } from 'antd';\nimport {\n Alert,\n Button,\n Cascader,\n Checkbox,\n ConfigProvider,\n DatePicker,\n Divider,\n Drawer,\n Dropdown,\n Empty,\n Input,\n InputNumber,\n Modal,\n Segmented,\n Select,\n Space,\n Table,\n Tag,\n Tooltip,\n Upload,\n message,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport {\n DeleteOutlined,\n DownloadOutlined,\n FilterOutlined,\n HistoryOutlined,\n ImportOutlined,\n MoreOutlined,\n PlusOutlined,\n ReloadOutlined,\n SettingOutlined,\n SwapOutlined,\n} from '@ant-design/icons';\nimport type { FormRuntimeApi, FormRuntimeApiConfig, FormSchema } from '../types';\nimport { createFormRuntimeApi } from '../core/runtimeApi';\nimport { StandardFormPage } from '../templates/StandardFormPage';\nimport {\n advancedSearchDataManagement,\n batchApproveDataManagementRows,\n deleteDataManagementRows,\n downloadDataManagementImportTemplate,\n exportDataManagementRows,\n getDataManagementConfig,\n getDataManagementSchema,\n getDataManagementTransferRecords,\n getSystemFieldsForFormType,\n importDataManagementRows,\n importPreviewDataManagementRows,\n normalizeColumnConfig,\n saveDataManagementConfig,\n type DataManagementConfig,\n type DataManagementConfigScope,\n type DataManagementDensity,\n type DataManagementField,\n type DataManagementFilterGroup,\n type DataManagementFilterRule,\n type DataManagementSort,\n} from '../core/dataManagementApi';\nimport { confirmAction } from '../utils/confirmAction';\n\ntype DetailRenderer = (props: {\n record: any;\n formInstanceId?: string;\n onClose: () => void;\n}) => React.ReactNode;\n\ntype DetailPageUrlBuilder = (props: { record: any; formInstanceId: string }) => string | undefined;\n\ntype SubmitRenderer = (props: { onClose: () => void; onSubmitted: () => void }) => React.ReactNode;\n\ntype DataManagementFetchState = {\n current?: number;\n pageSize?: number;\n searchKeyWord?: string;\n filterGroup?: DataManagementFilterGroup;\n sort?: DataManagementSort[];\n};\n\nexport interface DataManagementRowAction {\n key: string;\n label: string;\n danger?: boolean;\n onClick: (record: any) => void;\n}\n\nexport interface DataManagementListProps {\n appType: string;\n formUuid: string;\n detailBasePath?: string;\n menuFormUuid?: string;\n readonly?: boolean;\n fullHeight?: boolean;\n configScope?: DataManagementConfigScope;\n title?: string;\n formTitle?: string;\n formType?: string;\n forcedConfig?: DataManagementConfig;\n showForcedConfig?: boolean;\n detailRenderer?: DetailRenderer;\n detailPageUrlBuilder?: DetailPageUrlBuilder;\n submitRenderer?: SubmitRenderer;\n requestOverride?: FormRuntimeApi['request'] | FormRuntimeApiConfig;\n rowActions?: DataManagementRowAction[];\n}\n\nconst createGroup = (): DataManagementFilterGroup => ({\n id: `group_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n logic: 'AND',\n rules: [],\n conditions: [],\n});\n\nconst operatorAliases: Record<string, string> = {\n contains: 'CONTAINS',\n like: 'CONTAINS',\n eq: 'EQ',\n ne: 'NEQ',\n neq: 'NEQ',\n gt: 'GT',\n gte: 'GTE',\n ge: 'GTE',\n lt: 'LT',\n lte: 'LTE',\n le: 'LTE',\n between: 'BETWEEN',\n in: 'IN',\n not_contains: 'NOT_CONTAINS',\n empty: 'IS_NULL',\n notEmpty: 'IS_NOT_NULL',\n not_empty: 'IS_NOT_NULL',\n is_null: 'IS_NULL',\n is_not_null: 'IS_NOT_NULL',\n};\n\nconst noValueOperators = new Set(['IS_NULL', 'IS_NOT_NULL']);\n\nconst normalizeOperator = (operator?: string) => {\n const raw = String(operator || '').trim();\n if (!raw) return 'EQ';\n return operatorAliases[raw] || operatorAliases[raw.toLowerCase()] || raw.toUpperCase();\n};\n\nconst getFieldKind = (field?: DataManagementField) => {\n const componentName = field?.componentName || 'TextField';\n if (['NumberField'].includes(componentName)) return 'number';\n if (['DateField', 'DateTimeField', 'CascadeDateField'].includes(componentName)) return 'date';\n if (['SelectField', 'RadioField'].includes(componentName)) return 'singleOption';\n if (['CheckboxField', 'MultiSelectField'].includes(componentName)) return 'multiOption';\n if (['CascadeSelectField'].includes(componentName)) return 'cascadeOption';\n if (['UserSelectField', 'EmployeeSelectField'].includes(componentName)) return 'user';\n if (['DepartmentSelectField'].includes(componentName)) return 'department';\n return 'text';\n};\n\nconst getDefaultOperator = (field?: DataManagementField) => {\n const kind = getFieldKind(field);\n if (kind === 'text') return 'CONTAINS';\n if (kind === 'multiOption') return 'IN';\n return 'EQ';\n};\n\nconst getOperatorOptions = (field?: DataManagementField) => {\n const kind = getFieldKind(field);\n const commonNull = [\n { label: '为空', value: 'IS_NULL' },\n { label: '不为空', value: 'IS_NOT_NULL' },\n ];\n if (kind === 'text') {\n return [\n { label: '包含', value: 'CONTAINS' },\n { label: '等于', value: 'EQ' },\n { label: '不等于', value: 'NEQ' },\n { label: '不包含', value: 'NOT_CONTAINS' },\n ...commonNull,\n ];\n }\n if (kind === 'number' || kind === 'date') {\n return [\n { label: '等于', value: 'EQ' },\n { label: '不等于', value: 'NEQ' },\n { label: '大于', value: 'GT' },\n { label: '大于等于', value: 'GTE' },\n { label: '小于', value: 'LT' },\n { label: '小于等于', value: 'LTE' },\n { label: '区间', value: 'BETWEEN' },\n ...commonNull,\n ];\n }\n return [\n { label: '等于', value: 'EQ' },\n { label: '不等于', value: 'NEQ' },\n { label: '包含任一', value: 'IN' },\n ...commonNull,\n ];\n};\n\nconst getDefaultValueForOperator = (operator: string) => {\n const normalized = normalizeOperator(operator);\n if (noValueOperators.has(normalized)) return null;\n if (normalized === 'BETWEEN') return [null, null];\n if (normalized === 'IN') return [];\n return '';\n};\n\nconst createRule = (field?: DataManagementField): DataManagementFilterRule => ({\n id: `rule_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n key: field?.fieldId || '',\n operator: getDefaultOperator(field),\n value: getDefaultValueForOperator(getDefaultOperator(field)),\n componentName: field?.componentName,\n});\n\nconst getRecordId = (record: any) =>\n record?.formInstanceId ||\n record?.formInstId ||\n record?.form_instance_id ||\n record?.instanceId ||\n record?.id ||\n record?.processInstanceId;\n\nconst getSelectedRecordId = (record: any, fallback: React.Key) =>\n record?.formInstId ||\n record?.formInstanceId ||\n record?.form_instance_id ||\n record?.id ||\n fallback;\n\nconst hydrateFilterGroup = (group?: DataManagementFilterGroup): DataManagementFilterGroup => {\n if (!group) return createGroup();\n return {\n id: group.id || createGroup().id,\n logic: group.logic === 'OR' ? 'OR' : 'AND',\n rules: Array.isArray(group.rules)\n ? group.rules.map((rule) => ({\n ...rule,\n id: rule.id || `rule_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n operator: normalizeOperator(rule.operator),\n }))\n : [],\n conditions: Array.isArray(group.conditions) ? group.conditions.map(hydrateFilterGroup) : [],\n };\n};\n\nconst hasFilterContent = (group?: DataManagementFilterGroup) =>\n Boolean(group && ((group.rules || []).length > 0 || (group.conditions || []).length > 0));\n\nconst combineFilterGroups = (\n forced?: DataManagementFilterGroup,\n personal?: DataManagementFilterGroup,\n): DataManagementFilterGroup | undefined => {\n const forcedGroup = hasFilterContent(forced) ? hydrateFilterGroup(forced) : undefined;\n const personalGroup = hasFilterContent(personal) ? hydrateFilterGroup(personal) : undefined;\n if (forcedGroup && personalGroup) {\n return {\n id: `group_forced_${Date.now()}`,\n logic: 'AND',\n rules: [],\n conditions: [forcedGroup, personalGroup],\n };\n }\n return forcedGroup || personalGroup;\n};\n\nconst uniqueStrings = (values: Array<string | undefined | null>) => {\n const result: string[] = [];\n values.forEach((value) => {\n const normalized = String(value || '').trim();\n if (normalized && !result.includes(normalized)) result.push(normalized);\n });\n return result;\n};\n\nconst combineSearchKeywords = (forced?: string, personal?: string) => {\n const values = uniqueStrings([forced, personal]);\n return values.length > 0 ? values.join(' ') : undefined;\n};\n\nconst uniqueFields = (fields: DataManagementField[]) => {\n const seen = new Set<string>();\n return fields.filter((field) => {\n const key = String(field.fieldId || field.id || '').trim();\n if (!key || seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\nconst createSelectedIdFilterGroup = (\n selectedIds: string[],\n): DataManagementFilterGroup | undefined => {\n const ids = uniqueStrings(selectedIds);\n if (ids.length === 0) return undefined;\n return {\n id: `group_selected_export_${Date.now()}`,\n logic: 'OR',\n rules: ids.map((id) => ({\n id: `selected_${id}`,\n key: 'form_instance_id',\n operator: 'EQ',\n value: id,\n })),\n conditions: [],\n };\n};\n\nconst mergeSorts = (forced: DataManagementSort[] = [], personal: DataManagementSort[] = []) => {\n const used = new Set<string>();\n const result: DataManagementSort[] = [];\n [...forced, ...personal].forEach((item) => {\n if (!item?.id || used.has(item.id)) return;\n used.add(item.id);\n result.push(item);\n });\n return result;\n};\n\nconst stripForcedConfigPatch = (\n patch: DataManagementConfig,\n forced: DataManagementConfig | undefined,\n): DataManagementConfig => {\n if (!forced) return patch;\n const forcedShowFields = new Set(forced.showFields || []);\n const forcedLockFields = new Set(forced.lockFieldIds || []);\n const forcedSortIds = new Set((forced.sort || []).map((item) => item.id));\n const next = { ...patch };\n if (Array.isArray(next.showFields)) {\n next.showFields = next.showFields.filter((fieldId) => !forcedShowFields.has(fieldId));\n }\n if (Array.isArray(next.lockFieldIds)) {\n next.lockFieldIds = next.lockFieldIds.filter((fieldId) => !forcedLockFields.has(fieldId));\n }\n if (Array.isArray(next.sort)) {\n next.sort = next.sort.filter((item) => !forcedSortIds.has(item.id));\n }\n return next;\n};\n\nconst buildFallbackFormSchema = ({\n appType,\n formUuid,\n title,\n formType,\n fields,\n}: {\n appType: string;\n formUuid: string;\n title?: string;\n formType?: string;\n fields: DataManagementField[];\n}): FormSchema => ({\n formMeta: {\n appType,\n formUuid,\n title: title || formUuid,\n },\n template: {\n type: 'standard',\n formType: isProcessFormType(formType) ? 'process' : 'form',\n enableDraft: true,\n submitSuccessMode: 'stay',\n },\n fields: fields.filter((field) => !field.system),\n layout: fields\n .filter((field) => !field.system)\n .map((field) => ({\n id: `layout_${field.fieldId}`,\n type: 'field' as const,\n fieldId: field.fieldId,\n })),\n rules: [],\n});\n\nconst formatPrimitive = (value: any) => {\n if (value === undefined || value === null || value === '')\n return <span className=\"text-ant-color-text-quaternary\">--</span>;\n return String(value);\n};\n\nconst formatDateTime = (value: any) => {\n if (value === undefined || value === null || value === '') return formatPrimitive('');\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.format('YYYY-MM-DD HH:mm:ss') : String(value);\n};\n\nconst pickOptionLabel = (field: DataManagementField, value: any) => {\n const options =\n field.options || field.optionList || field.option_list || field.componentProps?.options || [];\n const scalar =\n typeof value === 'object' ? (value?.value ?? value?.id ?? value?.label ?? value?.name) : value;\n const match = Array.isArray(options)\n ? options.find((option: any) => String(option.value ?? option.id) === String(scalar))\n : undefined;\n return match?.label || match?.name || value?.label || value?.name || scalar;\n};\n\nconst renderStatusTag = (value: any, fieldId: string) => {\n const raw = String(value || '');\n const statusMap: Record<string, { label: string; color: string }> = {\n pending: { label: '待处理', color: 'processing' },\n running: { label: '审批中', color: 'processing' },\n waiting: { label: '等待中', color: 'default' },\n exception: { label: '流程异常', color: 'error' },\n completed: { label: '已完成', color: 'success' },\n terminated: { label: '已拒绝', color: 'error' },\n withdrawn: { label: '已撤销', color: 'default' },\n processing: { label: '审批中', color: 'processing' },\n approved: { label: '同意', color: 'success' },\n rejected: { label: '拒绝', color: 'error' },\n };\n if (fieldId !== 'processInstanceStatus' && fieldId !== 'approvalResult') return null;\n const meta = statusMap[raw];\n return <Tag color={meta?.color}>{meta?.label || raw || '--'}</Tag>;\n};\n\nconst renderCellValue = (value: any, field: DataManagementField) => {\n const status = renderStatusTag(value, field.fieldId);\n if (status) return status;\n\n if (field.componentName === 'DateField' || field.componentName === 'DateTimeField') {\n return formatDateTime(value);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return formatPrimitive('');\n if (field.componentName === 'ImageField') {\n return (\n <div className=\"flex max-w-[180px] gap-1 overflow-hidden\">\n {value.slice(0, 3).map((item: any, index) => (\n <img\n key={item?.uid || item?.id || item?.url || index}\n alt={item?.name || field.label}\n src={item?.url || item?.previewUrl}\n className=\"h-8 w-8 rounded object-cover\"\n />\n ))}\n </div>\n );\n }\n if (field.componentName === 'AttachmentField') {\n return (\n <Space size={4} wrap>\n {value.slice(0, 3).map((item: any, index) => (\n <Tag key={item?.uid || item?.id || index}>\n {item?.name || item?.originalName || `附件${index + 1}`}\n </Tag>\n ))}\n {value.length > 3 && <Tag>+{value.length - 3}</Tag>}\n </Space>\n );\n }\n return (\n <Space size={4} wrap>\n {value.slice(0, 4).map((item, index) => (\n <Tag key={`${field.fieldId}_${index}`}>{pickOptionLabel(field, item)}</Tag>\n ))}\n {value.length > 4 && <Tag>+{value.length - 4}</Tag>}\n </Space>\n );\n }\n\n if (value && typeof value === 'object') {\n if (\n field.componentName === 'UserSelectField' ||\n field.componentName === 'DepartmentSelectField'\n ) {\n return value.name || value.label || value.username || formatPrimitive(value.id);\n }\n if (value.start || value.end) {\n return [value.start, value.end].filter(Boolean).join(' 至 ');\n }\n if (value.label || value.name || value.value) {\n return pickOptionLabel(field, value);\n }\n return (\n <Tooltip title={JSON.stringify(value)}>\n <span className=\"text-ant-color-text-secondary\">对象数据</span>\n </Tooltip>\n );\n }\n\n if (\n ['SelectField', 'RadioField', 'CheckboxField', 'MultiSelectField'].includes(field.componentName)\n ) {\n return pickOptionLabel(field, value);\n }\n\n return formatPrimitive(value);\n};\n\nconst fileToBase64 = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = String(reader.result || '');\n resolve(result.includes(',') ? result.split(',')[1] : result);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\nconst normalizeBasePath = (basePath?: string) => {\n const normalized = String(basePath || '').replace(/^\\/+|\\/+$/g, '');\n return normalized ? `/${normalized}` : '';\n};\n\nexport const isProcessFormType = (formType?: string) => {\n const normalized = String(formType || '')\n .trim()\n .toLowerCase()\n .replace(/[\\s_-]+/g, '');\n return ['process', 'workflow', 'flow', 'flowform', 'processform', 'workflowform'].includes(\n normalized,\n );\n};\n\nexport function resolveDataManagementPopupContainer(\n rootEl?: HTMLElement | null,\n triggerNode?: HTMLElement,\n) {\n if (rootEl) {\n const rootNode = rootEl.getRootNode?.();\n if (typeof ShadowRoot !== 'undefined' && rootNode instanceof ShadowRoot) {\n return resolveDataManagementPortalContainer(rootEl);\n }\n }\n return (\n triggerNode?.ownerDocument?.body ||\n rootEl?.ownerDocument?.body ||\n (typeof document !== 'undefined' ? document.body : rootEl)\n );\n}\n\nconst DATA_MANAGEMENT_PORTAL_ATTR = 'data-sy-data-management-portal';\n\nexport function resolveDataManagementPortalContainer(rootEl?: HTMLElement | null) {\n if (!rootEl) return typeof document !== 'undefined' ? document.body : undefined;\n const rootNode = rootEl.getRootNode?.();\n if (typeof ShadowRoot !== 'undefined' && rootNode instanceof ShadowRoot) {\n const existing = rootNode.querySelector<HTMLElement>(`[${DATA_MANAGEMENT_PORTAL_ATTR}]`);\n if (existing) return existing;\n const portal = rootEl.ownerDocument.createElement('div');\n portal.setAttribute(DATA_MANAGEMENT_PORTAL_ATTR, '');\n rootNode.appendChild(portal);\n return portal;\n }\n return rootEl.ownerDocument.body;\n}\n\nconst inferBasePath = (appType: string) => {\n if (typeof window === 'undefined') return '';\n const pathname = window.location?.pathname || '';\n const marker = `/${appType}/`;\n const markerIndex = pathname.indexOf(marker);\n if (markerIndex <= 0) return '';\n return pathname.slice(0, markerIndex);\n};\n\nconst buildDefaultDetailUrl = ({\n appType,\n formUuid,\n formType,\n formInstanceId,\n basePath,\n}: {\n appType: string;\n formUuid: string;\n formType?: string;\n formInstanceId: string;\n basePath?: string;\n}) => {\n const prefix = normalizeBasePath(basePath ?? inferBasePath(appType));\n const detailType = isProcessFormType(formType) ? 'processDetail' : 'formDetail';\n return `${prefix}/${appType}/${detailType}/${formUuid}?formInstId=${encodeURIComponent(formInstanceId)}`;\n};\n\nconst getHeaderValue = (headers: any, key: string) => {\n if (!headers) return '';\n if (typeof headers.get === 'function')\n return headers.get(key) || headers.get(key.toLowerCase()) || '';\n return headers[key] || headers[key.toLowerCase()] || '';\n};\n\nconst resolveDownloadFilename = (headers: any, fallbackName: string) => {\n const disposition = getHeaderValue(headers, 'content-disposition');\n if (typeof disposition !== 'string') return fallbackName;\n const matchStar = disposition.match(/filename\\*=UTF-8''([^;]+)/i);\n if (matchStar?.[1]) return decodeURIComponent(matchStar[1]);\n const match = disposition.match(/filename=\"?([^\";]+)\"?/i);\n if (match?.[1]) return decodeURIComponent(match[1]);\n return fallbackName;\n};\n\nconst downloadBlobResponse = async (response: any, fallbackName: string) => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n const headers = response?.headers;\n const payload = response?.blob ?? response?.data ?? response;\n const contentType = getHeaderValue(headers, 'content-type') || payload?.type || '';\n const hasBlob = typeof Blob !== 'undefined';\n\n if (hasBlob && payload instanceof Blob && String(contentType).includes('application/json')) {\n const text = await payload.text();\n try {\n const json = JSON.parse(text);\n throw new Error(json?.message || '下载失败');\n } catch (error) {\n if (error instanceof SyntaxError) throw new Error('下载失败');\n if (error instanceof Error) throw error;\n throw new Error('下载失败');\n }\n }\n\n const blob =\n hasBlob && payload instanceof Blob\n ? payload\n : hasBlob && payload instanceof ArrayBuffer\n ? new Blob([payload], { type: contentType || 'application/octet-stream' })\n : new Blob([typeof payload === 'string' ? payload : JSON.stringify(payload ?? '')], {\n type: contentType || 'application/octet-stream',\n });\n const filename = response?.fileName || resolveDownloadFilename(headers, fallbackName);\n const url = window.URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n window.URL.revokeObjectURL(url);\n};\n\nconst unwrapRuntimePayload = (payload: any) => {\n const data = payload?.data?.result ?? payload?.result ?? payload?.data ?? payload;\n return data?.items || data?.list || data?.data || data?.records || data || [];\n};\n\nconst getRawFieldOptions = (field?: DataManagementField): any[] => {\n const options =\n field?.options ||\n field?.optionList ||\n field?.option_list ||\n field?.componentProps?.options ||\n field?.componentProps?.optionList ||\n [];\n return Array.isArray(options) ? options : [];\n};\n\nconst getOptionValue = (option: any) => option?.value ?? option?.id ?? option?.key;\n\nconst normalizeSelectOptions = (field?: DataManagementField): { label: string; value: string }[] =>\n getRawFieldOptions(field)\n .map((option) => {\n const value = getOptionValue(option);\n if (value === undefined || value === null || value === '') return null;\n return {\n label: String(option?.label ?? option?.name ?? option?.title ?? value),\n value: String(value),\n };\n })\n .filter(Boolean) as { label: string; value: string }[];\n\nconst normalizeCascadeOptions = (field?: DataManagementField): any[] => {\n const visit = (items: any[]): any[] =>\n items\n .map((item) => {\n const value = getOptionValue(item);\n if (value === undefined || value === null || value === '') return null;\n const children = Array.isArray(item.children) ? visit(item.children) : undefined;\n return {\n label: String(item.label ?? item.name ?? item.title ?? value),\n value: String(value),\n children: children && children.length > 0 ? children : undefined,\n };\n })\n .filter(Boolean);\n return visit(getRawFieldOptions(field));\n};\n\nconst flattenCascadeOptions = (options: any[]): { label: string; value: string }[] => {\n const result: { label: string; value: string }[] = [];\n const visit = (items: any[], parentLabels: string[] = []) => {\n items.forEach((item) => {\n const labels = [...parentLabels, item.label];\n result.push({ label: labels.join(' / '), value: item.value });\n if (Array.isArray(item.children)) visit(item.children, labels);\n });\n };\n visit(options);\n return result;\n};\n\nconst findCascadePath = (options: any[], value: any): string[] => {\n const target = String(value ?? '');\n const visit = (items: any[], trail: string[] = []): string[] => {\n for (const item of items) {\n const nextTrail = [...trail, String(item.value)];\n if (String(item.value) === target) return nextTrail;\n if (Array.isArray(item.children)) {\n const found = visit(item.children, nextTrail);\n if (found.length) return found;\n }\n }\n return [];\n };\n return visit(options);\n};\n\nconst formatDateFilterValue = (value: any, field?: DataManagementField) => {\n if (!value) return '';\n const format =\n field?.dateFormat ||\n field?.format ||\n (field?.componentName === 'DateTimeField' || field?.showTime\n ? 'YYYY-MM-DD HH:mm:ss'\n : 'YYYY-MM-DD');\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.format(format) : String(value);\n};\n\nconst normalizeEntityOption = (item: any) => {\n const value = item?.value ?? item?.id ?? item?.userid ?? item?.userId ?? item?.departmentId;\n if (value === undefined || value === null || value === '') return null;\n return {\n value: String(value),\n label: String(\n item?.label ?? item?.name ?? item?.title ?? item?.username ?? item?.departmentName ?? value,\n ),\n };\n};\n\nfunction AsyncEntityFilterSelect({\n api,\n entityType,\n operator,\n value,\n onChange,\n}: {\n api: FormRuntimeApi;\n entityType: 'user' | 'department';\n operator: string;\n value: any;\n onChange: (value: any) => void;\n}) {\n const [options, setOptions] = useState<{ label: string; value: string }[]>([]);\n const [fetching, setFetching] = useState(false);\n const multiple = normalizeOperator(operator) === 'IN';\n\n const loadOptions = useCallback(\n async (keyword = '') => {\n setFetching(true);\n try {\n let rows: any[] = [];\n if (entityType === 'user') {\n if (typeof api.getUserList === 'function') {\n rows = await api.getUserList(\n keyword\n ? { keyword, name: keyword, username: keyword, pageSize: 20 }\n : { pageSize: 20 },\n );\n } else {\n const response = await api.request({\n url: '/user/list',\n method: 'get',\n params: keyword ? { keyword, pageSize: 20 } : { pageSize: 20 },\n });\n rows = unwrapRuntimePayload(response);\n }\n } else {\n const response = await api.request({\n url: keyword ? '/department/list' : '/department/root',\n method: 'get',\n });\n rows = unwrapRuntimePayload(response);\n if (keyword) {\n const normalizedKeyword = keyword.toLowerCase();\n rows = rows.filter((item: any) =>\n String(item?.name ?? item?.label ?? item?.id ?? '')\n .toLowerCase()\n .includes(normalizedKeyword),\n );\n }\n }\n setOptions(\n rows.map(normalizeEntityOption).filter(Boolean) as { label: string; value: string }[],\n );\n } catch {\n setOptions([]);\n } finally {\n setFetching(false);\n }\n },\n [api, entityType],\n );\n\n useEffect(() => {\n void loadOptions();\n }, [loadOptions]);\n\n return (\n <Select\n showSearch\n allowClear\n mode={multiple ? 'multiple' : undefined}\n value={multiple ? (Array.isArray(value) ? value.map(String) : []) : value || undefined}\n options={options}\n filterOption={false}\n onSearch={(keyword) => void loadOptions(keyword)}\n onChange={(nextValue) => onChange(nextValue)}\n notFoundContent={fetching ? '加载中...' : null}\n placeholder={entityType === 'user' ? '选择人员' : '选择部门'}\n />\n );\n}\n\nfunction FilterValueEditor({\n api,\n field,\n operator,\n value,\n onChange,\n}: {\n api: FormRuntimeApi;\n field?: DataManagementField;\n operator: string;\n value: any;\n onChange: (value: any) => void;\n}) {\n const normalizedOperator = normalizeOperator(operator);\n const kind = getFieldKind(field);\n if (noValueOperators.has(normalizedOperator)) {\n return (\n <div className=\"flex h-8 items-center text-sm text-ant-color-text-tertiary\">无需填写值</div>\n );\n }\n if (kind === 'number') {\n if (normalizedOperator === 'BETWEEN') {\n const range = Array.isArray(value) ? value : [undefined, undefined];\n return (\n <div className=\"flex w-full gap-2\">\n <InputNumber\n className=\"w-full\"\n placeholder=\"最小值\"\n value={range[0] ?? null}\n onChange={(nextValue) => onChange([nextValue, range[1] ?? null])}\n />\n <InputNumber\n className=\"w-full\"\n placeholder=\"最大值\"\n value={range[1] ?? null}\n onChange={(nextValue) => onChange([range[0] ?? null, nextValue])}\n />\n </div>\n );\n }\n return (\n <InputNumber\n className=\"w-full\"\n value={value === '' || value === undefined ? null : Number(value)}\n placeholder=\"输入筛选值\"\n onChange={(nextValue) => onChange(nextValue)}\n />\n );\n }\n if (kind === 'date') {\n if (normalizedOperator === 'BETWEEN') {\n const range = Array.isArray(value) ? value : [];\n return (\n <DatePicker.RangePicker\n className=\"w-full\"\n value={\n range.length === 2 && range[0] && range[1] ? [dayjs(range[0]), dayjs(range[1])] : null\n }\n showTime={field?.componentName === 'DateTimeField' || field?.showTime}\n onChange={(dates) =>\n onChange(\n dates && dates[0] && dates[1]\n ? [formatDateFilterValue(dates[0], field), formatDateFilterValue(dates[1], field)]\n : [null, null],\n )\n }\n />\n );\n }\n return (\n <DatePicker\n className=\"w-full\"\n value={value ? dayjs(value) : null}\n showTime={field?.componentName === 'DateTimeField' || field?.showTime}\n placeholder=\"选择日期\"\n onChange={(date) => onChange(date ? formatDateFilterValue(date, field) : '')}\n />\n );\n }\n if (kind === 'singleOption' || kind === 'multiOption') {\n const multiple = normalizedOperator === 'IN' || kind === 'multiOption';\n return (\n <Select\n allowClear\n mode={multiple ? 'multiple' : undefined}\n value={multiple ? (Array.isArray(value) ? value.map(String) : []) : value || undefined}\n options={normalizeSelectOptions(field)}\n placeholder=\"选择筛选值\"\n onChange={(nextValue) => onChange(nextValue)}\n />\n );\n }\n if (kind === 'cascadeOption') {\n const cascadeOptions = normalizeCascadeOptions(field);\n if (normalizedOperator === 'IN') {\n return (\n <Select\n allowClear\n mode=\"multiple\"\n value={Array.isArray(value) ? value.map(String) : []}\n options={flattenCascadeOptions(cascadeOptions)}\n placeholder=\"选择筛选值\"\n onChange={(nextValue) => onChange(nextValue)}\n />\n );\n }\n return (\n <Cascader\n className=\"w-full\"\n allowClear\n options={cascadeOptions}\n value={findCascadePath(cascadeOptions, value)}\n placeholder=\"选择筛选值\"\n onChange={(nextValue) => {\n const pathValues = Array.isArray(nextValue) ? nextValue : [];\n onChange(pathValues.length ? pathValues[pathValues.length - 1] : '');\n }}\n />\n );\n }\n if (kind === 'user' || kind === 'department') {\n return (\n <AsyncEntityFilterSelect\n api={api}\n entityType={kind === 'department' ? 'department' : 'user'}\n operator={normalizedOperator}\n value={value}\n onChange={onChange}\n />\n );\n }\n if (normalizedOperator === 'IN') {\n return (\n <Select\n mode=\"tags\"\n tokenSeparators={[',', ',']}\n value={Array.isArray(value) ? value.map(String) : []}\n placeholder=\"输入后回车\"\n onChange={(nextValue) => onChange(nextValue)}\n />\n );\n }\n return (\n <Input\n value={value ?? ''}\n placeholder=\"输入筛选值\"\n onChange={(event) => onChange(event.target.value)}\n />\n );\n}\n\nfunction FilterGroupEditor({\n group,\n fields,\n api,\n onChange,\n level = 0,\n}: {\n group: DataManagementFilterGroup;\n fields: DataManagementField[];\n api: FormRuntimeApi;\n onChange: (group: DataManagementFilterGroup) => void;\n level?: number;\n}) {\n const fieldOptions = fields.map((field) => ({ label: field.label, value: field.fieldId }));\n\n const updateRule = (ruleId: string, patch: Partial<DataManagementFilterRule>) => {\n onChange({\n ...group,\n rules: group.rules.map((rule) =>\n rule.id === ruleId\n ? {\n ...rule,\n ...patch,\n operator: patch.operator ? normalizeOperator(patch.operator) : rule.operator,\n }\n : rule,\n ),\n });\n };\n\n return (\n <div\n className={`${level > 0 ? 'ml-4 border-l border-ant-border-secondary pl-4' : ''} space-y-3`}\n >\n <div className=\"flex items-center justify-between\">\n <Segmented\n size=\"small\"\n value={group.logic}\n options={[\n { label: '满足全部', value: 'AND' },\n { label: '满足任一', value: 'OR' },\n ]}\n onChange={(value) => onChange({ ...group, logic: value as 'AND' | 'OR' })}\n />\n <Space>\n <Button\n size=\"small\"\n onClick={() => onChange({ ...group, rules: [...group.rules, createRule(fields[0])] })}\n >\n 添加条件\n </Button>\n <Button\n size=\"small\"\n onClick={() => onChange({ ...group, conditions: [...group.conditions, createGroup()] })}\n >\n 添加分组\n </Button>\n </Space>\n </div>\n {group.rules.map((rule) => (\n <div\n key={rule.id}\n className=\"grid grid-cols-[minmax(140px,1fr)_132px_minmax(180px,1.4fr)_auto] gap-2\"\n >\n <Select\n showSearch\n placeholder=\"字段\"\n value={rule.key}\n options={fieldOptions}\n optionFilterProp=\"label\"\n onChange={(fieldId) => {\n const field = fields.find((item) => item.fieldId === fieldId);\n const nextOperator = getDefaultOperator(field);\n updateRule(rule.id, {\n key: fieldId,\n componentName: field?.componentName,\n operator: nextOperator,\n value: getDefaultValueForOperator(nextOperator),\n });\n }}\n />\n <Select\n value={normalizeOperator(rule.operator)}\n options={getOperatorOptions(fields.find((field) => field.fieldId === rule.key))}\n onChange={(operator) =>\n updateRule(rule.id, {\n operator,\n value: getDefaultValueForOperator(operator),\n })\n }\n />\n <FilterValueEditor\n api={api}\n field={fields.find((field) => field.fieldId === rule.key)}\n operator={rule.operator}\n value={rule.value}\n onChange={(value) => updateRule(rule.id, { value })}\n />\n <Button\n danger\n type=\"text\"\n icon={<DeleteOutlined />}\n onClick={() =>\n onChange({ ...group, rules: group.rules.filter((item) => item.id !== rule.id) })\n }\n />\n </div>\n ))}\n {group.conditions.map((child) => (\n <FilterGroupEditor\n key={child.id}\n group={child}\n fields={fields}\n api={api}\n level={level + 1}\n onChange={(next) =>\n onChange({\n ...group,\n conditions: group.conditions.map((item) => (item.id === child.id ? next : item)),\n })\n }\n />\n ))}\n {group.rules.length === 0 && group.conditions.length === 0 && (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无筛选条件\" />\n )}\n </div>\n );\n}\n\nfunction ResizableColumnTitle({\n label,\n width,\n onResize,\n onResizeEnd,\n}: {\n label: React.ReactNode;\n width: number;\n onResize: (width: number) => void;\n onResizeEnd: (width: number) => void;\n}) {\n const dragRef = useRef({ startX: 0, startWidth: width, latestWidth: width });\n\n const handleMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.preventDefault();\n event.stopPropagation();\n dragRef.current = {\n startX: event.clientX,\n startWidth: width,\n latestWidth: width,\n };\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const nextWidth = Math.min(\n 520,\n Math.max(96, dragRef.current.startWidth + moveEvent.clientX - dragRef.current.startX),\n );\n dragRef.current.latestWidth = nextWidth;\n onResize(nextWidth);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n onResizeEnd(dragRef.current.latestWidth);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n };\n\n return (\n <span className=\"relative flex min-w-0 items-center pr-3\">\n <span className=\"min-w-0 truncate\">{label}</span>\n <span\n aria-hidden\n className=\"absolute -right-3 top-0 h-full w-4 cursor-col-resize after:absolute after:right-1 after:top-1/2 after:h-5 after:w-0.5 after:-translate-y-1/2 after:rounded after:bg-transparent hover:after:bg-ant-color-primary\"\n onClickCapture={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onDoubleClickCapture={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onMouseDownCapture={handleMouseDown}\n title=\"拖拽调整列宽\"\n />\n </span>\n );\n}\n\nexport const DataManagementList: React.FC<DataManagementListProps> = ({\n appType,\n formUuid,\n detailBasePath,\n menuFormUuid,\n readonly = false,\n fullHeight = true,\n title,\n formTitle,\n formType: propFormType,\n forcedConfig,\n showForcedConfig = true,\n detailRenderer,\n detailPageUrlBuilder,\n submitRenderer,\n requestOverride,\n rowActions = [],\n}) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const api = useMemo(() => {\n if (typeof requestOverride === 'function') {\n return createFormRuntimeApi({ request: requestOverride });\n }\n return createFormRuntimeApi(requestOverride);\n }, [requestOverride]);\n\n const [fields, setFields] = useState<DataManagementField[]>([]);\n const [runtimeFormSchema, setRuntimeFormSchema] = useState<FormSchema | null>(null);\n const [config, setConfig] = useState<DataManagementConfig>({});\n const [formType, setFormType] = useState<string>('form');\n const [showFields, setShowFields] = useState<string[]>([]);\n const [lockFieldIds, setLockFieldIds] = useState<string[]>([]);\n const [widths, setWidths] = useState<Record<string, number>>({});\n const widthsRef = useRef<Record<string, number>>({});\n const [sort, setSort] = useState<DataManagementSort[]>([]);\n const [density, setDensity] = useState<DataManagementDensity>('middle');\n const [detailOpenMode, setDetailOpenMode] = useState<'drawer' | 'newPage'>('drawer');\n const [searchKeyWord, setSearchKeyWord] = useState('');\n const [filterGroup, setFilterGroup] = useState<DataManagementFilterGroup>(createGroup);\n const [dataSource, setDataSource] = useState<any[]>([]);\n const [total, setTotal] = useState(0);\n const [current, setCurrent] = useState(1);\n const [pageSize, setPageSize] = useState(10);\n const [loading, setLoading] = useState(false);\n const [schemaLoading, setSchemaLoading] = useState(true);\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);\n const [filterOpen, setFilterOpen] = useState(false);\n const [columnOpen, setColumnOpen] = useState(false);\n const [exportOpen, setExportOpen] = useState(false);\n const [exportScope, setExportScope] = useState<'selected' | 'all'>('all');\n const [exportFields, setExportFields] = useState<string[]>([]);\n const [exporting, setExporting] = useState(false);\n const [importOpen, setImportOpen] = useState(false);\n const [importPreview, setImportPreview] = useState<any[]>([]);\n const [importBase64, setImportBase64] = useState('');\n const [templateDownloading, setTemplateDownloading] = useState(false);\n const [recordsOpen, setRecordsOpen] = useState(false);\n const [recordTab, setRecordTab] = useState<'import' | 'export'>('export');\n const [transferRecords, setTransferRecords] = useState<any[]>([]);\n const [batchApprovalOpen, setBatchApprovalOpen] = useState(false);\n const [batchApprovalAction, setBatchApprovalAction] = useState<'approved' | 'rejected'>(\n 'approved',\n );\n const [batchApprovalComments, setBatchApprovalComments] = useState('');\n const [batchApproving, setBatchApproving] = useState(false);\n const [activeRecord, setActiveRecord] = useState<any | null>(null);\n const [detailOpen, setDetailOpen] = useState(false);\n const [submitOpen, setSubmitOpen] = useState(false);\n const fetchStateRef = useRef<DataManagementFetchState>({});\n const isProcessForm = isProcessFormType(formType);\n\n const request = api.request;\n const getPopupContainer = useCallback(\n (triggerNode?: HTMLElement) =>\n resolveDataManagementPopupContainer(rootRef.current, triggerNode) as HTMLElement,\n [],\n );\n const getOverlayContainer = useCallback(\n () => resolveDataManagementPortalContainer(rootRef.current) as HTMLElement,\n [],\n );\n const drawerWidth = 'min(960px, calc(100vw - 48px))';\n const confirmDanger = useCallback((title: string, content: string, onOk: () => void) => {\n if (confirmAction(title, content)) onOk();\n }, []);\n\n const visibleFields = useMemo(\n () =>\n showFields\n .map((fieldId) => fields.find((field) => field.fieldId === fieldId))\n .filter(Boolean) as DataManagementField[],\n [fields, showFields],\n );\n const forcedShowFieldIds = useMemo(\n () => new Set(forcedConfig?.showFields || []),\n [forcedConfig?.showFields],\n );\n const forcedLockFieldIds = useMemo(\n () => new Set(forcedConfig?.lockFieldIds || []),\n [forcedConfig?.lockFieldIds],\n );\n\n useEffect(() => {\n widthsRef.current = widths;\n }, [widths]);\n\n useEffect(() => {\n fetchStateRef.current = {\n current,\n pageSize,\n searchKeyWord,\n filterGroup,\n sort,\n };\n }, [current, filterGroup, pageSize, searchKeyWord, sort]);\n\n const loadData = useCallback(\n async (overrides: DataManagementFetchState = {}) => {\n if (!appType || !formUuid) return;\n const fetchState = { ...fetchStateRef.current, ...overrides };\n const nextCurrent = fetchState.current || 1;\n const nextPageSize = forcedConfig?.pageSize || fetchState.pageSize || 10;\n const nextFilterGroup = combineFilterGroups(\n forcedConfig?.filter?.group,\n fetchState.filterGroup,\n );\n const nextSort = mergeSorts(forcedConfig?.sort, fetchState.sort);\n const nextSearchKeyWord = combineSearchKeywords(\n forcedConfig?.filter?.searchKeyWord,\n fetchState.searchKeyWord,\n );\n fetchStateRef.current = {\n ...fetchState,\n current: nextCurrent,\n pageSize: nextPageSize,\n };\n setLoading(true);\n try {\n const result = await advancedSearchDataManagement(request, {\n appType,\n formUuid,\n currentPage: nextCurrent,\n pageSize: nextPageSize,\n searchKeyWord: nextSearchKeyWord,\n filters: nextFilterGroup,\n order: nextSort,\n });\n setDataSource(result.records);\n setTotal(result.total);\n setCurrent(nextCurrent);\n setPageSize(nextPageSize);\n } catch (error) {\n console.error('[DataManagementList] loadData failed:', error);\n message.error('加载数据失败');\n } finally {\n setLoading(false);\n }\n },\n [appType, forcedConfig, formUuid, request],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadSchemaAndConfig = async () => {\n if (!appType || !formUuid) return;\n setSchemaLoading(true);\n setDataSource([]);\n setTotal(0);\n setSelectedRowKeys([]);\n try {\n const schemaResult = await getDataManagementSchema(request, { appType, formUuid });\n if (!mounted) return;\n const allFields = uniqueFields([\n ...schemaResult.fields,\n ...getSystemFieldsForFormType(schemaResult.formType),\n ]);\n const saved = await getDataManagementConfig(request, {\n appType,\n formUuid,\n menuFormUuid,\n scope: 'personal',\n }).catch(() => undefined);\n if (!mounted) return;\n const resolved = normalizeColumnConfig(saved, allFields);\n const forcedResolved = forcedConfig ? normalizeColumnConfig(forcedConfig, allFields) : null;\n const forcedShowFields = forcedResolved?.showFields || [];\n const forcedLockFieldIds = forcedResolved?.lockFieldIds || [];\n const nextShowFields =\n forcedConfig?.showFields && forcedConfig.showFields.length > 0\n ? uniqueStrings([...forcedShowFields, ...resolved.showFields])\n : resolved.showFields;\n const nextLockFieldIds = uniqueStrings([...forcedLockFieldIds, ...resolved.lockFieldIds]);\n const nextSort = mergeSorts(forcedResolved?.sort, resolved.sort);\n const nextSearchKeyWord = saved?.filter?.searchKeyWord || '';\n const nextFilterGroup = hydrateFilterGroup(saved?.filter?.group);\n const nextFormType = propFormType || schemaResult.formType || 'form';\n setFields(allFields);\n setRuntimeFormSchema(\n schemaResult.schema ||\n buildFallbackFormSchema({\n appType,\n formUuid,\n title: formTitle || title,\n formType: nextFormType,\n fields: allFields,\n }),\n );\n setFormType(nextFormType);\n setConfig(saved || {});\n setShowFields(nextShowFields);\n setWidths(resolved.widths);\n setLockFieldIds(nextLockFieldIds);\n setSort(nextSort);\n setDensity(forcedConfig?.density || resolved.density);\n setDetailOpenMode(forcedConfig?.detailOpenMode || resolved.detailOpenMode);\n setPageSize(forcedConfig?.pageSize || resolved.pageSize);\n setSearchKeyWord(nextSearchKeyWord);\n setFilterGroup(nextFilterGroup);\n await loadData({\n current: 1,\n pageSize: forcedConfig?.pageSize || resolved.pageSize,\n searchKeyWord: nextSearchKeyWord,\n filterGroup: nextFilterGroup,\n sort: nextSort,\n });\n } catch (error) {\n console.error('[DataManagementList] load schema failed:', error);\n message.error('加载表单配置失败');\n } finally {\n if (mounted) setSchemaLoading(false);\n }\n };\n loadSchemaAndConfig();\n return () => {\n mounted = false;\n };\n }, [\n appType,\n forcedConfig,\n formTitle,\n formUuid,\n loadData,\n menuFormUuid,\n propFormType,\n request,\n title,\n ]);\n\n const persistConfig = useCallback(\n async (patch: DataManagementConfig) => {\n const personalPatch = stripForcedConfigPatch(patch, forcedConfig);\n const nextConfig = { ...config, ...personalPatch };\n setConfig(nextConfig);\n await saveDataManagementConfig(request, {\n appType,\n formUuid,\n menuFormUuid,\n scope: 'personal',\n config: nextConfig,\n }).catch((error) => {\n console.error('[DataManagementList] save config failed:', error);\n message.warning('配置保存失败,本次仅在当前页面生效');\n });\n },\n [appType, config, forcedConfig, formUuid, menuFormUuid, request],\n );\n\n const handleColumnCommit = async () => {\n setColumnOpen(false);\n await persistConfig({\n showFields,\n lockFieldIds,\n widths,\n sort,\n density,\n detailOpenMode,\n pageSize,\n });\n await loadData({ current: 1, pageSize, sort });\n };\n\n const handleSortChange = (index: number, patch: Partial<DataManagementSort>) => {\n setSort((prev) =>\n prev.map((item, itemIndex) => (itemIndex === index ? { ...item, ...patch } : item)),\n );\n };\n\n const handleAddSort = () => {\n const firstFieldId = showFields[0] || fields[0]?.fieldId;\n if (!firstFieldId) return;\n setSort((prev) => [...prev, { id: firstFieldId, isAsc: 'y' }]);\n };\n\n const handleRemoveSort = (index: number) => {\n setSort((prev) => prev.filter((_, itemIndex) => itemIndex !== index));\n };\n\n const updateColumnWidth = useCallback((fieldId: string, width: number) => {\n const nextWidth = Math.round(Math.max(96, Math.min(520, width)));\n widthsRef.current = { ...widthsRef.current, [fieldId]: nextWidth };\n setWidths(widthsRef.current);\n }, []);\n\n const commitColumnWidth = useCallback(\n (fieldId: string, width: number) => {\n const nextWidth = Math.round(Math.max(96, Math.min(520, width)));\n const nextWidths = { ...widthsRef.current, [fieldId]: nextWidth };\n widthsRef.current = nextWidths;\n setWidths(nextWidths);\n void persistConfig({ widths: nextWidths });\n },\n [persistConfig],\n );\n\n const handleDetail = useCallback(\n (record: any) => {\n const formInstanceId = getRecordId(record);\n if (!formInstanceId) {\n message.warning('当前记录缺少实例 ID,无法打开详情');\n return;\n }\n if (detailOpenMode === 'newPage' && typeof window !== 'undefined') {\n const detailUrl =\n detailPageUrlBuilder?.({ record, formInstanceId: String(formInstanceId) }) ||\n buildDefaultDetailUrl({\n appType,\n formUuid,\n formType,\n formInstanceId: String(formInstanceId),\n basePath: detailBasePath,\n });\n if (detailUrl) {\n window.open(detailUrl, '_blank');\n return;\n }\n }\n setActiveRecord(record);\n setDetailOpen(true);\n },\n [appType, detailBasePath, detailOpenMode, detailPageUrlBuilder, formType, formUuid],\n );\n\n const handleDelete = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n await deleteDataManagementRows(request, { appType, formUuid, formInstanceIds: ids });\n setSelectedRowKeys([]);\n await loadData({ current, pageSize });\n },\n [appType, current, formUuid, loadData, pageSize, request],\n );\n\n const getSelectedRecordIds = useCallback(\n () =>\n selectedRowKeys.map((key) => {\n const record = dataSource.find((item) => String(getRecordId(item)) === String(key));\n return String(getSelectedRecordId(record, key));\n }),\n [dataSource, selectedRowKeys],\n );\n\n const handleBatchApprove = () => {\n if (!isProcessForm) return;\n if (selectedRowKeys.length === 0) return;\n setBatchApprovalOpen(true);\n };\n\n const handleBatchApprovalConfirm = async () => {\n const ids = getSelectedRecordIds();\n if (ids.length === 0) return;\n setBatchApproving(true);\n try {\n await batchApproveDataManagementRows(request, {\n appType,\n formUuid,\n formInstanceIds: ids,\n action: batchApprovalAction,\n comments: batchApprovalComments || undefined,\n });\n message.success(`批量${batchApprovalAction === 'approved' ? '通过' : '拒绝'}已提交`);\n setSelectedRowKeys([]);\n setBatchApprovalOpen(false);\n setBatchApprovalAction('approved');\n setBatchApprovalComments('');\n await loadData({ current, pageSize });\n } catch (error) {\n console.error('[DataManagementList] batch approval failed:', error);\n message.error('批量审批失败');\n } finally {\n setBatchApproving(false);\n }\n };\n\n const handleExport = async (scope: 'selected' | 'all') => {\n const selectedIds = scope === 'selected' ? getSelectedRecordIds() : [];\n if (scope === 'selected' && selectedIds.length === 0) {\n message.warning('请先选择要导出的记录');\n return;\n }\n\n const selectedFilterGroup = createSelectedIdFilterGroup(selectedIds);\n const exportFilters =\n scope === 'selected'\n ? combineFilterGroups(forcedConfig?.filter?.group, selectedFilterGroup)\n : combineFilterGroups(forcedConfig?.filter?.group, filterGroup);\n const exportSort = mergeSorts(forcedConfig?.sort, sort);\n const exportSearchKeyWord = combineSearchKeywords(\n forcedConfig?.filter?.searchKeyWord,\n scope === 'selected' ? undefined : searchKeyWord,\n );\n\n setExporting(true);\n try {\n const response = await exportDataManagementRows(request, {\n appType,\n formUuid,\n currentPage: scope === 'selected' ? 1 : current,\n pageSize: scope === 'selected' ? selectedIds.length : pageSize,\n searchKeyWord: exportSearchKeyWord,\n filters: exportFilters,\n order: exportSort,\n exportAll: scope === 'all' ? 'y' : 'n',\n exportFields,\n });\n await downloadBlobResponse(\n response,\n `${scope === 'selected' ? '选中导出' : '全部导出'}-${formUuid}.xlsx`,\n );\n setExportOpen(false);\n } catch (error) {\n console.error('[DataManagementList] export failed:', error);\n message.error('导出失败');\n } finally {\n setExporting(false);\n }\n };\n\n const handleDownloadTemplate = async () => {\n setTemplateDownloading(true);\n try {\n const response = await downloadDataManagementImportTemplate(request, { appType, formUuid });\n await downloadBlobResponse(response, `导入模板-${formUuid}.xlsx`);\n message.success('模板下载已开始');\n } catch (error) {\n console.error('[DataManagementList] download template failed:', error);\n message.error(error instanceof Error ? error.message : '下载导入模板失败');\n } finally {\n setTemplateDownloading(false);\n }\n };\n\n const loadTransferRecords = async (type: 'import' | 'export') => {\n setRecordTab(type);\n setRecordsOpen(true);\n const result = await getDataManagementTransferRecords(request, {\n appType,\n formUuid,\n type,\n currentPage: 1,\n pageSize: 10,\n });\n setTransferRecords(result.records);\n };\n\n const handleImportPreview = async (file: File) => {\n const base64 = await fileToBase64(file);\n setImportBase64(base64);\n const result = await importPreviewDataManagementRows(request, {\n appType,\n formUuid,\n fileBase64: base64,\n });\n const records = result?.data || result?.records || result?.list || result || [];\n setImportPreview(Array.isArray(records) ? records : []);\n return false;\n };\n\n const handleImportConfirm = async () => {\n if (!importBase64) return;\n await importDataManagementRows(request, { appType, formUuid, fileBase64: importBase64 });\n message.success('导入任务已创建');\n setImportOpen(false);\n setImportPreview([]);\n setImportBase64('');\n await loadData({ current: 1, pageSize });\n };\n\n const columns = useMemo<TableProps<any>['columns']>(() => {\n const baseColumns =\n visibleFields.map((field) => {\n const columnWidth = widths[field.fieldId] || field.width || 160;\n return {\n title: (\n <ResizableColumnTitle\n label={field.label}\n width={columnWidth}\n onResize={(width) => updateColumnWidth(field.fieldId, width)}\n onResizeEnd={(width) => commitColumnWidth(field.fieldId, width)}\n />\n ),\n dataIndex: field.fieldId,\n key: field.fieldId,\n width: columnWidth,\n fixed: lockFieldIds.includes(field.fieldId) ? ('left' as const) : undefined,\n ellipsis: true,\n render: (value: any) => renderCellValue(value, field),\n };\n }) || [];\n return [\n ...baseColumns,\n {\n title: '操作',\n key: '__actions',\n width: 136,\n fixed: 'right' as const,\n render: (_: any, record: any) => (\n <Space size={4}>\n <Button type=\"link\" size=\"small\" onClick={() => handleDetail(record)}>\n 详情\n </Button>\n <Dropdown\n trigger={['click']}\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n ...(!readonly\n ? [\n {\n key: 'delete',\n label: '删除',\n danger: true,\n icon: <DeleteOutlined />,\n onClick: () =>\n confirmDanger('确认删除', '删除后不可恢复,确认继续吗?', () =>\n handleDelete([String(getRecordId(record))]),\n ),\n },\n ]\n : []),\n ...rowActions.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.danger,\n onClick: () => action.onClick(record),\n })),\n ...(isProcessForm\n ? [\n {\n key: 'workflow',\n label: '流程日志',\n icon: <HistoryOutlined />,\n onClick: () =>\n message.info('请通过 detailRenderer 接入流程日志或流程图入口'),\n },\n ]\n : []),\n ],\n }}\n >\n <Button type=\"text\" size=\"small\" icon={<MoreOutlined />} />\n </Dropdown>\n </Space>\n ),\n },\n ];\n }, [\n confirmDanger,\n commitColumnWidth,\n getPopupContainer,\n handleDelete,\n handleDetail,\n isProcessForm,\n lockFieldIds,\n readonly,\n rowActions,\n updateColumnWidth,\n visibleFields,\n widths,\n ]);\n\n const tableSize = density === 'compact' ? 'small' : density === 'loose' ? 'large' : 'middle';\n const tableScrollX = Math.max(\n 900,\n visibleFields.reduce((sum, field) => sum + (widths[field.fieldId] || field.width || 160), 136),\n );\n\n const importPreviewColumns = useMemo<TableProps<any>['columns']>(() => {\n const keys = Array.from(\n new Set(importPreview.flatMap((record) => Object.keys(record || {}))),\n ).slice(0, 16);\n return keys.map((key) => {\n const field = fields.find((item) => item.fieldId === key || item.id === key);\n return {\n title: field?.label || key,\n dataIndex: key,\n key,\n width: 150,\n ellipsis: true,\n render: (value: any) => (field ? renderCellValue(value, field) : formatPrimitive(value)),\n };\n });\n }, [fields, importPreview]);\n\n return (\n <ConfigProvider getPopupContainer={getPopupContainer}>\n <div\n ref={rootRef}\n className={`relative w-full bg-ant-bg-layout ${\n fullHeight ? 'flex h-[calc(100vh-88px)] min-h-[560px] overflow-hidden' : ''\n }`}\n >\n <div className=\"mx-auto flex min-h-0 w-full max-w-[1440px] flex-col px-4 py-4 md:px-6\">\n {title && (\n <div className=\"mb-4\">\n <h2 className=\"m-0 text-xl font-semibold text-ant-color-text\">{title}</h2>\n </div>\n )}\n <div className=\"mb-4 flex flex-col gap-3 md:flex-row md:items-center\">\n <Space wrap>\n {!readonly && (submitRenderer || runtimeFormSchema) && (\n <Button icon={<PlusOutlined />} type=\"primary\" onClick={() => setSubmitOpen(true)}>\n 新增\n </Button>\n )}\n <Input.Search\n allowClear\n className=\"w-[260px]\"\n placeholder=\"搜索关键字\"\n value={searchKeyWord}\n onChange={(event) => setSearchKeyWord(event.target.value)}\n onSearch={(value) => {\n const nextSearchKeyWord = String(value || '');\n setSearchKeyWord(nextSearchKeyWord);\n persistConfig({\n filter: { searchKeyWord: nextSearchKeyWord, group: filterGroup },\n });\n loadData({\n current: 1,\n pageSize,\n searchKeyWord: nextSearchKeyWord,\n filterGroup,\n });\n }}\n />\n <Button icon={<FilterOutlined />} onClick={() => setFilterOpen(true)}>\n 筛选\n </Button>\n <Button icon={<SettingOutlined />} onClick={() => setColumnOpen(true)}>\n 列设置\n </Button>\n <Dropdown\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n {\n key: 'all',\n label: '导出全部',\n onClick: () => {\n setExportScope('all');\n setExportFields(showFields);\n setExportOpen(true);\n },\n },\n {\n key: 'records',\n label: '导出记录',\n onClick: () => loadTransferRecords('export'),\n },\n ],\n }}\n >\n <Button icon={<DownloadOutlined />}>导出</Button>\n </Dropdown>\n {!readonly && (\n <Dropdown\n getPopupContainer={getPopupContainer}\n menu={{\n items: [\n { key: 'import', label: '导入数据', onClick: () => setImportOpen(true) },\n {\n key: 'records',\n label: '导入记录',\n onClick: () => loadTransferRecords('import'),\n },\n ],\n }}\n >\n <Button icon={<ImportOutlined />}>导入</Button>\n </Dropdown>\n )}\n <Button icon={<ReloadOutlined />} onClick={() => loadData({ current, pageSize })} />\n </Space>\n </div>\n\n {selectedRowKeys.length > 0 && (\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-3 rounded-lg border border-ant-border-secondary bg-ant-bg-container px-4 py-3 shadow-sm\">\n <span className=\"text-sm text-ant-color-text-secondary\">\n 已选 {selectedRowKeys.length} 条\n </span>\n <Space wrap>\n <Button\n icon={<DownloadOutlined />}\n onClick={() => {\n setExportScope('selected');\n setExportFields(showFields);\n setExportOpen(true);\n }}\n >\n 导出选中\n </Button>\n {!readonly && isProcessForm && (\n <Button icon={<SwapOutlined />} onClick={handleBatchApprove}>\n 批量审批\n </Button>\n )}\n {!readonly && (\n <Button\n danger\n icon={<DeleteOutlined />}\n onClick={() =>\n confirmDanger(\n '确认批量删除',\n `将删除 ${selectedRowKeys.length} 条数据,确认继续吗?`,\n () => handleDelete(selectedRowKeys.map(String)),\n )\n }\n >\n 批量删除\n </Button>\n )}\n <Button type=\"link\" onClick={() => setSelectedRowKeys([])}>\n 取消选择\n </Button>\n </Space>\n </div>\n )}\n\n <div className=\"relative flex-1 overflow-hidden rounded-lg border border-ant-border-secondary bg-ant-bg-container\">\n <Table\n rowKey={(record) => String(getRecordId(record))}\n loading={loading || schemaLoading}\n columns={columns}\n dataSource={dataSource}\n size={tableSize as TableProps<any>['size']}\n scroll={{\n x: tableScrollX,\n y: fullHeight\n ? selectedRowKeys.length > 0\n ? 'calc(100vh - 360px)'\n : 'calc(100vh - 300px)'\n : undefined,\n }}\n rowSelection={{\n selectedRowKeys,\n onChange: setSelectedRowKeys,\n }}\n pagination={{\n current,\n pageSize,\n total,\n showSizeChanger: true,\n showTotal: (count) => `共 ${count} 条`,\n }}\n onChange={(pagination) => {\n loadData({\n current: pagination.current || 1,\n pageSize: pagination.pageSize || pageSize,\n sort,\n });\n }}\n />\n </div>\n </div>\n\n <Modal\n getContainer={getOverlayContainer}\n title=\"高级筛选\"\n open={filterOpen}\n width={760}\n onCancel={() => setFilterOpen(false)}\n onOk={() => {\n setFilterOpen(false);\n persistConfig({ filter: { searchKeyWord, group: filterGroup } });\n loadData({ current: 1, pageSize, searchKeyWord, filterGroup });\n }}\n okText=\"应用筛选\"\n >\n {showForcedConfig && hasFilterContent(forcedConfig?.filter?.group) && (\n <Alert\n className=\"mb-4\"\n type=\"info\"\n showIcon\n message=\"当前列表包含页面强制筛选条件\"\n description=\"这些条件由页面设计配置固定生效,个人筛选会在此基础上继续叠加。\"\n />\n )}\n <FilterGroupEditor\n group={filterGroup}\n fields={fields}\n api={api}\n onChange={setFilterGroup}\n />\n </Modal>\n\n <Modal\n getContainer={getOverlayContainer}\n title=\"列设置\"\n open={columnOpen}\n width={920}\n onCancel={() => setColumnOpen(false)}\n onOk={handleColumnCommit}\n >\n <div className=\"space-y-5\">\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">显示列</div>\n <Checkbox.Group\n className=\"grid grid-cols-2 gap-2 md:grid-cols-3\"\n value={showFields}\n options={fields.map((field) => ({\n label: field.label,\n value: field.fieldId,\n disabled: forcedShowFieldIds.has(field.fieldId),\n }))}\n onChange={(values) =>\n setShowFields(\n uniqueStrings([...Array.from(forcedShowFieldIds), ...values.map(String)]),\n )\n }\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">冻结列</div>\n <Select\n mode=\"multiple\"\n className=\"w-full\"\n value={lockFieldIds}\n options={showFields.map((fieldId) => {\n const field = fields.find((item) => item.fieldId === fieldId);\n return {\n label: field?.label || fieldId,\n value: fieldId,\n disabled: forcedLockFieldIds.has(fieldId),\n };\n })}\n onChange={(values) =>\n setLockFieldIds(uniqueStrings([...Array.from(forcedLockFieldIds), ...values]))\n }\n />\n </div>\n <Divider className=\"my-1\" />\n <div>\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium text-ant-color-text\">排序规则</span>\n <Button size=\"small\" onClick={handleAddSort} disabled={fields.length === 0}>\n 添加排序\n </Button>\n </div>\n <div className=\"space-y-2\">\n {sort.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-ant-border-secondary px-3 py-4 text-center text-sm text-ant-color-text-tertiary\">\n 暂无排序规则\n </div>\n ) : (\n sort.map((item, index) => (\n <div key={`${item.id}_${index}`} className=\"flex items-center gap-2\">\n <Select\n className=\"min-w-0 flex-1\"\n value={item.id}\n options={fields.map((field) => ({\n label: field.label,\n value: field.fieldId,\n }))}\n onChange={(value) => handleSortChange(index, { id: value })}\n />\n <Segmented\n value={item.isAsc}\n options={[\n { label: '升序', value: 'y' },\n { label: '降序', value: 'n' },\n ]}\n onChange={(value) => handleSortChange(index, { isAsc: value as 'y' | 'n' })}\n />\n <Button\n danger\n type=\"text\"\n icon={<DeleteOutlined />}\n onClick={() => handleRemoveSort(index)}\n />\n </div>\n ))\n )}\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">表格密度</div>\n <Segmented\n block\n value={density}\n options={[\n { label: '紧凑', value: 'compact' },\n { label: '标准', value: 'middle' },\n { label: '宽松', value: 'loose' },\n ]}\n onChange={(value) => setDensity(value as DataManagementDensity)}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">详情打开方式</div>\n <Segmented\n block\n value={detailOpenMode}\n options={[\n { label: '抽屉', value: 'drawer' },\n { label: '新页', value: 'newPage' },\n ]}\n onChange={(value) => setDetailOpenMode(value as 'drawer' | 'newPage')}\n />\n </div>\n <div>\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">页大小</div>\n <Select\n className=\"w-full\"\n value={pageSize}\n options={[10, 20, 50, 100].map((value) => ({ label: `${value} 条`, value }))}\n onChange={setPageSize}\n />\n </div>\n </div>\n </div>\n </Modal>\n\n <Modal\n getContainer={getOverlayContainer}\n title={exportScope === 'selected' ? '导出选中数据' : '导出全部数据'}\n open={exportOpen}\n onCancel={() => setExportOpen(false)}\n footer={\n <Space>\n <Button onClick={() => setExportOpen(false)}>取消</Button>\n <Button\n type=\"primary\"\n loading={exporting}\n disabled={exportScope === 'selected' && selectedRowKeys.length === 0}\n onClick={() => handleExport(exportScope)}\n >\n {exportScope === 'selected' ? `导出选中 (${selectedRowKeys.length})` : '导出全部'}\n </Button>\n </Space>\n }\n >\n <Checkbox.Group\n className=\"grid grid-cols-2 gap-2\"\n value={exportFields}\n options={fields.map((field) => ({ label: field.label, value: field.fieldId }))}\n onChange={(values) => setExportFields(values.map(String))}\n />\n </Modal>\n\n <Modal\n getContainer={getOverlayContainer}\n title=\"批量审批\"\n open={batchApprovalOpen}\n onCancel={() => setBatchApprovalOpen(false)}\n onOk={handleBatchApprovalConfirm}\n okText={batchApprovalAction === 'approved' ? '确认通过' : '确认拒绝'}\n confirmLoading={batchApproving}\n >\n <div className=\"space-y-4\">\n <div className=\"text-sm text-ant-color-text-secondary\">\n 已选择 {selectedRowKeys.length} 条记录\n </div>\n <Segmented\n block\n value={batchApprovalAction}\n options={[\n { label: '同意', value: 'approved' },\n { label: '拒绝', value: 'rejected' },\n ]}\n onChange={(value) => setBatchApprovalAction(value as 'approved' | 'rejected')}\n />\n <Input.TextArea\n value={batchApprovalComments}\n rows={4}\n maxLength={500}\n showCount\n placeholder=\"填写审批意见\"\n onChange={(event) => setBatchApprovalComments(event.target.value)}\n />\n </div>\n </Modal>\n\n <Modal\n getContainer={getOverlayContainer}\n title=\"导入数据\"\n open={importOpen}\n width={720}\n onCancel={() => setImportOpen(false)}\n onOk={handleImportConfirm}\n okButtonProps={{ disabled: !importBase64 }}\n okText=\"确认导入\"\n >\n <div className=\"mb-3 flex flex-col gap-3 rounded-lg border border-ant-border-secondary bg-ant-bg-container px-4 py-3 md:flex-row md:items-center md:justify-between\">\n <div>\n <div className=\"text-sm font-medium text-ant-color-text\">导入模板</div>\n <div className=\"mt-1 text-xs text-ant-color-text-secondary\">\n 先下载模板填写数据,再上传 Excel 文件导入\n </div>\n </div>\n <Button\n icon={<DownloadOutlined />}\n loading={templateDownloading}\n onClick={handleDownloadTemplate}\n >\n 下载导入模板\n </Button>\n </div>\n <Upload.Dragger\n accept=\".xlsx,.xls\"\n maxCount={1}\n beforeUpload={handleImportPreview}\n onRemove={() => {\n setImportBase64('');\n setImportPreview([]);\n }}\n >\n <p className=\"text-ant-color-text-secondary\">拖拽 Excel 文件到此处,或点击选择文件</p>\n </Upload.Dragger>\n {importPreview.length > 0 && (\n <div className=\"mt-4\">\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">导入预览</div>\n <Table\n size=\"small\"\n dataSource={importPreview}\n columns={importPreviewColumns}\n scroll={{ x: Math.max(600, (importPreviewColumns?.length || 0) * 150) }}\n pagination={false}\n rowKey={(_, index) => String(index)}\n />\n </div>\n )}\n </Modal>\n\n <Drawer\n styles={{ body: { padding: 24, overflow: 'auto' } }}\n getContainer={getOverlayContainer}\n title={recordTab === 'import' ? '导入记录' : '导出记录'}\n open={recordsOpen}\n width={drawerWidth}\n onClose={() => setRecordsOpen(false)}\n >\n <Segmented\n value={recordTab}\n options={[\n { label: '导入记录', value: 'import' },\n { label: '导出记录', value: 'export' },\n ]}\n onChange={(value) => loadTransferRecords(value as 'import' | 'export')}\n />\n <Table\n className=\"mt-4\"\n size=\"small\"\n dataSource={transferRecords}\n rowKey={(record) => record.id || record.recordId}\n />\n </Drawer>\n\n <Drawer\n styles={{ body: { padding: 0, overflow: 'auto' } }}\n getContainer={getOverlayContainer}\n title=\"详情\"\n open={detailOpen}\n width={drawerWidth}\n onClose={() => setDetailOpen(false)}\n destroyOnClose\n >\n {activeRecord && detailRenderer ? (\n detailRenderer({\n record: activeRecord,\n formInstanceId: String(getRecordId(activeRecord)),\n onClose: () => setDetailOpen(false),\n })\n ) : activeRecord && runtimeFormSchema ? (\n <StandardFormPage\n schema={runtimeFormSchema}\n mode={isProcessForm ? 'process' : 'detail'}\n appType={appType}\n formUuid={formUuid}\n formInstanceId={String(getRecordId(activeRecord))}\n inDrawer\n />\n ) : (\n <Empty description=\"请通过 detailRenderer 接入详情模板\" />\n )}\n </Drawer>\n\n <Drawer\n styles={{ body: { padding: 0, overflow: 'auto' } }}\n getContainer={getOverlayContainer}\n title=\"新增数据\"\n open={submitOpen}\n width={drawerWidth}\n onClose={() => setSubmitOpen(false)}\n destroyOnClose\n >\n {submitRenderer ? (\n submitRenderer({\n onClose: () => setSubmitOpen(false),\n onSubmitted: () => {\n setSubmitOpen(false);\n loadData({ current: 1, pageSize });\n },\n })\n ) : runtimeFormSchema ? (\n <StandardFormPage\n schema={runtimeFormSchema}\n mode=\"submit\"\n appType={appType}\n formUuid={formUuid}\n inDrawer\n onSubmitSuccess={() => {\n setSubmitOpen(false);\n loadData({ current: 1, pageSize });\n }}\n />\n ) : (\n <Empty description=\"请通过 submitRenderer 接入提交模板\" />\n )}\n </Drawer>\n </div>\n </ConfigProvider>\n );\n};\n","import React, { useMemo } from 'react';\nimport type { FormEngineConfig, FormSchema, StandardFormPageMode } from '../types';\nimport { FormDetailTemplate } from './FormDetailTemplate';\nimport { FormSubmitTemplate } from './FormSubmitTemplate';\nimport { ProcessDetailTemplate } from './ProcessDetailTemplate';\n\nexport interface StandardFormPageProps {\n schema: FormSchema;\n mode?: StandardFormPageMode;\n initialValues?: Record<string, any> | null;\n permissions?: FormEngineConfig['permissions'];\n formUuid?: string;\n appType?: string;\n formInstanceId?: string;\n onSubmit?: (values: Record<string, any>) => Promise<any>;\n onSubmitSuccess?: (formInstId: string) => void;\n inDrawer?: boolean;\n}\n\nconst shouldForwardFullSubmitPayload = (\n payload: Record<string, any> | undefined,\n formType: 'form' | 'process',\n) =>\n formType === 'process' ||\n !!payload?.selectedApprovers ||\n !!payload?.initiatorSelectedApprovers ||\n !!payload?.submissionDepartmentId;\n\nconst normalizeStandardFormType = (value?: string): 'form' | 'process' => {\n const raw = String(value || '').toLowerCase();\n return raw === 'process' || raw === 'flow' ? 'process' : 'form';\n};\n\nexport const StandardFormPage: React.FC<StandardFormPageProps> = ({\n schema,\n mode,\n initialValues,\n permissions,\n formUuid,\n appType,\n formInstanceId,\n onSubmit,\n onSubmitSuccess,\n inDrawer,\n}) => {\n const resolvedMode = mode || schema.template?.defaultMode || 'submit';\n const resolvedFormUuid = formUuid || schema.formMeta.formUuid;\n const resolvedAppType = appType || schema.formMeta.appType;\n const formType = normalizeStandardFormType(\n schema.template?.formType || (resolvedMode === 'process' ? 'process' : 'form'),\n );\n\n const api = useMemo<FormEngineConfig['api'] | undefined>(() => {\n if (!onSubmit) return undefined;\n return {\n submitFormData: async (payload) =>\n onSubmit(\n shouldForwardFullSubmitPayload(payload, formType) ? payload : (payload?.data ?? payload),\n ),\n updateFormData: async (payload) => {\n const raw = payload?.updateFormDataJson;\n const values = typeof raw === 'string' ? JSON.parse(raw) : payload;\n return onSubmit(values);\n },\n };\n }, [formType, onSubmit]);\n\n if (resolvedMode === 'process') {\n return (\n <ProcessDetailTemplate\n schema={schema}\n formUuid={resolvedFormUuid}\n appType={resolvedAppType}\n formInstanceId={formInstanceId || ''}\n enableEdit={schema.template?.enableEdit}\n enableDelete={schema.template?.enableDelete}\n enableChangeRecords={schema.template?.enableChangeRecords}\n inDrawer={inDrawer}\n />\n );\n }\n\n if (resolvedMode === 'readonly' || resolvedMode === 'detail') {\n return (\n <FormDetailTemplate\n schema={schema}\n formUuid={resolvedFormUuid}\n appType={resolvedAppType}\n formInstanceId={formInstanceId || ''}\n enableEdit={schema.template?.enableEdit}\n enableDelete={schema.template?.enableDelete}\n enableChangeRecords={schema.template?.enableChangeRecords}\n inDrawer={inDrawer}\n />\n );\n }\n\n return (\n <FormSubmitTemplate\n schema={schema}\n config={{\n mode: resolvedMode,\n formUuid: resolvedFormUuid,\n appType: resolvedAppType,\n formInstanceId,\n permissions,\n api,\n }}\n formType={formType}\n submitSuccessMode={schema.template?.submitSuccessMode}\n enableDraft={schema.template?.enableDraft}\n enableProcessPreview={schema.template?.enableProcessPreview}\n initialValues={initialValues ?? undefined}\n onSubmitSuccess={onSubmitSuccess}\n inDrawer={inDrawer}\n />\n );\n};\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport dayjs from 'dayjs';\nimport type { FormSchema, FormInstanceData, FieldBehavior } from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { useFormContext } from '../core/FormContext';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { FormShell } from '../core/FormShell';\nimport { validateAndNotify } from '../core/validationFeedback';\nimport { useFormDetail } from '../hooks/useFormDetail';\nimport { useChangeRecords } from '../hooks/useChangeRecords';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { SummaryPanel } from '../modules/SummaryPanel';\nimport { RecordChangePanel } from '../modules/RecordChangePanel';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { PageSkeleton } from './PageSkeleton';\n\nexport interface FormDetailTemplateProps {\n schema: FormSchema;\n formUuid: string;\n appType: string;\n formInstanceId: string;\n enableEdit?: boolean;\n enableDelete?: boolean;\n enableChangeRecords?: boolean;\n header?: React.ReactNode;\n footer?: React.ReactNode;\n renderSummary?: (data: FormInstanceData) => React.ReactNode;\n renderActions?: (actions: ActionConfig[]) => React.ReactNode;\n onDelete?: () => void;\n onSave?: (values: Record<string, any>) => void;\n inDrawer?: boolean;\n}\n\nfunction FormDataBridge({\n formDataRef,\n validateRef,\n}: {\n formDataRef: React.MutableRefObject<(() => Record<string, any>) | undefined>;\n validateRef: React.MutableRefObject<(() => Promise<Record<string, string>>) | undefined>;\n}) {\n const { getFormData, validateAllWithErrors } = useFormContext();\n formDataRef.current = getFormData;\n validateRef.current = validateAllWithErrors;\n return null;\n}\n\nconst formatDateTime = (value?: React.ReactNode) => {\n if (!value || typeof value !== 'string') return value || '-';\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.format('YYYY-MM-DD HH:mm:ss') : value;\n};\n\nconst InnerDetailContent: React.FC<FormDetailTemplateProps> = ({\n schema,\n formUuid,\n appType,\n formInstanceId,\n enableEdit = true,\n enableDelete = false,\n enableChangeRecords = false,\n header,\n footer,\n renderSummary,\n renderActions,\n onDelete,\n onSave,\n inDrawer = false,\n}) => {\n const formDataRef = useRef<(() => Record<string, any>) | undefined>(undefined);\n const validateRef = useRef<(() => Promise<Record<string, string>>) | undefined>(undefined);\n const [accessDenied, setAccessDenied] = useState(false);\n const fieldIds = useMemo(() => schema.fields.map((field) => field.fieldId), [schema.fields]);\n const {\n loading,\n mode,\n formData,\n instanceInfo,\n fieldBehaviors,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n canEdit,\n canDelete,\n canViewChangeRecords,\n } = useFormDetail({\n formUuid,\n appType,\n formInstanceId,\n fieldIds,\n onPermissionDenied: () => setAccessDenied(true),\n });\n\n const {\n records,\n loading: recordsLoading,\n total: recordsTotal,\n page: recordsPage,\n hasMore,\n loadMore,\n refresh: refreshRecords,\n } = useChangeRecords({\n formUuid,\n appType,\n formInstanceId,\n autoLoad: enableChangeRecords && canViewChangeRecords,\n });\n\n const handleSave = useCallback(async () => {\n if (validateRef.current && !(await validateAndNotify(validateRef.current))) return;\n const values = formDataRef.current?.() ?? formData;\n if (!values) return;\n const success = await saveChanges(values);\n if (success) {\n onSave?.(values);\n }\n }, [formData, saveChanges, onSave]);\n\n const handleDelete = useCallback(async () => {\n const success = await deleteInstance();\n if (success) {\n onDelete?.();\n }\n }, [deleteInstance, onDelete]);\n\n const handleCancel = useCallback(() => {\n switchToReadonly();\n }, [switchToReadonly]);\n\n const readonlyActions: ActionConfig[] = [];\n if (enableEdit && canEdit) {\n readonlyActions.push({\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n });\n }\n if (enableDelete && canDelete) {\n readonlyActions.push({\n key: 'delete',\n label: '删除',\n type: 'danger',\n onClick: handleDelete,\n confirm: { title: '确认删除', content: '删除后将无法恢复,确认要删除吗?' },\n });\n }\n\n const editActions: ActionConfig[] = [\n { key: 'cancel', label: '取消', type: 'default', onClick: handleCancel },\n { key: 'save', label: '保存', type: 'primary', onClick: handleSave },\n ];\n\n const currentActions = mode === 'readonly' ? readonlyActions : editActions;\n\n const formConfig = {\n mode: mode === 'edit' ? ('edit' as const) : ('readonly' as const),\n formUuid,\n appType,\n formInstanceId,\n permissions: {\n fieldPermissions: fieldBehaviors as Record<string, FieldBehavior>,\n operations: [] as string[],\n },\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-ant-bg-layout\">\n <div className=\"max-w-4xl mx-auto py-8 px-6 pb-24\">\n <PageSkeleton type=\"detail\" />\n </div>\n </div>\n );\n }\n\n const actionsNode =\n currentActions.length > 0 ? (\n renderActions ? (\n renderActions(currentActions)\n ) : (\n <StickyActionBar actions={currentActions} align=\"center\" inDrawer={inDrawer} />\n )\n ) : null;\n\n return (\n <RuntimePageShell\n actions={actionsNode}\n accessDenied={accessDenied}\n contentClassName=\"sy-detail-page\"\n inDrawer={inDrawer}\n maxWidth=\"100%\"\n >\n <div className=\"sy-detail-header\">\n <div className=\"sy-detail-header-inner\">\n {header}\n\n {renderSummary && instanceInfo ? (\n renderSummary(instanceInfo)\n ) : (\n <SummaryPanel\n title={instanceInfo?.title || instanceInfo?.instanceTitle || schema.formMeta.title}\n showEyebrow={false}\n creator={\n instanceInfo?.creator || instanceInfo?.createdByName\n ? {\n name: instanceInfo?.creator?.name || instanceInfo?.createdByName,\n avatar: instanceInfo?.creator?.avatar,\n department:\n instanceInfo?.creator?.department || instanceInfo?.createdByDepartmentName,\n }\n : undefined\n }\n createdAt={formatDateTime(instanceInfo?.createdAt)}\n metaItems={[\n {\n key: 'creator',\n label: '提交人',\n value: instanceInfo?.creator?.name || instanceInfo?.createdByName || '未知用户',\n },\n {\n key: 'department',\n label: '提交人部门',\n value:\n instanceInfo?.creator?.department ||\n instanceInfo?.createdByDepartmentName ||\n '-',\n },\n {\n key: 'createdAt',\n label: '提交时间',\n value: formatDateTime(instanceInfo?.createdAt),\n },\n ]}\n className=\"sy-detail-summary-panel\"\n status={mode === 'edit' ? { label: '编辑中', tone: 'brand' } : undefined}\n />\n )}\n </div>\n </div>\n\n <div className=\"sy-detail-main\">\n {mode === 'edit' && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg px-4 py-3 text-sm text-blue-700 transition-all duration-150\">\n 正在编辑,修改后请保存\n </div>\n )}\n\n <div className=\"sy-detail-card\">\n <FormProvider schema={schema} config={formConfig} initialValues={formData ?? undefined}>\n <FormShell appearance={schema.template?.appearance} className=\"sy-form-shell\">\n <FormDataBridge formDataRef={formDataRef} validateRef={validateRef} />\n <FormRenderer\n columns={schema.template?.appearance?.columns ?? 2}\n size={schema.template?.appearance?.rendererSize ?? 'default'}\n />\n </FormShell>\n </FormProvider>\n </div>\n\n {enableChangeRecords && canViewChangeRecords && (\n <div className=\"mt-6\">\n <RecordChangePanel\n records={records}\n loading={recordsLoading}\n total={recordsTotal}\n page={recordsPage}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onRefresh={refreshRecords}\n onExpand={refreshRecords}\n />\n </div>\n )}\n\n {footer}\n </div>\n </RuntimePageShell>\n );\n};\n\nexport const FormDetailTemplate: React.FC<FormDetailTemplateProps> = (props) => {\n const { schema, formUuid, appType, formInstanceId } = props;\n\n const wrapperConfig = {\n mode: 'readonly' as const,\n formUuid,\n appType,\n formInstanceId,\n };\n\n return (\n <FormProvider schema={schema} config={wrapperConfig}>\n <InnerDetailContent {...props} />\n </FormProvider>\n );\n};\n","import React from 'react';\nimport { Skeleton } from 'antd';\n\nexport interface PageSkeletonProps {\n type: 'submit' | 'detail' | 'process';\n}\n\nconst CardSkeleton: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-100 p-6\">{children}</div>\n);\n\nconst SummaryCardSkeleton: React.FC = () => (\n <CardSkeleton>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <Skeleton.Input active size=\"large\" style={{ width: 200 }} />\n <div className=\"mt-2\">\n <Skeleton.Input active size=\"small\" style={{ width: 80 }} />\n </div>\n </div>\n <Skeleton.Button active size=\"small\" shape=\"round\" style={{ width: 60 }} />\n </div>\n <div className=\"flex items-center gap-3 mt-4\">\n <Skeleton.Avatar active size=\"small\" />\n <Skeleton.Input active size=\"small\" style={{ width: 120 }} />\n </div>\n </CardSkeleton>\n);\n\nconst FormGridSkeleton: React.FC = () => (\n <CardSkeleton>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"space-y-2\">\n <Skeleton.Input active size=\"small\" style={{ width: 80 }} />\n <Skeleton.Input active block style={{ width: '100%' }} />\n </div>\n ))}\n </div>\n </CardSkeleton>\n);\n\nconst ActionBarSkeleton: React.FC = () => (\n <div className=\"fixed bottom-0 left-0 right-0 backdrop-blur-lg bg-white/80 border-t border-gray-200 px-6 py-3\">\n <div className=\"flex items-center justify-end gap-3\">\n <Skeleton.Button active style={{ width: 80 }} />\n <Skeleton.Button active style={{ width: 80 }} />\n </div>\n </div>\n);\n\nconst TimelineSkeleton: React.FC = () => (\n <CardSkeleton>\n <Skeleton.Input active size=\"medium\" style={{ width: 100, marginBottom: 16 }} />\n <div className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-3 h-3 rounded-full bg-gray-200 animate-pulse\" />\n {i < 2 && <div className=\"w-0.5 flex-1 bg-gray-200 mt-1\" />}\n </div>\n <div className=\"flex-1 pb-4\">\n <Skeleton active paragraph={{ rows: 1 }} title={{ width: '60%' }} />\n </div>\n </div>\n ))}\n </div>\n </CardSkeleton>\n);\n\nexport const PageSkeleton: React.FC<PageSkeletonProps> = ({ type }) => {\n if (type === 'submit') {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Skeleton.Input active size=\"large\" style={{ width: 200 }} />\n <Skeleton.Input active size=\"small\" style={{ width: 300 }} />\n </div>\n <FormGridSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n }\n\n if (type === 'detail') {\n return (\n <div className=\"space-y-6\">\n <SummaryCardSkeleton />\n <FormGridSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <SummaryCardSkeleton />\n <FormGridSkeleton />\n <TimelineSkeleton />\n <ActionBarSkeleton />\n </div>\n );\n};\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\nimport { Button, message, Modal, Select } from 'antd';\nimport { CheckCircleFilled } from '@ant-design/icons';\nimport type {\n FormSchema,\n FormEngineConfig,\n InitiatorSelectedApprovers,\n InitiatorSelectRequirement,\n OptionItem,\n ProcessDefinition,\n ProcessRoute,\n UserItem,\n} from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { FormShell } from '../core/FormShell';\nimport { useFormContext } from '../core/FormContext';\nimport {\n getInitiatorSelectRequirements,\n getProcessDefinition,\n previewProcess,\n} from '../core/processApi';\nimport { validateAndNotify } from '../core/validationFeedback';\nimport { useDraftStorage } from '../hooks/useDraftStorage';\nimport { useFormNavigation } from '../hooks/useFormNavigation';\nimport { DraftManager } from '../modules/DraftManager';\nimport { InitiatorApproverSelector } from '../modules/InitiatorApproverSelector';\nimport { ProcessPreview } from '../modules/ProcessPreview';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { dateRangeToSubmitValue } from '../fields/DateField/dateFormat';\n\nexport interface SubmitSuccessInfo {\n formInstanceId: string;\n message?: string;\n}\n\nconst SUPERVISOR_APPROVER_TYPE = 'ext_target_approval_department_supervisor';\n\nconst unwrapRuntimePayload = (value: any) => value?.data ?? value?.result ?? value;\n\nconst normalizeSubmitFormType = (value?: string): 'form' | 'process' => {\n const raw = String(value || '').toLowerCase();\n return raw === 'process' || raw === 'flow' ? 'process' : 'form';\n};\n\nconst hasDepartmentSupervisorApproval = (definition: ProcessDefinition | any): boolean => {\n const raw = definition?.definitionJson || definition?.viewJson || definition;\n const nodes = Array.isArray(raw?.nodes) ? raw.nodes : [];\n return nodes.some(\n (node: any) =>\n node?.type === 'approval' && node?.data?.approverType === SUPERVISOR_APPROVER_TYPE,\n );\n};\n\nconst normalizeDepartmentOptions = (\n departments?: Array<{\n id?: string;\n value?: string;\n key?: string;\n departmentId?: string;\n name?: string;\n label?: string;\n title?: string;\n departmentName?: string;\n }>,\n) =>\n (departments || [])\n .map((department) => {\n const id =\n department?.id ?? department?.value ?? department?.departmentId ?? department?.key ?? '';\n return {\n value: String(id),\n label:\n department?.name ||\n department?.label ||\n department?.departmentName ||\n department?.title ||\n String(id),\n };\n })\n .filter((department) => department.value);\n\nconst pickFormInstanceId = (value: any): string | undefined => {\n if (!value) return undefined;\n if (typeof value === 'string') return value;\n if (typeof value !== 'object') return undefined;\n\n return (\n value.formInstanceId ||\n value.formInstId ||\n value.instanceId ||\n value.id ||\n pickFormInstanceId(value.result) ||\n pickFormInstanceId(value.data)\n );\n};\n\nconst normalizeFormDataForSubmit = (\n schema: FormSchema,\n formData: Record<string, any>,\n): Record<string, any> => {\n const next = { ...formData };\n for (const field of schema.fields) {\n if (!Object.prototype.hasOwnProperty.call(next, field.fieldId)) continue;\n if (field.componentName === 'CascadeDateField') {\n next[field.fieldId] = dateRangeToSubmitValue(next[field.fieldId]);\n continue;\n }\n if (field.componentName === 'SubFormField' && Array.isArray(next[field.fieldId])) {\n const columns = Array.isArray((field as any).columns) ? (field as any).columns : [];\n next[field.fieldId] = next[field.fieldId].map((row: Record<string, any>) => {\n const nextRow = { ...(row || {}) };\n for (const column of columns) {\n if (\n column?.componentName === 'CascadeDateField' &&\n Object.prototype.hasOwnProperty.call(nextRow, column.fieldId)\n ) {\n nextRow[column.fieldId] = dateRangeToSubmitValue(nextRow[column.fieldId]);\n }\n }\n return nextRow;\n });\n }\n }\n return next;\n};\n\nconst normalizeSelectedApprovers = (\n selectedUsersByNode: Record<string, Array<{ id?: string }>> = {},\n): InitiatorSelectedApprovers =>\n Object.fromEntries(\n Object.entries(selectedUsersByNode).map(([nodeId, users]) => [\n nodeId,\n (users || []).map((user) => user.id).filter(Boolean) as string[],\n ]),\n );\n\nexport interface FormSubmitTemplateProps {\n schema: FormSchema;\n config: FormEngineConfig;\n formType?: 'form' | 'process';\n submitSuccessMode?: 'redirect' | 'stay' | 'continue';\n enableDraft?: boolean;\n enableProcessPreview?: boolean;\n enableSubmissionDepartmentSelect?: boolean;\n departmentOptions?: OptionItem[];\n header?: React.ReactNode;\n footer?: React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n renderDepartmentSelector?: (props: {\n value?: string;\n onChange: (value?: string) => void;\n options: OptionItem[];\n }) => React.ReactNode;\n renderForm?: (props: { schema: FormSchema; config: FormEngineConfig }) => React.ReactNode;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n onSubmitSuccess?: (formInstId: string) => void;\n initialValues?: Record<string, any>;\n inDrawer?: boolean;\n}\n\ninterface SubmitSuccessCardProps {\n info: SubmitSuccessInfo;\n mode: 'redirect' | 'stay' | 'continue';\n isRedirecting: boolean;\n countdown: number;\n onContinue: () => void;\n onViewDetail: () => void;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n}\n\nconst SubmitSuccessCard: React.FC<SubmitSuccessCardProps> = ({\n info,\n mode,\n isRedirecting,\n countdown,\n onContinue,\n onViewDetail,\n renderSuccess,\n}) => {\n if (renderSuccess) {\n return <>{renderSuccess(info)}</>;\n }\n\n return (\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-100 p-6\">\n <div className=\"flex flex-col items-center py-16 animate-[fadeIn_0.3s_ease-out,scaleIn_0.3s_ease-out]\">\n <div className=\"w-12 h-12 rounded-full bg-green-100 flex items-center justify-center mb-4\">\n <CheckCircleFilled className=\"text-2xl text-green-500\" />\n </div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">提交成功</h2>\n <p className=\"text-sm text-gray-500 mb-6\">{info.message || '已成功创建一条新记录'}</p>\n <div className=\"flex gap-3\">\n {(mode === 'stay' || mode === 'redirect') && (\n <Button onClick={onContinue}>继续提交</Button>\n )}\n <Button type=\"primary\" onClick={onViewDetail}>\n 查看详情\n </Button>\n </div>\n {isRedirecting && (\n <div className=\"mt-6 w-48\">\n <div className=\"text-xs text-gray-400 text-center mb-1\">{countdown}秒后自动跳转</div>\n <div className=\"h-1 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-1000\"\n style={{ width: `${(countdown / 3) * 100}%` }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\ninterface InnerFormContentProps {\n schema: FormSchema;\n config: FormEngineConfig;\n formType: 'form' | 'process';\n submitSuccessMode: 'redirect' | 'stay' | 'continue';\n enableDraft: boolean;\n enableProcessPreview: boolean;\n enableSubmissionDepartmentSelect: boolean;\n departmentOptions: OptionItem[];\n header?: React.ReactNode;\n footer?: React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n renderDepartmentSelector?: (props: {\n value?: string;\n onChange: (value?: string) => void;\n options: OptionItem[];\n }) => React.ReactNode;\n renderForm?: (props: { schema: FormSchema; config: FormEngineConfig }) => React.ReactNode;\n renderSuccess?: (info: SubmitSuccessInfo) => React.ReactNode;\n onSubmitSuccess?: (formInstId: string) => void;\n inDrawer?: boolean;\n}\n\nconst InnerFormContent: React.FC<InnerFormContentProps> = ({\n schema,\n config,\n formType,\n submitSuccessMode,\n enableDraft,\n enableProcessPreview,\n enableSubmissionDepartmentSelect,\n departmentOptions,\n header,\n footer,\n beforeForm,\n afterForm,\n renderDepartmentSelector,\n renderForm,\n renderSuccess,\n onSubmitSuccess,\n inDrawer = false,\n}) => {\n const { validateAllWithErrors, getFormData, setFieldValue, resetForm, api } = useFormContext();\n const [submitted, setSubmitted] = useState(false);\n const [successInfo, setSuccessInfo] = useState<SubmitSuccessInfo | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [departmentId, setDepartmentId] = useState<string | undefined>();\n const [submissionDepartmentModalOpen, setSubmissionDepartmentModalOpen] = useState(false);\n const [submissionDepartmentOptions, setSubmissionDepartmentOptions] = useState<OptionItem[]>([]);\n const [selectedSubmissionDepartmentId, setSelectedSubmissionDepartmentId] = useState<\n string | undefined\n >();\n const submissionDepartmentResolverRef = useRef<((value: string | null) => void) | null>(null);\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewRoutes, setPreviewRoutes] = useState<ProcessRoute[]>([]);\n const [pendingFormData, setPendingFormData] = useState<Record<string, any> | null>(null);\n const [pendingSubmissionDepartmentId, setPendingSubmissionDepartmentId] = useState<\n string | undefined\n >();\n const [pendingInitiatorSelectedApprovers, setPendingInitiatorSelectedApprovers] = useState<\n InitiatorSelectedApprovers | undefined\n >();\n const pendingSubmissionDepartmentIdRef = useRef<string | undefined>(undefined);\n const pendingInitiatorSelectedApproversRef = useRef<InitiatorSelectedApprovers | undefined>(\n undefined,\n );\n const [initiatorApproverOpen, setInitiatorApproverOpen] = useState(false);\n const [initiatorApproverRequirements, setInitiatorApproverRequirements] = useState<\n InitiatorSelectRequirement[]\n >([]);\n\n const { hasDraft, draftTimestamp, saveDraft, restoreDraft, clearDraft } = useDraftStorage({\n appType: config.appType,\n formUuid: config.formUuid,\n });\n\n const { navigateToDetail, navigateToProcessDetail, isRedirecting, countdown, handlePostSubmit } =\n useFormNavigation({\n appType: config.appType,\n formUuid: config.formUuid,\n formType,\n mode: submitSuccessMode === 'continue' ? 'stay' : submitSuccessMode,\n basePath: config.navigation?.basePath,\n });\n\n useEffect(() => {\n return () => {\n submissionDepartmentResolverRef.current?.(null);\n submissionDepartmentResolverRef.current = null;\n };\n }, []);\n\n const closeSubmissionDepartmentModal = useCallback((value: string | null = null) => {\n setSubmissionDepartmentModalOpen(false);\n setSubmissionDepartmentOptions([]);\n setSelectedSubmissionDepartmentId(undefined);\n submissionDepartmentResolverRef.current?.(value);\n submissionDepartmentResolverRef.current = null;\n }, []);\n\n const promptSubmissionDepartmentSelection = useCallback(\n (options: OptionItem[], preferredDepartmentId?: string) => {\n return new Promise<string | null>((resolve) => {\n const selected = options.some((option) => option.value === preferredDepartmentId)\n ? preferredDepartmentId\n : options[0]?.value;\n setSubmissionDepartmentOptions(options);\n setSelectedSubmissionDepartmentId(selected);\n submissionDepartmentResolverRef.current = resolve;\n setSubmissionDepartmentModalOpen(true);\n });\n },\n [],\n );\n\n const resolveSubmissionDepartmentId = useCallback(async (): Promise<\n string | null | undefined\n > => {\n if (formType !== 'process') {\n return undefined;\n }\n\n const definition = await getProcessDefinition(api.request, config.formUuid);\n if (!hasDepartmentSupervisorApproval(definition)) {\n return departmentId;\n }\n\n const runtimeUser = schema.runtime?.currentUser as UserItem | undefined;\n const loadedUser = runtimeUser || unwrapRuntimePayload(await api.getUserById('current'));\n const departments = normalizeDepartmentOptions(loadedUser?.departments);\n\n if (departments.length === 0) {\n message.error('当前账号未分配部门,无法发起主管审批流程');\n return null;\n }\n\n if (departments.length === 1) {\n const onlyDepartmentId = departments[0].value;\n setDepartmentId(onlyDepartmentId);\n return onlyDepartmentId;\n }\n\n return promptSubmissionDepartmentSelection(departments, departmentId);\n }, [api, config.formUuid, departmentId, formType, promptSubmissionDepartmentSelection, schema]);\n\n const performSubmit = useCallback(\n async (\n formData: Record<string, any>,\n submissionDepartmentId?: string,\n initiatorSelectedApprovers?: InitiatorSelectedApprovers,\n ) => {\n const submitData = normalizeFormDataForSubmit(schema, formData);\n setSubmitting(true);\n try {\n const submitResponse =\n config.mode === 'edit' && config.formInstanceId\n ? await api.updateFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n formInstId: config.formInstanceId,\n formInstanceId: config.formInstanceId,\n updateFormDataJson: JSON.stringify(submitData),\n })\n : await api.submitFormData({\n appType: config.appType,\n formUuid: config.formUuid,\n data: submitData,\n submissionDepartmentId: submissionDepartmentId ?? departmentId,\n selectedApprovers: initiatorSelectedApprovers,\n initiatorSelectedApprovers,\n });\n\n const formInstId =\n pickFormInstanceId(submitResponse) || config.formInstanceId || `inst_${Date.now()}`;\n\n if (config.submit?.afterSubmit) {\n await config.submit.afterSubmit({\n formInstanceId: formInstId,\n data: submitData,\n response: submitResponse,\n });\n }\n\n if (enableDraft) {\n clearDraft();\n }\n\n onSubmitSuccess?.(formInstId);\n\n if (submitSuccessMode === 'continue') {\n resetForm();\n } else {\n setSuccessInfo({ formInstanceId: formInstId });\n setSubmitted(true);\n handlePostSubmit(formInstId);\n }\n } catch (error) {\n console.error('[FormSubmitTemplate] Submit failed:', error);\n } finally {\n setSubmitting(false);\n }\n },\n [\n api,\n clearDraft,\n config,\n schema,\n enableDraft,\n handlePostSubmit,\n onSubmitSuccess,\n resetForm,\n submitSuccessMode,\n departmentId,\n ],\n );\n\n const continuePreparedSubmit = useCallback(\n async (\n submitData: Record<string, any>,\n submissionDepartmentId?: string,\n initiatorSelectedApprovers?: InitiatorSelectedApprovers,\n ) => {\n if (formType === 'process' && enableProcessPreview) {\n setPendingFormData(submitData);\n setPendingSubmissionDepartmentId(submissionDepartmentId);\n pendingSubmissionDepartmentIdRef.current = submissionDepartmentId;\n setPendingInitiatorSelectedApprovers(initiatorSelectedApprovers);\n pendingInitiatorSelectedApproversRef.current = initiatorSelectedApprovers;\n setPreviewOpen(true);\n setPreviewLoading(true);\n try {\n const routes = await previewProcess(api.request, {\n appType: config.appType,\n formUuid: config.formUuid,\n data: submitData,\n submissionDepartmentId,\n selectedApprovers: initiatorSelectedApprovers,\n initiatorSelectedApprovers,\n });\n setPreviewRoutes(Array.isArray(routes) ? routes : []);\n } catch (error) {\n console.error('[FormSubmitTemplate] Preview failed:', error);\n setPreviewRoutes([]);\n } finally {\n setPreviewLoading(false);\n }\n return;\n }\n\n await performSubmit(submitData, submissionDepartmentId, initiatorSelectedApprovers);\n },\n [api.request, config.appType, config.formUuid, enableProcessPreview, formType, performSubmit],\n );\n\n const prepareSubmit = useCallback(async () => {\n const valid = await validateAndNotify(validateAllWithErrors);\n if (!valid) return;\n\n const formData = getFormData();\n const submitData = normalizeFormDataForSubmit(schema, formData);\n\n if (config.submit?.beforeSubmit) {\n const shouldContinue = await config.submit.beforeSubmit(formData);\n if (shouldContinue === false) {\n return;\n }\n }\n\n let submissionDepartmentId: string | null | undefined;\n try {\n submissionDepartmentId = await resolveSubmissionDepartmentId();\n } catch (error) {\n message.error(error instanceof Error ? error.message : '提交失败');\n return;\n }\n if (submissionDepartmentId === null) {\n return;\n }\n\n if (formType === 'process') {\n try {\n const requirements = await getInitiatorSelectRequirements(api.request, {\n appType: config.appType,\n formUuid: config.formUuid,\n data: submitData,\n submissionDepartmentId,\n });\n if (requirements.length > 0) {\n setPendingFormData(submitData);\n setPendingSubmissionDepartmentId(submissionDepartmentId);\n pendingSubmissionDepartmentIdRef.current = submissionDepartmentId;\n setPendingInitiatorSelectedApprovers(undefined);\n pendingInitiatorSelectedApproversRef.current = undefined;\n setInitiatorApproverRequirements(requirements);\n setInitiatorApproverOpen(true);\n return;\n }\n } catch (error) {\n console.error('[FormSubmitTemplate] Load initiator approver requirements failed:', error);\n message.error(error instanceof Error ? error.message : '加载审批人选择要求失败');\n return;\n }\n }\n\n await continuePreparedSubmit(submitData, submissionDepartmentId);\n }, [\n validateAllWithErrors,\n getFormData,\n schema,\n config,\n api,\n formType,\n resolveSubmissionDepartmentId,\n continuePreparedSubmit,\n ]);\n\n const handlePreviewConfirm = useCallback(async () => {\n const data = pendingFormData ?? getFormData();\n const submissionDepartmentId =\n pendingSubmissionDepartmentIdRef.current ?? pendingSubmissionDepartmentId;\n const initiatorSelectedApprovers =\n pendingInitiatorSelectedApproversRef.current ?? pendingInitiatorSelectedApprovers;\n setPreviewOpen(false);\n setPendingFormData(null);\n setPendingSubmissionDepartmentId(undefined);\n setPendingInitiatorSelectedApprovers(undefined);\n pendingSubmissionDepartmentIdRef.current = undefined;\n pendingInitiatorSelectedApproversRef.current = undefined;\n await performSubmit(data, submissionDepartmentId, initiatorSelectedApprovers);\n }, [\n getFormData,\n pendingFormData,\n pendingInitiatorSelectedApprovers,\n pendingSubmissionDepartmentId,\n performSubmit,\n ]);\n\n const handleInitiatorApproverConfirm = useCallback(\n async (selectedUsersByNode: Record<string, Array<{ id?: string }>>) => {\n const data = pendingFormData;\n if (!data) {\n setInitiatorApproverOpen(false);\n setInitiatorApproverRequirements([]);\n return;\n }\n\n const submissionDepartmentId =\n pendingSubmissionDepartmentIdRef.current ?? pendingSubmissionDepartmentId;\n const selectedApprovers = normalizeSelectedApprovers(selectedUsersByNode);\n setInitiatorApproverOpen(false);\n setInitiatorApproverRequirements([]);\n await continuePreparedSubmit(data, submissionDepartmentId, selectedApprovers);\n },\n [continuePreparedSubmit, pendingFormData, pendingSubmissionDepartmentId],\n );\n\n const handleInitiatorApproverCancel = useCallback(() => {\n setInitiatorApproverOpen(false);\n setInitiatorApproverRequirements([]);\n setPendingFormData(null);\n setPendingSubmissionDepartmentId(undefined);\n setPendingInitiatorSelectedApprovers(undefined);\n pendingSubmissionDepartmentIdRef.current = undefined;\n pendingInitiatorSelectedApproversRef.current = undefined;\n }, []);\n\n const handleSaveDraft = useCallback(() => {\n const data = getFormData();\n saveDraft(data);\n }, [getFormData, saveDraft]);\n\n const handleRestoreDraft = useCallback(() => {\n const data = restoreDraft();\n if (!data) return;\n Object.entries(data).forEach(([fieldId, value]) => {\n setFieldValue(fieldId, value);\n });\n }, [restoreDraft, setFieldValue]);\n\n const handleContinue = useCallback(() => {\n setSubmitted(false);\n setSuccessInfo(null);\n resetForm();\n }, [resetForm]);\n\n const handleViewDetail = useCallback(() => {\n if (!successInfo) return;\n if (formType === 'process') {\n navigateToProcessDetail(successInfo.formInstanceId);\n } else {\n navigateToDetail(successInfo.formInstanceId);\n }\n }, [successInfo, formType, navigateToDetail, navigateToProcessDetail]);\n\n const actions: ActionConfig[] = [];\n if (enableDraft) {\n actions.push({\n key: 'draft',\n label: '暂存',\n type: 'default',\n onClick: handleSaveDraft,\n });\n }\n actions.push({\n key: 'submit',\n label: '提交',\n type: 'primary',\n loading: submitting,\n onClick: prepareSubmit,\n });\n\n const departmentSelector =\n formType === 'process' && enableSubmissionDepartmentSelect ? (\n <div className=\"mb-5 rounded-lg border border-ant-border-secondary bg-ant-bg-elevated px-4 py-3\">\n <div className=\"mb-2 text-sm font-medium text-ant-color-text\">提交部门</div>\n {renderDepartmentSelector ? (\n renderDepartmentSelector({\n value: departmentId,\n onChange: setDepartmentId,\n options: departmentOptions,\n })\n ) : (\n <Select\n allowClear\n className=\"w-full\"\n placeholder=\"请选择本次提交流程所属部门\"\n value={departmentId}\n options={departmentOptions}\n onChange={setDepartmentId}\n />\n )}\n </div>\n ) : null;\n\n const actionsNode = !submitted ? (\n <StickyActionBar\n actions={actions}\n inDrawer={inDrawer}\n position=\"inline\"\n align=\"left\"\n surface=\"transparent\"\n className=\"mt-auto pt-6\"\n />\n ) : null;\n\n return (\n <RuntimePageShell\n className=\"sy-submit-runtime-page\"\n inDrawer={inDrawer}\n maxWidth={inDrawer ? '100%' : 1240}\n contentClassName={inDrawer ? 'md:px-5 md:py-4' : ''}\n >\n <div className=\"sy-submit-page flex min-h-full flex-1 flex-col space-y-6\">\n {header}\n\n {enableDraft && hasDraft && !submitted && (\n <div>\n <DraftManager\n hasDraft={hasDraft}\n draftTimestamp={draftTimestamp}\n onRestore={handleRestoreDraft}\n onDiscard={clearDraft}\n />\n </div>\n )}\n\n {!submitted ? (\n <div\n className={`sy-submit-card flex flex-1 flex-col rounded-lg border border-ant-border-secondary bg-ant-bg-container ${\n inDrawer ? 'p-5 md:p-6' : 'p-6 shadow-sm md:p-8'\n }`}\n >\n <FormShell\n appearance={schema.template?.appearance}\n className=\"sy-form-shell sy-submit-form-shell\"\n >\n {departmentSelector}\n {beforeForm}\n {renderForm ? (\n renderForm({ schema, config })\n ) : (\n <FormRenderer\n columns={schema.template?.appearance?.columns ?? 2}\n size={schema.template?.appearance?.rendererSize ?? 'default'}\n />\n )}\n {afterForm}\n {actionsNode}\n </FormShell>\n </div>\n ) : (\n successInfo && (\n <SubmitSuccessCard\n info={successInfo}\n mode={submitSuccessMode}\n isRedirecting={isRedirecting}\n countdown={countdown}\n onContinue={handleContinue}\n onViewDetail={handleViewDetail}\n renderSuccess={renderSuccess}\n />\n )\n )}\n\n {footer}\n </div>\n <InitiatorApproverSelector\n open={initiatorApproverOpen}\n formUuid={config.formUuid}\n appType={config.appType}\n api={api}\n requirements={initiatorApproverRequirements}\n onOk={handleInitiatorApproverConfirm}\n onCancel={handleInitiatorApproverCancel}\n />\n <ProcessPreview\n open={previewOpen}\n routes={previewRoutes}\n loading={previewLoading}\n onClose={() => {\n setPreviewOpen(false);\n setPendingFormData(null);\n setPendingSubmissionDepartmentId(undefined);\n setPendingInitiatorSelectedApprovers(undefined);\n pendingSubmissionDepartmentIdRef.current = undefined;\n pendingInitiatorSelectedApproversRef.current = undefined;\n }}\n onConfirm={handlePreviewConfirm}\n />\n <Modal\n getContainer={false}\n open={submissionDepartmentModalOpen}\n title=\"该流程包含部门主管审批,请选择提交部门后再发起\"\n okText=\"确定\"\n cancelText=\"取消\"\n onOk={() => {\n if (!selectedSubmissionDepartmentId) {\n message.error('请选择提交部门');\n return;\n }\n setDepartmentId(selectedSubmissionDepartmentId);\n closeSubmissionDepartmentModal(selectedSubmissionDepartmentId);\n }}\n onCancel={() => closeSubmissionDepartmentModal(null)}\n destroyOnHidden\n >\n <Select\n className=\"w-full\"\n placeholder=\"请选择提交部门\"\n value={selectedSubmissionDepartmentId}\n options={submissionDepartmentOptions}\n onChange={setSelectedSubmissionDepartmentId}\n />\n </Modal>\n </RuntimePageShell>\n );\n};\n\nexport const FormSubmitTemplate: React.FC<FormSubmitTemplateProps> = ({\n schema,\n config,\n formType = schema.template?.formType || 'form',\n submitSuccessMode = 'redirect',\n enableDraft = false,\n enableProcessPreview,\n enableSubmissionDepartmentSelect = false,\n departmentOptions = [],\n header,\n footer,\n beforeForm,\n afterForm,\n renderDepartmentSelector,\n renderForm,\n renderSuccess,\n onSubmitSuccess,\n initialValues,\n inDrawer = false,\n}) => {\n const resolvedFormType = normalizeSubmitFormType(formType);\n const resolvedEnableProcessPreview =\n enableProcessPreview ?? schema.template?.enableProcessPreview ?? resolvedFormType === 'process';\n\n return (\n <FormProvider schema={schema} config={config} initialValues={initialValues}>\n <InnerFormContent\n schema={schema}\n config={config}\n formType={resolvedFormType}\n submitSuccessMode={submitSuccessMode}\n enableDraft={enableDraft}\n enableProcessPreview={resolvedEnableProcessPreview}\n enableSubmissionDepartmentSelect={enableSubmissionDepartmentSelect}\n departmentOptions={departmentOptions}\n header={header}\n footer={footer}\n beforeForm={beforeForm}\n afterForm={afterForm}\n renderDepartmentSelector={renderDepartmentSelector}\n renderForm={renderForm}\n renderSuccess={renderSuccess}\n onSubmitSuccess={onSubmitSuccess}\n inDrawer={inDrawer}\n />\n </FormProvider>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Button, Empty, Modal, Select, Space, Tag, Typography, message } from 'antd';\nimport type {\n FormRuntimeApi,\n InitiatorSelectCandidate,\n InitiatorSelectRequirement,\n} from '../types';\nimport { getInitiatorSelectCandidates } from '../core/processApi';\nimport { UserPicker } from '../fields/shared/UserPicker';\n\nexport type SelectedApproverMap = Record<string, InitiatorSelectCandidate[]>;\n\ninterface InitiatorApproverSelectorProps {\n open: boolean;\n formUuid: string;\n appType: string;\n api: FormRuntimeApi;\n requirements: InitiatorSelectRequirement[];\n value?: SelectedApproverMap;\n onOk: (selected: SelectedApproverMap) => void;\n onCancel: () => void;\n}\n\ninterface RequirementSelectProps {\n open: boolean;\n formUuid: string;\n appType: string;\n api: FormRuntimeApi;\n requirement: InitiatorSelectRequirement;\n selectedUsers: InitiatorSelectCandidate[];\n onChange: (nodeId: string, users: InitiatorSelectCandidate[]) => void;\n}\n\nconst scopeText: Record<InitiatorSelectRequirement['scope'], string> = {\n all: '全部成员',\n members: '指定成员',\n roles: '指定角色',\n};\n\nconst EMPTY_SELECTED_USERS: InitiatorSelectCandidate[] = [];\nconst EMPTY_SELECTED_MAP: SelectedApproverMap = {};\n\nconst getUserId = (user: any) =>\n String(user?.id ?? user?.userId ?? user?.userid ?? user?.value ?? '').trim();\n\nconst normalizeCandidate = (user: any): InitiatorSelectCandidate | null => {\n const id = getUserId(user);\n if (!id) return null;\n return {\n ...user,\n id,\n name: String(user?.name ?? user?.label ?? user?.username ?? id),\n };\n};\n\nconst getUserLabel = (user: InitiatorSelectCandidate) => user.name || user.username || user.id;\n\nconst mergeUsers = (current: InitiatorSelectCandidate[], incoming: InitiatorSelectCandidate[]) => {\n const map = new Map<string, InitiatorSelectCandidate>();\n current.forEach((user) => map.set(user.id, user));\n incoming.forEach((user) => map.set(user.id, user));\n return Array.from(map.values());\n};\n\nconst RequirementSelect: React.FC<RequirementSelectProps> = ({\n open,\n formUuid,\n appType,\n api,\n requirement,\n selectedUsers,\n onChange,\n}) => {\n const [pickerOpen, setPickerOpen] = useState(false);\n const initialCandidates = useMemo(\n () =>\n (requirement.candidateUsers || [])\n .map(normalizeCandidate)\n .filter(Boolean) as InitiatorSelectCandidate[],\n [requirement.candidateUsers],\n );\n const [optionsSource, setOptionsSource] = useState<InitiatorSelectCandidate[]>(initialCandidates);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n setOptionsSource((current) =>\n mergeUsers(initialCandidates, mergeUsers(current, selectedUsers)),\n );\n }, [initialCandidates, selectedUsers]);\n\n const loadCandidates = useCallback(\n async (keyword?: string) => {\n setLoading(true);\n try {\n const result = await getInitiatorSelectCandidates(api.request, {\n formUuid,\n appType,\n nodeId: requirement.nodeId,\n keyword,\n page: 1,\n pageSize: 50,\n });\n setOptionsSource((current) =>\n mergeUsers(\n current,\n result.items.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n ),\n );\n } catch {\n if (requirement.scope === 'all' && typeof api.getUserList === 'function') {\n const users = await api.getUserList(\n keyword ? { name: keyword, username: keyword } : undefined,\n );\n setOptionsSource((current) =>\n mergeUsers(\n current,\n users.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n ),\n );\n } else if (initialCandidates.length === 0) {\n message.error('加载审批候选人失败');\n }\n } finally {\n setLoading(false);\n }\n },\n [api, appType, formUuid, initialCandidates.length, requirement.nodeId, requirement.scope],\n );\n\n useEffect(() => {\n if (requirement.scope !== 'all' && open && formUuid && appType && requirement.nodeId) {\n void loadCandidates();\n }\n }, [appType, formUuid, loadCandidates, open, requirement.nodeId, requirement.scope]);\n\n const options = useMemo(\n () =>\n optionsSource.map((user) => ({\n value: user.id,\n label: getUserLabel(user),\n })),\n [optionsSource],\n );\n\n if (requirement.scope === 'all') {\n return (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-3\">\n <div className=\"mb-2 flex items-start justify-between gap-3\">\n <div>\n <Typography.Text strong>{requirement.nodeName}</Typography.Text>\n <div className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 选择范围:{scopeText[requirement.scope] || '全部成员'}\n </div>\n </div>\n <Button onClick={() => setPickerOpen(true)}>\n {selectedUsers.length > 0 ? '重新选择成员' : '选择成员'}\n </Button>\n </div>\n {selectedUsers.length > 0 ? (\n <Space size={[4, 4]} wrap className=\"mt-2\">\n {selectedUsers.map((user) => (\n <Tag key={user.id}>{getUserLabel(user)}</Tag>\n ))}\n </Space>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"请从组织架构选择成员\" />\n )}\n <UserPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple\n value={selectedUsers}\n loadAllWhenNoDepartment={false}\n onConfirm={(items) => {\n onChange(\n requirement.nodeId,\n items.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n );\n }}\n onCancel={() => undefined}\n />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-3\">\n <div className=\"mb-2\">\n <Typography.Text strong>{requirement.nodeName}</Typography.Text>\n <div className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 选择范围:{scopeText[requirement.scope] || '全部成员'}\n </div>\n </div>\n <Select\n mode=\"multiple\"\n className=\"w-full\"\n allowClear\n showSearch\n filterOption={false}\n placeholder=\"请选择审批人\"\n loading={loading}\n value={selectedUsers.map((user) => user.id)}\n options={options}\n notFoundContent={loading ? '加载中...' : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}\n onSearch={(keyword) => {\n void loadCandidates(keyword);\n }}\n onChange={(ids: string[]) => {\n const next = ids\n .map(\n (id) =>\n optionsSource.find((user) => user.id === id) ||\n selectedUsers.find((user) => user.id === id),\n )\n .filter(Boolean) as InitiatorSelectCandidate[];\n onChange(requirement.nodeId, next);\n }}\n />\n {selectedUsers.length > 0 ? (\n <Space size={[4, 4]} wrap className=\"mt-2\">\n {selectedUsers.map((user) => (\n <Tag key={user.id}>{getUserLabel(user)}</Tag>\n ))}\n </Space>\n ) : null}\n </div>\n );\n};\n\nexport const InitiatorApproverSelector: React.FC<InitiatorApproverSelectorProps> = ({\n open,\n formUuid,\n appType,\n api,\n requirements,\n value,\n onOk,\n onCancel,\n}) => {\n const [selected, setSelected] = useState<SelectedApproverMap>({});\n const wasOpenRef = useRef(false);\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n setSelected(value || EMPTY_SELECTED_MAP);\n }\n wasOpenRef.current = open;\n }, [open, value]);\n\n const missingNodes = requirements.filter(\n (requirement) => !(selected[requirement.nodeId] || []).length,\n );\n\n return (\n <Modal\n getContainer={false}\n title=\"选择审批人\"\n open={open}\n width={760}\n okText=\"确定\"\n cancelText=\"取消\"\n onCancel={onCancel}\n onOk={() => {\n if (missingNodes.length > 0) {\n message.error('请为所有发起人自选节点选择审批人');\n return;\n }\n onOk(selected);\n }}\n destroyOnHidden\n >\n <Space direction=\"vertical\" size={12} className=\"w-full\">\n {requirements.map((requirement) => (\n <RequirementSelect\n key={requirement.nodeId}\n open={open}\n formUuid={formUuid}\n appType={appType}\n api={api}\n requirement={requirement}\n selectedUsers={selected[requirement.nodeId] ?? EMPTY_SELECTED_USERS}\n onChange={(nodeId, users) =>\n setSelected((current) => ({ ...current, [nodeId]: users }))\n }\n />\n ))}\n </Space>\n </Modal>\n );\n};\n\nexport default InitiatorApproverSelector;\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport dayjs from 'dayjs';\nimport { Form as AntForm, Input, Modal, message } from 'antd';\nimport type {\n FormSchema,\n InitiatorSelectedApprovers,\n InitiatorSelectRequirement,\n ProcessTask,\n ProcessAction,\n FieldBehavior,\n ReturnableNode,\n ProcessStatus,\n} from '../types';\nimport { FormProvider } from '../core/FormProvider';\nimport { useFormContext } from '../core/FormContext';\nimport { FormRenderer } from '../core/FormRenderer';\nimport { FormShell } from '../core/FormShell';\nimport { validateAndNotify } from '../core/validationFeedback';\nimport { getResubmitInitiatorSelectRequirements } from '../core/processApi';\nimport { useProcessDetail } from '../hooks/useProcessDetail';\nimport { useApprovalActions } from '../hooks/useApprovalActions';\nimport { useChangeRecords } from '../hooks/useChangeRecords';\nimport { ApprovalTimeline } from '../modules/ApprovalTimeline';\nimport { ApprovalActionBar } from '../modules/ApprovalActionBar';\nimport { RuntimePageShell } from '../modules/RuntimePageShell';\nimport { StickyActionBar } from '../modules/StickyActionBar';\nimport { SummaryPanel } from '../modules/SummaryPanel';\nimport { RecordChangePanel } from '../modules/RecordChangePanel';\nimport { InitiatorApproverSelector } from '../modules/InitiatorApproverSelector';\nimport type { ActionConfig } from '../modules/FormActionBar';\nimport { PageSkeleton } from './PageSkeleton';\n\nexport interface ProcessDetailTemplateProps {\n schema: FormSchema;\n formUuid: string;\n appType: string;\n formInstanceId: string;\n enableEdit?: boolean;\n enableDelete?: boolean;\n enableChangeRecords?: boolean;\n showApproverInfo?: boolean;\n header?: React.ReactNode;\n renderTimeline?: (tasks: ProcessTask[]) => React.ReactNode;\n renderActions?: (actions: ProcessAction[]) => React.ReactNode;\n renderFooterActions?: (actions: ActionConfig[]) => React.ReactNode;\n renderTransferSelector?: (props: {\n value?: string;\n onChange: (userId: string) => void;\n }) => React.ReactNode;\n renderReturnNodeLabel?: (node: ReturnableNode) => React.ReactNode;\n renderActionModalExtra?: (action: ProcessAction) => React.ReactNode;\n beforeForm?: React.ReactNode;\n afterForm?: React.ReactNode;\n onActionComplete?: (action: string) => Promise<void> | void;\n onSave?: (values: Record<string, any>) => Promise<void> | void;\n onDelete?: () => Promise<void> | void;\n inDrawer?: boolean;\n}\n\nfunction FormDataBridge({\n formDataRef,\n validateRef,\n}: {\n formDataRef: React.MutableRefObject<(() => Record<string, any>) | undefined>;\n validateRef: React.MutableRefObject<(() => Promise<Record<string, string>>) | undefined>;\n}) {\n const { getFormData, validateAllWithErrors } = useFormContext();\n formDataRef.current = getFormData;\n validateRef.current = validateAllWithErrors;\n return null;\n}\n\nconst formatDateTime = (value?: React.ReactNode) => {\n if (!value || typeof value !== 'string') return value || '-';\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.format('YYYY-MM-DD HH:mm:ss') : value;\n};\n\nconst normalizeSelectedApprovers = (\n selectedUsersByNode: Record<string, Array<{ id?: string }>> = {},\n): InitiatorSelectedApprovers =>\n Object.fromEntries(\n Object.entries(selectedUsersByNode).map(([nodeId, users]) => [\n nodeId,\n (users || []).map((user) => user.id).filter(Boolean) as string[],\n ]),\n );\n\ntype ProcessStampTone = 'running' | 'approved' | 'rejected' | 'danger' | 'neutral';\n\nconst PROCESS_STATUS_STAMP: Partial<\n Record<ProcessStatus, { label: string; tone: ProcessStampTone }>\n> = {\n running: { label: '流程中', tone: 'running' },\n waiting: { label: '流程中', tone: 'running' },\n pending: { label: '流程中', tone: 'running' },\n completed: { label: '已同意', tone: 'approved' },\n terminated: { label: '已拒绝', tone: 'rejected' },\n exception: { label: '流程异常', tone: 'danger' },\n withdrawn: { label: '已撤销', tone: 'neutral' },\n cancelled: { label: '已取消', tone: 'neutral' },\n};\n\nconst STAMP_STAR_POINTS = [\n { left: '50%', top: '17%' },\n { left: '63%', top: '22%' },\n { left: '74%', top: '34%' },\n { left: '70%', top: '70%' },\n { left: '56%', top: '79%' },\n { left: '40%', top: '76%' },\n { left: '27%', top: '64%' },\n { left: '24%', top: '36%' },\n { left: '37%', top: '23%' },\n];\n\nfunction ProcessStatusStamp({ status }: { status?: ProcessStatus | null }) {\n const stamp = status ? PROCESS_STATUS_STAMP[status] : undefined;\n if (!stamp) return null;\n\n return (\n <div\n aria-label={`流程状态:${stamp.label}`}\n className={`sy-process-status-stamp sy-process-status-stamp-${stamp.tone}`}\n role=\"img\"\n >\n <span className=\"sy-process-status-stamp-ring\">\n {STAMP_STAR_POINTS.map((point, index) => (\n <span\n key={`${point.left}-${point.top}-${index}`}\n aria-hidden=\"true\"\n className=\"sy-process-status-stamp-star\"\n style={point}\n >\n ★\n </span>\n ))}\n <span className=\"sy-process-status-stamp-text\">{stamp.label}</span>\n </span>\n </div>\n );\n}\n\nconst InnerProcessContent: React.FC<ProcessDetailTemplateProps> = ({\n schema,\n formUuid,\n appType,\n formInstanceId,\n enableEdit = true,\n enableDelete = true,\n enableChangeRecords = true,\n showApproverInfo = true,\n header,\n renderTimeline,\n renderActions,\n renderFooterActions,\n renderTransferSelector,\n renderReturnNodeLabel,\n renderActionModalExtra,\n beforeForm,\n afterForm,\n onActionComplete,\n onSave,\n onDelete,\n inDrawer = false,\n}) => {\n const formDataRef = useRef<(() => Record<string, any>) | undefined>(undefined);\n const validateRef = useRef<(() => Promise<Record<string, string>>) | undefined>(undefined);\n const [withdrawForm] = AntForm.useForm();\n const [withdrawOpen, setWithdrawOpen] = useState(false);\n const [withdrawLoading, setWithdrawLoading] = useState(false);\n const [saveLoading, setSaveLoading] = useState(false);\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [initiatorApproverOpen, setInitiatorApproverOpen] = useState(false);\n const [initiatorApproverRequirements, setInitiatorApproverRequirements] = useState<\n InitiatorSelectRequirement[]\n >([]);\n const [pendingResubmitComments, setPendingResubmitComments] = useState<string | undefined>();\n const fieldIds = useMemo(() => schema.fields.map((field) => field.fieldId), [schema.fields]);\n const { api } = useFormContext();\n\n const {\n loading,\n processInfo,\n processStatus,\n currentTask,\n progressList,\n formData,\n instanceInfo,\n accessDenied,\n loadError,\n isApprover,\n activeActions,\n fieldBehaviors,\n mode,\n isOriginatorReturn,\n isProcessCompleted,\n canWithdraw,\n canEdit,\n canDelete,\n canViewWorkflow,\n canViewChangeRecords,\n dataVersion,\n switchToEdit,\n switchToReadonly,\n saveChanges,\n deleteInstance,\n refreshDetail,\n } = useProcessDetail({ formUuid, appType, formInstanceId, fieldIds });\n const currentTaskId = currentTask?.taskId ?? currentTask?.id;\n\n const {\n approve,\n reject,\n transfer,\n returnTo,\n withdraw,\n save,\n resubmit,\n callbackTask,\n returnableNodes,\n returnPolicy,\n loadReturnableNodes,\n } = useApprovalActions({\n formInstanceId,\n formUuid,\n appType,\n currentTaskId,\n onActionComplete: async (action: string) => {\n await onActionComplete?.(action);\n await refreshDetail();\n },\n getFormValues: () => formDataRef.current?.() ?? formData ?? {},\n });\n\n const {\n records,\n loading: recordsLoading,\n total: recordsTotal,\n page: recordsPage,\n hasMore,\n loadMore,\n refresh: refreshRecords,\n } = useChangeRecords({\n formUuid,\n appType,\n formInstanceId,\n autoLoad: enableChangeRecords && canViewChangeRecords,\n });\n\n const validateForm = useCallback(async () => {\n return validateRef.current ? validateAndNotify(validateRef.current) : true;\n }, []);\n\n const handleApprove = useCallback(\n async (comments?: string) => {\n if (!(await validateForm())) return;\n await approve(comments);\n },\n [approve, validateForm],\n );\n\n const handleReject = useCallback(\n async (comments?: string) => {\n await reject(comments);\n },\n [reject],\n );\n\n const handleTransfer = useCallback(\n async (userId: string, reason?: string) => {\n await transfer(userId, reason);\n },\n [transfer],\n );\n\n const handleReturn = useCallback(\n async (nodeId: string, reason?: string) => {\n await returnTo(nodeId, reason);\n },\n [returnTo],\n );\n\n const handleWithdraw = useCallback(\n async (reason?: string) => {\n await withdraw(reason);\n },\n [withdraw],\n );\n\n const handleSave = useCallback(async () => {\n if (!(await validateForm())) return;\n await save();\n }, [save, validateForm]);\n\n const handleResubmit = useCallback(\n async (comments?: string) => {\n if (!(await validateForm())) return;\n const values = formDataRef.current?.() ?? formData ?? {};\n if (!currentTaskId) {\n message.error('未找到发起人修改任务');\n return;\n }\n\n let requirements: InitiatorSelectRequirement[] = [];\n try {\n requirements = await getResubmitInitiatorSelectRequirements(api.request, {\n taskId: currentTaskId,\n formUuid,\n appType,\n data: values,\n });\n } catch (error) {\n console.error(\n '[ProcessDetailTemplate] Load resubmit initiator approver requirements failed:',\n error,\n );\n message.error(error instanceof Error ? error.message : '加载审批人选择要求失败');\n return;\n }\n if (requirements.length > 0) {\n setPendingResubmitComments(comments);\n setInitiatorApproverRequirements(requirements);\n setInitiatorApproverOpen(true);\n return;\n }\n\n await resubmit(comments);\n },\n [api.request, appType, currentTaskId, formData, formUuid, resubmit, validateForm],\n );\n\n const handleInitiatorApproverConfirm = useCallback(\n async (selectedUsersByNode: Record<string, Array<{ id?: string }>>) => {\n const selectedApprovers = normalizeSelectedApprovers(selectedUsersByNode);\n setInitiatorApproverOpen(false);\n setInitiatorApproverRequirements([]);\n const comments = pendingResubmitComments;\n setPendingResubmitComments(undefined);\n await resubmit(comments, selectedApprovers);\n },\n [pendingResubmitComments, resubmit],\n );\n\n const handleInitiatorApproverCancel = useCallback(() => {\n setInitiatorApproverOpen(false);\n setInitiatorApproverRequirements([]);\n setPendingResubmitComments(undefined);\n }, []);\n\n const handleCallback = useCallback(async () => {\n await callbackTask();\n }, [callbackTask]);\n\n const handleCompletedSave = useCallback(async () => {\n if (!(await validateForm())) return;\n const values = formDataRef.current?.() ?? formData;\n if (!values) return;\n setSaveLoading(true);\n try {\n const success = await saveChanges(values);\n if (success) {\n await onSave?.(values);\n }\n } finally {\n setSaveLoading(false);\n }\n }, [formData, onSave, saveChanges, validateForm]);\n\n const handleCompletedDelete = useCallback(async () => {\n setDeleteLoading(true);\n try {\n const success = await deleteInstance();\n if (success) {\n await onDelete?.();\n }\n } finally {\n setDeleteLoading(false);\n }\n }, [deleteInstance, onDelete]);\n\n const handleFooterWithdraw = useCallback(async () => {\n const values = await withdrawForm.validateFields();\n setWithdrawLoading(true);\n try {\n await handleWithdraw(values.reason || undefined);\n setWithdrawOpen(false);\n withdrawForm.resetFields();\n } finally {\n setWithdrawLoading(false);\n }\n }, [handleWithdraw, withdrawForm]);\n\n const handleFooterWithdrawCancel = useCallback(() => {\n setWithdrawOpen(false);\n withdrawForm.resetFields();\n }, [withdrawForm]);\n\n const bottomActions: ActionConfig[] = useMemo(() => {\n if (isApprover && !isOriginatorReturn && activeActions.length > 0) return [];\n\n if (isProcessCompleted) {\n if (mode === 'readonly') {\n const actions: ActionConfig[] = [];\n if (enableEdit && canEdit) {\n actions.push({\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n });\n }\n if (enableDelete && canDelete) {\n actions.push({\n key: 'delete',\n label: '删除',\n type: 'danger',\n loading: deleteLoading,\n onClick: handleCompletedDelete,\n confirm: { title: '确认删除', content: '删除后将无法恢复,确认要删除吗?' },\n });\n }\n return actions;\n }\n\n return [\n {\n key: 'cancel',\n label: '取消',\n type: 'default',\n onClick: switchToReadonly,\n placement: 'left',\n },\n {\n key: 'save',\n label: '保存',\n type: 'primary',\n loading: saveLoading,\n onClick: handleCompletedSave,\n },\n ];\n }\n\n if (isOriginatorReturn) {\n if (mode === 'readonly') {\n const actions: ActionConfig[] = [\n {\n key: 'edit',\n label: '编辑',\n type: 'primary',\n onClick: switchToEdit,\n },\n ];\n actions.push({\n key: 'resubmit',\n label: '重新提交',\n type: 'default',\n onClick: () => handleResubmit(),\n });\n if (canWithdraw) {\n actions.push({\n key: 'withdraw',\n label: '撤销',\n type: 'danger',\n onClick: () => setWithdrawOpen(true),\n });\n }\n return actions;\n }\n const actions: ActionConfig[] = [\n {\n key: 'cancel',\n label: '取消',\n type: 'default',\n onClick: switchToReadonly,\n placement: 'left',\n },\n {\n key: 'resubmit',\n label: '重新提交',\n type: 'primary',\n onClick: () => handleResubmit(),\n },\n ];\n if (canWithdraw) {\n actions.push({\n key: 'withdraw',\n label: '撤销',\n type: 'danger',\n onClick: () => setWithdrawOpen(true),\n });\n }\n return actions;\n }\n\n if (canWithdraw) {\n return [\n {\n key: 'withdraw',\n label: '撤销',\n type: 'danger',\n loading: withdrawLoading,\n onClick: () => setWithdrawOpen(true),\n },\n ];\n }\n\n return [];\n }, [\n activeActions.length,\n canDelete,\n canEdit,\n canWithdraw,\n deleteLoading,\n enableDelete,\n enableEdit,\n handleCompletedDelete,\n handleCompletedSave,\n handleResubmit,\n isApprover,\n isOriginatorReturn,\n isProcessCompleted,\n mode,\n saveLoading,\n switchToEdit,\n switchToReadonly,\n withdrawLoading,\n ]);\n\n const formConfig = {\n mode: mode === 'edit' ? ('edit' as const) : ('readonly' as const),\n formUuid,\n appType,\n formInstanceId,\n permissions: {\n fieldPermissions: fieldBehaviors as Record<string, FieldBehavior>,\n operations: [] as string[],\n },\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-ant-bg-layout\">\n <div className=\"mx-auto max-w-4xl px-6 py-8 pb-24\">\n <PageSkeleton type=\"process\" />\n </div>\n </div>\n );\n }\n\n if (accessDenied || loadError) {\n return (\n <RuntimePageShell accessDenied={accessDenied} error={loadError} inDrawer={inDrawer}>\n <div />\n </RuntimePageShell>\n );\n }\n\n const showApprovalActions = isApprover && !isOriginatorReturn && activeActions.length > 0;\n const actionsNode = showApprovalActions ? (\n renderActions ? (\n renderActions(activeActions)\n ) : (\n <ApprovalActionBar\n actions={activeActions}\n onApprove={handleApprove}\n onReject={handleReject}\n onTransfer={handleTransfer}\n onReturn={handleReturn}\n onWithdraw={handleWithdraw}\n onSave={handleSave}\n onResubmit={handleResubmit}\n onCallback={handleCallback}\n returnableNodes={returnableNodes}\n returnPolicy={returnPolicy}\n onLoadReturnableNodes={loadReturnableNodes}\n renderTransferSelector={renderTransferSelector}\n renderReturnNodeLabel={renderReturnNodeLabel}\n renderActionModalExtra={renderActionModalExtra}\n inDrawer={inDrawer}\n maxWidth={1180}\n />\n )\n ) : bottomActions.length > 0 ? (\n renderFooterActions ? (\n renderFooterActions(bottomActions)\n ) : (\n <StickyActionBar actions={bottomActions} align=\"center\" inDrawer={inDrawer} maxWidth={1180} />\n )\n ) : null;\n\n const hasStatusStamp = Boolean(processStatus && PROCESS_STATUS_STAMP[processStatus]);\n const submitterName =\n processInfo?.originatorName || instanceInfo?.creator?.name || instanceInfo?.createdByName;\n const submitterDepartment =\n processInfo?.originatorDepartment ||\n instanceInfo?.creator?.department ||\n instanceInfo?.createdByDepartmentName;\n const submittedAt = formatDateTime(processInfo?.createdAt || instanceInfo?.createdAt);\n const summaryCreator =\n submitterName || submitterDepartment\n ? {\n name: submitterName || '未知用户',\n department: submitterDepartment,\n }\n : undefined;\n\n return (\n <RuntimePageShell\n actions={actionsNode}\n contentClassName=\"sy-detail-page\"\n inDrawer={inDrawer}\n maxWidth=\"100%\"\n >\n <div className=\"sy-detail-header\">\n <div className=\"sy-detail-header-inner\">\n {header}\n\n <div\n className={`sy-process-summary ${hasStatusStamp ? 'sy-process-summary-with-stamp' : ''}`}\n >\n <SummaryPanel\n title={processInfo?.title || instanceInfo?.title || schema.formMeta.title}\n showEyebrow={false}\n creator={summaryCreator}\n createdAt={submittedAt}\n metaItems={[\n {\n key: 'creator',\n label: '提交人',\n value: submitterName || '未知用户',\n },\n {\n key: 'department',\n label: '提交人部门',\n value: submitterDepartment || '-',\n },\n {\n key: 'createdAt',\n label: '提交时间',\n value: submittedAt,\n },\n ]}\n className=\"sy-detail-summary-panel\"\n />\n <ProcessStatusStamp status={processStatus} />\n </div>\n </div>\n </div>\n\n <div className=\"sy-detail-main\">\n {beforeForm}\n\n {mode === 'edit' && (\n <div className=\"rounded-lg border border-blue-200 bg-blue-50 px-4 py-3 text-sm text-blue-700 transition-all duration-150\">\n {isProcessCompleted ? '正在编辑,修改后请保存' : '正在编辑表单,修改后请重新提交'}\n </div>\n )}\n\n <div className=\"sy-detail-card\">\n <FormProvider\n key={`${mode}-${dataVersion}`}\n schema={schema}\n config={formConfig}\n initialValues={formData ?? undefined}\n >\n <FormShell appearance={schema.template?.appearance} className=\"sy-form-shell\">\n <FormDataBridge formDataRef={formDataRef} validateRef={validateRef} />\n <FormRenderer\n columns={schema.template?.appearance?.columns ?? 2}\n size={schema.template?.appearance?.rendererSize ?? 'default'}\n />\n </FormShell>\n </FormProvider>\n </div>\n\n {afterForm}\n\n {canViewWorkflow && (\n <div className=\"sy-detail-card\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-base font-semibold text-ant-color-text\">审批进度</h3>\n <p className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 节点、审批人、处理意见和等待状态\n </p>\n </div>\n </div>\n {renderTimeline ? (\n renderTimeline(progressList)\n ) : (\n <ApprovalTimeline\n tasks={progressList}\n showRemarks\n showApproverInfo={showApproverInfo}\n />\n )}\n </div>\n )}\n\n {enableChangeRecords && canViewChangeRecords && (\n <RecordChangePanel\n records={records}\n loading={recordsLoading}\n total={recordsTotal}\n page={recordsPage}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onRefresh={refreshRecords}\n onExpand={refreshRecords}\n />\n )}\n </div>\n <Modal\n getContainer={false}\n title=\"撤销流程\"\n open={withdrawOpen}\n okText=\"确认撤销\"\n cancelText=\"取消\"\n confirmLoading={withdrawLoading}\n okButtonProps={{ danger: true }}\n onOk={handleFooterWithdraw}\n onCancel={handleFooterWithdrawCancel}\n destroyOnHidden\n >\n <AntForm form={withdrawForm} layout=\"vertical\">\n <AntForm.Item\n name=\"reason\"\n label=\"撤销原因\"\n rules={[{ required: true, message: '请填写撤销原因' }]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount placeholder=\"请输入撤销原因\" />\n </AntForm.Item>\n </AntForm>\n </Modal>\n <InitiatorApproverSelector\n open={initiatorApproverOpen}\n formUuid={formUuid}\n appType={appType}\n api={api}\n requirements={initiatorApproverRequirements}\n onOk={handleInitiatorApproverConfirm}\n onCancel={handleInitiatorApproverCancel}\n />\n </RuntimePageShell>\n );\n};\n\nexport const ProcessDetailTemplate: React.FC<ProcessDetailTemplateProps> = (props) => {\n const { schema, formUuid, appType, formInstanceId } = props;\n\n const wrapperConfig = {\n mode: 'readonly' as const,\n formUuid,\n appType,\n formInstanceId,\n };\n\n return (\n <FormProvider schema={schema} config={wrapperConfig}>\n <InnerProcessContent {...props} />\n </FormProvider>\n );\n};\n","import React, { useMemo } from 'react';\nimport type { LowcodePageNode, LowcodePageSchema, RuntimeRequestConfig } from '../types';\nimport { DataManagementList } from '../modules/DataManagementList';\nimport { StandardFormPage } from './StandardFormPage';\n\nexport interface LowcodePageRuntimeContext {\n appType?: string;\n mode?: string;\n route?: Record<string, any>;\n bridge?: {\n invoke?: (method: string, payload?: any) => Promise<any>;\n };\n [key: string]: any;\n}\n\nexport interface LowcodePageRendererProps {\n schema: LowcodePageSchema;\n context?: LowcodePageRuntimeContext;\n}\n\nfunction nodeChildren(node: LowcodePageNode) {\n if (Array.isArray(node.children)) return node.children;\n if (Array.isArray(node.cells)) return node.cells.flatMap((cell) => cell.children || []);\n return [];\n}\n\nfunction createRuntimeRequest(context?: LowcodePageRuntimeContext) {\n if (typeof context?.bridge?.invoke !== 'function') return undefined;\n return async (config: RuntimeRequestConfig) => {\n const search = config.params ? new URLSearchParams() : null;\n if (search) {\n Object.entries(config.params || {}).forEach(([key, value]) => {\n if (value !== undefined && value !== null && value !== '') {\n search.set(key, String(value));\n }\n });\n }\n const method = config.responseType === 'blob' ? 'transport.download' : 'transport.request';\n return context.bridge?.invoke?.(method, {\n path: config.url,\n method: config.method || 'get',\n query: search?.toString(),\n body: config.data,\n headers: config.headers,\n });\n };\n}\n\nexport function LowcodePageRenderer({ schema, context }: LowcodePageRendererProps) {\n const appType = context?.appType || schema.pageMeta.appType;\n const requestOverride = useMemo(() => createRuntimeRequest(context), [context]);\n\n const renderNode = (node: LowcodePageNode): React.ReactNode => {\n const props = node.props || {};\n const children = nodeChildren(node);\n\n if (node.type === 'PageSection') {\n return (\n <section key={node.id} className=\"sy-page-section\">\n {(props.title || props.description) && (\n <div className=\"sy-page-section-header\">\n {props.title && <h2 className=\"sy-page-section-title\">{props.title}</h2>}\n {props.description && (\n <p className=\"sy-page-section-description\">{props.description}</p>\n )}\n </div>\n )}\n <div className=\"sy-page-section-body\">{children.map(renderNode)}</div>\n </section>\n );\n }\n\n if (node.type === 'PageGrid') {\n const columns = Math.min(Math.max(Number(props.columns || 2), 1), 4);\n const style: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,\n gap: props.gap ?? 16,\n };\n return (\n <div key={node.id} className=\"sy-page-grid\" style={style}>\n {children.map(renderNode)}\n </div>\n );\n }\n\n if (node.type === 'HeadingBlock') {\n const level = Math.min(Math.max(Number(props.level || 2), 1), 4);\n const tagName = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4';\n return React.createElement(\n tagName,\n { key: node.id, className: 'sy-page-heading' },\n props.text || props.title || '标题',\n );\n }\n\n if (node.type === 'TextBlock') {\n return (\n <p key={node.id} className=\"sy-page-text\">\n {props.text || ''}\n </p>\n );\n }\n\n if (node.type === 'DataManagementList') {\n const formUuid = props.formUuid || props.relateFormUuid;\n if (!formUuid) return null;\n return (\n <DataManagementList\n key={node.id}\n appType={props.appType || appType}\n formUuid={formUuid}\n title={props.title}\n formTitle={props.formTitle}\n formType={props.formType}\n readonly={props.readonly ?? true}\n fullHeight={props.fullHeight ?? true}\n configScope=\"personal\"\n forcedConfig={props.forcedConfig}\n showForcedConfig={props.showForcedConfig}\n requestOverride={requestOverride}\n />\n );\n }\n\n if (node.type === 'FormBlock' && props.schema) {\n return (\n <StandardFormPage\n key={node.id}\n schema={props.schema}\n mode={props.mode || context?.mode || 'submit'}\n appType={props.appType || appType}\n formUuid={props.formUuid || props.schema?.formMeta?.formUuid}\n inDrawer={props.inDrawer ?? true}\n />\n );\n }\n\n return (\n <div key={node.id} className=\"sy-page-unknown-node\" data-node-type={node.type}>\n {children.map(renderNode)}\n </div>\n );\n };\n\n return <div className=\"sy-lowcode-page\">{schema.nodes.map(renderNode)}</div>;\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","joinClassNames","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd_mobile","import_jsx_runtime","joinClassNames","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_react","import_antd","import_jsx_runtime","React","import_jsx_runtime","import_react","import_antd_mobile","import_jsx_runtime","joinClassNames","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_jsx_runtime","optionValue","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_jsx_runtime","optionValue","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_dayjs","dayjs","import_dayjs","import_dayjs","dayjs","dayjs","import_jsx_runtime","dayjs","zhCN","import_react","import_antd_mobile","import_dayjs","import_react","import_antd_mobile","import_dayjs","import_jsx_runtime","dayjs","React","import_jsx_runtime","dayjs","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_zh_CN","import_dayjs","import_jsx_runtime","dayjs","zhCN","import_react","import_antd_mobile","import_dayjs","import_jsx_runtime","dayjs","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_icons","import_jsx_runtime","import_jsx_runtime","React","import_react","import_jsx_runtime","PREVIEW_PAGE_EXTENSIONS","createLocalItem","canPreview","React","import_jsx_runtime","PREVIEW_PAGE_EXTENSIONS","canPreview","import_jsx_runtime","import_react","import_react","import_antd","import_jsx_runtime","createLocalItem","React","import_react","import_jsx_runtime","createLocalItem","ImageThumbContent","React","import_react","import_jsx_runtime","getTicketUrl","ImageThumbContent","React","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_antd","import_react","import_antd","import_icons","import_react","import_jsx_runtime","import_jsx_runtime","import_react","MobileAntd","import_jsx_runtime","import_react","import_jsx_runtime","getUserNameLikeId","import_jsx_runtime","import_react","import_react","import_antd","import_react","import_antd","import_icons","MobileAntd","import_jsx_runtime","getMobileComponent","MobileAntd","import_jsx_runtime","import_react","MobileAntd","import_jsx_runtime","EMPTY_TREE_DATA","toDepartmentValue","getMobilePopup","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","MobileAntd","import_jsx_runtime","getMobileComponent","MobileAntd","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","StarterKit","Underline","Superscript","Subscript","FontFamily","Color","Highlight","Link","Placeholder","TextAlign","Image","TableRow","TableHeader","TableCell","TaskList","TaskItem","CharacterCount","CodeBlockLowlight","value","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_react","import_jsx_runtime","message","getFormData","rules","React","import_react","import_icons","import_react","import_jsx_runtime","cn","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_react","Antd","import_jsx_runtime","AntForm","import_react","import_antd","import_antd","import_jsx_runtime","getFormData","import_jsx_runtime","cn","id","normalizeOperator","import_jsx_runtime","columnClasses","formatValue","import_react","getFormData","import_react","getFormData","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react","import_antd","import_icons","import_jsx_runtime","import_jsx_runtime","import_react","import_icons","import_jsx_runtime","toneClasses","import_react","import_antd","import_icons","import_react","import_antd","import_icons","message","import_jsx_runtime","import_jsx_runtime","React","import_react","import_antd","import_icons","import_jsx_runtime","import_react","import_antd","import_jsx_runtime","import_antd","import_jsx_runtime","import_antd","import_icons","import_jsx_runtime","toneClasses","import_antd","import_icons","import_jsx_runtime","import_antd","import_icons","import_jsx_runtime","import_react","import_antd","import_dayjs","import_icons","import_react","import_react","import_dayjs","import_antd","import_jsx_runtime","import_jsx_runtime","getFormData","dayjs","import_react","import_antd","import_icons","import_react","import_antd","import_jsx_runtime","getUserId","import_jsx_runtime","unwrapRuntimePayload","getFormData","import_react","import_dayjs","import_antd","import_jsx_runtime","FormDataBridge","getFormData","formatDateTime","dayjs","normalizeSelectedApprovers","AntForm","actions","import_jsx_runtime","import_jsx_runtime","formatDateTime","dayjs","normalizeBasePath","inferBasePath","unwrapRuntimePayload","title","forcedLockFieldIds","import_react","import_jsx_runtime","React"]}