best-lowcode-runtime 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lowcode/adapter.ts", "../src/lowcode/BestCrudPage.tsx", "../src/runtime/BestProvider.tsx", "../src/ui/BestBatchInput.tsx", "../src/ui/BestDetail.tsx", "../src/ui/BestFilePreview.tsx", "../src/ui/BestForm.tsx", "../src/ui/BestLightTable.tsx", "../src/ui/BestOverlay.tsx", "../src/ui/BestSearch.tsx", "../src/ui/BestStates.tsx", "../src/ui/BestTable.tsx", "../src/lowcode/runtime.ts", "../src/lowcode/schema.ts", "../src/lowcode/validate.ts", "../src/lowcode/BestTabbedPage.tsx"],
4
- "sourcesContent": ["import dayjs from 'dayjs'\nimport type { CrudDataAdapter } from './BestCrudPage'\n\nexport type BestValueNormalizer = (value: unknown, field?: string) => unknown\n\nexport function normalizeBestValues(\n values: Record<string, unknown>,\n normalize: BestValueNormalizer = defaultNormalize\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([field, value]) => [\n field,\n normalizeNested(value, normalize, field)\n ])\n )\n}\n\nfunction normalizeNested(value: unknown, normalize: BestValueNormalizer, field?: string): unknown {\n if (Array.isArray(value)) return value.map((item) => normalizeNested(item, normalize, field))\n if (dayjs.isDayjs(value) || value instanceof Date) return value\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeNested(item, normalize, key)])\n )\n }\n return normalize(value, field)\n}\n\nfunction defaultNormalize(value: unknown) {\n if (typeof value === 'string') return value.trim() === '' ? undefined : value.trim()\n return value\n}\n\nexport function createBestCrudAdapter(\n options: {\n normalize?: BestValueNormalizer\n fromList?: CrudDataAdapter['fromList']\n fromDetail?: CrudDataAdapter['fromDetail']\n toCreatePayload?: CrudDataAdapter['toCreatePayload']\n toUpdatePayload?: CrudDataAdapter['toUpdatePayload']\n } = {}\n): CrudDataAdapter {\n const normalize = options.normalize ?? defaultNormalize\n return {\n fromList: options.fromList,\n fromDetail: options.fromDetail,\n toCreatePayload: (values) =>\n options.toCreatePayload?.(normalizeBestValues(values, normalize)) ??\n normalizeBestValues(values, normalize),\n toUpdatePayload: (values, record) =>\n options.toUpdatePayload?.(normalizeBestValues(values, normalize), record) ??\n normalizeBestValues(values, normalize)\n }\n}\n", "import type { ActionType } from '@ant-design/pro-components'\nimport { Button, Modal, message } from 'antd'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useBestListService, useBestRegistry } from '../runtime'\nimport {\n BestDetail,\n type BestDetailField,\n type BestDetailSection,\n type BestFieldDefinition,\n BestDrawer,\n BestEmpty,\n BestError,\n BestLoading,\n BestForm,\n BestModal,\n BestSearch,\n BestTable,\n type BestTableColumn\n} from '../ui'\nimport { evaluateCondition, getDefaultValues } from '../ui/BestForm'\nimport {\n confirmBeforeAction,\n createLatestPageRequest,\n errorMessage,\n formatCrudValue,\n removeCrudRecord,\n toBestListQuery\n} from './runtime'\nimport type {\n CrudPageSchema,\n DetailFieldSchema,\n DetailSectionSchema,\n FieldSchema,\n FormMode,\n PageActionSchema,\n TableColumnSchema\n} from './schema'\nimport { assertValidCrudPageSchema } from './validate'\n\ntype RecordValue = Record<string, unknown>\n\nexport type BestCrudPageProps = {\n className?: string\n schema: CrudPageSchema\n adapter?: CrudDataAdapter\n}\n\nexport type CrudDataAdapter = {\n fromList?: (records: RecordValue[]) => RecordValue[]\n fromDetail?: (record: RecordValue) => RecordValue\n toCreatePayload?: (values: RecordValue) => RecordValue\n toUpdatePayload?: (values: RecordValue, record?: RecordValue) => RecordValue\n}\n\ntype DrawerState = { mode: 'closed' } | { mode: 'detail' | 'edit' | 'create'; record?: RecordValue }\ntype DetailState = { loading: boolean; error?: unknown; record?: RecordValue }\n\nfunction pickRowKeyValues(record: RecordValue | undefined, rowKey: string | string[]) {\n if (!record) return {}\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n return Object.fromEntries(\n keys.flatMap((key) => {\n const value = record[key]\n return value === undefined ? [] : [[key, value] as const]\n })\n )\n}\n\nfunction projectSubmittedValues(values: RecordValue, fields: FieldSchema[]) {\n const projected: RecordValue = {}\n fields.forEach((field) => {\n if (!Object.hasOwn(values, field.field)) return\n const value = values[field.field]\n if (field.component === 'repeatable' && Array.isArray(value) && field.itemFields?.length) {\n projected[field.field] = value.map((item) =>\n isRecord(item) ? projectSubmittedValues(item, field.itemFields ?? []) : item\n )\n return\n }\n projected[field.field] = value\n })\n return projected\n}\n\nexport function buildCrudSubmitValues(\n values: RecordValue,\n record: RecordValue | undefined,\n rowKey: string | string[]\n) {\n return { ...values, ...pickRowKeyValues(record, rowKey) }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction mergeRecordForEdit(\n record: RecordValue | undefined,\n detail: RecordValue,\n rowKey: string | string[]\n) {\n return record ? { ...record, ...detail, ...pickRowKeyValues(record, rowKey) } : detail\n}\n\nfunction toFieldDefinition(\n field: FieldSchema,\n dictionaries: ReturnType<typeof useBestRegistry>['dictionaries'],\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestFieldDefinition {\n const slot = field.slot\n const options = field.dict ? (dictionaries[field.dict] ?? []) : []\n const rules = field.rules ?? []\n return {\n field: field.field,\n label: field.label,\n component: field.component,\n placeholder: field.placeholder,\n options,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n required: field.required,\n disabled: field.disabled,\n hidden: field.hidden,\n maxDate: field.maxDate,\n span: field.span,\n defaultValue: field.defaultValue,\n visibleWhen: field.visibleWhen,\n disabledWhen: field.disabledWhen,\n clearWhenHidden: field.clearWhenHidden,\n itemFields: field.itemFields?.map((item) =>\n toFieldDefinition(item as FieldSchema, dictionaries, slots)\n ),\n minItems: field.minItems,\n maxItems: field.maxItems,\n render: slot ? (context) => slots[slot]?.(context) : undefined,\n rules:\n field.required && !rules.some((rule) => rule.required)\n ? [{ required: true, message: `\u8BF7\u586B\u5199${field.label}` }, ...rules]\n : rules\n }\n}\n\nfunction useFields(fields: FieldSchema[] = []) {\n const registry = useBestRegistry()\n return fields.map((field) => toFieldDefinition(field, registry.dictionaries, registry.slots))\n}\n\nfunction toDetailField(\n field: DetailFieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots'],\n record: RecordValue = {}\n): BestDetailField {\n const slot = field.slot\n const valueEnum = field.dict\n ? Object.fromEntries(\n (dictionary[field.dict] ?? []).map((item) => [String(item.value), item.label])\n )\n : undefined\n return {\n field: field.field,\n label: field.label,\n span: field.span,\n format: field.format,\n emptyText: field.emptyText,\n visible: !field.visibleWhen || evaluateCondition(field.visibleWhen, record, 'detail'),\n valueEnum,\n render: slot\n ? (value, record) => slots[slot]?.({ field: field.field, record, value }) ?? '-'\n : undefined\n }\n}\n\nfunction getPathValue(values: RecordValue, path: string) {\n if (Object.hasOwn(values, path)) return values[path]\n return path.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as RecordValue)[part]\n return undefined\n }, values)\n}\n\nfunction toDetailSection(\n section: DetailSectionSchema,\n record: RecordValue,\n dictionaries: ReturnType<typeof useBestRegistry>['dictionaries'],\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestDetailSection | null {\n if (section.visibleWhen && !evaluateCondition(section.visibleWhen, record, 'detail')) return null\n const fields = section.fields?.map((field) => toDetailField(field, dictionaries, slots, record))\n const table = section.table\n ? {\n key: section.key,\n data: (getPathValue(record, section.table.data) as RecordValue[]) ?? [],\n rowKey: section.table.rowKey,\n scrollX: section.table.scrollX,\n columns: section.table.columns.map((column) => ({\n key: column.field,\n title: column.title,\n dataIndex: column.field,\n width: column.width,\n fixed: column.fixed,\n render: (value: unknown, row: RecordValue) => {\n if (column.slot) return slots[column.slot]?.({ field: column.field, record: row, value }) ?? '-'\n if (column.dict) {\n const item = (dictionaries[column.dict] ?? []).find((candidate) => candidate.value === value)\n if (item) return item.label\n }\n const format = column.format\n if (format === 'date' || format === 'datetime') return formatCrudValue(value, format)\n if (format === 'money') return formatCrudValue(value, format)\n return value == null || value === '' ? '-' : String(value)\n }\n }))\n }\n : undefined\n const content = section.layout === 'slot' && section.slot\n ? slots[section.slot]?.({ record })\n : undefined\n return { key: section.key, title: section.title, description: section.description, columns: section.columns, span: section.span, variant: section.variant, fields, table, content }\n}\n\nfunction toTableColumn(\n column: TableColumnSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestTableColumn<RecordValue> {\n const slot = column.slot\n const valueEnum = column.dict\n ? Object.fromEntries(\n (dictionary[column.dict] ?? []).map((item) => [String(item.value), { text: item.label }])\n )\n : undefined\n return {\n dataIndex: column.field,\n search: false,\n title: column.title,\n width: column.width,\n fixed: column.fixed,\n valueEnum,\n renderText:\n column.format && !slot && !column.dict\n ? (value) => formatCrudValue(value, column.format)\n : undefined,\n render: slot\n ? (_value, record) =>\n slots[slot]?.({\n field: column.field,\n record,\n value: record[column.field]\n }) ?? '-'\n : undefined\n }\n}\n\nfunction toProTableSearchColumn(\n field: FieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>\n): BestTableColumn<RecordValue> {\n const valueType = (() => {\n switch (field.component) {\n case 'number':\n return 'digit' as const\n case 'select':\n return 'select' as const\n case 'date':\n return 'date' as const\n case 'dateRange':\n return 'dateRange' as const\n default:\n return 'text' as const\n }\n })()\n const options = field.dict ? (dictionary[field.dict] ?? []) : undefined\n return {\n dataIndex: field.field,\n title: field.label,\n valueType,\n search: true,\n hideInTable: true,\n initialValue: field.defaultValue,\n fieldProps: {\n ...(options ? { options } : {}),\n ...(field.maxDate === 'today'\n ? { disabledDate: (current: dayjs.Dayjs) => current.isAfter(dayjs(), 'day') }\n : {})\n }\n }\n}\n\nfunction confirmAction(content: string) {\n return new Promise<boolean>((resolve) => {\n Modal.confirm({\n content,\n okText: '\u786E\u8BA4',\n cancelText: '\u53D6\u6D88',\n onOk: () => resolve(true),\n onCancel: () => resolve(false)\n })\n })\n}\n\nexport function BestCrudPage({ adapter, className, schema }: BestCrudPageProps) {\n const registry = useBestRegistry()\n assertValidCrudPageSchema(schema, registry)\n const registeredListService = useBestListService(schema.dataSource.list)\n if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`)\n const listService = useCallback(\n async (\n query: Parameters<typeof registeredListService>[0],\n options?: Parameters<typeof registeredListService>[1]\n ) => {\n const response = await registeredListService(query, options)\n return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response\n },\n [adapter, registeredListService]\n )\n const searchFields = useFields(schema.search)\n const useBestSearch =\n schema.searchMode === 'bestSearch' ||\n schema.search?.some((field) => field.component === 'remoteSelect')\n const formFields = useFields(schema.form)\n const actionRef = useRef<ActionType>(undefined)\n const searchDefaultValues = useMemo(() => getDefaultValues(searchFields), [searchFields])\n const searchFieldNames = useMemo(\n () => new Set(searchFields.map((field) => field.field)),\n [searchFields]\n )\n const searchSchemaSignature = useMemo(\n () =>\n JSON.stringify(\n searchFields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue\n }))\n ),\n [searchFields]\n )\n const [query, setQuery] = useState<RecordValue>(searchDefaultValues)\n const queryRef = useRef<RecordValue>(searchDefaultValues)\n const queryStateRef = useRef({\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: false\n })\n const [drawer, setDrawer] = useState<DrawerState>({ mode: 'closed' })\n const [detailState, setDetailState] = useState<DetailState>({ loading: false })\n const detailRequestRef = useRef<AbortController | undefined>(undefined)\n const [submitting, setSubmitting] = useState(false)\n const submittingRef = useRef(false)\n\n const handleAction = useCallback(\n async (action: PageActionSchema, record?: RecordValue) => {\n if (action.access && !registry.access(action.access)) return\n if (action.effect === 'closeDetail') {\n detailRequestRef.current?.abort()\n setDrawer({ mode: 'closed' })\n setDetailState({ loading: false })\n return\n }\n if (action.effect !== 'remove' && !(await confirmBeforeAction(action.confirm, confirmAction)))\n return\n if (action.effect === 'openDetail') {\n detailRequestRef.current?.abort()\n const controller = new AbortController()\n detailRequestRef.current = controller\n setDrawer({ mode: 'detail', record })\n setDetailState({ loading: Boolean(schema.dataSource.detail), record })\n if (schema.dataSource.detail) {\n const detailService = registry.services[schema.dataSource.detail]\n if (!detailService) {\n setDetailState({ loading: false, error: new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`), record })\n return\n }\n try {\n const detail = await detailService(record ?? {}, { signal: controller.signal })\n if (controller.signal.aborted) return\n const normalized = isRecord(detail)\n ? adapter?.fromDetail ? adapter.fromDetail(detail) : detail\n : record ?? {}\n setDetailState({ loading: false, record: normalized })\n setDrawer({ mode: 'detail', record: normalized })\n } catch (error) {\n if (!controller.signal.aborted) setDetailState({ loading: false, error, record })\n }\n }\n }\n if (action.effect === 'openEdit') {\n let editRecord = record\n if (schema.dataSource.detail) {\n const detailService = registry.services[schema.dataSource.detail]\n if (!detailService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`)\n return\n }\n try {\n const detail = await detailService(record ?? {})\n if (detail && typeof detail === 'object' && !Array.isArray(detail)) {\n const normalizedDetail = adapter?.fromDetail\n ? adapter.fromDetail(detail as RecordValue)\n : (detail as RecordValue)\n editRecord = mergeRecordForEdit(record, normalizedDetail, schema.table.rowKey)\n }\n } catch (error) {\n message.error(errorMessage(error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n return\n }\n }\n setDrawer({ mode: 'edit', record: editRecord })\n }\n if (action.effect === 'openCreate') setDrawer({ mode: 'create' })\n if (action.effect === 'remove' && schema.dataSource.remove) {\n const removeService = registry.services[schema.dataSource.remove]\n if (!removeService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`)\n return\n }\n try {\n const deleted = await removeCrudRecord(\n record ?? {},\n removeService,\n action.confirm ?? `\u786E\u8BA4\u5220\u9664${schema.title}\uFF1F`,\n confirmAction\n )\n if (deleted) {\n message.success('\u5220\u9664\u6210\u529F')\n actionRef.current?.reload()\n }\n } catch (error) {\n message.error(errorMessage(error, '\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n }\n }\n if (action.effect === 'runAction' && action.action) {\n const runAction = registry.actions[action.action]\n if (!runAction) {\n message.error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n return\n }\n try {\n await runAction({ record })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, `${action.label}\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n }\n }\n },\n [adapter, registry, schema]\n )\n\n const columns = useMemo<BestTableColumn<RecordValue>[]>(() => {\n const proTableSearchFields = useBestSearch ? [] : (schema.search ?? [])\n const searchColumns = new Map(\n proTableSearchFields.map((field) => [\n field.field,\n toProTableSearchColumn(field, registry.dictionaries)\n ])\n )\n const configuredColumns = schema.table.columns.map((column) => {\n const tableColumn = toTableColumn(column, registry.dictionaries, registry.slots)\n const searchColumn = searchColumns.get(column.field)\n if (!searchColumn) return tableColumn\n searchColumns.delete(column.field)\n return { ...tableColumn, ...searchColumn, hideInTable: false }\n })\n configuredColumns.push(...searchColumns.values())\n if (!schema.table.actions?.length) return configuredColumns\n const actionColumnWidth = Math.max(160, schema.table.actions.length * 80 + 32)\n configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\n fixed: 'right',\n width: actionColumnWidth,\n render: (_, record) =>\n schema.table.actions?.map((action) => (\n <ActionButton action={action} key={action.id} record={record} onExecute={handleAction} />\n ))\n })\n return configuredColumns\n }, [\n handleAction,\n registry.dictionaries,\n registry.slots,\n schema.search,\n schema.table.actions,\n schema.table.columns,\n useBestSearch\n ])\n\n const pageRequest = useMemo(\n () =>\n createLatestPageRequest(listService, (error) =>\n message.error(errorMessage(error, `${schema.title}\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n ),\n [listService, schema.title]\n )\n const rowKey = schema.table.rowKey\n const request = useCallback(\n (params: RecordValue, sort?: Record<string, unknown>) =>\n pageRequest.request(\n toBestListQuery({ ...params, ...(useBestSearch ? queryRef.current : {}) }, sort)\n ),\n [pageRequest, useBestSearch]\n )\n\n useLayoutEffect(() => {\n const previous = queryStateRef.current\n if (previous.schemaId === schema.id && previous.searchSchemaSignature === searchSchemaSignature)\n return\n\n const shouldUseDefaults = previous.schemaId !== schema.id || !previous.userTouched\n const nextQuery = shouldUseDefaults\n ? searchDefaultValues\n : Object.fromEntries(\n Object.entries(queryRef.current).filter(([field]) => searchFieldNames.has(field))\n )\n queryRef.current = nextQuery\n setQuery(nextQuery)\n queryStateRef.current = {\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: shouldUseDefaults ? false : previous.userTouched\n }\n }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature])\n\n useEffect(() => () => pageRequest.abort(), [pageRequest])\n\n const submitForm = useCallback(\n async (values: RecordValue) => {\n if (submittingRef.current) return\n const serviceKey =\n drawer.mode === 'edit' ? schema.dataSource.update : schema.dataSource.create\n if (!serviceKey) {\n message.error(`${drawer.mode === 'edit' ? '\u66F4\u65B0' : '\u521B\u5EFA'}\u670D\u52A1\u672A\u914D\u7F6E`)\n return\n }\n const service = registry.services[serviceKey]\n if (!service) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${serviceKey}`)\n return\n }\n const record = drawer.mode === 'closed' ? undefined : drawer.record\n const payloadValues =\n drawer.mode === 'edit'\n ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey)\n : projectSubmittedValues(values, formFields)\n submittingRef.current = true\n setSubmitting(true)\n try {\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues)\n : (adapter?.toCreatePayload?.(payloadValues) ?? payloadValues)\n await service(payload)\n message.success('\u4FDD\u5B58\u6210\u529F')\n setDrawer({ mode: 'closed' })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n } finally {\n setSubmitting(false)\n submittingRef.current = false\n }\n },\n [\n adapter,\n drawer,\n formFields,\n registry.services,\n rowKey,\n schema.dataSource.create,\n schema.dataSource.update\n ]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={(values) => {\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n onSearch={(values) => {\n // Keep the latest filters synchronously available to request().\n // reload() may execute before React commits a state update.\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n />\n ) : null}\n <BestTable<RecordValue, RecordValue>\n actionRef={actionRef}\n className={className}\n columns={columns}\n pagination={{ showSizeChanger: true, defaultPageSize: schema.table.pageSize ?? 20 }}\n request={request}\n rowKey={\n Array.isArray(rowKey)\n ? (record) => rowKey.map((field) => String(record[field] ?? '')).join('-')\n : rowKey\n }\n search={useBestSearch ? false : undefined}\n scroll={schema.table.scrollX ? { x: schema.table.scrollX } : undefined}\n toolBarRender={() =>\n schema.toolbar?.map((action) => (\n <ActionButton action={action} key={action.id} onExecute={handleAction} />\n )) ?? []\n }\n />\n {drawer.mode === 'detail' && schema.detail?.mode === 'inline' ? (\n <DetailContent state={detailState} record={drawer.record} />\n ) : null}\n {drawer.mode !== 'closed' && (schema.detail?.mode !== 'inline' || drawer.mode !== 'detail') && schema.detail?.mode === 'drawer' ? <BestDrawer\n open\n width={schema.detail.width}\n title={drawer.mode === 'detail' ? `${schema.title}\u8BE6\u60C5` : drawer.mode === 'edit' ? `\u7F16\u8F91${schema.title}` : `\u65B0\u5EFA${schema.title}`}\n footer={drawer.mode === 'detail' && schema.detail.footer?.length ? <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>{schema.detail.footer.map((action) => <ActionButton action={action} key={action.id} record={drawer.record} onExecute={handleAction} />)}</div> : undefined}\n onClose={() => { detailRequestRef.current?.abort(); setDrawer({ mode: 'closed' }); setDetailState({ loading: false }) }}\n >\n {drawer.mode === 'detail' ? <DetailContent state={detailState} record={drawer.record} /> : null}\n {drawer.mode === 'edit' || drawer.mode === 'create' ? <BestForm fields={formFields} initialValues={drawer.record} loading={submitting} mode={drawer.mode as FormMode} onCancel={() => setDrawer({ mode: 'closed' })} onSubmit={(values) => { void submitForm(values) }} /> : null}\n </BestDrawer> : null}\n {drawer.mode !== 'closed' && (schema.detail?.mode !== 'inline' || drawer.mode !== 'detail') && schema.detail?.mode !== 'drawer' ? <BestModal\n open\n title={\n drawer.mode === 'detail'\n ? `${schema.title}\u8BE6\u60C5`\n : drawer.mode === 'edit'\n ? `\u7F16\u8F91${schema.title}`\n : `\u65B0\u5EFA${schema.title}`\n }\n width={schema.detail?.width}\n footer={drawer.mode === 'detail' && schema.detail?.footer?.length ? <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>{schema.detail.footer.map((action) => <ActionButton action={action} key={action.id} record={drawer.record} onExecute={handleAction} />)}</div> : undefined}\n onClose={() => { detailRequestRef.current?.abort(); setDrawer({ mode: 'closed' }); setDetailState({ loading: false }) }}\n >\n {drawer.mode === 'detail' ? (\n <DetailContent state={detailState} record={drawer.record} />\n ) : null}\n {drawer.mode === 'edit' || drawer.mode === 'create' ? (\n <BestForm\n fields={formFields}\n initialValues={drawer.record}\n loading={submitting}\n mode={drawer.mode as FormMode}\n onCancel={() => setDrawer({ mode: 'closed' })}\n onSubmit={(values) => {\n void submitForm(values)\n }}\n />\n ) : null}\n </BestModal> : null}\n </>\n )\n\n function DetailContent({ state, record }: { state: DetailState; record?: RecordValue }) {\n if (state.loading) return <BestLoading />\n if (state.error) return <BestError description={errorMessage(state.error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25`)} />\n if (!record) return <BestEmpty />\n const sections = schema.detail?.sections?.map((section) => toDetailSection(section, record, registry.dictionaries, registry.slots)).filter(Boolean) as BestDetailSection[] | undefined\n return <BestDetail\n fields={schema.detail?.fields?.map((field) => toDetailField(field, registry.dictionaries, registry.slots, record)) ?? []}\n sections={sections}\n sectionColumns={schema.detail?.columns}\n sectionGap={schema.detail?.gap}\n record={record}\n />\n }\n\n function ActionButton({\n action,\n record,\n onExecute\n }: {\n action: PageActionSchema\n record?: RecordValue\n onExecute: (action: PageActionSchema, record?: RecordValue) => Promise<void>\n }) {\n const permitted = !action.access || registry.access(action.access)\n if (!permitted) return null\n if (action.effect === 'slot' && action.slot) {\n return registry.slots[action.slot]?.({ record }) ?? null\n }\n return (\n <Button\n key={action.id}\n type={action.buttonType ?? 'link'}\n onClick={() => {\n void onExecute(action, record)\n }}\n >\n {action.label}\n </Button>\n )\n }\n}\n", "import type { ThemeConfig } from 'antd'\nimport { ConfigProvider } from 'antd'\nimport type { ReactNode } from 'react'\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react'\nimport type { BestListService } from '../lowcode/list'\n\nexport type BestDictionaryItem = { label: string; value: string | number; disabled?: boolean }\nexport type BestService = (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n) => Promise<unknown>\nexport type BestSlotContext = {\n pageId?: string\n tabKey?: string\n field?: string\n record?: Record<string, unknown>\n value?: unknown\n values?: Record<string, unknown>\n}\nexport type BestActionContext = BestSlotContext\nexport type BestAction = (context: BestActionContext) => void | Promise<void>\nexport type BestSlot = (context: BestSlotContext) => ReactNode\nexport type BestSlotRegistry = Record<string, BestSlot>\n\nexport type BestRegistry = {\n /** List services use the stable low-code pagination contract. */\n listServices: Record<string, BestListService>\n /** Command services, such as create, update and remove. */\n services: Record<string, BestService>\n dictionaries: Record<string, BestDictionaryItem[]>\n actions: Record<string, BestAction>\n slots: BestSlotRegistry\n access: (key: string) => boolean\n}\n\nexport type BestProviderProps = {\n children: ReactNode\n registry?: Partial<Omit<BestRegistry, 'access'>> & { access?: BestRegistry['access'] }\n theme?: ThemeConfig\n}\n\nexport type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {\n access?: BestRegistry['access']\n}\n\nexport type BestDictionaryActions = {\n setDictionary: (key: string, items: BestDictionaryItem[]) => void\n}\n\nconst emptyRegistry: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: () => true\n}\n\nconst defaultTheme: ThemeConfig = {\n token: {\n borderRadius: 6,\n controlHeight: 32,\n fontSize: 14\n }\n}\n\nconst BestRuntimeContext = createContext<BestRegistry>(emptyRegistry)\nconst BestDictionaryActionsContext = createContext<BestDictionaryActions | null>(null)\n\nexport function composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry {\n const result: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: emptyRegistry.access\n }\n const groups = ['listServices', 'services', 'dictionaries', 'actions', 'slots'] as const\n for (const layer of layers) {\n for (const group of groups) {\n for (const [key, value] of Object.entries(layer[group] ?? {})) {\n if (Object.hasOwn(result[group], key)) {\n throw new Error(`Registry key \u91CD\u590D\uFF1A${group}.${key}`)\n }\n result[group][key] = value as never\n }\n }\n if (layer.access) {\n const previousAccess = result.access\n result.access = (key) => previousAccess(key) && layer.access?.(key) !== false\n }\n }\n return result\n}\n\n/** Compose feature-local Runtime Slots and reject duplicate Slot keys. */\nexport function createBestSlotRegistry(...layers: BestSlotRegistry[]): BestSlotRegistry {\n const result: BestSlotRegistry = {}\n for (const layer of layers) {\n for (const [key, slot] of Object.entries(layer)) {\n if (Object.hasOwn(result, key)) throw new Error(`Slot key \u91CD\u590D\uFF1A${key}`)\n result[key] = slot\n }\n }\n return result\n}\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return composeBestRegistry(registry)\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const [dictionaryUpdates, setDictionaryUpdates] = useState<Record<string, BestDictionaryItem[]>>({})\n const setDictionary = useCallback((key: string, items: BestDictionaryItem[]) => {\n setDictionaryUpdates((current) => ({ ...current, [key]: items }))\n }, [])\n const value = useMemo(() => {\n const next = createBestRegistry(registry)\n Object.assign(next.dictionaries, dictionaryUpdates)\n return next\n }, [dictionaryUpdates, registry])\n const mergedTheme = useMemo<ThemeConfig>(\n () => ({ ...defaultTheme, ...theme, token: { ...defaultTheme.token, ...theme?.token } }),\n [theme]\n )\n return (\n <BestRuntimeContext.Provider value={value}>\n <ConfigProvider theme={mergedTheme}>\n <BestDictionaryActionsContext.Provider value={{ setDictionary }}>\n {children}\n </BestDictionaryActionsContext.Provider>\n </ConfigProvider>\n </BestRuntimeContext.Provider>\n )\n}\n\nexport function useBestRegistry() {\n return useContext(BestRuntimeContext)\n}\n\nexport function useBestService(key: string): BestService {\n const service = useBestRegistry().services[key]\n if (!service) throw new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${key}`)\n return service\n}\n\nexport function useBestListService(key: string): BestListService | undefined {\n return useBestRegistry().listServices[key]\n}\n\nexport function useBestAccess(key?: string): boolean {\n const registry = useBestRegistry()\n return key ? registry.access(key) : true\n}\n\nexport function useBestDictionary(key?: string): BestDictionaryItem[] {\n const dictionaries = useBestRegistry().dictionaries\n return key ? (dictionaries[key] ?? []) : []\n}\n\nexport function useBestDictionaryActions(): BestDictionaryActions {\n const actions = useContext(BestDictionaryActionsContext)\n if (!actions) throw new Error('useBestDictionaryActions \u5FC5\u987B\u5728 BestProvider \u5185\u4F7F\u7528')\n return actions\n}\n\nexport function useBestAction(key: string): BestAction {\n const action = useBestRegistry().actions[key]\n if (!action) throw new Error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${key}`)\n return action\n}\n", "import { Input } from 'antd'\nimport type { TextAreaProps } from 'antd/es/input'\nimport { useImperativeHandle, useMemo, useState } from 'react'\n\nexport type BestBatchInputRef = {\n getParsedValue: () => string[][]\n}\n\nexport type BestBatchInputProps = Omit<TextAreaProps, 'onChange'> & {\n ref?: React.Ref<BestBatchInputRef>\n separator?: string\n onChange?: (value: string, parsed: string[][]) => void\n}\n\nfunction parse(value: string, separator: string) {\n const escaped = separator.replace(/[\\\\\\]\\-^]/g, '\\\\$&')\n const delimiter = new RegExp(`[${escaped}]`)\n return value\n .split('\\n')\n .map((row) => row.trim())\n .filter(Boolean)\n .map((row) => row.split(delimiter).map((cell) => cell.trim()))\n}\n\nexport function BestBatchInput({\n ref,\n separator = '|',\n value,\n defaultValue,\n onChange,\n ...props\n}: BestBatchInputProps) {\n const [innerValue, setInnerValue] = useState(String(defaultValue ?? ''))\n const currentValue = value == null ? innerValue : String(value)\n const parsed = useMemo(() => parse(currentValue, separator), [currentValue, separator])\n\n useImperativeHandle(ref, () => ({ getParsedValue: () => parsed }), [parsed])\n\n return (\n <Input.TextArea\n {...props}\n value={currentValue}\n onChange={(event) => {\n const nextValue = event.target.value\n if (value == null) setInnerValue(nextValue)\n onChange?.(nextValue, parse(nextValue, separator))\n }}\n />\n )\n}\n", "import { Descriptions, Empty, Table, Typography } from 'antd'\nimport dayjs from 'dayjs'\nimport type { ReactNode } from 'react'\nimport type { BestDetailField } from './types'\n\nexport type BestDetailTable = {\n key: string\n data: Record<string, unknown>[]\n rowKey?: string\n columns: {\n key: string\n title: string\n dataIndex?: string\n width?: number\n fixed?: 'left' | 'right'\n render?: (value: unknown, record: Record<string, unknown>) => React.ReactNode\n }[]\n scrollX?: number | string\n}\n\nexport type BestDetailSection = {\n key: string\n title?: ReactNode\n description?: ReactNode\n columns?: number\n span?: number\n variant?: 'plain' | 'card'\n fields?: BestDetailField[]\n table?: BestDetailTable\n content?: ReactNode\n}\n\nexport type BestDetailProps = {\n fields: BestDetailField[]\n record?: Record<string, unknown>\n column?: number\n sections?: BestDetailSection[]\n sectionColumns?: number\n sectionGap?: number | string\n}\n\nexport function BestDetail({ fields, record = {}, column = 2, sections, sectionColumns, sectionGap = 20 }: BestDetailProps) {\n const content = sections?.length\n ? <div style={{ display: 'grid', minWidth: 0, maxWidth: '100%', width: '100%', boxSizing: 'border-box', gridTemplateColumns: `repeat(${sectionColumns ?? 1}, minmax(0, 1fr))`, gap: sectionGap }}>\n {sections.map((section) => {\n const card = section.variant === 'card'\n return <section key={section.key} style={{ minWidth: 0, maxWidth: '100%', gridColumn: section.span ? `span ${section.span}` : undefined, marginBottom: 0, border: card ? '1px solid #f0f0f0' : undefined, borderRadius: card ? 6 : undefined, overflow: card ? 'hidden' : undefined, background: card ? '#fff' : undefined }}>\n {section.title ? <div style={{ padding: card ? '8px 12px' : undefined, background: card ? '#fafafa' : undefined, borderBottom: card ? '1px solid #f0f0f0' : undefined }}><Typography.Title level={5} style={{ margin: 0 }}>{section.title}</Typography.Title></div> : null}\n <div style={{ padding: card ? 12 : undefined }}>\n {section.description ? <Typography.Paragraph type='secondary'>{section.description}</Typography.Paragraph> : null}\n {section.content}\n {section.fields ? <FieldDescriptions fields={section.fields} record={record} column={section.columns ?? column} /> : null}\n {section.table ? <DetailTable table={section.table} /> : null}\n </div>\n </section>\n })}\n </div>\n : <FieldDescriptions fields={fields} record={record} column={column} />\n return content\n}\n\nfunction FieldDescriptions({ fields, record, column }: { fields: BestDetailField[]; record: Record<string, unknown>; column: number }) {\n const visibleFields = fields.filter((field) => field.visible !== false)\n return <div style={{ minWidth: 0, maxWidth: '100%', width: '100%', overflowX: 'auto' }}><Descriptions bordered column={column} size='small' style={{ minWidth: 0 }}>\n {visibleFields.map((field) => {\n const value = getPathValue(record, field.field)\n const display = field.render\n ? field.render(value, record)\n : (field.valueEnum?.[String(value)] ?? formatValue(value, field.format, field.emptyText))\n return <Descriptions.Item key={field.field} label={field.label} span={field.span}>{display}</Descriptions.Item>\n })}\n </Descriptions></div>\n}\n\nfunction DetailTable({ table }: { table: BestDetailTable }) {\n if (!table.data.length) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description='\u6682\u65E0\u6570\u636E' />\n return <div style={{ minWidth: 0, maxWidth: '100%', width: '100%', overflowX: 'auto' }}><Table<Record<string, unknown>>\n size='small'\n bordered\n pagination={false}\n rowKey={table.rowKey}\n dataSource={table.data}\n scroll={table.scrollX ? { x: table.scrollX } : undefined}\n columns={table.columns.map((column) => ({ ...column, dataIndex: column.dataIndex ?? column.key }))}\n /></div>\n}\n\nfunction formatValue(value: unknown, format: BestDetailField['format'], emptyText = '-') {\n if (value == null || value === '') return emptyText\n const type = typeof format === 'object' ? format.type : format\n if (!type || type === 'text') return String(value)\n if (type === 'number') {\n const number = Number(value)\n if (!Number.isFinite(number)) return String(value)\n const precision = typeof format === 'object' ? format.precision : undefined\n return number.toLocaleString('zh-CN', precision === undefined ? undefined : { minimumFractionDigits: precision, maximumFractionDigits: precision })\n }\n if (type === 'money') {\n const number = Number(value)\n return Number.isFinite(number) ? number.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : String(value)\n }\n if (type === 'boolean') return value ? '\u662F' : '\u5426'\n if (type === 'json') return typeof value === 'string' ? value : JSON.stringify(value)\n const date = dayjs(value as string | number | Date)\n return date.isValid() ? date.format(type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss') : String(value)\n}\n\nfunction getPathValue(values: Record<string, unknown>, path: string) {\n if (Object.hasOwn(values, path)) return values[path]\n return path.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') {\n return (current as Record<string, unknown>)[part]\n }\n return undefined\n }, values)\n}\n", "import { Button, Image, List, Typography } from 'antd'\n\nexport type BestFileItem = {\n url: string\n name?: string\n mimeType?: string\n}\n\nexport type BestFilePreviewProps = {\n files: BestFileItem[]\n onDownload?: (file: BestFileItem) => void\n}\n\nfunction isImage(file: BestFileItem) {\n return (\n file.mimeType?.startsWith('image/') ||\n /\\.(avif|bmp|gif|jpe?g|png|svg|webp)(?:$|[?#])/i.test(file.url)\n )\n}\n\nexport function BestFilePreview({ files, onDownload }: BestFilePreviewProps) {\n return (\n <List\n dataSource={files}\n renderItem={(file) => (\n <List.Item\n actions={[\n <Button key='download' type='link' onClick={() => onDownload?.(file)}>\n \u4E0B\u8F7D\n </Button>\n ]}\n >\n {isImage(file) ? (\n <Image alt={file.name ?? '\u6587\u4EF6\u9884\u89C8'} height={48} preview src={file.url} width={48} />\n ) : null}\n <Typography.Text ellipsis style={{ marginInlineStart: isImage(file) ? 12 : 0 }}>\n {file.name ?? file.url}\n </Typography.Text>\n </List.Item>\n )}\n />\n )\n}\n", "import type { FormRule } from 'antd'\nimport { Button, DatePicker, Form, Input, InputNumber, Select, Space } from 'antd'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormMode } from '../lowcode/schema'\nimport { useBestRegistry } from '../runtime'\nimport type { BestFieldDefinition, BestFieldRule, BestOption } from './types'\n\nexport type BestFormProps = {\n fields: BestFieldDefinition[]\n initialValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n mode?: FormMode\n onSubmit: (value: Record<string, unknown>) => void\n onCancel?: () => void\n}\n\ntype FormControlProps = {\n field: BestFieldDefinition\n values: Record<string, unknown>\n scopeValues?: Record<string, unknown>\n namePath?: string | number | (string | number)[]\n value?: unknown\n onChange?: (...args: unknown[]) => void\n} & Record<string, unknown>\n\nfunction toNamePath(path?: string | number | (string | number)[]) {\n return path === undefined ? [] : Array.isArray(path) ? path : [path]\n}\n\nfunction isNamePath(value: string | number | (string | number)[]) {\n return Array.isArray(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return false\n }\n if (dayjs.isDayjs(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction appendNamePath(\n path: string | number | (string | number)[] | undefined,\n ...segments: (string | number)[]\n) {\n return [...toNamePath(path), ...segments]\n}\n\nfunction getConditionFieldValue(values: Record<string, unknown>, field: string) {\n if (Object.hasOwn(values, field)) return values[field]\n return getPathValue(values, field.split('.'))\n}\n\nfunction getScopedValues(values: Record<string, unknown>, itemPath: (string | number)[]) {\n const itemValues = getPathValue(values, itemPath)\n return isRecord(itemValues) ? { ...values, ...itemValues } : values\n}\n\nfunction isFieldVisible(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n}\n\nfunction resolveFieldDisabled(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return (\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n )\n}\n\nfunction toDayjsValue(value: unknown): Dayjs | null {\n if (dayjs.isDayjs(value)) return value\n if (value instanceof Date) return dayjs(value)\n if (typeof value === 'number') {\n const normalized = Math.abs(value) >= 1_000_000_000_000 ? value : value * 1000\n const parsed = dayjs(normalized)\n return parsed.isValid() ? parsed : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = dayjs(trimmed)\n return parsed.isValid() ? parsed : null\n }\n return null\n}\n\nexport function toDatePickerValue(value: unknown): Dayjs | null {\n return toDayjsValue(value)\n}\n\nexport function toDateRangePickerValue(value: unknown): [Dayjs | null, Dayjs | null] | null {\n if (!Array.isArray(value)) return null\n const nextValue: [Dayjs | null, Dayjs | null] = [toDayjsValue(value[0]), toDayjsValue(value[1])]\n return nextValue[0] || nextValue[1] ? nextValue : null\n}\n\nexport function serializeDatePickerValue(_: Dayjs | null, dateString: string) {\n return dateString || undefined\n}\n\nexport function serializeDateRangePickerValue(\n _: [Dayjs | null, Dayjs | null] | null,\n dateStrings: [string, string]\n) {\n return dateStrings[0] || dateStrings[1] ? dateStrings : undefined\n}\n\nfunction fieldSignature(field: BestFieldDefinition): unknown {\n return {\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n itemFields: field.itemFields?.map((itemField) => fieldSignature(itemField))\n }\n}\n\nfunction FormControl({\n field,\n values,\n scopeValues,\n mode = 'create',\n form,\n namePath,\n value,\n onChange,\n ...controlProps\n}: FormControlProps & { mode?: FormMode; form: ReturnType<typeof Form.useForm>[0] }) {\n const registry = useBestRegistry()\n const renderValues = scopeValues ?? values\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value !== undefined ? value : getPathValue(values, namePath ?? field.field)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n onChange={(nextValue) => {\n if (onChange) onChange(nextValue)\n else form.setFieldValue(namePath ?? field.field, nextValue)\n }}\n registry={registry}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n case 'slot':\n return (\n <>\n {field.render?.({\n field: field.field,\n values: renderValues,\n value: value !== undefined ? value : getPathValue(values, namePath ?? field.field),\n mode,\n disabled: field.disabled,\n setValue: (name, nextValue) =>\n form.setFieldValue(\n namePath\n ? isNamePath(name)\n ? name\n : [...toNamePath(namePath).slice(0, -1), name]\n : name,\n nextValue\n )\n })}\n </>\n )\n case 'repeatable':\n return (\n <RepeatableField\n field={field}\n form={form}\n mode={mode}\n namePath={namePath}\n values={values}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction RepeatableField({\n field,\n form,\n mode,\n namePath,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n mode: FormMode\n namePath?: string | number | (string | number)[]\n values: Record<string, unknown>\n}) {\n const listName = namePath ?? field.field\n return (\n <Form.List name={listName}>\n {(items, { add, remove }) => (\n <>\n {items.map((item) => (\n <RepeatableFieldRow\n key={item.key}\n field={field}\n form={form}\n itemCount={items.length}\n itemName={item.name}\n itemKey={item.key}\n listName={listName}\n mode={mode}\n remove={remove}\n values={values}\n />\n ))}\n <Button\n disabled={field.maxItems !== undefined && items.length >= field.maxItems}\n onClick={() => add(resolveInitialValues(field.itemFields ?? [], undefined))}\n type='dashed'\n >\n \u65B0\u589E\u4E00\u9879\n </Button>\n </>\n )}\n </Form.List>\n )\n}\n\nfunction RepeatableFieldRow({\n field,\n form,\n itemCount,\n itemName,\n itemKey,\n listName,\n mode,\n remove,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n itemCount: number\n itemName: number\n itemKey: React.Key\n listName: string | number | (string | number)[]\n mode: FormMode\n remove: (index: number) => void\n values: Record<string, unknown>\n}) {\n const itemPath = appendNamePath(listName, itemName)\n const itemValues = getPathValue(values, itemPath)\n const scopeValues = getScopedValues(values, itemPath)\n\n useEffect(() => {\n field.itemFields?.forEach((itemField) => {\n if (!itemField.clearWhenHidden) return\n const nextPath = appendNamePath(itemPath, itemField.field)\n if (\n !isFieldVisible(itemField, scopeValues, mode) &&\n getPathValue(values, nextPath) !== undefined\n ) {\n form.setFieldValue(nextPath, undefined)\n }\n })\n }, [field.itemFields, form, itemPath, mode, scopeValues, values])\n\n return (\n <Space key={itemKey} align='start'>\n {field.itemFields?.map((itemField) => {\n if (!isFieldVisible(itemField, scopeValues, mode)) return null\n const nextPath = appendNamePath(itemPath, itemField.field)\n return (\n <Form.Item\n key={itemField.field}\n label={itemField.label}\n name={[itemName, itemField.field]}\n rules={toAntRules(itemField.rules)}\n >\n <FormControl\n field={{\n ...itemField,\n disabled: resolveFieldDisabled(itemField, scopeValues, mode)\n }}\n form={form}\n mode={mode}\n namePath={nextPath}\n scopeValues={scopeValues}\n values={isRecord(itemValues) ? { ...values, ...itemValues } : values}\n />\n </Form.Item>\n )\n })}\n <Button\n disabled={itemCount <= (field.minItems ?? 0)}\n onClick={() => remove(itemName)}\n type='link'\n >\n \u5220\u9664\n </Button>\n </Space>\n )\n}\n\ntype FormFieldsProps = Pick<BestFormProps, 'fields' | 'initialValues' | 'mode'> & {\n form: ReturnType<typeof Form.useForm>[0]\n}\n\nfunction FormFields({ fields, form, initialValues, mode = 'create' }: FormFieldsProps) {\n const values =\n (Form.useWatch([], { form, preserve: true }) as Record<string, unknown> | undefined) ??\n initialValues ??\n {}\n const isVisible = (field: BestFieldDefinition) =>\n !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n useEffect(() => {\n fields\n .filter((field) => field.clearWhenHidden && !isVisible(field))\n .forEach((field) => {\n if (values[field.field] !== undefined) form.setFieldValue(field.field, undefined)\n })\n }, [fields, form, mode, values])\n return (\n <>\n {fields\n .filter((field) => isVisible(field))\n .map((field) => {\n const control = (\n <FormControl\n key={field.field}\n field={{\n ...field,\n disabled:\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n }}\n form={form}\n mode={mode}\n values={values}\n />\n )\n return field.component === 'repeatable' ? (\n <Form.Item key={field.field} label={field.label}>\n {control}\n </Form.Item>\n ) : (\n <Form.Item\n key={field.field}\n label={field.label}\n name={field.field}\n rules={toAntRules(field.rules)}\n >\n {control}\n </Form.Item>\n )\n })}\n </>\n )\n}\n\nexport function toAntRules(rules: BestFieldRule[] | undefined): FormRule[] | undefined {\n return rules?.map(\n (rule) =>\n Object.fromEntries(\n Object.entries({\n required: rule.required,\n type: rule.type === 'string' ? undefined : rule.type,\n min: rule.min ?? rule.minLength,\n max: rule.max ?? rule.maxLength,\n pattern: safeRegExp(rule.pattern),\n message: rule.message,\n validator:\n rule.type === 'integer'\n ? async (_: unknown, value: unknown) => {\n if (value === undefined || value === null || value === '') return\n if (!Number.isInteger(Number(value)))\n throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\n }).filter(([, value]) => value !== undefined)\n ) as FormRule\n )\n}\n\nfunction safeRegExp(pattern: string | undefined) {\n if (!pattern) return undefined\n try {\n return new RegExp(pattern)\n } catch {\n return undefined\n }\n}\n\nexport function RemoteSelect({\n field,\n value,\n disabled,\n placeholder,\n onChange,\n registry\n}: {\n field: BestFieldDefinition\n value?: unknown\n disabled?: boolean\n placeholder?: string\n onChange: (value: unknown) => void\n registry: ReturnType<typeof useBestRegistry>\n}) {\n const [keywordOptions, setKeywordOptions] = useState<BestOption[]>([])\n const [selectedOptions, setSelectedOptions] = useState<BestOption[]>([])\n const [loading, setLoading] = useState(false)\n const [keyword, setKeyword] = useState('')\n const keywordRequestId = useRef(0)\n const selectedRequestId = useRef(0)\n const service = field.remoteService ? registry.services[field.remoteService] : undefined\n const labelField = field.labelField ?? 'label'\n const valueField = field.valueField ?? 'value'\n const searchField = field.searchField ?? 'keyword'\n const debounceMs = field.debounceMs ?? 300\n const pageSize = field.pageSize ?? 20\n\n const parseOptions = (response: unknown): BestOption[] => {\n const raw = Array.isArray(response)\n ? response\n : ((response as { items?: unknown[]; list?: unknown[] })?.items ??\n (response as { list?: unknown[] })?.list ??\n [])\n return raw.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const record = item as Record<string, unknown>\n const optionValue = record[valueField]\n if (typeof optionValue !== 'string' && typeof optionValue !== 'number') return []\n return [\n {\n label: String(record[labelField] ?? optionValue ?? ''),\n value: optionValue,\n disabled: Boolean(record.disabled)\n }\n ]\n })\n }\n\n const mergeOptions = (base: BestOption[], extra: BestOption[]) => {\n const merged = new Map(base.map((item) => [String(item.value), item]))\n extra.forEach((item) => {\n merged.set(String(item.value), item)\n })\n return [...merged.values()]\n }\n\n const options = useMemo(\n () => mergeOptions(keywordOptions, selectedOptions),\n [keywordOptions, selectedOptions]\n )\n\n useEffect(() => {\n const currentRequestId = ++keywordRequestId.current\n if (!service) {\n setKeywordOptions([])\n setLoading(false)\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === keywordRequestId.current && !controller.signal.aborted\n const timer = window.setTimeout(async () => {\n setLoading(true)\n try {\n const response = await service(\n { [searchField]: keyword, page: 1, pageSize },\n { signal: controller.signal }\n )\n if (isCurrent()) setKeywordOptions(parseOptions(response))\n } catch {\n if (isCurrent()) setKeywordOptions([])\n } finally {\n if (isCurrent()) setLoading(false)\n }\n }, debounceMs)\n return () => {\n window.clearTimeout(timer)\n controller.abort()\n }\n }, [debounceMs, keyword, labelField, pageSize, searchField, service, valueField])\n\n useEffect(() => {\n const currentRequestId = ++selectedRequestId.current\n if (!service) {\n setSelectedOptions([])\n return\n }\n if (value === undefined || value === null || value === '') {\n setSelectedOptions([])\n return\n }\n if (typeof value !== 'string' && typeof value !== 'number') {\n setSelectedOptions([])\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === selectedRequestId.current && !controller.signal.aborted\n const fallbackOption: BestOption = {\n label: String(value),\n value: value as string | number\n }\n setSelectedOptions([fallbackOption])\n void service({ [valueField]: value, page: 1, pageSize }, { signal: controller.signal })\n .then((response) => {\n if (!isCurrent()) return\n const resolvedOptions = parseOptions(response)\n if (resolvedOptions.length) {\n setSelectedOptions(mergeOptions([fallbackOption], resolvedOptions))\n }\n })\n .catch(() => undefined)\n return () => {\n controller.abort()\n }\n }, [labelField, pageSize, service, value, valueField])\n\n return (\n <Select\n showSearch\n filterOption={false}\n loading={loading}\n value={value}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n onSearch={setKeyword}\n onChange={onChange}\n />\n )\n}\n\nexport function BestForm({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps) {\n const resolvedInitialValues = useMemo(\n () => resolveInitialValues(fields, initialValues),\n [fields, initialValues]\n )\n const formSignature = useMemo(\n () =>\n JSON.stringify([mode, fields.map((field) => fieldSignature(field)), resolvedInitialValues]),\n [fields, mode, resolvedInitialValues]\n )\n return (\n <BestFormBody\n key={formSignature}\n extra={extra}\n fields={fields}\n initialValues={resolvedInitialValues}\n loading={loading}\n mode={mode}\n onCancel={onCancel}\n onSubmit={onSubmit}\n submitText={submitText}\n />\n )\n}\n\nfunction BestFormBody({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n return (\n <Form form={form} initialValues={initialValues} layout='vertical' onFinish={onSubmit}>\n <FormFields fields={fields} form={form} initialValues={initialValues} mode={mode} />\n <Space>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n {onCancel ? <Button onClick={onCancel}>\u53D6\u6D88</Button> : null}\n {extra}\n </Space>\n </Form>\n )\n}\n\nexport function getDefaultValues(fields: BestFieldDefinition[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field) => field.defaultValue !== undefined)\n .map((field) => [field.field, field.defaultValue])\n )\n}\n\nfunction resolveInitialValues(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown> | undefined\n) {\n const values = mergeDefinedValues(getDefaultValues(fields), initialValues)\n const resolvedValues = { ...values }\n fields.forEach((field) => {\n if (field.component !== 'repeatable' || !field.itemFields) return\n const items: unknown[] = Array.isArray(resolvedValues[field.field])\n ? (resolvedValues[field.field] as unknown[])\n : []\n resolvedValues[field.field] = items.map((item) =>\n resolveInitialValues(field.itemFields ?? [], isRecord(item) ? item : {})\n )\n })\n return resolvedValues\n}\n\nexport function mergeDefinedValues(\n baseValues: Record<string, unknown>,\n nextValues: Record<string, unknown> | undefined\n) {\n const mergedValues = { ...baseValues }\n Object.entries(nextValues ?? {}).forEach(([key, value]) => {\n if (value === undefined) return\n const currentValue = mergedValues[key]\n if (isRecord(currentValue) && isRecord(value)) {\n mergedValues[key] = mergeDefinedValues(currentValue, value)\n return\n }\n mergedValues[key] = value\n })\n return mergedValues\n}\n\nfunction getPathValue(\n values: Record<string, unknown>,\n path: string | number | (string | number)[]\n) {\n const parts = Array.isArray(path) ? path : [path]\n return parts.reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as Record<string, unknown>)[part]\n return undefined\n }, values)\n}\n\nexport function evaluateCondition(\n condition: NonNullable<BestFieldDefinition['visibleWhen']>,\n values: Record<string, unknown>,\n mode: FormMode\n): boolean {\n switch (condition.operator) {\n case 'equals':\n return getConditionFieldValue(values, condition.field) === condition.value\n case 'notEmpty':\n return (\n getConditionFieldValue(values, condition.field) !== undefined &&\n getConditionFieldValue(values, condition.field) !== null &&\n getConditionFieldValue(values, condition.field) !== ''\n )\n case 'modeEquals':\n return mode === condition.value\n case 'and':\n return condition.conditions.every((item) => evaluateCondition(item, values, mode))\n case 'or':\n return condition.conditions.some((item) => evaluateCondition(item, values, mode))\n case 'not':\n return !evaluateCondition(condition.condition, values, mode)\n }\n}\n", "import type { TableColumnsType } from 'antd'\nimport { Table } from 'antd'\n\nexport type BestLightTableColumn<T extends Record<string, unknown>> = {\n field: keyof T & string\n title: string\n width?: number\n render?: (value: unknown, record: T, index: number) => React.ReactNode\n}\n\nexport type BestLightTableProps<T extends Record<string, unknown>> = {\n columns: BestLightTableColumn<T>[]\n data: T[]\n rowKey?: string\n}\n\nexport function BestLightTable<T extends Record<string, unknown>>({\n columns,\n data,\n rowKey\n}: BestLightTableProps<T>) {\n const tableColumns: TableColumnsType<T> = columns.map((column) => ({\n dataIndex: column.field,\n key: column.field,\n title: column.title,\n width: column.width,\n render: column.render\n }))\n return (\n <Table\n columns={tableColumns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n size='small'\n />\n )\n}\n", "import { Drawer, Modal } from 'antd'\nimport type { ReactNode } from 'react'\n\ntype OverlayProps = {\n children: ReactNode\n open: boolean\n title: ReactNode\n onClose: () => void\n width?: number | string\n footer?: ReactNode\n}\n\nexport function BestDrawer({ children, open, title, onClose, width, footer }: OverlayProps) {\n return (\n <Drawer destroyOnHidden open={open} title={title} width={width ?? 640} footer={footer} onClose={onClose}>\n {children}\n </Drawer>\n )\n}\n\nexport function BestModal({ children, open, title, onClose, width, footer }: OverlayProps) {\n return (\n <Modal\n destroyOnHidden\n footer={footer ?? null}\n open={open}\n title={title}\n width={width}\n onCancel={onClose}\n styles={{\n root: { minWidth: 0, maxWidth: '100%', boxSizing: 'border-box' },\n body: { minWidth: 0, maxWidth: '100%', overflowX: 'hidden', boxSizing: 'border-box' }\n }}\n >\n <div style={{ minWidth: 0, maxWidth: '100%', width: '100%', boxSizing: 'border-box' }}>{children}</div>\n </Modal>\n )\n}\n", "import type { FormInstance } from 'antd'\nimport { Button, Col, DatePicker, Form, Input, InputNumber, Row, Select } from 'antd'\nimport dayjs from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useBestRegistry } from '../runtime'\nimport {\n getDefaultValues,\n mergeDefinedValues,\n RemoteSelect,\n serializeDatePickerValue,\n serializeDateRangePickerValue,\n toAntRules,\n toDatePickerValue,\n toDateRangePickerValue\n} from './BestForm'\nimport type { BestFieldDefinition } from './types'\nimport './BestSearch.module.less'\n\nexport type BestSearchProps = {\n fields: BestFieldDefinition[]\n value?: Record<string, unknown>\n defaultValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n onChange?: (value: Record<string, unknown>) => void\n onSearch: (value: Record<string, unknown>) => void\n onReset?: (value: Record<string, unknown>) => void\n}\n\ntype FieldControlProps = {\n field: BestFieldDefinition\n value?: unknown\n onChange?: (value: unknown) => void\n} & Record<string, unknown>\n\nfunction searchFormSignature(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown>\n) {\n return JSON.stringify([\n fields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize\n })),\n initialValues\n ])\n}\n\nfunction FieldControl({ field, value, onChange, ...controlProps }: FieldControlProps) {\n const registry = useBestRegistry()\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value as never}\n onChange={onChange ?? (() => undefined)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n registry={registry}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction syncValues(\n form: FormInstance,\n value: Record<string, unknown>,\n fields: BestFieldDefinition[]\n) {\n form.setFieldsValue(Object.fromEntries(fields.map((field) => [field.field, undefined])) as never)\n form.setFieldsValue(value as never)\n}\n\nexport function BestSearch({\n fields,\n value,\n defaultValues,\n loading,\n submitText = '\u67E5\u8BE2',\n extra,\n onChange,\n onSearch,\n onReset\n}: BestSearchProps) {\n const initialValues = useMemo(\n () => mergeDefinedValues(getDefaultValues(fields), defaultValues),\n [fields, defaultValues]\n )\n return (\n <BestSearchBody\n key={searchFormSignature(fields, initialValues)}\n extra={extra}\n fields={fields}\n initialValues={initialValues}\n loading={loading}\n onChange={onChange}\n onReset={onReset}\n onSearch={onSearch}\n submitText={submitText}\n value={value}\n />\n )\n}\n\nfunction BestSearchBody({\n fields,\n value,\n initialValues,\n loading,\n submitText,\n extra,\n onChange,\n onSearch,\n onReset\n}: Omit<BestSearchProps, 'defaultValues'> & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n const valueSignatureRef = useRef<string | undefined>(undefined)\n const controlledRef = useRef(false)\n\n useEffect(() => {\n if (value === undefined) {\n if (controlledRef.current) {\n syncValues(form, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n controlledRef.current = false\n }\n return\n }\n controlledRef.current = true\n const signature = JSON.stringify(value)\n if (valueSignatureRef.current === signature) return\n syncValues(form, value, fields)\n valueSignatureRef.current = signature\n }, [fields, form, value])\n\n return (\n <Form\n form={form}\n initialValues={initialValues}\n layout='vertical'\n onFinish={(values) => onSearch(values as Record<string, unknown>)}\n onValuesChange={(_, values) => onChange?.(values as Record<string, unknown>)}\n className='best-lowcode-search'\n >\n <Row gutter={16} align='bottom'>\n {fields\n .filter((field) => !field.hidden)\n .map((field) => (\n <Col key={field.field} span={field.span ?? 6}>\n <Form.Item label={field.label} name={field.field} rules={toAntRules(field.rules)}>\n <FieldControl field={field} />\n </Form.Item>\n </Col>\n ))}\n <Col>\n <Form.Item>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n <Button\n onClick={() => {\n syncValues(form, initialValues, fields)\n valueSignatureRef.current = JSON.stringify(initialValues)\n onChange?.(initialValues)\n onReset?.(initialValues)\n }}\n style={{ marginInlineStart: 8 }}\n >\n \u91CD\u7F6E\n </Button>\n {extra}\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )\n}\n", "import { Empty, Result, Spin } from 'antd'\n\nexport function BestLoading({ description = '\u52A0\u8F7D\u4E2D' }: { description?: string }) {\n return (\n <div style={{ display: 'grid', minHeight: 160, placeItems: 'center' }}>\n <Spin tip={description} />\n </div>\n )\n}\n\nexport function BestEmpty({ description = '\u6682\u65E0\u6570\u636E' }: { description?: string }) {\n return <Empty description={description} />\n}\n\nexport function BestError({ description = '\u52A0\u8F7D\u5931\u8D25' }: { description?: string }) {\n return <Result status='error' title={description} />\n}\n", "import {\n type ParamsType,\n ProTable,\n type ProTableProps,\n type RequestData\n} from '@ant-design/pro-components'\nimport type { TableProps } from 'antd'\nimport type { ReactNode } from 'react'\nimport './BestTable.module.less'\n\nexport type BestTableColumn<T extends Record<string, unknown>> = NonNullable<\n ProTableProps<T, ParamsType>['columns']\n>[number]\n\nexport type BestTableProps<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n> = Omit<ProTableProps<DataSource, Params, ValueType>, 'columns'> & {\n columns?:\n | ProTableProps<DataSource, Params, ValueType>['columns']\n | TableProps<DataSource>['columns']\n emptyText?: ReactNode\n}\n\nconst defaultSearch: NonNullable<ProTableProps<Record<string, unknown>, ParamsType>['search']> = {\n layout: 'vertical',\n labelWidth: 'auto',\n defaultCollapsed: false,\n collapseRender: false,\n span: 6\n}\n\nfunction mergeSearch<T>(defaults: T, value: T | false | undefined): T | false {\n if (value === false) return false\n return { ...(defaults as object), ...((value ?? {}) as object) } as T\n}\n\nexport function BestTable<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n>({\n columns,\n cardProps,\n className,\n search,\n emptyText = '\u6682\u65E0\u6570\u636E',\n ...props\n}: BestTableProps<DataSource, Params, ValueType>) {\n return (\n <ProTable<DataSource, Params, ValueType>\n {...props}\n className={['best-lowcode-table', className].filter(Boolean).join(' ')}\n columns={columns as ProTableProps<DataSource, Params, ValueType>['columns']}\n options={false}\n search={mergeSearch(defaultSearch, search as typeof defaultSearch | false | undefined)}\n cardProps={\n cardProps === false\n ? false\n : {\n ...cardProps,\n styles: {\n ...cardProps?.styles,\n body: { ...cardProps?.styles?.body, padding: 12 }\n }\n }\n }\n locale={{ emptyText }}\n />\n )\n}\n\nexport type { RequestData }\n", "import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc.js'\nimport type { BestListQuery, BestListService } from './list'\nimport type { TableColumnSchema } from './schema'\n\ndayjs.extend(utc)\n\ntype ProTablePageResponse = { data: Record<string, unknown>[]; success: boolean; total: number }\n\nexport function toBestListQuery(\n params: Record<string, unknown>,\n sort?: Record<string, unknown>\n): BestListQuery {\n const { current, pageSize, ...filters } = params\n const normalizedSort = Object.fromEntries(\n Object.entries(sort ?? {}).filter(\n (entry): entry is [string, 'ascend' | 'descend'] =>\n entry[1] === 'ascend' || entry[1] === 'descend'\n )\n )\n return {\n page: typeof current === 'number' && current > 0 ? current : 1,\n pageSize: typeof pageSize === 'number' && pageSize > 0 ? pageSize : 20,\n filters,\n ...(Object.keys(normalizedSort).length ? { sort: normalizedSort } : {})\n }\n}\n\nexport function formatCrudValue(value: unknown, format: TableColumnSchema['format']): string {\n if (value == null || value === '') return '-'\n if (!format || format === 'text') return String(value)\n if (format === 'money') {\n const amount = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(amount)\n ? new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount)\n : String(value)\n }\n if (typeof value !== 'string' && typeof value !== 'number' && !(value instanceof Date)) {\n return String(value)\n }\n let timestamp: string | number | Date = value\n if (typeof value === 'number' || typeof value === 'string') {\n const numericValue = typeof value === 'number' ? value : Number(value.trim())\n timestamp =\n Number.isFinite(numericValue) && numericValue !== 0\n ? Math.abs(numericValue) >= 1_000_000_000_000\n ? numericValue\n : numericValue * 1000\n : value\n }\n const date = dayjs.utc(timestamp)\n if (!date.isValid()) return String(value)\n return date.format(format === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')\n}\n\nexport function errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback\n}\n\nexport function isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted || (error instanceof DOMException && error.name === 'AbortError')\n}\n\nexport async function confirmBeforeAction(\n content: string | undefined,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n return !content || confirm(content)\n}\n\nexport async function removeCrudRecord(\n record: Record<string, unknown>,\n service: (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ) => Promise<unknown>,\n content: string,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n if (!(await confirmBeforeAction(content, confirm))) return false\n await service(record)\n return true\n}\n\nexport function createLatestPageRequest(\n service: BestListService,\n onError: (error: unknown) => void\n) {\n let sequence = 0\n let controller: AbortController | undefined\n let latest: ProTablePageResponse = { data: [], success: false, total: 0 }\n\n return {\n async request(query: BestListQuery): Promise<ProTablePageResponse> {\n controller?.abort()\n controller = new AbortController()\n const currentController = controller\n const currentSequence = ++sequence\n try {\n const response = await service(query, { signal: currentController.signal })\n const pageResponse: ProTablePageResponse = {\n data: response.items,\n success: true,\n total: response.total\n }\n if (currentSequence !== sequence) return latest\n latest = pageResponse\n return pageResponse\n } catch (error) {\n if (currentSequence !== sequence || isAbortError(error, currentController.signal))\n return latest\n onError(error)\n return { data: [], success: false, total: 0 }\n }\n },\n abort() {\n controller?.abort()\n }\n }\n}\n", "import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\nexport const TABBED_PAGE_SCHEMA_ID = 'https://best.dev/schema/tabs/v1' as const\nexport const TABBED_PAGE_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n format?: DetailFormat | DetailFormatConfig\n visibleWhen?: Condition\n emptyText?: string\n}\n\nexport type DetailFormat = 'text' | 'number' | 'money' | 'date' | 'datetime' | 'boolean' | 'json'\n\nexport type DetailFormatConfig = {\n type: DetailFormat\n emptyText?: string\n precision?: number\n timezone?: string\n}\n\nexport type DetailTableColumnSchema = {\n field: string\n title: string\n width?: number\n fixed?: 'left' | 'right'\n dict?: string\n format?: DetailFormat | DetailFormatConfig\n slot?: string\n}\n\nexport type DetailTableSchema = {\n data: string\n rowKey?: string\n columns: DetailTableColumnSchema[]\n scrollX?: number | string\n}\n\nexport type DetailSectionSchema = {\n key: string\n title?: string\n description?: string\n visibleWhen?: Condition\n layout?: 'fields' | 'table' | 'slot'\n columns?: number\n span?: number\n variant?: 'plain' | 'card'\n fields?: DetailFieldSchema[]\n table?: DetailTableSchema\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot' | 'closeDetail'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: {\n mode?: 'drawer' | 'modal' | 'inline'\n width?: number | string\n columns?: number\n gap?: number | string\n fields?: DetailFieldSchema[]\n sections?: DetailSectionSchema[]\n footer?: PageActionSchema[]\n }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n\nexport type TabContentSchema =\n | { type: 'crud'; schema: CrudPageSchema }\n | { type: 'slot'; slot: string }\n\nexport type TabSchema = {\n key: string\n label: string\n access?: string\n /** Defaults to true so inactive CRUD pages do not fetch until selected. */\n destroyOnHidden?: boolean\n content: TabContentSchema\n}\n\n/** A page composition schema with runtime-owned tab navigation. */\nexport type TabbedPageSchema = {\n $schema: typeof TABBED_PAGE_SCHEMA_ID\n version: typeof TABBED_PAGE_SCHEMA_VERSION\n id: string\n kind: 'tabs'\n tabs: TabSchema[]\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema,\n TABBED_PAGE_SCHEMA_ID,\n TABBED_PAGE_SCHEMA_VERSION,\n type TabbedPageSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot',\n 'closeDetail'\n])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\nconst detailFormats = new Set(['text', 'number', 'money', 'date', 'datetime', 'boolean', 'json'])\n\nfunction push(diagnostics: SchemaDiagnostic[], path: string, code: string, message: string) {\n diagnostics.push({ path, code, message })\n}\n\nfunction validateCondition(condition: Condition, path: string, diagnostics: SchemaDiagnostic[]) {\n if (!condition || typeof condition !== 'object') {\n push(diagnostics, path, 'condition.type', '\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61')\n return\n }\n if (condition.operator === 'equals') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'notEmpty') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'modeEquals') {\n return\n }\n if (\n (condition.operator === 'and' || condition.operator === 'or') &&\n !Array.isArray(condition.conditions)\n ) {\n push(diagnostics, path, 'condition.conditions', '\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4')\n return\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n if (condition.conditions.length === 0) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n return\n }\n if (condition.operator === 'not') {\n if (!condition.condition) {\n push(diagnostics, path, 'condition.missing', 'not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition')\n return\n }\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\n return\n }\n push(diagnostics, path, 'condition.operator', `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${(condition as { operator?: unknown }).operator}`)\n}\n\nfunction validateDetailField(\n field: import('./schema').DetailFieldSchema,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n if (field.visibleWhen) validateCondition(field.visibleWhen, `${path}/visibleWhen`, diagnostics)\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, `${path}/slot`, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n const format = typeof field.format === 'object' ? field.format.type : field.format\n if (format && !detailFormats.has(format))\n push(diagnostics, `${path}/format`, 'detail.format', `\u4E0D\u652F\u6301\u7684\u8BE6\u60C5\u683C\u5F0F\uFF1A${format}`)\n}\n\nfunction validateFields(\n fields: FieldSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n const seen = new Set<string>()\n fields?.forEach((field, index) => {\n const fieldPath = `${path}/${index}`\n if (!field.field) push(diagnostics, fieldPath, 'field.missing', '\u5B57\u6BB5\u540D\u4E0D\u80FD\u4E3A\u7A7A')\n if (seen.has(field.field))\n push(diagnostics, fieldPath, 'field.duplicate', `\u5B57\u6BB5\u91CD\u590D\uFF1A${field.field}`)\n seen.add(field.field)\n if (!fieldComponents.has(field.component))\n push(diagnostics, fieldPath, 'field.component', `\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\uFF1A${field.component}`)\n if (field.dict && registry && !registry.dictionaries[field.dict]) {\n push(diagnostics, fieldPath, 'registry.dictionary', `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${field.dict}`)\n }\n if (field.component === 'remoteSelect' && !field.remoteService)\n push(diagnostics, fieldPath, 'field.remoteService', 'remoteSelect \u5FC5\u987B\u6307\u5B9A remoteService')\n if (field.remoteService && registry && !registry.services[field.remoteService])\n push(diagnostics, fieldPath, 'registry.service', `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${field.remoteService}`)\n if (field.component === 'slot' && !field.slot)\n push(diagnostics, fieldPath, 'field.slot', 'slot \u7EC4\u4EF6\u5FC5\u987B\u6307\u5B9A slot key')\n if (field.component === 'repeatable' && !field.itemFields?.length)\n push(\n diagnostics,\n fieldPath,\n 'field.repeatable',\n 'repeatable \u7EC4\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A itemFields \u5B57\u6BB5'\n )\n if (field.itemFields?.length)\n validateFields(\n field.itemFields as FieldSchema[],\n `${fieldPath}/itemFields`,\n registry,\n diagnostics\n )\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n push(diagnostics, fieldPath, 'field.repeatable.range', 'minItems \u4E0D\u80FD\u5927\u4E8E maxItems')\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, fieldPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n if (field.visibleWhen)\n validateCondition(field.visibleWhen, `${fieldPath}/visibleWhen`, diagnostics)\n if (field.disabledWhen)\n validateCondition(field.disabledWhen, `${fieldPath}/disabledWhen`, diagnostics)\n })\n}\n\nfunction validateActions(\n actions: PageActionSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n hasRemoveService: boolean,\n diagnostics: SchemaDiagnostic[]\n) {\n actions?.forEach((action, index) => {\n const actionPath = `${path}/${index}`\n if (!action.id) push(diagnostics, actionPath, 'action.missing', '\u52A8\u4F5C id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!builtInEffects.has(action.effect))\n push(diagnostics, actionPath, 'action.effect', `\u4E0D\u652F\u6301\u7684\u52A8\u4F5C\uFF1A${action.effect}`)\n if (action.effect === 'runAction' && !action.action)\n push(diagnostics, actionPath, 'action.key', 'runAction \u5FC5\u987B\u6307\u5B9A action key')\n if (action.effect === 'remove' && !hasRemoveService)\n push(diagnostics, actionPath, 'action.removeService', 'remove \u52A8\u4F5C\u5FC5\u987B\u914D\u7F6E dataSource.remove')\n if (action.effect === 'slot' && !action.slot)\n push(diagnostics, actionPath, 'action.slot', 'slot \u52A8\u4F5C\u5FC5\u987B\u6307\u5B9A slot key')\n if (action.action && registry && !registry.actions[action.action]) {\n push(diagnostics, actionPath, 'registry.action', `\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n }\n if (action.slot && registry && !registry.slots[action.slot]) {\n push(diagnostics, actionPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${action.slot}`)\n }\n })\n}\n\nexport function validateCrudPageSchema(\n schema: CrudPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== CRUD_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${CRUD_SCHEMA_ID}`)\n if (schema.version !== CRUD_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${CRUD_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.title) push(diagnostics, '/title', 'page.title', '\u9875\u9762\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.dataSource?.list)\n push(diagnostics, '/dataSource/list', 'service.list', '\u5217\u8868\u670D\u52A1\u4E0D\u80FD\u4E3A\u7A7A')\n if (schema.dataSource?.list && registry && !registry.listServices[schema.dataSource.list]) {\n push(\n diagnostics,\n '/dataSource/list',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.list}`\n )\n }\n if (schema.dataSource?.detail && registry && !registry.services[schema.dataSource.detail]) {\n push(\n diagnostics,\n '/dataSource/detail',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`\n )\n }\n if (schema.dataSource?.create && registry && !registry.services[schema.dataSource.create]) {\n push(\n diagnostics,\n '/dataSource/create',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.create}`\n )\n }\n if (schema.dataSource?.update && registry && !registry.services[schema.dataSource.update]) {\n push(\n diagnostics,\n '/dataSource/update',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.update}`\n )\n }\n if (schema.dataSource?.remove && registry && !registry.services[schema.dataSource.remove]) {\n push(\n diagnostics,\n '/dataSource/remove',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`\n )\n }\n validateFields(schema.search, '/search', registry, diagnostics)\n validateFields(schema.form, '/form', registry, diagnostics)\n if (!schema.table?.rowKey) push(diagnostics, '/table/rowKey', 'table.rowKey', 'rowKey \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.table?.columns?.length)\n push(diagnostics, '/table/columns', 'table.columns', '\u81F3\u5C11\u9700\u8981\u4E00\u5217')\n schema.table?.columns?.forEach((column, index) => {\n if (column.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n (schema.detail.fields !== undefined && !Array.isArray(schema.detail.fields)) ||\n (schema.detail.sections !== undefined && !Array.isArray(schema.detail.sections))\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u6216 sections \u6570\u7EC4')\n } else {\n schema.detail.fields?.forEach((field, index) => validateDetailField(field, `/detail/fields/${index}`, registry, diagnostics))\n schema.detail.sections?.forEach((section, index) => {\n if (section.visibleWhen) validateCondition(section.visibleWhen, `/detail/sections/${index}/visibleWhen`, diagnostics)\n if (!section.key) push(diagnostics, `/detail/sections/${index}/key`, 'detail.section.key', '\u8BE6\u60C5\u533A\u5757\u5FC5\u987B\u6307\u5B9A key')\n if (section.span !== undefined && (!Number.isInteger(section.span) || section.span < 1))\n push(diagnostics, `/detail/sections/${index}/span`, 'detail.section.span', '\u8BE6\u60C5\u533A\u5757 span \u5FC5\u987B\u662F\u6B63\u6574\u6570')\n if (section.columns !== undefined && (!Number.isInteger(section.columns) || section.columns < 1))\n push(diagnostics, `/detail/sections/${index}/columns`, 'detail.section.columns', '\u8BE6\u60C5\u5B57\u6BB5 columns \u5FC5\u987B\u662F\u6B63\u6574\u6570')\n if (section.layout === 'slot' && !section.slot)\n push(diagnostics, `/detail/sections/${index}/slot`, 'detail.slot', 'slot \u533A\u5757\u5FC5\u987B\u6307\u5B9A slot')\n if (section.layout === 'table' && !section.table)\n push(diagnostics, `/detail/sections/${index}/table`, 'detail.table', 'table \u533A\u5757\u5FC5\u987B\u6307\u5B9A table')\n if (section.table && typeof section.table.data !== 'string')\n push(diagnostics, `/detail/sections/${index}/table/data`, 'detail.table.data', '\u8BE6\u60C5\u8868\u683C data \u5FC5\u987B\u662F\u5B57\u6BB5\u8DEF\u5F84')\n if (section.slot && registry && !registry.slots[section.slot])\n push(diagnostics, `/detail/sections/${index}/slot`, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${section.slot}`)\n section.fields?.forEach((field, fieldIndex) => validateDetailField(field, `/detail/sections/${index}/fields/${fieldIndex}`, registry, diagnostics))\n })\n }\n }\n validateActions(\n schema.table?.actions,\n '/table/actions',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.toolbar,\n '/toolbar',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.detail?.footer,\n '/detail/footer',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry) {\n const result = validateCrudPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n\nexport function validateTabbedPageSchema(\n schema: TabbedPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`)\n if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {\n push(diagnostics, '/tabs', 'tabs.required', '\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E')\n return { valid: false, diagnostics }\n }\n const keys = new Set<string>()\n schema.tabs.forEach((tab, index) => {\n const path = `/tabs/${index}`\n if (!tab.key) push(diagnostics, path, 'tab.key', '\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A')\n if (keys.has(tab.key)) push(diagnostics, path, 'tab.duplicate', `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`)\n keys.add(tab.key)\n if (!tab.label) push(diagnostics, path, 'tab.label', '\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (tab.content.type === 'crud') {\n const result = validateCrudPageSchema(tab.content.schema, registry)\n diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })))\n } else if (tab.content.type === 'slot') {\n if (!tab.content.slot) push(diagnostics, path, 'tab.slot', 'slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key')\n if (tab.content.slot && registry && !registry.slots[tab.content.slot])\n push(diagnostics, path, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`)\n } else {\n push(diagnostics, path, 'tab.content', '\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B')\n }\n })\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry) {\n const result = validateTabbedPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import { Tabs } from 'antd'\nimport { useBestRegistry } from '../runtime'\nimport { BestCrudPage } from './BestCrudPage'\nimport type { TabbedPageSchema } from './schema'\nimport { assertValidTabbedPageSchema } from './validate'\n\nexport type BestTabbedPageProps = {\n className?: string\n schema: TabbedPageSchema\n}\n\n/** Renders declarative tabs whose contents are either a CRUD schema or a registered slot. */\nexport function BestTabbedPage({ className, schema }: BestTabbedPageProps) {\n const registry = useBestRegistry()\n assertValidTabbedPageSchema(schema, registry)\n const items = schema.tabs\n .filter((tab) => !tab.access || registry.access(tab.access))\n .map((tab) => ({\n key: tab.key,\n label: tab.label,\n destroyOnHidden: tab.destroyOnHidden,\n children:\n tab.content.type === 'crud' ? (\n <BestCrudPage schema={tab.content.schema} />\n ) : (\n registry.slots[tab.content.slot]?.({ pageId: schema.id, tabKey: tab.key }) ?? null\n )\n }))\n return <Tabs className={className} items={items} />\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import dayjs from 'dayjs'\nimport type { CrudDataAdapter } from './BestCrudPage'\n\nexport type BestValueNormalizer = (value: unknown, field?: string) => unknown\n\nexport function normalizeBestValues(\n values: Record<string, unknown>,\n normalize: BestValueNormalizer = defaultNormalize\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([field, value]) => [\n field,\n normalizeNested(value, normalize, field)\n ])\n )\n}\n\nfunction normalizeNested(value: unknown, normalize: BestValueNormalizer, field?: string): unknown {\n if (Array.isArray(value)) return value.map((item) => normalizeNested(item, normalize, field))\n if (dayjs.isDayjs(value) || value instanceof Date) return value\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeNested(item, normalize, key)])\n )\n }\n return normalize(value, field)\n}\n\nfunction defaultNormalize(value: unknown) {\n if (typeof value === 'string') return value.trim() === '' ? undefined : value.trim()\n return value\n}\n\nexport function createBestCrudAdapter(\n options: {\n normalize?: BestValueNormalizer\n fromList?: CrudDataAdapter['fromList']\n fromDetail?: CrudDataAdapter['fromDetail']\n toCreatePayload?: CrudDataAdapter['toCreatePayload']\n toUpdatePayload?: CrudDataAdapter['toUpdatePayload']\n } = {}\n): CrudDataAdapter {\n const normalize = options.normalize ?? defaultNormalize\n return {\n fromList: options.fromList,\n fromDetail: options.fromDetail,\n toCreatePayload: (values) =>\n options.toCreatePayload?.(normalizeBestValues(values, normalize)) ??\n normalizeBestValues(values, normalize),\n toUpdatePayload: (values, record) =>\n options.toUpdatePayload?.(normalizeBestValues(values, normalize), record) ??\n normalizeBestValues(values, normalize)\n }\n}\n", "import type { ActionType } from '@ant-design/pro-components'\nimport { Button, Modal, message } from 'antd'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type Key } from 'react'\nimport { useBestListService, useBestRegistry } from '../runtime'\nimport {\n BestDetail,\n type BestDetailField,\n type BestDetailSection,\n type BestFieldDefinition,\n BestDrawer,\n BestEmpty,\n BestError,\n BestLoading,\n BestForm,\n BestModal,\n BestSearch,\n BestTable,\n type BestTableColumn\n} from '../ui'\nimport { evaluateCondition, getDefaultValues } from '../ui/BestForm'\nimport {\n confirmBeforeAction,\n createLatestPageRequest,\n errorMessage,\n formatCrudValue,\n removeCrudRecord,\n toBestListQuery\n} from './runtime'\nimport type {\n CrudPageSchema,\n DetailFieldSchema,\n DetailSectionSchema,\n FieldSchema,\n FormMode,\n PageActionSchema,\n TableColumnSchema\n} from './schema'\nimport { assertValidCrudPageSchema } from './validate'\n\ntype RecordValue = Record<string, unknown>\n\nexport type BestCrudPageProps = {\n className?: string\n schema: CrudPageSchema\n adapter?: CrudDataAdapter\n}\n\nexport type CrudDataAdapter = {\n fromList?: (records: RecordValue[]) => RecordValue[]\n fromDetail?: (record: RecordValue) => RecordValue\n toCreatePayload?: (values: RecordValue) => RecordValue\n toUpdatePayload?: (values: RecordValue, record?: RecordValue) => RecordValue\n}\n\ntype DrawerState = { mode: 'closed' } | { mode: 'detail' | 'edit' | 'create'; record?: RecordValue }\ntype DetailState = { loading: boolean; error?: unknown; record?: RecordValue }\n\nfunction pickRowKeyValues(record: RecordValue | undefined, rowKey: string | string[]) {\n if (!record) return {}\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n return Object.fromEntries(\n keys.flatMap((key) => {\n const value = record[key]\n return value === undefined ? [] : [[key, value] as const]\n })\n )\n}\n\nfunction projectSubmittedValues(values: RecordValue, fields: FieldSchema[]) {\n const projected: RecordValue = {}\n fields.forEach((field) => {\n if (!Object.hasOwn(values, field.field)) return\n const value = values[field.field]\n if (field.component === 'repeatable' && Array.isArray(value) && field.itemFields?.length) {\n projected[field.field] = value.map((item) =>\n isRecord(item) ? projectSubmittedValues(item, field.itemFields ?? []) : item\n )\n return\n }\n projected[field.field] = value\n })\n return projected\n}\n\nexport function buildCrudSubmitValues(\n values: RecordValue,\n record: RecordValue | undefined,\n rowKey: string | string[]\n) {\n return { ...values, ...pickRowKeyValues(record, rowKey) }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction mergeRecordForEdit(\n record: RecordValue | undefined,\n detail: RecordValue,\n rowKey: string | string[]\n) {\n return record ? { ...record, ...detail, ...pickRowKeyValues(record, rowKey) } : detail\n}\n\nfunction toFieldDefinition(\n field: FieldSchema,\n dictionaries: ReturnType<typeof useBestRegistry>['dictionaries'],\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestFieldDefinition {\n const slot = field.slot\n const options = field.dict ? (dictionaries[field.dict] ?? []) : []\n const rules = field.rules ?? []\n return {\n field: field.field,\n label: field.label,\n component: field.component,\n placeholder: field.placeholder,\n options,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n required: field.required,\n disabled: field.disabled,\n hidden: field.hidden,\n maxDate: field.maxDate,\n span: field.span,\n defaultValue: field.defaultValue,\n visibleWhen: field.visibleWhen,\n disabledWhen: field.disabledWhen,\n clearWhenHidden: field.clearWhenHidden,\n itemFields: field.itemFields?.map((item) =>\n toFieldDefinition(item as FieldSchema, dictionaries, slots)\n ),\n minItems: field.minItems,\n maxItems: field.maxItems,\n render: slot ? (context) => slots[slot]?.(context) : undefined,\n rules:\n field.required && !rules.some((rule) => rule.required)\n ? [{ required: true, message: `\u8BF7\u586B\u5199${field.label}` }, ...rules]\n : rules\n }\n}\n\nfunction useFields(fields: FieldSchema[] = []) {\n const registry = useBestRegistry()\n return fields.map((field) => toFieldDefinition(field, registry.dictionaries, registry.slots))\n}\n\nfunction toDetailField(\n field: DetailFieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots'],\n record: RecordValue = {}\n): BestDetailField {\n const slot = field.slot\n const valueEnum = field.dict\n ? Object.fromEntries(\n (dictionary[field.dict] ?? []).map((item) => [String(item.value), item.label])\n )\n : undefined\n return {\n field: field.field,\n label: field.label,\n span: field.span,\n format: field.format,\n emptyText: field.emptyText,\n visible: !field.visibleWhen || evaluateCondition(field.visibleWhen, record, 'detail'),\n valueEnum,\n render: slot\n ? (value, record) => slots[slot]?.({ field: field.field, record, value }) ?? '-'\n : undefined\n }\n}\n\nfunction getPathValue(values: RecordValue, path: string) {\n if (Object.hasOwn(values, path)) return values[path]\n return path.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as RecordValue)[part]\n return undefined\n }, values)\n}\n\nfunction toDetailSection(\n section: DetailSectionSchema,\n record: RecordValue,\n dictionaries: ReturnType<typeof useBestRegistry>['dictionaries'],\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestDetailSection | null {\n if (section.visibleWhen && !evaluateCondition(section.visibleWhen, record, 'detail')) return null\n const fields = section.fields?.map((field) => toDetailField(field, dictionaries, slots, record))\n const table = section.table\n ? {\n key: section.key,\n data: (getPathValue(record, section.table.data) as RecordValue[]) ?? [],\n rowKey: section.table.rowKey,\n scrollX: section.table.scrollX,\n columns: section.table.columns.map((column) => ({\n key: column.field,\n title: column.title,\n dataIndex: column.field,\n width: column.width,\n fixed: column.fixed,\n render: (value: unknown, row: RecordValue) => {\n if (column.slot) return slots[column.slot]?.({ field: column.field, record: row, value }) ?? '-'\n if (column.dict) {\n const item = (dictionaries[column.dict] ?? []).find((candidate) => candidate.value === value)\n if (item) return item.label\n }\n const format = column.format\n if (format === 'date' || format === 'datetime') return formatCrudValue(value, format)\n if (format === 'money') return formatCrudValue(value, format)\n return value == null || value === '' ? '-' : String(value)\n }\n }))\n }\n : undefined\n const content = section.layout === 'slot' && section.slot\n ? slots[section.slot]?.({ record })\n : undefined\n return { key: section.key, title: section.title, description: section.description, columns: section.columns, span: section.span, variant: section.variant, fields, table, content }\n}\n\nfunction toTableColumn(\n column: TableColumnSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestTableColumn<RecordValue> {\n const slot = column.slot\n const composite = column.composite\n const valueEnum = column.dict\n ? Object.fromEntries(\n (dictionary[column.dict] ?? []).map((item) => [String(item.value), { text: item.label }])\n )\n : undefined\n return {\n dataIndex: column.field,\n search: false,\n title: column.title,\n width: column.width,\n fixed: column.fixed,\n valueEnum,\n renderText:\n column.format && !slot && !column.dict\n ? (value) => formatCrudValue(value, column.format)\n : undefined,\n render: composite\n ? (_value, record) => (\n <div style={{ display: 'flex', flexDirection: composite.layout === 'horizontal' ? 'row' : 'column', gap: composite.gap ?? 2 }}>\n {composite.items.map((item) => {\n const rawValue = getPathValue(record, item.field)\n const dictionaryItem = item.dict\n ? (dictionary[item.dict] ?? []).find((candidate) => String(candidate.value) === String(rawValue))\n : undefined\n const value = dictionaryItem?.label ?? formatCrudValue(rawValue, item.format)\n const content = rawValue == null || rawValue === '' ? item.emptyText ?? '-' : value\n return <div key={item.field}>{item.label ? `${item.label}\uFF1A${content}` : content}</div>\n })}\n </div>\n )\n : slot\n ? (_value, record) =>\n slots[slot]?.({\n field: column.field,\n record,\n value: column.field ? record[column.field] : undefined\n }) ?? '-'\n : undefined\n }\n}\n\nfunction toProTableSearchColumn(\n field: FieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>\n): BestTableColumn<RecordValue> {\n const valueType = (() => {\n switch (field.component) {\n case 'number':\n return 'digit' as const\n case 'select':\n return 'select' as const\n case 'date':\n return 'date' as const\n case 'dateRange':\n return 'dateRange' as const\n default:\n return 'text' as const\n }\n })()\n const options = field.dict ? (dictionary[field.dict] ?? []) : undefined\n return {\n dataIndex: field.field,\n title: field.label,\n valueType,\n search: true,\n hideInTable: true,\n initialValue: field.defaultValue,\n fieldProps: {\n ...(options ? { options } : {}),\n ...(field.maxDate === 'today'\n ? { disabledDate: (current: dayjs.Dayjs) => current.isAfter(dayjs(), 'day') }\n : {})\n }\n }\n}\n\nfunction confirmAction(content: string) {\n return new Promise<boolean>((resolve) => {\n Modal.confirm({\n content,\n okText: '\u786E\u8BA4',\n cancelText: '\u53D6\u6D88',\n onOk: () => resolve(true),\n onCancel: () => resolve(false)\n })\n })\n}\n\nexport function BestCrudPage({ adapter, className, schema }: BestCrudPageProps) {\n const registry = useBestRegistry()\n assertValidCrudPageSchema(schema, registry)\n const registeredListService = useBestListService(schema.dataSource.list)\n if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`)\n const listService = useCallback(\n async (\n query: Parameters<typeof registeredListService>[0],\n options?: Parameters<typeof registeredListService>[1]\n ) => {\n const response = await registeredListService(query, options)\n return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response\n },\n [adapter, registeredListService]\n )\n const searchFields = useFields(schema.search)\n const useBestSearch =\n schema.searchMode === 'bestSearch' ||\n schema.search?.some((field) => field.component === 'remoteSelect')\n const formFields = useFields(schema.form)\n const actionRef = useRef<ActionType>(undefined)\n const searchDefaultValues = useMemo(() => getDefaultValues(searchFields), [searchFields])\n const searchFieldNames = useMemo(\n () => new Set(searchFields.map((field) => field.field)),\n [searchFields]\n )\n const searchSchemaSignature = useMemo(\n () =>\n JSON.stringify(\n searchFields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue\n }))\n ),\n [searchFields]\n )\n const [query, setQuery] = useState<RecordValue>(searchDefaultValues)\n const queryRef = useRef<RecordValue>(searchDefaultValues)\n const queryStateRef = useRef({\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: false\n })\n const [drawer, setDrawer] = useState<DrawerState>({ mode: 'closed' })\n const [detailState, setDetailState] = useState<DetailState>({ loading: false })\n const detailRequestRef = useRef<AbortController | undefined>(undefined)\n const [submitting, setSubmitting] = useState(false)\n const submittingRef = useRef(false)\n\n const handleAction = useCallback(\n async (action: PageActionSchema, record?: RecordValue) => {\n if (action.access && !registry.access(action.access)) return\n if (action.effect === 'closeDetail') {\n detailRequestRef.current?.abort()\n setDrawer({ mode: 'closed' })\n setDetailState({ loading: false })\n return\n }\n if (action.effect !== 'remove' && !(await confirmBeforeAction(action.confirm, confirmAction)))\n return\n if (action.effect === 'openDetail') {\n detailRequestRef.current?.abort()\n const controller = new AbortController()\n detailRequestRef.current = controller\n setDrawer({ mode: 'detail', record })\n setDetailState({ loading: Boolean(schema.dataSource.detail), record })\n if (schema.dataSource.detail) {\n const detailService = registry.services[schema.dataSource.detail]\n if (!detailService) {\n setDetailState({ loading: false, error: new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`), record })\n return\n }\n try {\n const detail = await detailService(record ?? {}, { signal: controller.signal })\n if (controller.signal.aborted) return\n const normalized = isRecord(detail)\n ? adapter?.fromDetail ? adapter.fromDetail(detail) : detail\n : record ?? {}\n setDetailState({ loading: false, record: normalized })\n setDrawer({ mode: 'detail', record: normalized })\n } catch (error) {\n if (!controller.signal.aborted) setDetailState({ loading: false, error, record })\n }\n }\n }\n if (action.effect === 'openEdit') {\n let editRecord = record\n if (schema.dataSource.detail) {\n const detailService = registry.services[schema.dataSource.detail]\n if (!detailService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`)\n return\n }\n try {\n const detail = await detailService(record ?? {})\n if (detail && typeof detail === 'object' && !Array.isArray(detail)) {\n const normalizedDetail = adapter?.fromDetail\n ? adapter.fromDetail(detail as RecordValue)\n : (detail as RecordValue)\n editRecord = mergeRecordForEdit(record, normalizedDetail, schema.table.rowKey)\n }\n } catch (error) {\n message.error(errorMessage(error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n return\n }\n }\n setDrawer({ mode: 'edit', record: editRecord })\n }\n if (action.effect === 'openCreate') setDrawer({ mode: 'create' })\n if (action.effect === 'remove' && schema.dataSource.remove) {\n const removeService = registry.services[schema.dataSource.remove]\n if (!removeService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`)\n return\n }\n try {\n const deleted = await removeCrudRecord(\n record ?? {},\n removeService,\n action.confirm ?? `\u786E\u8BA4\u5220\u9664${schema.title}\uFF1F`,\n confirmAction\n )\n if (deleted) {\n message.success('\u5220\u9664\u6210\u529F')\n actionRef.current?.reload()\n }\n } catch (error) {\n message.error(errorMessage(error, '\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n }\n }\n if (action.effect === 'runAction' && action.action) {\n const runAction = registry.actions[action.action]\n if (!runAction) {\n message.error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n return\n }\n try {\n await runAction({ record })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, `${action.label}\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n }\n }\n },\n [adapter, registry, schema]\n )\n\n const columns = useMemo<BestTableColumn<RecordValue>[]>(() => {\n const proTableSearchFields = useBestSearch ? [] : (schema.search ?? [])\n const searchColumns = new Map(\n proTableSearchFields.map((field) => [\n field.field,\n toProTableSearchColumn(field, registry.dictionaries)\n ])\n )\n const configuredColumns = schema.table.columns.map((column) => {\n const tableColumn = toTableColumn(column, registry.dictionaries, registry.slots)\n if (!column.field) return tableColumn\n const searchColumn = searchColumns.get(column.field)\n if (!searchColumn) return tableColumn\n searchColumns.delete(column.field)\n return { ...tableColumn, ...searchColumn, hideInTable: false }\n })\n configuredColumns.push(...searchColumns.values())\n if (!schema.table.actions?.length) return configuredColumns\n const actionColumnWidth = Math.max(160, schema.table.actions.length * 80 + 32)\n configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\n fixed: 'right',\n width: actionColumnWidth,\n render: (_, record) =>\n schema.table.actions?.map((action) => (\n <ActionButton action={action} key={action.id} record={record} onExecute={handleAction} />\n ))\n })\n return configuredColumns\n }, [\n handleAction,\n registry.dictionaries,\n registry.slots,\n schema.search,\n schema.table.actions,\n schema.table.columns,\n useBestSearch\n ])\n\n const pageRequest = useMemo(\n () =>\n createLatestPageRequest(listService, (error) =>\n message.error(errorMessage(error, `${schema.title}\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n ),\n [listService, schema.title]\n )\n const rowKey = schema.table.rowKey\n const [selectedRowKeys, setSelectedRowKeys] = useState<Key[]>([])\n const request = useCallback(\n (params: RecordValue, sort?: Record<string, unknown>) =>\n pageRequest.request(\n toBestListQuery({ ...params, ...(useBestSearch ? queryRef.current : {}) }, sort)\n ),\n [pageRequest, useBestSearch]\n )\n\n useEffect(() => {\n setSelectedRowKeys([])\n }, [schema.id])\n\n useLayoutEffect(() => {\n const previous = queryStateRef.current\n if (previous.schemaId === schema.id && previous.searchSchemaSignature === searchSchemaSignature)\n return\n\n const shouldUseDefaults = previous.schemaId !== schema.id || !previous.userTouched\n const nextQuery = shouldUseDefaults\n ? searchDefaultValues\n : Object.fromEntries(\n Object.entries(queryRef.current).filter(([field]) => searchFieldNames.has(field))\n )\n queryRef.current = nextQuery\n setQuery(nextQuery)\n queryStateRef.current = {\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: shouldUseDefaults ? false : previous.userTouched\n }\n }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature])\n\n useEffect(() => () => pageRequest.abort(), [pageRequest])\n\n const submitForm = useCallback(\n async (values: RecordValue) => {\n if (submittingRef.current) return\n const serviceKey =\n drawer.mode === 'edit' ? schema.dataSource.update : schema.dataSource.create\n if (!serviceKey) {\n message.error(`${drawer.mode === 'edit' ? '\u66F4\u65B0' : '\u521B\u5EFA'}\u670D\u52A1\u672A\u914D\u7F6E`)\n return\n }\n const service = registry.services[serviceKey]\n if (!service) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${serviceKey}`)\n return\n }\n const record = drawer.mode === 'closed' ? undefined : drawer.record\n const payloadValues =\n drawer.mode === 'edit'\n ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey)\n : projectSubmittedValues(values, formFields)\n submittingRef.current = true\n setSubmitting(true)\n try {\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues)\n : (adapter?.toCreatePayload?.(payloadValues) ?? payloadValues)\n await service(payload)\n message.success('\u4FDD\u5B58\u6210\u529F')\n setDrawer({ mode: 'closed' })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n } finally {\n setSubmitting(false)\n submittingRef.current = false\n }\n },\n [\n adapter,\n drawer,\n formFields,\n registry.services,\n rowKey,\n schema.dataSource.create,\n schema.dataSource.update\n ]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={(values) => {\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n onSearch={(values) => {\n // Keep the latest filters synchronously available to request().\n // reload() may execute before React commits a state update.\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n />\n ) : null}\n <BestTable<RecordValue, RecordValue>\n actionRef={actionRef}\n className={className}\n columns={columns}\n pagination={{ showSizeChanger: true, defaultPageSize: schema.table.pageSize ?? 20 }}\n request={request}\n rowKey={\n Array.isArray(rowKey)\n ? (record) => rowKey.map((field) => String(record[field] ?? '')).join('-')\n : rowKey\n }\n expandable={schema.table.expandable ? {\n childrenColumnName: schema.table.expandable.childrenField ?? 'children',\n defaultExpandAllRows: schema.table.expandable.defaultExpandAllRows,\n defaultExpandedRowKeys: schema.table.expandable.defaultExpandedRowKeys,\n indentSize: schema.table.expandable.indentSize\n } : undefined}\n rowSelection={schema.table.rowSelection?.enabled ? {\n type: schema.table.rowSelection.type ?? 'checkbox',\n checkStrictly: schema.table.rowSelection.checkStrictly ?? true,\n preserveSelectedRowKeys: schema.table.rowSelection.preserveSelectedRowKeys,\n selectedRowKeys,\n onChange: (keys) => setSelectedRowKeys(keys)\n } : undefined}\n search={useBestSearch ? false : undefined}\n scroll={schema.table.scrollX ? { x: schema.table.scrollX } : undefined}\n toolBarRender={() =>\n schema.toolbar?.map((action) => (\n <ActionButton action={action} key={action.id} onExecute={handleAction} />\n )) ?? []\n }\n />\n {drawer.mode === 'detail' && schema.detail?.mode === 'inline' ? (\n <DetailContent state={detailState} record={drawer.record} />\n ) : null}\n {drawer.mode !== 'closed' && (schema.detail?.mode !== 'inline' || drawer.mode !== 'detail') && schema.detail?.mode === 'drawer' ? <BestDrawer\n open\n width={schema.detail.width}\n title={drawer.mode === 'detail' ? `${schema.title}\u8BE6\u60C5` : drawer.mode === 'edit' ? `\u7F16\u8F91${schema.title}` : `\u65B0\u5EFA${schema.title}`}\n footer={drawer.mode === 'detail' && schema.detail.footer?.length ? <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>{schema.detail.footer.map((action) => <ActionButton action={action} key={action.id} record={drawer.record} onExecute={handleAction} />)}</div> : undefined}\n onClose={() => { detailRequestRef.current?.abort(); setDrawer({ mode: 'closed' }); setDetailState({ loading: false }) }}\n >\n {drawer.mode === 'detail' ? <DetailContent state={detailState} record={drawer.record} /> : null}\n {drawer.mode === 'edit' || drawer.mode === 'create' ? <BestForm fields={formFields} initialValues={drawer.record} loading={submitting} mode={drawer.mode as FormMode} onCancel={() => setDrawer({ mode: 'closed' })} onSubmit={(values) => { void submitForm(values) }} /> : null}\n </BestDrawer> : null}\n {drawer.mode !== 'closed' && (schema.detail?.mode !== 'inline' || drawer.mode !== 'detail') && schema.detail?.mode !== 'drawer' ? <BestModal\n open\n title={\n drawer.mode === 'detail'\n ? `${schema.title}\u8BE6\u60C5`\n : drawer.mode === 'edit'\n ? `\u7F16\u8F91${schema.title}`\n : `\u65B0\u5EFA${schema.title}`\n }\n width={schema.detail?.width}\n footer={drawer.mode === 'detail' && schema.detail?.footer?.length ? <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>{schema.detail.footer.map((action) => <ActionButton action={action} key={action.id} record={drawer.record} onExecute={handleAction} />)}</div> : undefined}\n onClose={() => { detailRequestRef.current?.abort(); setDrawer({ mode: 'closed' }); setDetailState({ loading: false }) }}\n >\n {drawer.mode === 'detail' ? (\n <DetailContent state={detailState} record={drawer.record} />\n ) : null}\n {drawer.mode === 'edit' || drawer.mode === 'create' ? (\n <BestForm\n fields={formFields}\n initialValues={drawer.record}\n loading={submitting}\n mode={drawer.mode as FormMode}\n onCancel={() => setDrawer({ mode: 'closed' })}\n onSubmit={(values) => {\n void submitForm(values)\n }}\n />\n ) : null}\n </BestModal> : null}\n </>\n )\n\n function DetailContent({ state, record }: { state: DetailState; record?: RecordValue }) {\n if (state.loading) return <BestLoading />\n if (state.error) return <BestError description={errorMessage(state.error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25`)} />\n if (!record) return <BestEmpty />\n const sections = schema.detail?.sections?.map((section) => toDetailSection(section, record, registry.dictionaries, registry.slots)).filter(Boolean) as BestDetailSection[] | undefined\n return <BestDetail\n fields={schema.detail?.fields?.map((field) => toDetailField(field, registry.dictionaries, registry.slots, record)) ?? []}\n sections={sections}\n sectionColumns={schema.detail?.columns}\n sectionGap={schema.detail?.gap}\n record={record}\n />\n }\n\n function ActionButton({\n action,\n record,\n onExecute\n }: {\n action: PageActionSchema\n record?: RecordValue\n onExecute: (action: PageActionSchema, record?: RecordValue) => Promise<void>\n }) {\n const permitted = !action.access || registry.access(action.access)\n if (!permitted) return null\n if (action.effect === 'slot' && action.slot) {\n return registry.slots[action.slot]?.({ record }) ?? null\n }\n return (\n <Button\n key={action.id}\n type={action.buttonType ?? 'link'}\n onClick={() => {\n void onExecute(action, record)\n }}\n >\n {action.label}\n </Button>\n )\n }\n}\n", "import type { ThemeConfig } from 'antd'\nimport { ConfigProvider } from 'antd'\nimport type { ReactNode } from 'react'\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react'\nimport type { BestListService } from '../lowcode/list'\n\nexport type BestDictionaryItem = { label: string; value: string | number; disabled?: boolean }\nexport type BestService = (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n) => Promise<unknown>\nexport type BestSlotContext = {\n pageId?: string\n tabKey?: string\n field?: string\n record?: Record<string, unknown>\n value?: unknown\n values?: Record<string, unknown>\n}\nexport type BestActionContext = BestSlotContext\nexport type BestAction = (context: BestActionContext) => void | Promise<void>\nexport type BestSlot = (context: BestSlotContext) => ReactNode\nexport type BestSlotRegistry = Record<string, BestSlot>\n\nexport type BestRegistry = {\n /** List services use the stable low-code pagination contract. */\n listServices: Record<string, BestListService>\n /** Command services, such as create, update and remove. */\n services: Record<string, BestService>\n dictionaries: Record<string, BestDictionaryItem[]>\n actions: Record<string, BestAction>\n slots: BestSlotRegistry\n access: (key: string) => boolean\n}\n\nexport type BestProviderProps = {\n children: ReactNode\n registry?: Partial<Omit<BestRegistry, 'access'>> & { access?: BestRegistry['access'] }\n theme?: ThemeConfig\n}\n\nexport type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {\n access?: BestRegistry['access']\n}\n\nexport type BestDictionaryActions = {\n setDictionary: (key: string, items: BestDictionaryItem[]) => void\n}\n\nconst emptyRegistry: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: () => true\n}\n\nconst defaultTheme: ThemeConfig = {\n token: {\n borderRadius: 6,\n controlHeight: 32,\n fontSize: 14\n }\n}\n\nconst BestRuntimeContext = createContext<BestRegistry>(emptyRegistry)\nconst BestDictionaryActionsContext = createContext<BestDictionaryActions | null>(null)\n\nexport function composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry {\n const result: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: emptyRegistry.access\n }\n const groups = ['listServices', 'services', 'dictionaries', 'actions', 'slots'] as const\n for (const layer of layers) {\n for (const group of groups) {\n for (const [key, value] of Object.entries(layer[group] ?? {})) {\n if (Object.hasOwn(result[group], key)) {\n throw new Error(`Registry key \u91CD\u590D\uFF1A${group}.${key}`)\n }\n result[group][key] = value as never\n }\n }\n if (layer.access) {\n const previousAccess = result.access\n result.access = (key) => previousAccess(key) && layer.access?.(key) !== false\n }\n }\n return result\n}\n\n/** Compose feature-local Runtime Slots and reject duplicate Slot keys. */\nexport function createBestSlotRegistry(...layers: BestSlotRegistry[]): BestSlotRegistry {\n const result: BestSlotRegistry = {}\n for (const layer of layers) {\n for (const [key, slot] of Object.entries(layer)) {\n if (Object.hasOwn(result, key)) throw new Error(`Slot key \u91CD\u590D\uFF1A${key}`)\n result[key] = slot\n }\n }\n return result\n}\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return composeBestRegistry(registry)\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const [dictionaryUpdates, setDictionaryUpdates] = useState<Record<string, BestDictionaryItem[]>>({})\n const setDictionary = useCallback((key: string, items: BestDictionaryItem[]) => {\n setDictionaryUpdates((current) => ({ ...current, [key]: items }))\n }, [])\n const value = useMemo(() => {\n const next = createBestRegistry(registry)\n Object.assign(next.dictionaries, dictionaryUpdates)\n return next\n }, [dictionaryUpdates, registry])\n const mergedTheme = useMemo<ThemeConfig>(\n () => ({ ...defaultTheme, ...theme, token: { ...defaultTheme.token, ...theme?.token } }),\n [theme]\n )\n return (\n <BestRuntimeContext.Provider value={value}>\n <ConfigProvider theme={mergedTheme}>\n <BestDictionaryActionsContext.Provider value={{ setDictionary }}>\n {children}\n </BestDictionaryActionsContext.Provider>\n </ConfigProvider>\n </BestRuntimeContext.Provider>\n )\n}\n\nexport function useBestRegistry() {\n return useContext(BestRuntimeContext)\n}\n\nexport function useBestService(key: string): BestService {\n const service = useBestRegistry().services[key]\n if (!service) throw new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${key}`)\n return service\n}\n\nexport function useBestListService(key: string): BestListService | undefined {\n return useBestRegistry().listServices[key]\n}\n\nexport function useBestAccess(key?: string): boolean {\n const registry = useBestRegistry()\n return key ? registry.access(key) : true\n}\n\nexport function useBestDictionary(key?: string): BestDictionaryItem[] {\n const dictionaries = useBestRegistry().dictionaries\n return key ? (dictionaries[key] ?? []) : []\n}\n\nexport function useBestDictionaryActions(): BestDictionaryActions {\n const actions = useContext(BestDictionaryActionsContext)\n if (!actions) throw new Error('useBestDictionaryActions \u5FC5\u987B\u5728 BestProvider \u5185\u4F7F\u7528')\n return actions\n}\n\nexport function useBestAction(key: string): BestAction {\n const action = useBestRegistry().actions[key]\n if (!action) throw new Error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${key}`)\n return action\n}\n", "import { Input } from 'antd'\nimport type { TextAreaProps } from 'antd/es/input'\nimport { useImperativeHandle, useMemo, useState } from 'react'\n\nexport type BestBatchInputRef = {\n getParsedValue: () => string[][]\n}\n\nexport type BestBatchInputProps = Omit<TextAreaProps, 'onChange'> & {\n ref?: React.Ref<BestBatchInputRef>\n separator?: string\n onChange?: (value: string, parsed: string[][]) => void\n}\n\nfunction parse(value: string, separator: string) {\n const escaped = separator.replace(/[\\\\\\]\\-^]/g, '\\\\$&')\n const delimiter = new RegExp(`[${escaped}]`)\n return value\n .split('\\n')\n .map((row) => row.trim())\n .filter(Boolean)\n .map((row) => row.split(delimiter).map((cell) => cell.trim()))\n}\n\nexport function BestBatchInput({\n ref,\n separator = '|',\n value,\n defaultValue,\n onChange,\n ...props\n}: BestBatchInputProps) {\n const [innerValue, setInnerValue] = useState(String(defaultValue ?? ''))\n const currentValue = value == null ? innerValue : String(value)\n const parsed = useMemo(() => parse(currentValue, separator), [currentValue, separator])\n\n useImperativeHandle(ref, () => ({ getParsedValue: () => parsed }), [parsed])\n\n return (\n <Input.TextArea\n {...props}\n value={currentValue}\n onChange={(event) => {\n const nextValue = event.target.value\n if (value == null) setInnerValue(nextValue)\n onChange?.(nextValue, parse(nextValue, separator))\n }}\n />\n )\n}\n", "import { Descriptions, Empty, Table, Typography } from 'antd'\nimport dayjs from 'dayjs'\nimport type { ReactNode } from 'react'\nimport type { BestDetailField } from './types'\n\nexport type BestDetailTable = {\n key: string\n data: Record<string, unknown>[]\n rowKey?: string\n columns: {\n key: string\n title: string\n dataIndex?: string\n width?: number\n fixed?: 'left' | 'right'\n render?: (value: unknown, record: Record<string, unknown>) => React.ReactNode\n }[]\n scrollX?: number | string\n}\n\nexport type BestDetailSection = {\n key: string\n title?: ReactNode\n description?: ReactNode\n columns?: number\n span?: number\n variant?: 'plain' | 'card'\n fields?: BestDetailField[]\n table?: BestDetailTable\n content?: ReactNode\n}\n\nexport type BestDetailProps = {\n fields: BestDetailField[]\n record?: Record<string, unknown>\n column?: number\n sections?: BestDetailSection[]\n sectionColumns?: number\n sectionGap?: number | string\n}\n\nexport function BestDetail({ fields, record = {}, column = 2, sections, sectionColumns, sectionGap = 20 }: BestDetailProps) {\n const content = sections?.length\n ? <div style={{ display: 'grid', minWidth: 0, maxWidth: '100%', width: '100%', boxSizing: 'border-box', gridTemplateColumns: `repeat(${sectionColumns ?? 1}, minmax(0, 1fr))`, gap: sectionGap }}>\n {sections.map((section) => {\n const card = section.variant === 'card'\n return <section key={section.key} style={{ minWidth: 0, maxWidth: '100%', gridColumn: section.span ? `span ${section.span}` : undefined, marginBottom: 0, border: card ? '1px solid #f0f0f0' : undefined, borderRadius: card ? 6 : undefined, overflow: card ? 'hidden' : undefined, background: card ? '#fff' : undefined }}>\n {section.title ? <div style={{ padding: card ? '8px 12px' : undefined, background: card ? '#fafafa' : undefined, borderBottom: card ? '1px solid #f0f0f0' : undefined }}><Typography.Title level={5} style={{ margin: 0 }}>{section.title}</Typography.Title></div> : null}\n <div style={{ padding: card ? 12 : undefined }}>\n {section.description ? <Typography.Paragraph type='secondary'>{section.description}</Typography.Paragraph> : null}\n {section.content}\n {section.fields ? <FieldDescriptions fields={section.fields} record={record} column={section.columns ?? column} /> : null}\n {section.table ? <DetailTable table={section.table} /> : null}\n </div>\n </section>\n })}\n </div>\n : <FieldDescriptions fields={fields} record={record} column={column} />\n return content\n}\n\nfunction FieldDescriptions({ fields, record, column }: { fields: BestDetailField[]; record: Record<string, unknown>; column: number }) {\n const visibleFields = fields.filter((field) => field.visible !== false)\n return <div style={{ minWidth: 0, maxWidth: '100%', width: '100%', overflowX: 'auto' }}><Descriptions bordered column={column} size='small' style={{ minWidth: 0 }}>\n {visibleFields.map((field) => {\n const value = getPathValue(record, field.field)\n const display = field.render\n ? field.render(value, record)\n : (field.valueEnum?.[String(value)] ?? formatValue(value, field.format, field.emptyText))\n return <Descriptions.Item key={field.field} label={field.label} span={field.span}>{display}</Descriptions.Item>\n })}\n </Descriptions></div>\n}\n\nfunction DetailTable({ table }: { table: BestDetailTable }) {\n if (!table.data.length) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description='\u6682\u65E0\u6570\u636E' />\n return <div style={{ minWidth: 0, maxWidth: '100%', width: '100%', overflowX: 'auto' }}><Table<Record<string, unknown>>\n size='small'\n bordered\n pagination={false}\n rowKey={table.rowKey}\n dataSource={table.data}\n scroll={table.scrollX ? { x: table.scrollX } : undefined}\n columns={table.columns.map((column) => ({ ...column, dataIndex: column.dataIndex ?? column.key }))}\n /></div>\n}\n\nfunction formatValue(value: unknown, format: BestDetailField['format'], emptyText = '-') {\n if (value == null || value === '') return emptyText\n const type = typeof format === 'object' ? format.type : format\n if (!type || type === 'text') return String(value)\n if (type === 'number') {\n const number = Number(value)\n if (!Number.isFinite(number)) return String(value)\n const precision = typeof format === 'object' ? format.precision : undefined\n return number.toLocaleString('zh-CN', precision === undefined ? undefined : { minimumFractionDigits: precision, maximumFractionDigits: precision })\n }\n if (type === 'money') {\n const number = Number(value)\n return Number.isFinite(number) ? number.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : String(value)\n }\n if (type === 'boolean') return value ? '\u662F' : '\u5426'\n if (type === 'json') return typeof value === 'string' ? value : JSON.stringify(value)\n const date = dayjs(value as string | number | Date)\n return date.isValid() ? date.format(type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss') : String(value)\n}\n\nfunction getPathValue(values: Record<string, unknown>, path: string) {\n if (Object.hasOwn(values, path)) return values[path]\n return path.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') {\n return (current as Record<string, unknown>)[part]\n }\n return undefined\n }, values)\n}\n", "import { Button, Image, List, Typography } from 'antd'\n\nexport type BestFileItem = {\n url: string\n name?: string\n mimeType?: string\n}\n\nexport type BestFilePreviewProps = {\n files: BestFileItem[]\n onDownload?: (file: BestFileItem) => void\n}\n\nfunction isImage(file: BestFileItem) {\n return (\n file.mimeType?.startsWith('image/') ||\n /\\.(avif|bmp|gif|jpe?g|png|svg|webp)(?:$|[?#])/i.test(file.url)\n )\n}\n\nexport function BestFilePreview({ files, onDownload }: BestFilePreviewProps) {\n return (\n <List\n dataSource={files}\n renderItem={(file) => (\n <List.Item\n actions={[\n <Button key='download' type='link' onClick={() => onDownload?.(file)}>\n \u4E0B\u8F7D\n </Button>\n ]}\n >\n {isImage(file) ? (\n <Image alt={file.name ?? '\u6587\u4EF6\u9884\u89C8'} height={48} preview src={file.url} width={48} />\n ) : null}\n <Typography.Text ellipsis style={{ marginInlineStart: isImage(file) ? 12 : 0 }}>\n {file.name ?? file.url}\n </Typography.Text>\n </List.Item>\n )}\n />\n )\n}\n", "import type { FormRule } from 'antd'\nimport { Button, DatePicker, Form, Input, InputNumber, Select, Space } from 'antd'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormMode } from '../lowcode/schema'\nimport { useBestRegistry } from '../runtime'\nimport type { BestFieldDefinition, BestFieldRule, BestOption } from './types'\n\nexport type BestFormProps = {\n fields: BestFieldDefinition[]\n initialValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n mode?: FormMode\n onSubmit: (value: Record<string, unknown>) => void\n onCancel?: () => void\n}\n\ntype FormControlProps = {\n field: BestFieldDefinition\n values: Record<string, unknown>\n scopeValues?: Record<string, unknown>\n namePath?: string | number | (string | number)[]\n value?: unknown\n onChange?: (...args: unknown[]) => void\n} & Record<string, unknown>\n\nfunction toNamePath(path?: string | number | (string | number)[]) {\n return path === undefined ? [] : Array.isArray(path) ? path : [path]\n}\n\nfunction isNamePath(value: string | number | (string | number)[]) {\n return Array.isArray(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return false\n }\n if (dayjs.isDayjs(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction appendNamePath(\n path: string | number | (string | number)[] | undefined,\n ...segments: (string | number)[]\n) {\n return [...toNamePath(path), ...segments]\n}\n\nfunction getConditionFieldValue(values: Record<string, unknown>, field: string) {\n if (Object.hasOwn(values, field)) return values[field]\n return getPathValue(values, field.split('.'))\n}\n\nfunction getScopedValues(values: Record<string, unknown>, itemPath: (string | number)[]) {\n const itemValues = getPathValue(values, itemPath)\n return isRecord(itemValues) ? { ...values, ...itemValues } : values\n}\n\nfunction isFieldVisible(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n}\n\nfunction resolveFieldDisabled(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return (\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n )\n}\n\nfunction toDayjsValue(value: unknown): Dayjs | null {\n if (dayjs.isDayjs(value)) return value\n if (value instanceof Date) return dayjs(value)\n if (typeof value === 'number') {\n const normalized = Math.abs(value) >= 1_000_000_000_000 ? value : value * 1000\n const parsed = dayjs(normalized)\n return parsed.isValid() ? parsed : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = dayjs(trimmed)\n return parsed.isValid() ? parsed : null\n }\n return null\n}\n\nexport function toDatePickerValue(value: unknown): Dayjs | null {\n return toDayjsValue(value)\n}\n\nexport function toDateRangePickerValue(value: unknown): [Dayjs | null, Dayjs | null] | null {\n if (!Array.isArray(value)) return null\n const nextValue: [Dayjs | null, Dayjs | null] = [toDayjsValue(value[0]), toDayjsValue(value[1])]\n return nextValue[0] || nextValue[1] ? nextValue : null\n}\n\nexport function serializeDatePickerValue(_: Dayjs | null, dateString: string) {\n return dateString || undefined\n}\n\nexport function serializeDateRangePickerValue(\n _: [Dayjs | null, Dayjs | null] | null,\n dateStrings: [string, string]\n) {\n return dateStrings[0] || dateStrings[1] ? dateStrings : undefined\n}\n\nfunction fieldSignature(field: BestFieldDefinition): unknown {\n return {\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n itemFields: field.itemFields?.map((itemField) => fieldSignature(itemField))\n }\n}\n\nfunction FormControl({\n field,\n values,\n scopeValues,\n mode = 'create',\n form,\n namePath,\n value,\n onChange,\n ...controlProps\n}: FormControlProps & { mode?: FormMode; form: ReturnType<typeof Form.useForm>[0] }) {\n const registry = useBestRegistry()\n const renderValues = scopeValues ?? values\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value !== undefined ? value : getPathValue(values, namePath ?? field.field)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n onChange={(nextValue) => {\n if (onChange) onChange(nextValue)\n else form.setFieldValue(namePath ?? field.field, nextValue)\n }}\n registry={registry}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n case 'slot':\n return (\n <>\n {field.render?.({\n field: field.field,\n values: renderValues,\n value: value !== undefined ? value : getPathValue(values, namePath ?? field.field),\n mode,\n disabled: field.disabled,\n setValue: (name, nextValue) =>\n form.setFieldValue(\n namePath\n ? isNamePath(name)\n ? name\n : [...toNamePath(namePath).slice(0, -1), name]\n : name,\n nextValue\n )\n })}\n </>\n )\n case 'repeatable':\n return (\n <RepeatableField\n field={field}\n form={form}\n mode={mode}\n namePath={namePath}\n values={values}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction RepeatableField({\n field,\n form,\n mode,\n namePath,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n mode: FormMode\n namePath?: string | number | (string | number)[]\n values: Record<string, unknown>\n}) {\n const listName = namePath ?? field.field\n return (\n <Form.List name={listName}>\n {(items, { add, remove }) => (\n <>\n {items.map((item) => (\n <RepeatableFieldRow\n key={item.key}\n field={field}\n form={form}\n itemCount={items.length}\n itemName={item.name}\n itemKey={item.key}\n listName={listName}\n mode={mode}\n remove={remove}\n values={values}\n />\n ))}\n <Button\n disabled={field.maxItems !== undefined && items.length >= field.maxItems}\n onClick={() => add(resolveInitialValues(field.itemFields ?? [], undefined))}\n type='dashed'\n >\n \u65B0\u589E\u4E00\u9879\n </Button>\n </>\n )}\n </Form.List>\n )\n}\n\nfunction RepeatableFieldRow({\n field,\n form,\n itemCount,\n itemName,\n itemKey,\n listName,\n mode,\n remove,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n itemCount: number\n itemName: number\n itemKey: React.Key\n listName: string | number | (string | number)[]\n mode: FormMode\n remove: (index: number) => void\n values: Record<string, unknown>\n}) {\n const itemPath = appendNamePath(listName, itemName)\n const itemValues = getPathValue(values, itemPath)\n const scopeValues = getScopedValues(values, itemPath)\n\n useEffect(() => {\n field.itemFields?.forEach((itemField) => {\n if (!itemField.clearWhenHidden) return\n const nextPath = appendNamePath(itemPath, itemField.field)\n if (\n !isFieldVisible(itemField, scopeValues, mode) &&\n getPathValue(values, nextPath) !== undefined\n ) {\n form.setFieldValue(nextPath, undefined)\n }\n })\n }, [field.itemFields, form, itemPath, mode, scopeValues, values])\n\n return (\n <Space key={itemKey} align='start'>\n {field.itemFields?.map((itemField) => {\n if (!isFieldVisible(itemField, scopeValues, mode)) return null\n const nextPath = appendNamePath(itemPath, itemField.field)\n return (\n <Form.Item\n key={itemField.field}\n label={itemField.label}\n name={[itemName, itemField.field]}\n rules={toAntRules(itemField.rules)}\n >\n <FormControl\n field={{\n ...itemField,\n disabled: resolveFieldDisabled(itemField, scopeValues, mode)\n }}\n form={form}\n mode={mode}\n namePath={nextPath}\n scopeValues={scopeValues}\n values={isRecord(itemValues) ? { ...values, ...itemValues } : values}\n />\n </Form.Item>\n )\n })}\n <Button\n disabled={itemCount <= (field.minItems ?? 0)}\n onClick={() => remove(itemName)}\n type='link'\n >\n \u5220\u9664\n </Button>\n </Space>\n )\n}\n\ntype FormFieldsProps = Pick<BestFormProps, 'fields' | 'initialValues' | 'mode'> & {\n form: ReturnType<typeof Form.useForm>[0]\n}\n\nfunction FormFields({ fields, form, initialValues, mode = 'create' }: FormFieldsProps) {\n const values =\n (Form.useWatch([], { form, preserve: true }) as Record<string, unknown> | undefined) ??\n initialValues ??\n {}\n const isVisible = (field: BestFieldDefinition) =>\n !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n useEffect(() => {\n fields\n .filter((field) => field.clearWhenHidden && !isVisible(field))\n .forEach((field) => {\n if (values[field.field] !== undefined) form.setFieldValue(field.field, undefined)\n })\n }, [fields, form, mode, values])\n return (\n <>\n {fields\n .filter((field) => isVisible(field))\n .map((field) => {\n const control = (\n <FormControl\n key={field.field}\n field={{\n ...field,\n disabled:\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n }}\n form={form}\n mode={mode}\n values={values}\n />\n )\n return field.component === 'repeatable' ? (\n <Form.Item key={field.field} label={field.label}>\n {control}\n </Form.Item>\n ) : (\n <Form.Item\n key={field.field}\n label={field.label}\n name={field.field}\n rules={toAntRules(field.rules)}\n >\n {control}\n </Form.Item>\n )\n })}\n </>\n )\n}\n\nexport function toAntRules(rules: BestFieldRule[] | undefined): FormRule[] | undefined {\n return rules?.map(\n (rule) =>\n Object.fromEntries(\n Object.entries({\n required: rule.required,\n type: rule.type === 'string' ? undefined : rule.type,\n min: rule.min ?? rule.minLength,\n max: rule.max ?? rule.maxLength,\n pattern: safeRegExp(rule.pattern),\n message: rule.message,\n validator:\n rule.type === 'integer'\n ? async (_: unknown, value: unknown) => {\n if (value === undefined || value === null || value === '') return\n if (!Number.isInteger(Number(value)))\n throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\n }).filter(([, value]) => value !== undefined)\n ) as FormRule\n )\n}\n\nfunction safeRegExp(pattern: string | undefined) {\n if (!pattern) return undefined\n try {\n return new RegExp(pattern)\n } catch {\n return undefined\n }\n}\n\nexport function RemoteSelect({\n field,\n value,\n disabled,\n placeholder,\n onChange,\n registry\n}: {\n field: BestFieldDefinition\n value?: unknown\n disabled?: boolean\n placeholder?: string\n onChange: (value: unknown) => void\n registry: ReturnType<typeof useBestRegistry>\n}) {\n const [keywordOptions, setKeywordOptions] = useState<BestOption[]>([])\n const [selectedOptions, setSelectedOptions] = useState<BestOption[]>([])\n const [loading, setLoading] = useState(false)\n const [keyword, setKeyword] = useState('')\n const keywordRequestId = useRef(0)\n const selectedRequestId = useRef(0)\n const service = field.remoteService ? registry.services[field.remoteService] : undefined\n const labelField = field.labelField ?? 'label'\n const valueField = field.valueField ?? 'value'\n const searchField = field.searchField ?? 'keyword'\n const debounceMs = field.debounceMs ?? 300\n const pageSize = field.pageSize ?? 20\n\n const parseOptions = (response: unknown): BestOption[] => {\n const raw = Array.isArray(response)\n ? response\n : ((response as { items?: unknown[]; list?: unknown[] })?.items ??\n (response as { list?: unknown[] })?.list ??\n [])\n return raw.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const record = item as Record<string, unknown>\n const optionValue = record[valueField]\n if (typeof optionValue !== 'string' && typeof optionValue !== 'number') return []\n return [\n {\n label: String(record[labelField] ?? optionValue ?? ''),\n value: optionValue,\n disabled: Boolean(record.disabled)\n }\n ]\n })\n }\n\n const mergeOptions = (base: BestOption[], extra: BestOption[]) => {\n const merged = new Map(base.map((item) => [String(item.value), item]))\n extra.forEach((item) => {\n merged.set(String(item.value), item)\n })\n return [...merged.values()]\n }\n\n const options = useMemo(\n () => mergeOptions(keywordOptions, selectedOptions),\n [keywordOptions, selectedOptions]\n )\n\n useEffect(() => {\n const currentRequestId = ++keywordRequestId.current\n if (!service) {\n setKeywordOptions([])\n setLoading(false)\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === keywordRequestId.current && !controller.signal.aborted\n const timer = window.setTimeout(async () => {\n setLoading(true)\n try {\n const response = await service(\n { [searchField]: keyword, page: 1, pageSize },\n { signal: controller.signal }\n )\n if (isCurrent()) setKeywordOptions(parseOptions(response))\n } catch {\n if (isCurrent()) setKeywordOptions([])\n } finally {\n if (isCurrent()) setLoading(false)\n }\n }, debounceMs)\n return () => {\n window.clearTimeout(timer)\n controller.abort()\n }\n }, [debounceMs, keyword, labelField, pageSize, searchField, service, valueField])\n\n useEffect(() => {\n const currentRequestId = ++selectedRequestId.current\n if (!service) {\n setSelectedOptions([])\n return\n }\n if (value === undefined || value === null || value === '') {\n setSelectedOptions([])\n return\n }\n if (typeof value !== 'string' && typeof value !== 'number') {\n setSelectedOptions([])\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === selectedRequestId.current && !controller.signal.aborted\n const fallbackOption: BestOption = {\n label: String(value),\n value: value as string | number\n }\n setSelectedOptions([fallbackOption])\n void service({ [valueField]: value, page: 1, pageSize }, { signal: controller.signal })\n .then((response) => {\n if (!isCurrent()) return\n const resolvedOptions = parseOptions(response)\n if (resolvedOptions.length) {\n setSelectedOptions(mergeOptions([fallbackOption], resolvedOptions))\n }\n })\n .catch(() => undefined)\n return () => {\n controller.abort()\n }\n }, [labelField, pageSize, service, value, valueField])\n\n return (\n <Select\n showSearch\n filterOption={false}\n loading={loading}\n value={value}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n onSearch={setKeyword}\n onChange={onChange}\n />\n )\n}\n\nexport function BestForm({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps) {\n const resolvedInitialValues = useMemo(\n () => resolveInitialValues(fields, initialValues),\n [fields, initialValues]\n )\n const formSignature = useMemo(\n () =>\n JSON.stringify([mode, fields.map((field) => fieldSignature(field)), resolvedInitialValues]),\n [fields, mode, resolvedInitialValues]\n )\n return (\n <BestFormBody\n key={formSignature}\n extra={extra}\n fields={fields}\n initialValues={resolvedInitialValues}\n loading={loading}\n mode={mode}\n onCancel={onCancel}\n onSubmit={onSubmit}\n submitText={submitText}\n />\n )\n}\n\nfunction BestFormBody({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n return (\n <Form form={form} initialValues={initialValues} layout='vertical' onFinish={onSubmit}>\n <FormFields fields={fields} form={form} initialValues={initialValues} mode={mode} />\n <Space>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n {onCancel ? <Button onClick={onCancel}>\u53D6\u6D88</Button> : null}\n {extra}\n </Space>\n </Form>\n )\n}\n\nexport function getDefaultValues(fields: BestFieldDefinition[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field) => field.defaultValue !== undefined)\n .map((field) => [field.field, field.defaultValue])\n )\n}\n\nfunction resolveInitialValues(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown> | undefined\n) {\n const values = mergeDefinedValues(getDefaultValues(fields), initialValues)\n const resolvedValues = { ...values }\n fields.forEach((field) => {\n if (field.component !== 'repeatable' || !field.itemFields) return\n const items: unknown[] = Array.isArray(resolvedValues[field.field])\n ? (resolvedValues[field.field] as unknown[])\n : []\n resolvedValues[field.field] = items.map((item) =>\n resolveInitialValues(field.itemFields ?? [], isRecord(item) ? item : {})\n )\n })\n return resolvedValues\n}\n\nexport function mergeDefinedValues(\n baseValues: Record<string, unknown>,\n nextValues: Record<string, unknown> | undefined\n) {\n const mergedValues = { ...baseValues }\n Object.entries(nextValues ?? {}).forEach(([key, value]) => {\n if (value === undefined) return\n const currentValue = mergedValues[key]\n if (isRecord(currentValue) && isRecord(value)) {\n mergedValues[key] = mergeDefinedValues(currentValue, value)\n return\n }\n mergedValues[key] = value\n })\n return mergedValues\n}\n\nfunction getPathValue(\n values: Record<string, unknown>,\n path: string | number | (string | number)[]\n) {\n const parts = Array.isArray(path) ? path : [path]\n return parts.reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as Record<string, unknown>)[part]\n return undefined\n }, values)\n}\n\nexport function evaluateCondition(\n condition: NonNullable<BestFieldDefinition['visibleWhen']>,\n values: Record<string, unknown>,\n mode: FormMode\n): boolean {\n switch (condition.operator) {\n case 'equals':\n return getConditionFieldValue(values, condition.field) === condition.value\n case 'notEmpty':\n return (\n getConditionFieldValue(values, condition.field) !== undefined &&\n getConditionFieldValue(values, condition.field) !== null &&\n getConditionFieldValue(values, condition.field) !== ''\n )\n case 'modeEquals':\n return mode === condition.value\n case 'and':\n return condition.conditions.every((item) => evaluateCondition(item, values, mode))\n case 'or':\n return condition.conditions.some((item) => evaluateCondition(item, values, mode))\n case 'not':\n return !evaluateCondition(condition.condition, values, mode)\n }\n}\n", "import type { TableColumnsType } from 'antd'\nimport { Table } from 'antd'\n\nexport type BestLightTableColumn<T extends Record<string, unknown>> = {\n field: keyof T & string\n title: string\n width?: number\n render?: (value: unknown, record: T, index: number) => React.ReactNode\n}\n\nexport type BestLightTableProps<T extends Record<string, unknown>> = {\n columns: BestLightTableColumn<T>[]\n data: T[]\n rowKey?: string\n}\n\nexport function BestLightTable<T extends Record<string, unknown>>({\n columns,\n data,\n rowKey\n}: BestLightTableProps<T>) {\n const tableColumns: TableColumnsType<T> = columns.map((column) => ({\n dataIndex: column.field,\n key: column.field,\n title: column.title,\n width: column.width,\n render: column.render\n }))\n return (\n <Table\n columns={tableColumns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n size='small'\n />\n )\n}\n", "import { Drawer, Modal } from 'antd'\nimport type { ReactNode } from 'react'\n\ntype OverlayProps = {\n children: ReactNode\n open: boolean\n title: ReactNode\n onClose: () => void\n width?: number | string\n footer?: ReactNode\n}\n\nexport function BestDrawer({ children, open, title, onClose, width, footer }: OverlayProps) {\n return (\n <Drawer destroyOnHidden open={open} title={title} width={width ?? 640} footer={footer} onClose={onClose}>\n {children}\n </Drawer>\n )\n}\n\nexport function BestModal({ children, open, title, onClose, width, footer }: OverlayProps) {\n return (\n <Modal\n destroyOnHidden\n footer={footer ?? null}\n open={open}\n title={title}\n width={width}\n onCancel={onClose}\n styles={{\n root: { minWidth: 0, maxWidth: '100%', boxSizing: 'border-box' },\n body: { minWidth: 0, maxWidth: '100%', overflowX: 'hidden', boxSizing: 'border-box' }\n }}\n >\n <div style={{ minWidth: 0, maxWidth: '100%', width: '100%', boxSizing: 'border-box' }}>{children}</div>\n </Modal>\n )\n}\n", "import type { FormInstance } from 'antd'\nimport { Button, Col, DatePicker, Form, Input, InputNumber, Row, Select } from 'antd'\nimport dayjs from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useBestRegistry } from '../runtime'\nimport {\n getDefaultValues,\n mergeDefinedValues,\n RemoteSelect,\n serializeDatePickerValue,\n serializeDateRangePickerValue,\n toAntRules,\n toDatePickerValue,\n toDateRangePickerValue\n} from './BestForm'\nimport type { BestFieldDefinition } from './types'\nimport './BestSearch.module.less'\n\nexport type BestSearchProps = {\n fields: BestFieldDefinition[]\n value?: Record<string, unknown>\n defaultValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n onChange?: (value: Record<string, unknown>) => void\n onSearch: (value: Record<string, unknown>) => void\n onReset?: (value: Record<string, unknown>) => void\n}\n\ntype FieldControlProps = {\n field: BestFieldDefinition\n value?: unknown\n onChange?: (value: unknown) => void\n} & Record<string, unknown>\n\nfunction searchFormSignature(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown>\n) {\n return JSON.stringify([\n fields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize\n })),\n initialValues\n ])\n}\n\nfunction FieldControl({ field, value, onChange, ...controlProps }: FieldControlProps) {\n const registry = useBestRegistry()\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value as never}\n onChange={onChange ?? (() => undefined)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n registry={registry}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction syncValues(\n form: FormInstance,\n value: Record<string, unknown>,\n fields: BestFieldDefinition[]\n) {\n form.setFieldsValue(Object.fromEntries(fields.map((field) => [field.field, undefined])) as never)\n form.setFieldsValue(value as never)\n}\n\nexport function BestSearch({\n fields,\n value,\n defaultValues,\n loading,\n submitText = '\u67E5\u8BE2',\n extra,\n onChange,\n onSearch,\n onReset\n}: BestSearchProps) {\n const initialValues = useMemo(\n () => mergeDefinedValues(getDefaultValues(fields), defaultValues),\n [fields, defaultValues]\n )\n return (\n <BestSearchBody\n key={searchFormSignature(fields, initialValues)}\n extra={extra}\n fields={fields}\n initialValues={initialValues}\n loading={loading}\n onChange={onChange}\n onReset={onReset}\n onSearch={onSearch}\n submitText={submitText}\n value={value}\n />\n )\n}\n\nfunction BestSearchBody({\n fields,\n value,\n initialValues,\n loading,\n submitText,\n extra,\n onChange,\n onSearch,\n onReset\n}: Omit<BestSearchProps, 'defaultValues'> & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n const valueSignatureRef = useRef<string | undefined>(undefined)\n const controlledRef = useRef(false)\n\n useEffect(() => {\n if (value === undefined) {\n if (controlledRef.current) {\n syncValues(form, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n controlledRef.current = false\n }\n return\n }\n controlledRef.current = true\n const signature = JSON.stringify(value)\n if (valueSignatureRef.current === signature) return\n syncValues(form, value, fields)\n valueSignatureRef.current = signature\n }, [fields, form, value])\n\n return (\n <Form\n form={form}\n initialValues={initialValues}\n layout='vertical'\n onFinish={(values) => onSearch(values as Record<string, unknown>)}\n onValuesChange={(_, values) => onChange?.(values as Record<string, unknown>)}\n className='best-lowcode-search'\n >\n <Row gutter={16} align='bottom'>\n {fields\n .filter((field) => !field.hidden)\n .map((field) => (\n <Col key={field.field} span={field.span ?? 6}>\n <Form.Item label={field.label} name={field.field} rules={toAntRules(field.rules)}>\n <FieldControl field={field} />\n </Form.Item>\n </Col>\n ))}\n <Col>\n <Form.Item>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n <Button\n onClick={() => {\n syncValues(form, initialValues, fields)\n valueSignatureRef.current = JSON.stringify(initialValues)\n onChange?.(initialValues)\n onReset?.(initialValues)\n }}\n style={{ marginInlineStart: 8 }}\n >\n \u91CD\u7F6E\n </Button>\n {extra}\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )\n}\n", "import { Empty, Result, Spin } from 'antd'\n\nexport function BestLoading({ description = '\u52A0\u8F7D\u4E2D' }: { description?: string }) {\n return (\n <div style={{ display: 'grid', minHeight: 160, placeItems: 'center' }}>\n <Spin tip={description} />\n </div>\n )\n}\n\nexport function BestEmpty({ description = '\u6682\u65E0\u6570\u636E' }: { description?: string }) {\n return <Empty description={description} />\n}\n\nexport function BestError({ description = '\u52A0\u8F7D\u5931\u8D25' }: { description?: string }) {\n return <Result status='error' title={description} />\n}\n", "import {\n type ParamsType,\n ProTable,\n type ProTableProps,\n type RequestData\n} from '@ant-design/pro-components'\nimport type { TableProps } from 'antd'\nimport type { ReactNode } from 'react'\nimport './BestTable.module.less'\n\nexport type BestTableColumn<T extends Record<string, unknown>> = NonNullable<\n ProTableProps<T, ParamsType>['columns']\n>[number]\n\nexport type BestTableProps<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n> = Omit<ProTableProps<DataSource, Params, ValueType>, 'columns'> & {\n columns?:\n | ProTableProps<DataSource, Params, ValueType>['columns']\n | TableProps<DataSource>['columns']\n emptyText?: ReactNode\n}\n\nconst defaultSearch: NonNullable<ProTableProps<Record<string, unknown>, ParamsType>['search']> = {\n layout: 'vertical',\n labelWidth: 'auto',\n defaultCollapsed: false,\n collapseRender: false,\n span: 6\n}\n\nfunction mergeSearch<T>(defaults: T, value: T | false | undefined): T | false {\n if (value === false) return false\n return { ...(defaults as object), ...((value ?? {}) as object) } as T\n}\n\nexport function BestTable<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n>({\n columns,\n cardProps,\n className,\n search,\n emptyText = '\u6682\u65E0\u6570\u636E',\n ...props\n}: BestTableProps<DataSource, Params, ValueType>) {\n return (\n <ProTable<DataSource, Params, ValueType>\n {...props}\n className={['best-lowcode-table', className].filter(Boolean).join(' ')}\n columns={columns as ProTableProps<DataSource, Params, ValueType>['columns']}\n options={false}\n search={mergeSearch(defaultSearch, search as typeof defaultSearch | false | undefined)}\n cardProps={\n cardProps === false\n ? false\n : {\n ...cardProps,\n styles: {\n ...cardProps?.styles,\n body: { ...cardProps?.styles?.body, padding: 12 }\n }\n }\n }\n locale={{ emptyText }}\n />\n )\n}\n\nexport type { RequestData }\n", "import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc.js'\nimport type { BestListQuery, BestListService } from './list'\nimport type { TableColumnSchema } from './schema'\n\ndayjs.extend(utc)\n\ntype ProTablePageResponse = { data: Record<string, unknown>[]; success: boolean; total: number }\n\nexport function toBestListQuery(\n params: Record<string, unknown>,\n sort?: Record<string, unknown>\n): BestListQuery {\n const { current, pageSize, ...filters } = params\n const normalizedSort = Object.fromEntries(\n Object.entries(sort ?? {}).filter(\n (entry): entry is [string, 'ascend' | 'descend'] =>\n entry[1] === 'ascend' || entry[1] === 'descend'\n )\n )\n return {\n page: typeof current === 'number' && current > 0 ? current : 1,\n pageSize: typeof pageSize === 'number' && pageSize > 0 ? pageSize : 20,\n filters,\n ...(Object.keys(normalizedSort).length ? { sort: normalizedSort } : {})\n }\n}\n\nexport function formatCrudValue(value: unknown, format: TableColumnSchema['format']): string {\n if (value == null || value === '') return '-'\n if (!format || format === 'text') return String(value)\n if (format === 'money') {\n const amount = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(amount)\n ? new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount)\n : String(value)\n }\n if (typeof value !== 'string' && typeof value !== 'number' && !(value instanceof Date)) {\n return String(value)\n }\n let timestamp: string | number | Date = value\n if (typeof value === 'number' || typeof value === 'string') {\n const numericValue = typeof value === 'number' ? value : Number(value.trim())\n timestamp =\n Number.isFinite(numericValue) && numericValue !== 0\n ? Math.abs(numericValue) >= 1_000_000_000_000\n ? numericValue\n : numericValue * 1000\n : value\n }\n const date = dayjs.utc(timestamp)\n if (!date.isValid()) return String(value)\n return date.format(format === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')\n}\n\nexport function errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback\n}\n\nexport function isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted || (error instanceof DOMException && error.name === 'AbortError')\n}\n\nexport async function confirmBeforeAction(\n content: string | undefined,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n return !content || confirm(content)\n}\n\nexport async function removeCrudRecord(\n record: Record<string, unknown>,\n service: (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ) => Promise<unknown>,\n content: string,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n if (!(await confirmBeforeAction(content, confirm))) return false\n await service(record)\n return true\n}\n\nexport function createLatestPageRequest(\n service: BestListService,\n onError: (error: unknown) => void\n) {\n let sequence = 0\n let controller: AbortController | undefined\n let latest: ProTablePageResponse = { data: [], success: false, total: 0 }\n\n return {\n async request(query: BestListQuery): Promise<ProTablePageResponse> {\n controller?.abort()\n controller = new AbortController()\n const currentController = controller\n const currentSequence = ++sequence\n try {\n const response = await service(query, { signal: currentController.signal })\n const pageResponse: ProTablePageResponse = {\n data: response.items,\n success: true,\n total: response.total\n }\n if (currentSequence !== sequence) return latest\n latest = pageResponse\n return pageResponse\n } catch (error) {\n if (currentSequence !== sequence || isAbortError(error, currentController.signal))\n return latest\n onError(error)\n return { data: [], success: false, total: 0 }\n }\n },\n abort() {\n controller?.abort()\n }\n }\n}\n", "import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\nexport const TABBED_PAGE_SCHEMA_ID = 'https://best.dev/schema/tabs/v1' as const\nexport const TABBED_PAGE_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type CompositeColumnItemSchema = {\n label?: string\n field: string\n dict?: string\n format?: 'date' | 'datetime' | 'money' | 'text'\n emptyText?: string\n}\n\nexport type CompositeColumnSchema = {\n layout?: 'vertical' | 'horizontal'\n gap?: number\n items: CompositeColumnItemSchema[]\n}\n\nexport type TableColumnSchema = {\n field?: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n composite?: CompositeColumnSchema\n}\n\nexport type TableExpandableSchema = {\n /** Nested row field name. Defaults to Ant Design Table's `children`. */\n childrenField?: string\n defaultExpandAllRows?: boolean\n defaultExpandedRowKeys?: (string | number)[]\n indentSize?: number\n}\n\nexport type TableRowSelectionSchema = {\n enabled?: boolean\n type?: 'checkbox' | 'radio'\n /** When false, selecting a parent also selects its descendants. */\n checkStrictly?: boolean\n preserveSelectedRowKeys?: boolean\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n format?: DetailFormat | DetailFormatConfig\n visibleWhen?: Condition\n emptyText?: string\n}\n\nexport type DetailFormat = 'text' | 'number' | 'money' | 'date' | 'datetime' | 'boolean' | 'json'\n\nexport type DetailFormatConfig = {\n type: DetailFormat\n emptyText?: string\n precision?: number\n timezone?: string\n}\n\nexport type DetailTableColumnSchema = {\n field: string\n title: string\n width?: number\n fixed?: 'left' | 'right'\n dict?: string\n format?: DetailFormat | DetailFormatConfig\n slot?: string\n}\n\nexport type DetailTableSchema = {\n data: string\n rowKey?: string\n columns: DetailTableColumnSchema[]\n scrollX?: number | string\n}\n\nexport type DetailSectionSchema = {\n key: string\n title?: string\n description?: string\n visibleWhen?: Condition\n layout?: 'fields' | 'table' | 'slot'\n columns?: number\n span?: number\n variant?: 'plain' | 'card'\n fields?: DetailFieldSchema[]\n table?: DetailTableSchema\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot' | 'closeDetail'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n expandable?: TableExpandableSchema\n rowSelection?: TableRowSelectionSchema\n }\n detail?: {\n mode?: 'drawer' | 'modal' | 'inline'\n width?: number | string\n columns?: number\n gap?: number | string\n fields?: DetailFieldSchema[]\n sections?: DetailSectionSchema[]\n footer?: PageActionSchema[]\n }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n\nexport type TabContentSchema =\n | { type: 'crud'; schema: CrudPageSchema }\n | { type: 'slot'; slot: string }\n\nexport type TabSchema = {\n key: string\n label: string\n access?: string\n /** Defaults to true so inactive CRUD pages do not fetch until selected. */\n destroyOnHidden?: boolean\n content: TabContentSchema\n}\n\n/** A page composition schema with runtime-owned tab navigation. */\nexport type TabbedPageSchema = {\n $schema: typeof TABBED_PAGE_SCHEMA_ID\n version: typeof TABBED_PAGE_SCHEMA_VERSION\n id: string\n kind: 'tabs'\n tabs: TabSchema[]\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema,\n TABBED_PAGE_SCHEMA_ID,\n TABBED_PAGE_SCHEMA_VERSION,\n type TabbedPageSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot',\n 'closeDetail'\n])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\nconst detailFormats = new Set(['text', 'number', 'money', 'date', 'datetime', 'boolean', 'json'])\n\nfunction push(diagnostics: SchemaDiagnostic[], path: string, code: string, message: string) {\n diagnostics.push({ path, code, message })\n}\n\nfunction validateCondition(condition: Condition, path: string, diagnostics: SchemaDiagnostic[]) {\n if (!condition || typeof condition !== 'object') {\n push(diagnostics, path, 'condition.type', '\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61')\n return\n }\n if (condition.operator === 'equals') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'notEmpty') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'modeEquals') {\n return\n }\n if (\n (condition.operator === 'and' || condition.operator === 'or') &&\n !Array.isArray(condition.conditions)\n ) {\n push(diagnostics, path, 'condition.conditions', '\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4')\n return\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n if (condition.conditions.length === 0) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n return\n }\n if (condition.operator === 'not') {\n if (!condition.condition) {\n push(diagnostics, path, 'condition.missing', 'not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition')\n return\n }\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\n return\n }\n push(diagnostics, path, 'condition.operator', `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${(condition as { operator?: unknown }).operator}`)\n}\n\nfunction validateDetailField(\n field: import('./schema').DetailFieldSchema,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n if (field.visibleWhen) validateCondition(field.visibleWhen, `${path}/visibleWhen`, diagnostics)\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, `${path}/slot`, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n const format = typeof field.format === 'object' ? field.format.type : field.format\n if (format && !detailFormats.has(format))\n push(diagnostics, `${path}/format`, 'detail.format', `\u4E0D\u652F\u6301\u7684\u8BE6\u60C5\u683C\u5F0F\uFF1A${format}`)\n}\n\nfunction validateFields(\n fields: FieldSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n const seen = new Set<string>()\n fields?.forEach((field, index) => {\n const fieldPath = `${path}/${index}`\n if (!field.field) push(diagnostics, fieldPath, 'field.missing', '\u5B57\u6BB5\u540D\u4E0D\u80FD\u4E3A\u7A7A')\n if (seen.has(field.field))\n push(diagnostics, fieldPath, 'field.duplicate', `\u5B57\u6BB5\u91CD\u590D\uFF1A${field.field}`)\n seen.add(field.field)\n if (!fieldComponents.has(field.component))\n push(diagnostics, fieldPath, 'field.component', `\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\uFF1A${field.component}`)\n if (field.dict && registry && !registry.dictionaries[field.dict]) {\n push(diagnostics, fieldPath, 'registry.dictionary', `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${field.dict}`)\n }\n if (field.component === 'remoteSelect' && !field.remoteService)\n push(diagnostics, fieldPath, 'field.remoteService', 'remoteSelect \u5FC5\u987B\u6307\u5B9A remoteService')\n if (field.remoteService && registry && !registry.services[field.remoteService])\n push(diagnostics, fieldPath, 'registry.service', `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${field.remoteService}`)\n if (field.component === 'slot' && !field.slot)\n push(diagnostics, fieldPath, 'field.slot', 'slot \u7EC4\u4EF6\u5FC5\u987B\u6307\u5B9A slot key')\n if (field.component === 'repeatable' && !field.itemFields?.length)\n push(\n diagnostics,\n fieldPath,\n 'field.repeatable',\n 'repeatable \u7EC4\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A itemFields \u5B57\u6BB5'\n )\n if (field.itemFields?.length)\n validateFields(\n field.itemFields as FieldSchema[],\n `${fieldPath}/itemFields`,\n registry,\n diagnostics\n )\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n push(diagnostics, fieldPath, 'field.repeatable.range', 'minItems \u4E0D\u80FD\u5927\u4E8E maxItems')\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, fieldPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n if (field.visibleWhen)\n validateCondition(field.visibleWhen, `${fieldPath}/visibleWhen`, diagnostics)\n if (field.disabledWhen)\n validateCondition(field.disabledWhen, `${fieldPath}/disabledWhen`, diagnostics)\n })\n}\n\nfunction validateActions(\n actions: PageActionSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n hasRemoveService: boolean,\n diagnostics: SchemaDiagnostic[]\n) {\n actions?.forEach((action, index) => {\n const actionPath = `${path}/${index}`\n if (!action.id) push(diagnostics, actionPath, 'action.missing', '\u52A8\u4F5C id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!builtInEffects.has(action.effect))\n push(diagnostics, actionPath, 'action.effect', `\u4E0D\u652F\u6301\u7684\u52A8\u4F5C\uFF1A${action.effect}`)\n if (action.effect === 'runAction' && !action.action)\n push(diagnostics, actionPath, 'action.key', 'runAction \u5FC5\u987B\u6307\u5B9A action key')\n if (action.effect === 'remove' && !hasRemoveService)\n push(diagnostics, actionPath, 'action.removeService', 'remove \u52A8\u4F5C\u5FC5\u987B\u914D\u7F6E dataSource.remove')\n if (action.effect === 'slot' && !action.slot)\n push(diagnostics, actionPath, 'action.slot', 'slot \u52A8\u4F5C\u5FC5\u987B\u6307\u5B9A slot key')\n if (action.action && registry && !registry.actions[action.action]) {\n push(diagnostics, actionPath, 'registry.action', `\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n }\n if (action.slot && registry && !registry.slots[action.slot]) {\n push(diagnostics, actionPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${action.slot}`)\n }\n })\n}\n\nexport function validateCrudPageSchema(\n schema: CrudPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== CRUD_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${CRUD_SCHEMA_ID}`)\n if (schema.version !== CRUD_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${CRUD_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.title) push(diagnostics, '/title', 'page.title', '\u9875\u9762\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.dataSource?.list)\n push(diagnostics, '/dataSource/list', 'service.list', '\u5217\u8868\u670D\u52A1\u4E0D\u80FD\u4E3A\u7A7A')\n if (schema.dataSource?.list && registry && !registry.listServices[schema.dataSource.list]) {\n push(\n diagnostics,\n '/dataSource/list',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.list}`\n )\n }\n if (schema.dataSource?.detail && registry && !registry.services[schema.dataSource.detail]) {\n push(\n diagnostics,\n '/dataSource/detail',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`\n )\n }\n if (schema.dataSource?.create && registry && !registry.services[schema.dataSource.create]) {\n push(\n diagnostics,\n '/dataSource/create',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.create}`\n )\n }\n if (schema.dataSource?.update && registry && !registry.services[schema.dataSource.update]) {\n push(\n diagnostics,\n '/dataSource/update',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.update}`\n )\n }\n if (schema.dataSource?.remove && registry && !registry.services[schema.dataSource.remove]) {\n push(\n diagnostics,\n '/dataSource/remove',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`\n )\n }\n validateFields(schema.search, '/search', registry, diagnostics)\n validateFields(schema.form, '/form', registry, diagnostics)\n if (!schema.table?.rowKey) push(diagnostics, '/table/rowKey', 'table.rowKey', 'rowKey \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.table?.columns?.length)\n push(diagnostics, '/table/columns', 'table.columns', '\u81F3\u5C11\u9700\u8981\u4E00\u5217')\n schema.table?.columns?.forEach((column, index) => {\n if (!column.field && !column.composite) {\n push(\n diagnostics,\n `/table/columns/${index}`,\n 'column.field',\n '\u666E\u901A\u5217\u5FC5\u987B\u6307\u5B9A field\uFF0C\u7EC4\u5408\u5217\u5FC5\u987B\u6307\u5B9A composite'\n )\n }\n if (column.composite) {\n if (!column.composite.items?.length) {\n push(\n diagnostics,\n `/table/columns/${index}/composite/items`,\n 'column.composite.items',\n '\u7EC4\u5408\u5217\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B57\u6BB5'\n )\n }\n column.composite.items?.forEach((item, itemIndex) => {\n if (!item.field) {\n push(\n diagnostics,\n `/table/columns/${index}/composite/items/${itemIndex}/field`,\n 'column.composite.field',\n '\u7EC4\u5408\u5217\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A'\n )\n }\n if (item.format && !columnFormats.has(item.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/composite/items/${itemIndex}/format`,\n 'column.composite.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${item.format}`\n )\n }\n if (item.dict && registry && !registry.dictionaries[item.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/composite/items/${itemIndex}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${item.dict}`\n )\n }\n })\n }\n if (column.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n (schema.detail.fields !== undefined && !Array.isArray(schema.detail.fields)) ||\n (schema.detail.sections !== undefined && !Array.isArray(schema.detail.sections))\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u6216 sections \u6570\u7EC4')\n } else {\n schema.detail.fields?.forEach((field, index) => validateDetailField(field, `/detail/fields/${index}`, registry, diagnostics))\n schema.detail.sections?.forEach((section, index) => {\n if (section.visibleWhen) validateCondition(section.visibleWhen, `/detail/sections/${index}/visibleWhen`, diagnostics)\n if (!section.key) push(diagnostics, `/detail/sections/${index}/key`, 'detail.section.key', '\u8BE6\u60C5\u533A\u5757\u5FC5\u987B\u6307\u5B9A key')\n if (section.span !== undefined && (!Number.isInteger(section.span) || section.span < 1))\n push(diagnostics, `/detail/sections/${index}/span`, 'detail.section.span', '\u8BE6\u60C5\u533A\u5757 span \u5FC5\u987B\u662F\u6B63\u6574\u6570')\n if (section.columns !== undefined && (!Number.isInteger(section.columns) || section.columns < 1))\n push(diagnostics, `/detail/sections/${index}/columns`, 'detail.section.columns', '\u8BE6\u60C5\u5B57\u6BB5 columns \u5FC5\u987B\u662F\u6B63\u6574\u6570')\n if (section.layout === 'slot' && !section.slot)\n push(diagnostics, `/detail/sections/${index}/slot`, 'detail.slot', 'slot \u533A\u5757\u5FC5\u987B\u6307\u5B9A slot')\n if (section.layout === 'table' && !section.table)\n push(diagnostics, `/detail/sections/${index}/table`, 'detail.table', 'table \u533A\u5757\u5FC5\u987B\u6307\u5B9A table')\n if (section.table && typeof section.table.data !== 'string')\n push(diagnostics, `/detail/sections/${index}/table/data`, 'detail.table.data', '\u8BE6\u60C5\u8868\u683C data \u5FC5\u987B\u662F\u5B57\u6BB5\u8DEF\u5F84')\n if (section.slot && registry && !registry.slots[section.slot])\n push(diagnostics, `/detail/sections/${index}/slot`, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${section.slot}`)\n section.fields?.forEach((field, fieldIndex) => validateDetailField(field, `/detail/sections/${index}/fields/${fieldIndex}`, registry, diagnostics))\n })\n }\n }\n validateActions(\n schema.table?.actions,\n '/table/actions',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.toolbar,\n '/toolbar',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.detail?.footer,\n '/detail/footer',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry) {\n const result = validateCrudPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n\nexport function validateTabbedPageSchema(\n schema: TabbedPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`)\n if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {\n push(diagnostics, '/tabs', 'tabs.required', '\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E')\n return { valid: false, diagnostics }\n }\n const keys = new Set<string>()\n schema.tabs.forEach((tab, index) => {\n const path = `/tabs/${index}`\n if (!tab.key) push(diagnostics, path, 'tab.key', '\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A')\n if (keys.has(tab.key)) push(diagnostics, path, 'tab.duplicate', `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`)\n keys.add(tab.key)\n if (!tab.label) push(diagnostics, path, 'tab.label', '\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (tab.content.type === 'crud') {\n const result = validateCrudPageSchema(tab.content.schema, registry)\n diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })))\n } else if (tab.content.type === 'slot') {\n if (!tab.content.slot) push(diagnostics, path, 'tab.slot', 'slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key')\n if (tab.content.slot && registry && !registry.slots[tab.content.slot])\n push(diagnostics, path, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`)\n } else {\n push(diagnostics, path, 'tab.content', '\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B')\n }\n })\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry) {\n const result = validateTabbedPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import { Tabs } from 'antd'\nimport { useBestRegistry } from '../runtime'\nimport { BestCrudPage } from './BestCrudPage'\nimport type { TabbedPageSchema } from './schema'\nimport { assertValidTabbedPageSchema } from './validate'\n\nexport type BestTabbedPageProps = {\n className?: string\n schema: TabbedPageSchema\n}\n\n/** Renders declarative tabs whose contents are either a CRUD schema or a registered slot. */\nexport function BestTabbedPage({ className, schema }: BestTabbedPageProps) {\n const registry = useBestRegistry()\n assertValidTabbedPageSchema(schema, registry)\n const items = schema.tabs\n .filter((tab) => !tab.access || registry.access(tab.access))\n .map((tab) => ({\n key: tab.key,\n label: tab.label,\n destroyOnHidden: tab.destroyOnHidden,\n children:\n tab.content.type === 'crud' ? (\n <BestCrudPage schema={tab.content.schema} />\n ) : (\n registry.slots[tab.content.slot]?.({ pageId: schema.id, tabKey: tab.key }) ?? null\n )\n }))\n return <Tabs className={className} items={items} />\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Button", "Modal", "dayjs", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useMemo", "useState", "jsx", "dayjs", "jsx", "Typography", "jsx", "jsxs", "Button", "Input", "dayjs", "useMemo", "useState", "jsx", "jsxs", "dayjs", "getPathValue", "Input", "Button", "useState", "useMemo", "Table", "jsx", "jsx", "Button", "DatePicker", "Form", "Input", "InputNumber", "Select", "dayjs", "useEffect", "useMemo", "useRef", "jsx", "jsxs", "Select", "InputNumber", "DatePicker", "dayjs", "Input", "useMemo", "Form", "useRef", "useEffect", "Button", "Empty", "jsx", "jsx", "dayjs", "message", "Fragment", "jsx", "jsxs", "isRecord", "record", "getPathValue", "dayjs", "Modal", "useCallback", "query", "useRef", "useMemo", "useState", "useEffect", "Button", "jsx"]
7
7
  }