best-lowcode-runtime 0.2.1 → 0.2.2
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/dev.js +49 -12
- package/dist/dev.js.map +2 -2
- package/dist/index.js +122 -26
- package/dist/index.js.map +3 -3
- package/dist/lowcode/BestCrudPage.d.ts +3 -0
- package/dist/lowcode/BestCrudPage.d.ts.map +1 -1
- package/dist/lowcode/validate.d.ts.map +1 -1
- package/dist/ui/BestForm.d.ts.map +1 -1
- package/package.json +7 -8
package/dist/dev.js
CHANGED
|
@@ -27,16 +27,47 @@ function push(diagnostics, path, code, message) {
|
|
|
27
27
|
diagnostics.push({ path, code, message });
|
|
28
28
|
}
|
|
29
29
|
function validateCondition(condition, path, diagnostics) {
|
|
30
|
-
if (
|
|
31
|
-
push(diagnostics, path, "condition.
|
|
30
|
+
if (!condition || typeof condition !== "object") {
|
|
31
|
+
push(diagnostics, path, "condition.type", "\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (condition.operator === "equals") {
|
|
35
|
+
if (typeof condition.field !== "string" || condition.field === "") {
|
|
36
|
+
push(diagnostics, path, "condition.field", "equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (condition.operator === "notEmpty") {
|
|
41
|
+
if (typeof condition.field !== "string" || condition.field === "") {
|
|
42
|
+
push(diagnostics, path, "condition.field", "notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (condition.operator === "modeEquals") {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if ((condition.operator === "and" || condition.operator === "or") && !Array.isArray(condition.conditions)) {
|
|
50
|
+
push(diagnostics, path, "condition.conditions", "\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4");
|
|
51
|
+
return;
|
|
32
52
|
}
|
|
33
53
|
if (condition.operator === "and" || condition.operator === "or") {
|
|
54
|
+
if (condition.conditions.length === 0) {
|
|
55
|
+
push(diagnostics, path, "condition.empty", "\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6");
|
|
56
|
+
}
|
|
34
57
|
condition.conditions.forEach((item, index) => {
|
|
35
58
|
validateCondition(item, `${path}/conditions/${index}`, diagnostics);
|
|
36
59
|
});
|
|
60
|
+
return;
|
|
37
61
|
}
|
|
38
|
-
if (condition.operator === "not")
|
|
62
|
+
if (condition.operator === "not") {
|
|
63
|
+
if (!condition.condition) {
|
|
64
|
+
push(diagnostics, path, "condition.missing", "not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
39
67
|
validateCondition(condition.condition, `${path}/condition`, diagnostics);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
push(diagnostics, path, "condition.operator", `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${condition.operator}`);
|
|
40
71
|
}
|
|
41
72
|
function validateFields(fields, path, registry, diagnostics) {
|
|
42
73
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -182,15 +213,21 @@ function validateCrudPageSchema(schema, registry) {
|
|
|
182
213
|
);
|
|
183
214
|
}
|
|
184
215
|
});
|
|
185
|
-
schema.detail
|
|
186
|
-
if (
|
|
187
|
-
push(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
216
|
+
if (schema.detail !== void 0) {
|
|
217
|
+
if (!schema.detail || typeof schema.detail !== "object" || !Array.isArray(schema.detail.fields)) {
|
|
218
|
+
push(diagnostics, "/detail", "detail.type", "detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4");
|
|
219
|
+
} else {
|
|
220
|
+
schema.detail.fields.forEach((field, index) => {
|
|
221
|
+
if (field.slot && registry && !registry.slots[field.slot])
|
|
222
|
+
push(
|
|
223
|
+
diagnostics,
|
|
224
|
+
`/detail/fields/${index}/slot`,
|
|
225
|
+
"registry.slot",
|
|
226
|
+
`\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`
|
|
227
|
+
);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
194
231
|
validateActions(
|
|
195
232
|
schema.table?.actions,
|
|
196
233
|
"/table/actions",
|
package/dist/dev.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/lowcode/schema.ts", "../src/lowcode/validate.ts", "../src/lowcode/dev.ts"],
|
|
4
|
-
"sourcesContent": ["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\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 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}\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\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?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\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} 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])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\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 (\n (condition.operator === 'and' || condition.operator === 'or') &&\n condition.conditions.length === 0\n ) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n }\n if (condition.operator === 'not')\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\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.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 schema.detail?.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\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 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", "import type {\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n CrudPageSchema,\n FieldSchema,\n PageActionSchema\n} from './schema'\nimport type { SchemaDiagnostic, SchemaValidationResult } from './validate'\nimport { validateCrudPageSchema } from './validate'\n\nconst builtInCapabilities = [\n 'builtin.effect.openCreate',\n 'builtin.effect.openDetail',\n 'builtin.effect.openEdit',\n 'builtin.effect.remove',\n 'builtin.effect.runAction',\n 'builtin.effect.slot',\n 'builtin.format.date',\n 'builtin.format.datetime',\n 'builtin.format.money',\n 'builtin.format.text',\n 'builtin.field.input',\n 'builtin.field.number',\n 'builtin.field.select',\n 'builtin.field.remoteSelect',\n 'builtin.field.date',\n 'builtin.field.dateRange',\n 'builtin.field.textarea',\n 'builtin.field.slot',\n 'builtin.field.repeatable'\n] as const\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction arrayOfRecords(value: unknown): JsonRecord[] | undefined {\n return Array.isArray(value) && value.every(isRecord) ? value : undefined\n}\n\nfunction diagnostic(path: string, code: string, message: string): SchemaDiagnostic {\n return { path, code, message }\n}\n\nfunction validateUnknownShape(candidate: unknown): SchemaDiagnostic[] {\n if (!isRecord(candidate)) return [diagnostic('', 'schema.type', 'Schema \u5FC5\u987B\u662F JSON \u5BF9\u8C61')]\n const diagnostics: SchemaDiagnostic[] = []\n if (!isRecord(candidate.dataSource))\n diagnostics.push(diagnostic('/dataSource', 'dataSource.type', 'dataSource \u5FC5\u987B\u662F\u5BF9\u8C61'))\n if (!isRecord(candidate.table))\n diagnostics.push(diagnostic('/table', 'table.type', 'table \u5FC5\u987B\u662F\u5BF9\u8C61'))\n for (const key of ['search', 'form'] as const) {\n if (candidate[key] !== undefined && !arrayOfRecords(candidate[key])) {\n diagnostics.push(diagnostic(`/${key}`, 'field.list', `${key} \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4`))\n }\n }\n if (isRecord(candidate.table)) {\n if (!arrayOfRecords(candidate.table.columns)) {\n diagnostics.push(diagnostic('/table/columns', 'column.list', 'columns \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n if (candidate.table.actions !== undefined && !arrayOfRecords(candidate.table.actions)) {\n diagnostics.push(diagnostic('/table/actions', 'action.list', 'actions \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n }\n if (candidate.toolbar !== undefined && !arrayOfRecords(candidate.toolbar)) {\n diagnostics.push(diagnostic('/toolbar', 'action.list', 'toolbar \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n return diagnostics\n}\n\nfunction toRuntimeSchema(candidate: JsonRecord): CrudPageSchema {\n return {\n $schema: candidate.$schema as typeof CRUD_SCHEMA_ID,\n version: candidate.version as typeof CRUD_SCHEMA_VERSION,\n id: candidate.id as string,\n kind: candidate.kind as 'crud',\n title: candidate.title as string,\n dataSource: candidate.dataSource as CrudPageSchema['dataSource'],\n search: candidate.search as FieldSchema[] | undefined,\n searchMode: candidate.searchMode as CrudPageSchema['searchMode'],\n form: candidate.form as FieldSchema[] | undefined,\n table: candidate.table as CrudPageSchema['table'],\n detail: candidate.detail as CrudPageSchema['detail'],\n toolbar: candidate.toolbar as PageActionSchema[] | undefined,\n meta: candidate.meta as CrudPageSchema['meta']\n }\n}\n\n/**\n * Server-safe development entry. It accepts unknown JSON from CLI/MCP before delegating to the\n * runtime validator, so untrusted candidates cannot trigger assumptions in typed runtime code.\n */\nexport function validateUnknownCrudPageSchema(candidate: unknown): SchemaValidationResult {\n const shapeDiagnostics = validateUnknownShape(candidate)\n if (shapeDiagnostics.length || !isRecord(candidate)) {\n return { valid: false, diagnostics: shapeDiagnostics }\n }\n return validateCrudPageSchema(toRuntimeSchema(candidate))\n}\n\n/** Serializable capabilities supplied by the current runtime without application Manifest entries. */\nexport function getBuiltinCapabilities(): string[] {\n return [...builtInCapabilities]\n}\n"],
|
|
5
|
-
"mappings": ";AAEO,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;;;ACkBnC,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,YAAY,SAAS,MAAM,CAAC;AAEnE,SAAS,KAAK,aAAiC,MAAc,MAAc,SAAiB;AAC1F,cAAY,KAAK,EAAE,MAAM,MAAM,QAAQ,CAAC;AAC1C;AAEA,SAAS,kBAAkB,WAAsB,MAAc,aAAiC;AAC9F,OACG,UAAU,aAAa,SAAS,UAAU,aAAa,SACxD,UAAU,
|
|
4
|
+
"sourcesContent": ["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\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 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}\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\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?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\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} 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])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\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 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.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 !Array.isArray(schema.detail.fields)\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4')\n } else {\n schema.detail.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\n )\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 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", "import type {\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n CrudPageSchema,\n FieldSchema,\n PageActionSchema\n} from './schema'\nimport type { SchemaDiagnostic, SchemaValidationResult } from './validate'\nimport { validateCrudPageSchema } from './validate'\n\nconst builtInCapabilities = [\n 'builtin.effect.openCreate',\n 'builtin.effect.openDetail',\n 'builtin.effect.openEdit',\n 'builtin.effect.remove',\n 'builtin.effect.runAction',\n 'builtin.effect.slot',\n 'builtin.format.date',\n 'builtin.format.datetime',\n 'builtin.format.money',\n 'builtin.format.text',\n 'builtin.field.input',\n 'builtin.field.number',\n 'builtin.field.select',\n 'builtin.field.remoteSelect',\n 'builtin.field.date',\n 'builtin.field.dateRange',\n 'builtin.field.textarea',\n 'builtin.field.slot',\n 'builtin.field.repeatable'\n] as const\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction arrayOfRecords(value: unknown): JsonRecord[] | undefined {\n return Array.isArray(value) && value.every(isRecord) ? value : undefined\n}\n\nfunction diagnostic(path: string, code: string, message: string): SchemaDiagnostic {\n return { path, code, message }\n}\n\nfunction validateUnknownShape(candidate: unknown): SchemaDiagnostic[] {\n if (!isRecord(candidate)) return [diagnostic('', 'schema.type', 'Schema \u5FC5\u987B\u662F JSON \u5BF9\u8C61')]\n const diagnostics: SchemaDiagnostic[] = []\n if (!isRecord(candidate.dataSource))\n diagnostics.push(diagnostic('/dataSource', 'dataSource.type', 'dataSource \u5FC5\u987B\u662F\u5BF9\u8C61'))\n if (!isRecord(candidate.table))\n diagnostics.push(diagnostic('/table', 'table.type', 'table \u5FC5\u987B\u662F\u5BF9\u8C61'))\n for (const key of ['search', 'form'] as const) {\n if (candidate[key] !== undefined && !arrayOfRecords(candidate[key])) {\n diagnostics.push(diagnostic(`/${key}`, 'field.list', `${key} \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4`))\n }\n }\n if (isRecord(candidate.table)) {\n if (!arrayOfRecords(candidate.table.columns)) {\n diagnostics.push(diagnostic('/table/columns', 'column.list', 'columns \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n if (candidate.table.actions !== undefined && !arrayOfRecords(candidate.table.actions)) {\n diagnostics.push(diagnostic('/table/actions', 'action.list', 'actions \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n }\n if (candidate.toolbar !== undefined && !arrayOfRecords(candidate.toolbar)) {\n diagnostics.push(diagnostic('/toolbar', 'action.list', 'toolbar \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n return diagnostics\n}\n\nfunction toRuntimeSchema(candidate: JsonRecord): CrudPageSchema {\n return {\n $schema: candidate.$schema as typeof CRUD_SCHEMA_ID,\n version: candidate.version as typeof CRUD_SCHEMA_VERSION,\n id: candidate.id as string,\n kind: candidate.kind as 'crud',\n title: candidate.title as string,\n dataSource: candidate.dataSource as CrudPageSchema['dataSource'],\n search: candidate.search as FieldSchema[] | undefined,\n searchMode: candidate.searchMode as CrudPageSchema['searchMode'],\n form: candidate.form as FieldSchema[] | undefined,\n table: candidate.table as CrudPageSchema['table'],\n detail: candidate.detail as CrudPageSchema['detail'],\n toolbar: candidate.toolbar as PageActionSchema[] | undefined,\n meta: candidate.meta as CrudPageSchema['meta']\n }\n}\n\n/**\n * Server-safe development entry. It accepts unknown JSON from CLI/MCP before delegating to the\n * runtime validator, so untrusted candidates cannot trigger assumptions in typed runtime code.\n */\nexport function validateUnknownCrudPageSchema(candidate: unknown): SchemaValidationResult {\n const shapeDiagnostics = validateUnknownShape(candidate)\n if (shapeDiagnostics.length || !isRecord(candidate)) {\n return { valid: false, diagnostics: shapeDiagnostics }\n }\n return validateCrudPageSchema(toRuntimeSchema(candidate))\n}\n\n/** Serializable capabilities supplied by the current runtime without application Manifest entries. */\nexport function getBuiltinCapabilities(): string[] {\n return [...builtInCapabilities]\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -140,11 +140,20 @@ import { Descriptions } from "antd";
|
|
|
140
140
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
141
141
|
function BestDetail({ fields, record = {}, column = 2 }) {
|
|
142
142
|
return /* @__PURE__ */ jsx3(Descriptions, { bordered: true, column, size: "small", children: fields.map((field) => {
|
|
143
|
-
const value = record
|
|
143
|
+
const value = getPathValue(record, field.field);
|
|
144
144
|
const display = field.render ? field.render(value, record) : field.valueEnum?.[String(value)] ?? (value == null || value === "" ? "-" : String(value));
|
|
145
145
|
return /* @__PURE__ */ jsx3(Descriptions.Item, { label: field.label, span: field.span, children: display }, field.field);
|
|
146
146
|
}) });
|
|
147
147
|
}
|
|
148
|
+
function getPathValue(values, path) {
|
|
149
|
+
if (Object.hasOwn(values, path)) return values[path];
|
|
150
|
+
return path.split(".").reduce((current, part) => {
|
|
151
|
+
if (current && typeof current === "object") {
|
|
152
|
+
return current[part];
|
|
153
|
+
}
|
|
154
|
+
return void 0;
|
|
155
|
+
}, values);
|
|
156
|
+
}
|
|
148
157
|
|
|
149
158
|
// src/ui/BestFilePreview.tsx
|
|
150
159
|
import { Button, Image, List, Typography } from "antd";
|
|
@@ -197,10 +206,10 @@ function appendNamePath(path, ...segments) {
|
|
|
197
206
|
}
|
|
198
207
|
function getConditionFieldValue(values, field) {
|
|
199
208
|
if (Object.hasOwn(values, field)) return values[field];
|
|
200
|
-
return
|
|
209
|
+
return getPathValue2(values, field.split("."));
|
|
201
210
|
}
|
|
202
211
|
function getScopedValues(values, itemPath) {
|
|
203
|
-
const itemValues =
|
|
212
|
+
const itemValues = getPathValue2(values, itemPath);
|
|
204
213
|
return isRecord(itemValues) ? { ...values, ...itemValues } : values;
|
|
205
214
|
}
|
|
206
215
|
function isFieldVisible(field, values, mode) {
|
|
@@ -284,7 +293,7 @@ function FormControl({
|
|
|
284
293
|
RemoteSelect,
|
|
285
294
|
{
|
|
286
295
|
field,
|
|
287
|
-
value: value !== void 0 ? value :
|
|
296
|
+
value: value !== void 0 ? value : getPathValue2(values, namePath ?? field.field),
|
|
288
297
|
disabled: field.disabled,
|
|
289
298
|
placeholder: field.placeholder,
|
|
290
299
|
onChange: (nextValue) => {
|
|
@@ -300,7 +309,12 @@ function FormControl({
|
|
|
300
309
|
{
|
|
301
310
|
...controlProps,
|
|
302
311
|
value,
|
|
303
|
-
onChange
|
|
312
|
+
onChange: (nextValue) => {
|
|
313
|
+
onChange?.(nextValue);
|
|
314
|
+
const fieldPath = namePath ?? field.field;
|
|
315
|
+
form.setFieldValue(fieldPath, nextValue);
|
|
316
|
+
void form.validateFields([fieldPath]).catch(() => void 0);
|
|
317
|
+
},
|
|
304
318
|
disabled: field.disabled,
|
|
305
319
|
placeholder: field.placeholder,
|
|
306
320
|
style: { width: "100%" }
|
|
@@ -314,6 +328,7 @@ function FormControl({
|
|
|
314
328
|
value: toDatePickerValue(value),
|
|
315
329
|
onChange: (date, dateString) => onChange?.(serializeDatePickerValue(date, dateString)),
|
|
316
330
|
disabled: field.disabled,
|
|
331
|
+
disabledDate: (current) => field.maxDate === "today" && current.isAfter(dayjs2(), "day"),
|
|
317
332
|
style: { width: "100%" }
|
|
318
333
|
}
|
|
319
334
|
);
|
|
@@ -325,6 +340,7 @@ function FormControl({
|
|
|
325
340
|
value: toDateRangePickerValue(value),
|
|
326
341
|
onChange: (dates, dateStrings) => onChange?.(serializeDateRangePickerValue(dates, dateStrings)),
|
|
327
342
|
disabled: field.disabled,
|
|
343
|
+
disabledDate: (current) => field.maxDate === "today" && current.isAfter(dayjs2(), "day"),
|
|
328
344
|
style: { width: "100%" }
|
|
329
345
|
}
|
|
330
346
|
);
|
|
@@ -343,7 +359,7 @@ function FormControl({
|
|
|
343
359
|
return /* @__PURE__ */ jsx5(Fragment, { children: field.render?.({
|
|
344
360
|
field: field.field,
|
|
345
361
|
values: renderValues,
|
|
346
|
-
value: value !== void 0 ? value :
|
|
362
|
+
value: value !== void 0 ? value : getPathValue2(values, namePath ?? field.field),
|
|
347
363
|
mode,
|
|
348
364
|
disabled: field.disabled,
|
|
349
365
|
setValue: (name, nextValue) => form.setFieldValue(
|
|
@@ -422,13 +438,13 @@ function RepeatableFieldRow({
|
|
|
422
438
|
values
|
|
423
439
|
}) {
|
|
424
440
|
const itemPath = appendNamePath(listName, itemName);
|
|
425
|
-
const itemValues =
|
|
441
|
+
const itemValues = getPathValue2(values, itemPath);
|
|
426
442
|
const scopeValues = getScopedValues(values, itemPath);
|
|
427
443
|
useEffect(() => {
|
|
428
444
|
field.itemFields?.forEach((itemField) => {
|
|
429
445
|
if (!itemField.clearWhenHidden) return;
|
|
430
446
|
const nextPath = appendNamePath(itemPath, itemField.field);
|
|
431
|
-
if (!isFieldVisible(itemField, scopeValues, mode) &&
|
|
447
|
+
if (!isFieldVisible(itemField, scopeValues, mode) && getPathValue2(values, nextPath) !== void 0) {
|
|
432
448
|
form.setFieldValue(nextPath, void 0);
|
|
433
449
|
}
|
|
434
450
|
});
|
|
@@ -733,7 +749,7 @@ function mergeDefinedValues(baseValues, nextValues) {
|
|
|
733
749
|
});
|
|
734
750
|
return mergedValues;
|
|
735
751
|
}
|
|
736
|
-
function
|
|
752
|
+
function getPathValue2(values, path) {
|
|
737
753
|
const parts = Array.isArray(path) ? path : [path];
|
|
738
754
|
return parts.reduce((current, part) => {
|
|
739
755
|
if (current && typeof current === "object") return current[part];
|
|
@@ -1180,16 +1196,47 @@ function push(diagnostics, path, code, message2) {
|
|
|
1180
1196
|
diagnostics.push({ path, code, message: message2 });
|
|
1181
1197
|
}
|
|
1182
1198
|
function validateCondition(condition, path, diagnostics) {
|
|
1183
|
-
if (
|
|
1184
|
-
push(diagnostics, path, "condition.
|
|
1199
|
+
if (!condition || typeof condition !== "object") {
|
|
1200
|
+
push(diagnostics, path, "condition.type", "\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61");
|
|
1201
|
+
return;
|
|
1202
|
+
}
|
|
1203
|
+
if (condition.operator === "equals") {
|
|
1204
|
+
if (typeof condition.field !== "string" || condition.field === "") {
|
|
1205
|
+
push(diagnostics, path, "condition.field", "equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
|
|
1206
|
+
}
|
|
1207
|
+
return;
|
|
1208
|
+
}
|
|
1209
|
+
if (condition.operator === "notEmpty") {
|
|
1210
|
+
if (typeof condition.field !== "string" || condition.field === "") {
|
|
1211
|
+
push(diagnostics, path, "condition.field", "notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
|
|
1212
|
+
}
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
if (condition.operator === "modeEquals") {
|
|
1216
|
+
return;
|
|
1217
|
+
}
|
|
1218
|
+
if ((condition.operator === "and" || condition.operator === "or") && !Array.isArray(condition.conditions)) {
|
|
1219
|
+
push(diagnostics, path, "condition.conditions", "\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4");
|
|
1220
|
+
return;
|
|
1185
1221
|
}
|
|
1186
1222
|
if (condition.operator === "and" || condition.operator === "or") {
|
|
1223
|
+
if (condition.conditions.length === 0) {
|
|
1224
|
+
push(diagnostics, path, "condition.empty", "\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6");
|
|
1225
|
+
}
|
|
1187
1226
|
condition.conditions.forEach((item, index) => {
|
|
1188
1227
|
validateCondition(item, `${path}/conditions/${index}`, diagnostics);
|
|
1189
1228
|
});
|
|
1229
|
+
return;
|
|
1190
1230
|
}
|
|
1191
|
-
if (condition.operator === "not")
|
|
1231
|
+
if (condition.operator === "not") {
|
|
1232
|
+
if (!condition.condition) {
|
|
1233
|
+
push(diagnostics, path, "condition.missing", "not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition");
|
|
1234
|
+
return;
|
|
1235
|
+
}
|
|
1192
1236
|
validateCondition(condition.condition, `${path}/condition`, diagnostics);
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1239
|
+
push(diagnostics, path, "condition.operator", `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${condition.operator}`);
|
|
1193
1240
|
}
|
|
1194
1241
|
function validateFields(fields, path, registry, diagnostics) {
|
|
1195
1242
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -1335,15 +1382,21 @@ function validateCrudPageSchema(schema, registry) {
|
|
|
1335
1382
|
);
|
|
1336
1383
|
}
|
|
1337
1384
|
});
|
|
1338
|
-
schema.detail
|
|
1339
|
-
if (
|
|
1340
|
-
push(
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1385
|
+
if (schema.detail !== void 0) {
|
|
1386
|
+
if (!schema.detail || typeof schema.detail !== "object" || !Array.isArray(schema.detail.fields)) {
|
|
1387
|
+
push(diagnostics, "/detail", "detail.type", "detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4");
|
|
1388
|
+
} else {
|
|
1389
|
+
schema.detail.fields.forEach((field, index) => {
|
|
1390
|
+
if (field.slot && registry && !registry.slots[field.slot])
|
|
1391
|
+
push(
|
|
1392
|
+
diagnostics,
|
|
1393
|
+
`/detail/fields/${index}/slot`,
|
|
1394
|
+
"registry.slot",
|
|
1395
|
+
`\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`
|
|
1396
|
+
);
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1347
1400
|
validateActions(
|
|
1348
1401
|
schema.table?.actions,
|
|
1349
1402
|
"/table/actions",
|
|
@@ -1371,6 +1424,40 @@ ${message2}`);
|
|
|
1371
1424
|
|
|
1372
1425
|
// src/lowcode/BestCrudPage.tsx
|
|
1373
1426
|
import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1427
|
+
function pickRowKeyValues(record, rowKey) {
|
|
1428
|
+
if (!record) return {};
|
|
1429
|
+
const keys = Array.isArray(rowKey) ? rowKey : [rowKey];
|
|
1430
|
+
return Object.fromEntries(
|
|
1431
|
+
keys.flatMap((key) => {
|
|
1432
|
+
const value = record[key];
|
|
1433
|
+
return value === void 0 ? [] : [[key, value]];
|
|
1434
|
+
})
|
|
1435
|
+
);
|
|
1436
|
+
}
|
|
1437
|
+
function projectSubmittedValues(values, fields) {
|
|
1438
|
+
const projected = {};
|
|
1439
|
+
fields.forEach((field) => {
|
|
1440
|
+
if (!Object.hasOwn(values, field.field)) return;
|
|
1441
|
+
const value = values[field.field];
|
|
1442
|
+
if (field.component === "repeatable" && Array.isArray(value) && field.itemFields?.length) {
|
|
1443
|
+
projected[field.field] = value.map(
|
|
1444
|
+
(item) => isRecord2(item) ? projectSubmittedValues(item, field.itemFields ?? []) : item
|
|
1445
|
+
);
|
|
1446
|
+
return;
|
|
1447
|
+
}
|
|
1448
|
+
projected[field.field] = value;
|
|
1449
|
+
});
|
|
1450
|
+
return projected;
|
|
1451
|
+
}
|
|
1452
|
+
function buildCrudSubmitValues(values, record, rowKey) {
|
|
1453
|
+
return { ...values, ...pickRowKeyValues(record, rowKey) };
|
|
1454
|
+
}
|
|
1455
|
+
function isRecord2(value) {
|
|
1456
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
1457
|
+
}
|
|
1458
|
+
function mergeRecordForEdit(record, detail, rowKey) {
|
|
1459
|
+
return record ? { ...record, ...detail, ...pickRowKeyValues(record, rowKey) } : detail;
|
|
1460
|
+
}
|
|
1374
1461
|
function toFieldDefinition(field, dictionaries, slots) {
|
|
1375
1462
|
const slot = field.slot;
|
|
1376
1463
|
const options = field.dict ? dictionaries[field.dict] ?? [] : [];
|
|
@@ -1539,7 +1626,8 @@ function BestCrudPage({ adapter, className, schema }) {
|
|
|
1539
1626
|
try {
|
|
1540
1627
|
const detail = await detailService(record ?? {});
|
|
1541
1628
|
if (detail && typeof detail === "object" && !Array.isArray(detail)) {
|
|
1542
|
-
|
|
1629
|
+
const normalizedDetail = adapter?.fromDetail ? adapter.fromDetail(detail) : detail;
|
|
1630
|
+
editRecord = mergeRecordForEdit(record, normalizedDetail, schema.table.rowKey);
|
|
1543
1631
|
}
|
|
1544
1632
|
} catch (error) {
|
|
1545
1633
|
message.error(errorMessage(error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`));
|
|
@@ -1625,6 +1713,7 @@ function BestCrudPage({ adapter, className, schema }) {
|
|
|
1625
1713
|
),
|
|
1626
1714
|
[listService, schema.title]
|
|
1627
1715
|
);
|
|
1716
|
+
const rowKey = schema.table.rowKey;
|
|
1628
1717
|
const request = useCallback(
|
|
1629
1718
|
(params, sort) => pageRequest.request(
|
|
1630
1719
|
toBestListQuery({ ...params, ...useBestSearch ? queryRef.current : {} }, sort)
|
|
@@ -1648,7 +1737,6 @@ function BestCrudPage({ adapter, className, schema }) {
|
|
|
1648
1737
|
};
|
|
1649
1738
|
}, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature]);
|
|
1650
1739
|
useEffect3(() => () => pageRequest.abort(), [pageRequest]);
|
|
1651
|
-
const rowKey = schema.table.rowKey;
|
|
1652
1740
|
const submitForm = useCallback(
|
|
1653
1741
|
async (values) => {
|
|
1654
1742
|
if (submittingRef.current) return;
|
|
@@ -1663,11 +1751,11 @@ function BestCrudPage({ adapter, className, schema }) {
|
|
|
1663
1751
|
return;
|
|
1664
1752
|
}
|
|
1665
1753
|
const record = drawer.mode === "closed" ? void 0 : drawer.record;
|
|
1754
|
+
const payloadValues = drawer.mode === "edit" ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey) : projectSubmittedValues(values, formFields);
|
|
1666
1755
|
submittingRef.current = true;
|
|
1667
1756
|
setSubmitting(true);
|
|
1668
1757
|
try {
|
|
1669
|
-
const
|
|
1670
|
-
const payload = drawer.mode === "edit" ? adapter?.toUpdatePayload?.(mergedValues, record) ?? mergedValues : adapter?.toCreatePayload?.(mergedValues) ?? mergedValues;
|
|
1758
|
+
const payload = drawer.mode === "edit" ? adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues : adapter?.toCreatePayload?.(payloadValues) ?? payloadValues;
|
|
1671
1759
|
await service(payload);
|
|
1672
1760
|
message.success("\u4FDD\u5B58\u6210\u529F");
|
|
1673
1761
|
setDrawer({ mode: "closed" });
|
|
@@ -1679,7 +1767,15 @@ function BestCrudPage({ adapter, className, schema }) {
|
|
|
1679
1767
|
submittingRef.current = false;
|
|
1680
1768
|
}
|
|
1681
1769
|
},
|
|
1682
|
-
[
|
|
1770
|
+
[
|
|
1771
|
+
adapter,
|
|
1772
|
+
drawer,
|
|
1773
|
+
formFields,
|
|
1774
|
+
registry.services,
|
|
1775
|
+
rowKey,
|
|
1776
|
+
schema.dataSource.create,
|
|
1777
|
+
schema.dataSource.update
|
|
1778
|
+
]
|
|
1683
1779
|
);
|
|
1684
1780
|
return /* @__PURE__ */ jsxs4(Fragment2, { children: [
|
|
1685
1781
|
useBestSearch && searchFields.length ? /* @__PURE__ */ jsx11(
|
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/ui/BestTable.module.less", "../src/lowcode/runtime.ts", "../src/lowcode/schema.ts", "../src/lowcode/validate.ts"],
|
|
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 BestDrawer,\n type BestFieldDefinition,\n BestForm,\n BestSearch,\n BestTable,\n type BestTableColumn\n} from '../ui'\nimport { 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 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 }\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): 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 valueEnum,\n render: slot\n ? (value, record) => slots[slot]?.({ field: field.field, record, value }) ?? '-'\n : undefined\n }\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 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 [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 !== 'remove' && !(await confirmBeforeAction(action.confirm, confirmAction)))\n return\n if (action.effect === 'openDetail') setDrawer({ mode: 'detail', record })\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 editRecord = adapter?.fromDetail\n ? adapter.fromDetail(detail as RecordValue)\n : (detail as RecordValue)\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 configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\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 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 const rowKey = schema.table.rowKey\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 submittingRef.current = true\n setSubmitting(true)\n try {\n const mergedValues = { ...record, ...values }\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(mergedValues, record) ?? mergedValues)\n : (adapter?.toCreatePayload?.(mergedValues) ?? mergedValues)\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 [adapter, drawer, registry.services, schema.dataSource.create, schema.dataSource.update]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={() => {\n queryRef.current = {}\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery({})\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 <BestDrawer\n open={drawer.mode !== 'closed'}\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 onClose={() => setDrawer({ mode: 'closed' })}\n >\n {drawer.mode === 'detail' ? (\n <BestDetail\n fields={\n schema.detail?.fields.map((field) =>\n toDetailField(field, registry.dictionaries, registry.slots)\n ) ?? []\n }\n record={drawer.record}\n />\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 </BestDrawer>\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='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, useContext, useMemo } 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 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\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: Record<string, BestSlot>\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\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)\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return {\n listServices: registry.listServices ?? {},\n services: registry.services ?? {},\n dictionaries: registry.dictionaries ?? {},\n actions: registry.actions ?? {},\n slots: registry.slots ?? {},\n access: registry.access ?? emptyRegistry.access\n }\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const value = useMemo(() => createBestRegistry(registry), [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}>{children}</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 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 } from 'antd'\nimport type { BestDetailField } from './types'\n\nexport type BestDetailProps = {\n fields: BestDetailField[]\n record?: Record<string, unknown>\n column?: number\n}\n\nexport function BestDetail({ fields, record = {}, column = 2 }: BestDetailProps) {\n return (\n <Descriptions bordered column={column} size='small'>\n {fields.map((field) => {\n const value = record[field.field]\n const display = field.render\n ? field.render(value, record)\n : (field.valueEnum?.[String(value)] ??\n (value == null || value === '' ? '-' : String(value)))\n return (\n <Descriptions.Item key={field.field} label={field.label} span={field.span}>\n {display}\n </Descriptions.Item>\n )\n })}\n </Descriptions>\n )\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 { 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 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 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) {\n return rules?.map((rule) => ({\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))) throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\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}\n\nexport function BestDrawer({ children, open, title, onClose }: OverlayProps) {\n return (\n <Drawer destroyOnHidden open={open} title={title} width={640} onClose={onClose}>\n {children}\n </Drawer>\n )\n}\n\nexport function BestModal({ children, open, title, onClose }: OverlayProps) {\n return (\n <Modal destroyOnHidden footer={null} open={open} title={title} onCancel={onClose}>\n {children}\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'\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?: () => 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 style={{ marginBottom: 16 }}\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, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n onChange?.({})\n onReset?.()\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 styles from './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={[styles.root, 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", ".root {\n :global(.ant-pro-card-body) {\n padding: 12px;\n }\n\n :global(.ant-pro-query-filter-actions .ant-form-item-label) {\n display: none;\n }\n\n :global(.ant-pro-query-filter-actions) {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n }\n}\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\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 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}\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\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?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\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} 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])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\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 (\n (condition.operator === 'and' || condition.operator === 'or') &&\n condition.conditions.length === 0\n ) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n }\n if (condition.operator === 'not')\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\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.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 schema.detail?.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\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 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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Button", "Modal", "dayjs", "useEffect", "useMemo", "useRef", "useState", "useMemo", "jsx", "jsx", "jsx", "Button", "Input", "dayjs", "useMemo", "useState", "jsx", "jsxs", "dayjs", "Input", "Button", "useState", "useMemo", "jsx", "jsx", "Button", "DatePicker", "Form", "Input", "InputNumber", "Select", "dayjs", "useEffect", "useMemo", "useRef", "jsx", "jsxs", "Select", "InputNumber", "DatePicker", "dayjs", "Input", "useMemo", "Form", "useRef", "useEffect", "Button", "jsx", "jsx", "dayjs", "message", "Fragment", "jsx", "jsxs", "dayjs", "Modal", "query", "useRef", "useMemo", "useState", "useEffect", "Button"]
|
|
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 BestDrawer,\n type BestFieldDefinition,\n BestForm,\n BestSearch,\n BestTable,\n type BestTableColumn\n} from '../ui'\nimport { 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 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 }\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): 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 valueEnum,\n render: slot\n ? (value, record) => slots[slot]?.({ field: field.field, record, value }) ?? '-'\n : undefined\n }\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 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 [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 !== 'remove' && !(await confirmBeforeAction(action.confirm, confirmAction)))\n return\n if (action.effect === 'openDetail') setDrawer({ mode: 'detail', record })\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 configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\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={() => {\n queryRef.current = {}\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery({})\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 <BestDrawer\n open={drawer.mode !== 'closed'}\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 onClose={() => setDrawer({ mode: 'closed' })}\n >\n {drawer.mode === 'detail' ? (\n <BestDetail\n fields={\n schema.detail?.fields.map((field) =>\n toDetailField(field, registry.dictionaries, registry.slots)\n ) ?? []\n }\n record={drawer.record}\n />\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 </BestDrawer>\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='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, useContext, useMemo } 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 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\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: Record<string, BestSlot>\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\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)\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return {\n listServices: registry.listServices ?? {},\n services: registry.services ?? {},\n dictionaries: registry.dictionaries ?? {},\n actions: registry.actions ?? {},\n slots: registry.slots ?? {},\n access: registry.access ?? emptyRegistry.access\n }\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const value = useMemo(() => createBestRegistry(registry), [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}>{children}</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 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 } from 'antd'\nimport type { BestDetailField } from './types'\n\nexport type BestDetailProps = {\n fields: BestDetailField[]\n record?: Record<string, unknown>\n column?: number\n}\n\nexport function BestDetail({ fields, record = {}, column = 2 }: BestDetailProps) {\n return (\n <Descriptions bordered column={column} size='small'>\n {fields.map((field) => {\n const value = getPathValue(record, field.field)\n const display = field.render\n ? field.render(value, record)\n : (field.valueEnum?.[String(value)] ??\n (value == null || value === '' ? '-' : String(value)))\n return (\n <Descriptions.Item key={field.field} label={field.label} span={field.span}>\n {display}\n </Descriptions.Item>\n )\n })}\n </Descriptions>\n )\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 { 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={(nextValue) => {\n onChange?.(nextValue)\n const fieldPath = namePath ?? field.field\n form.setFieldValue(fieldPath, nextValue)\n void form.validateFields([fieldPath]).catch(() => undefined)\n }}\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) {\n return rules?.map((rule) => ({\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))) throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\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}\n\nexport function BestDrawer({ children, open, title, onClose }: OverlayProps) {\n return (\n <Drawer destroyOnHidden open={open} title={title} width={640} onClose={onClose}>\n {children}\n </Drawer>\n )\n}\n\nexport function BestModal({ children, open, title, onClose }: OverlayProps) {\n return (\n <Modal destroyOnHidden footer={null} open={open} title={title} onCancel={onClose}>\n {children}\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'\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?: () => 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 style={{ marginBottom: 16 }}\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, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n onChange?.({})\n onReset?.()\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 styles from './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={[styles.root, 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", ".root {\n :global(.ant-pro-card-body) {\n padding: 12px;\n }\n\n :global(.ant-pro-query-filter-actions .ant-form-item-label) {\n display: none;\n }\n\n :global(.ant-pro-query-filter-actions) {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n }\n}\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\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 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}\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\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?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\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} 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])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\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 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.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 !Array.isArray(schema.detail.fields)\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4')\n } else {\n schema.detail.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\n )\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 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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Button", "Modal", "dayjs", "useEffect", "useMemo", "useRef", "useState", "useMemo", "jsx", "jsx", "jsx", "Button", "Input", "dayjs", "useMemo", "useState", "jsx", "jsxs", "dayjs", "getPathValue", "Input", "Button", "useState", "useMemo", "jsx", "jsx", "Button", "DatePicker", "Form", "Input", "InputNumber", "Select", "dayjs", "useEffect", "useMemo", "useRef", "jsx", "jsxs", "Select", "InputNumber", "DatePicker", "dayjs", "Input", "useMemo", "Form", "useRef", "useEffect", "Button", "jsx", "jsx", "dayjs", "message", "Fragment", "jsx", "jsxs", "isRecord", "dayjs", "Modal", "query", "useRef", "useMemo", "useState", "useEffect", "Button"]
|
|
7
7
|
}
|
|
@@ -11,6 +11,9 @@ export type CrudDataAdapter = {
|
|
|
11
11
|
toCreatePayload?: (values: RecordValue) => RecordValue;
|
|
12
12
|
toUpdatePayload?: (values: RecordValue, record?: RecordValue) => RecordValue;
|
|
13
13
|
};
|
|
14
|
+
export declare function buildCrudSubmitValues(values: RecordValue, record: RecordValue | undefined, rowKey: string | string[]): {
|
|
15
|
+
[x: string]: unknown;
|
|
16
|
+
};
|
|
14
17
|
export declare function BestCrudPage({ adapter, className, schema }: BestCrudPageProps): import("react/jsx-runtime").JSX.Element;
|
|
15
18
|
export {};
|
|
16
19
|
//# sourceMappingURL=BestCrudPage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BestCrudPage.d.ts","sourceRoot":"","sources":["../../src/lowcode/BestCrudPage.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,cAAc,EAMf,MAAM,UAAU,CAAA;AAGjB,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,CAAA;IACpD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACtD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAA;CAC7E,CAAA;
|
|
1
|
+
{"version":3,"file":"BestCrudPage.d.ts","sourceRoot":"","sources":["../../src/lowcode/BestCrudPage.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,cAAc,EAMf,MAAM,UAAU,CAAA;AAGjB,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,CAAA;IACpD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACtD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAA;CAC7E,CAAA;AA+BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;;EAG1B;AAkKD,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAuV7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lowcode/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAIL,KAAK,cAAc,EAGpB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,gBAAgB,EAAE,CAAA;CAChC,CAAA;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lowcode/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAIL,KAAK,cAAc,EAGpB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,gBAAgB,EAAE,CAAA;CAChC,CAAA;AA0JD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,YAAY,GACtB,sBAAsB,CAmHxB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,YAAY,QAMxF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BestForm.d.ts","sourceRoot":"","sources":["../../src/ui/BestForm.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAc,MAAM,SAAS,CAAA;AAE7E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAClD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAiFD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAI1F;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,sBAE3E;AAED,wBAAgB,6BAA6B,CAC3C,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,gCAG9B;
|
|
1
|
+
{"version":3,"file":"BestForm.d.ts","sourceRoot":"","sources":["../../src/ui/BestForm.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAc,MAAM,SAAS,CAAA;AAE7E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAClD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAiFD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAI1F;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,sBAE3E;AAED,wBAAgB,6BAA6B,CAC3C,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,gCAG9B;AAwUD,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS;;;;;;;oBAUzC,OAAO,SAAS,OAAO;gBAM1C;AAWD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACT,EAAE;IACD,KAAK,EAAE,mBAAmB,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CAC7C,2CA+HA;AAED,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,aAAa,EACb,OAAO,EACP,UAAiB,EACjB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACT,EAAE,aAAa,2CAuBf;AA2BD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMvF;AAoBD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;EAahD;AAaD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,EAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,QAAQ,GACb,OAAO,CAmBT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "best-lowcode-runtime",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "BEST React low-code runtime, CRUD page renderer, and UI components.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"best",
|
|
@@ -39,12 +39,6 @@
|
|
|
39
39
|
},
|
|
40
40
|
"./style.css": "./dist/index.css"
|
|
41
41
|
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
|
|
44
|
-
"check": "tsc -p tsconfig.json --noEmit",
|
|
45
|
-
"prepack": "pnpm run build",
|
|
46
|
-
"test": "vitest run"
|
|
47
|
-
},
|
|
48
42
|
"peerDependencies": {
|
|
49
43
|
"@ant-design/pro-components": "^3.1.5-0",
|
|
50
44
|
"antd": "^6.2.1",
|
|
@@ -61,5 +55,10 @@
|
|
|
61
55
|
"publishConfig": {
|
|
62
56
|
"access": "public",
|
|
63
57
|
"registry": "https://registry.npmjs.org/"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
|
|
61
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
62
|
+
"test": "vitest run"
|
|
64
63
|
}
|
|
65
|
-
}
|
|
64
|
+
}
|