best-lowcode-runtime 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,6 +44,29 @@ export function CustomerPage() {
44
44
  }
45
45
  ```
46
46
 
47
+ ## 异步字典更新
48
+
49
+ 字典可以在页面初始化后通过 `useBestDictionaryActions` 局部更新,不需要替换完整 Registry:
50
+
51
+ ```tsx
52
+ import { useEffect } from 'react'
53
+ import { useBestDictionaryActions } from 'best-lowcode-runtime'
54
+
55
+ function LoadDictionaries() {
56
+ const { setDictionary } = useBestDictionaryActions()
57
+
58
+ useEffect(() => {
59
+ void fetch('/api/status-options')
60
+ .then((response) => response.json())
61
+ .then((items) => setDictionary('customer.status', items))
62
+ }, [setDictionary])
63
+
64
+ return null
65
+ }
66
+ ```
67
+
68
+ `setDictionary` 只更新指定字典,并触发使用该字典的字段、表格和详情重新渲染。
69
+
47
70
  ## 开发期校验入口
48
71
 
49
72
  ### 通用表单和数据能力
package/dist/index.js CHANGED
@@ -35,11 +35,11 @@ function createBestCrudAdapter(options = {}) {
35
35
  // src/lowcode/BestCrudPage.tsx
36
36
  import { Button as Button4, Modal as Modal2, message } from "antd";
37
37
  import dayjs5 from "dayjs";
38
- import { useCallback, useEffect as useEffect3, useLayoutEffect, useMemo as useMemo5, useRef as useRef3, useState as useState3 } from "react";
38
+ import { useCallback as useCallback2, useEffect as useEffect3, useLayoutEffect, useMemo as useMemo5, useRef as useRef3, useState as useState4 } from "react";
39
39
 
40
40
  // src/runtime/BestProvider.tsx
41
41
  import { ConfigProvider } from "antd";
42
- import { createContext, useContext, useMemo } from "react";
42
+ import { createContext, useCallback, useContext, useMemo, useState } from "react";
43
43
  import { jsx } from "react/jsx-runtime";
44
44
  var emptyRegistry = {
45
45
  listServices: {},
@@ -57,6 +57,7 @@ var defaultTheme = {
57
57
  }
58
58
  };
59
59
  var BestRuntimeContext = createContext(emptyRegistry);
60
+ var BestDictionaryActionsContext = createContext(null);
60
61
  function composeBestRegistry(...layers) {
61
62
  const result = {
62
63
  listServices: {},
@@ -87,12 +88,20 @@ function createBestRegistry(registry = {}) {
87
88
  return composeBestRegistry(registry);
88
89
  }
89
90
  function BestProvider({ children, registry, theme }) {
90
- const value = useMemo(() => createBestRegistry(registry), [registry]);
91
+ const [dictionaryUpdates, setDictionaryUpdates] = useState({});
92
+ const setDictionary = useCallback((key, items) => {
93
+ setDictionaryUpdates((current) => ({ ...current, [key]: items }));
94
+ }, []);
95
+ const value = useMemo(() => {
96
+ const next = createBestRegistry(registry);
97
+ Object.assign(next.dictionaries, dictionaryUpdates);
98
+ return next;
99
+ }, [dictionaryUpdates, registry]);
91
100
  const mergedTheme = useMemo(
92
101
  () => ({ ...defaultTheme, ...theme, token: { ...defaultTheme.token, ...theme?.token } }),
93
102
  [theme]
94
103
  );
95
- return /* @__PURE__ */ jsx(BestRuntimeContext.Provider, { value, children: /* @__PURE__ */ jsx(ConfigProvider, { theme: mergedTheme, children }) });
104
+ return /* @__PURE__ */ jsx(BestRuntimeContext.Provider, { value, children: /* @__PURE__ */ jsx(ConfigProvider, { theme: mergedTheme, children: /* @__PURE__ */ jsx(BestDictionaryActionsContext.Provider, { value: { setDictionary }, children }) }) });
96
105
  }
97
106
  function useBestRegistry() {
98
107
  return useContext(BestRuntimeContext);
@@ -113,6 +122,11 @@ function useBestDictionary(key) {
113
122
  const dictionaries = useBestRegistry().dictionaries;
114
123
  return key ? dictionaries[key] ?? [] : [];
115
124
  }
125
+ function useBestDictionaryActions() {
126
+ const actions = useContext(BestDictionaryActionsContext);
127
+ if (!actions) throw new Error("useBestDictionaryActions \u5FC5\u987B\u5728 BestProvider \u5185\u4F7F\u7528");
128
+ return actions;
129
+ }
116
130
  function useBestAction(key) {
117
131
  const action = useBestRegistry().actions[key];
118
132
  if (!action) throw new Error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${key}`);
@@ -121,7 +135,7 @@ function useBestAction(key) {
121
135
 
122
136
  // src/ui/BestBatchInput.tsx
123
137
  import { Input } from "antd";
124
- import { useImperativeHandle, useMemo as useMemo2, useState } from "react";
138
+ import { useImperativeHandle, useMemo as useMemo2, useState as useState2 } from "react";
125
139
  import { jsx as jsx2 } from "react/jsx-runtime";
126
140
  function parse(value, separator) {
127
141
  const escaped = separator.replace(/[\\\]\-^]/g, "\\$&");
@@ -136,7 +150,7 @@ function BestBatchInput({
136
150
  onChange,
137
151
  ...props
138
152
  }) {
139
- const [innerValue, setInnerValue] = useState(String(defaultValue ?? ""));
153
+ const [innerValue, setInnerValue] = useState2(String(defaultValue ?? ""));
140
154
  const currentValue = value == null ? innerValue : String(value);
141
155
  const parsed = useMemo2(() => parse(currentValue, separator), [currentValue, separator]);
142
156
  useImperativeHandle(ref, () => ({ getParsedValue: () => parsed }), [parsed]);
@@ -204,7 +218,7 @@ function BestFilePreview({ files, onDownload }) {
204
218
  // src/ui/BestForm.tsx
205
219
  import { Button as Button2, DatePicker, Form, Input as Input2, InputNumber, Select, Space } from "antd";
206
220
  import dayjs2 from "dayjs";
207
- import { useEffect, useMemo as useMemo3, useRef, useState as useState2 } from "react";
221
+ import { useEffect, useMemo as useMemo3, useRef, useState as useState3 } from "react";
208
222
  import { Fragment, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
209
223
  function toNamePath(path) {
210
224
  return path === void 0 ? [] : Array.isArray(path) ? path : [path];
@@ -571,10 +585,10 @@ function RemoteSelect({
571
585
  onChange,
572
586
  registry
573
587
  }) {
574
- const [keywordOptions, setKeywordOptions] = useState2([]);
575
- const [selectedOptions, setSelectedOptions] = useState2([]);
576
- const [loading, setLoading] = useState2(false);
577
- const [keyword, setKeyword] = useState2("");
588
+ const [keywordOptions, setKeywordOptions] = useState3([]);
589
+ const [selectedOptions, setSelectedOptions] = useState3([]);
590
+ const [loading, setLoading] = useState3(false);
591
+ const [keyword, setKeyword] = useState3("");
578
592
  const keywordRequestId = useRef(0);
579
593
  const selectedRequestId = useRef(0);
580
594
  const service = field.remoteService ? registry.services[field.remoteService] : void 0;
@@ -1637,7 +1651,7 @@ function BestCrudPage({ adapter, className, schema }) {
1637
1651
  assertValidCrudPageSchema(schema, registry);
1638
1652
  const registeredListService = useBestListService(schema.dataSource.list);
1639
1653
  if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`);
1640
- const listService = useCallback(
1654
+ const listService = useCallback2(
1641
1655
  async (query2, options) => {
1642
1656
  const response = await registeredListService(query2, options);
1643
1657
  return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response;
@@ -1663,17 +1677,17 @@ function BestCrudPage({ adapter, className, schema }) {
1663
1677
  ),
1664
1678
  [searchFields]
1665
1679
  );
1666
- const [query, setQuery] = useState3(searchDefaultValues);
1680
+ const [query, setQuery] = useState4(searchDefaultValues);
1667
1681
  const queryRef = useRef3(searchDefaultValues);
1668
1682
  const queryStateRef = useRef3({
1669
1683
  schemaId: schema.id,
1670
1684
  searchSchemaSignature,
1671
1685
  userTouched: false
1672
1686
  });
1673
- const [drawer, setDrawer] = useState3({ mode: "closed" });
1674
- const [submitting, setSubmitting] = useState3(false);
1687
+ const [drawer, setDrawer] = useState4({ mode: "closed" });
1688
+ const [submitting, setSubmitting] = useState4(false);
1675
1689
  const submittingRef = useRef3(false);
1676
- const handleAction = useCallback(
1690
+ const handleAction = useCallback2(
1677
1691
  async (action, record) => {
1678
1692
  if (action.access && !registry.access(action.access)) return;
1679
1693
  if (action.effect !== "remove" && !await confirmBeforeAction(action.confirm, confirmAction))
@@ -1781,7 +1795,7 @@ function BestCrudPage({ adapter, className, schema }) {
1781
1795
  [listService, schema.title]
1782
1796
  );
1783
1797
  const rowKey = schema.table.rowKey;
1784
- const request = useCallback(
1798
+ const request = useCallback2(
1785
1799
  (params, sort) => pageRequest.request(
1786
1800
  toBestListQuery({ ...params, ...useBestSearch ? queryRef.current : {} }, sort)
1787
1801
  ),
@@ -1804,7 +1818,7 @@ function BestCrudPage({ adapter, className, schema }) {
1804
1818
  };
1805
1819
  }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature]);
1806
1820
  useEffect3(() => () => pageRequest.abort(), [pageRequest]);
1807
- const submitForm = useCallback(
1821
+ const submitForm = useCallback2(
1808
1822
  async (values) => {
1809
1823
  if (submittingRef.current) return;
1810
1824
  const serviceKey = drawer.mode === "edit" ? schema.dataSource.update : schema.dataSource.create;
@@ -1979,6 +1993,7 @@ export {
1979
1993
  useBestAccess,
1980
1994
  useBestAction,
1981
1995
  useBestDictionary,
1996
+ useBestDictionaryActions,
1982
1997
  useBestListService,
1983
1998
  useBestRegistry,
1984
1999
  useBestService,
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lowcode/adapter.ts", "../src/lowcode/BestCrudPage.tsx", "../src/runtime/BestProvider.tsx", "../src/ui/BestBatchInput.tsx", "../src/ui/BestDetail.tsx", "../src/ui/BestFilePreview.tsx", "../src/ui/BestForm.tsx", "../src/ui/BestLightTable.tsx", "../src/ui/BestOverlay.tsx", "../src/ui/BestSearch.tsx", "../src/ui/BestStates.tsx", "../src/ui/BestTable.tsx", "../src/lowcode/runtime.ts", "../src/lowcode/schema.ts", "../src/lowcode/validate.ts", "../src/lowcode/BestTabbedPage.tsx"],
4
- "sourcesContent": ["import dayjs from 'dayjs'\nimport type { CrudDataAdapter } from './BestCrudPage'\n\nexport type BestValueNormalizer = (value: unknown, field?: string) => unknown\n\nexport function normalizeBestValues(\n values: Record<string, unknown>,\n normalize: BestValueNormalizer = defaultNormalize\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([field, value]) => [\n field,\n normalizeNested(value, normalize, field)\n ])\n )\n}\n\nfunction normalizeNested(value: unknown, normalize: BestValueNormalizer, field?: string): unknown {\n if (Array.isArray(value)) return value.map((item) => normalizeNested(item, normalize, field))\n if (dayjs.isDayjs(value) || value instanceof Date) return value\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeNested(item, normalize, key)])\n )\n }\n return normalize(value, field)\n}\n\nfunction defaultNormalize(value: unknown) {\n if (typeof value === 'string') return value.trim() === '' ? undefined : value.trim()\n return value\n}\n\nexport function createBestCrudAdapter(\n options: {\n normalize?: BestValueNormalizer\n fromList?: CrudDataAdapter['fromList']\n fromDetail?: CrudDataAdapter['fromDetail']\n toCreatePayload?: CrudDataAdapter['toCreatePayload']\n toUpdatePayload?: CrudDataAdapter['toUpdatePayload']\n } = {}\n): CrudDataAdapter {\n const normalize = options.normalize ?? defaultNormalize\n return {\n fromList: options.fromList,\n fromDetail: options.fromDetail,\n toCreatePayload: (values) =>\n options.toCreatePayload?.(normalizeBestValues(values, normalize)) ??\n normalizeBestValues(values, normalize),\n toUpdatePayload: (values, record) =>\n options.toUpdatePayload?.(normalizeBestValues(values, normalize), record) ??\n normalizeBestValues(values, normalize)\n }\n}\n", "import type { ActionType } from '@ant-design/pro-components'\nimport { Button, Modal, message } from 'antd'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useBestListService, useBestRegistry } from '../runtime'\nimport {\n BestDetail,\n type BestDetailField,\n type BestFieldDefinition,\n BestForm,\n BestModal,\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 fixed: column.fixed,\n valueEnum,\n renderText:\n column.format && !slot && !column.dict\n ? (value) => formatCrudValue(value, column.format)\n : undefined,\n render: slot\n ? (_value, record) =>\n slots[slot]?.({\n field: column.field,\n record,\n value: record[column.field]\n }) ?? '-'\n : undefined\n }\n}\n\nfunction toProTableSearchColumn(\n field: FieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>\n): BestTableColumn<RecordValue> {\n const valueType = (() => {\n switch (field.component) {\n case 'number':\n return 'digit' as const\n case 'select':\n return 'select' as const\n case 'date':\n return 'date' as const\n case 'dateRange':\n return 'dateRange' as const\n default:\n return 'text' as const\n }\n })()\n const options = field.dict ? (dictionary[field.dict] ?? []) : undefined\n return {\n dataIndex: field.field,\n title: field.label,\n valueType,\n search: true,\n hideInTable: true,\n initialValue: field.defaultValue,\n fieldProps: {\n ...(options ? { options } : {}),\n ...(field.maxDate === 'today'\n ? { disabledDate: (current: dayjs.Dayjs) => current.isAfter(dayjs(), 'day') }\n : {})\n }\n }\n}\n\nfunction confirmAction(content: string) {\n return new Promise<boolean>((resolve) => {\n Modal.confirm({\n content,\n okText: '\u786E\u8BA4',\n cancelText: '\u53D6\u6D88',\n onOk: () => resolve(true),\n onCancel: () => resolve(false)\n })\n })\n}\n\nexport function BestCrudPage({ adapter, className, schema }: BestCrudPageProps) {\n const registry = useBestRegistry()\n assertValidCrudPageSchema(schema, registry)\n const registeredListService = useBestListService(schema.dataSource.list)\n if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`)\n const listService = useCallback(\n async (\n query: Parameters<typeof registeredListService>[0],\n options?: Parameters<typeof registeredListService>[1]\n ) => {\n const response = await registeredListService(query, options)\n return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response\n },\n [adapter, registeredListService]\n )\n const searchFields = useFields(schema.search)\n const useBestSearch =\n schema.searchMode === 'bestSearch' ||\n schema.search?.some((field) => field.component === 'remoteSelect')\n const formFields = useFields(schema.form)\n const actionRef = useRef<ActionType>(undefined)\n const searchDefaultValues = useMemo(() => getDefaultValues(searchFields), [searchFields])\n const searchFieldNames = useMemo(\n () => new Set(searchFields.map((field) => field.field)),\n [searchFields]\n )\n const searchSchemaSignature = useMemo(\n () =>\n JSON.stringify(\n searchFields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue\n }))\n ),\n [searchFields]\n )\n const [query, setQuery] = useState<RecordValue>(searchDefaultValues)\n const queryRef = useRef<RecordValue>(searchDefaultValues)\n const queryStateRef = useRef({\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: false\n })\n const [drawer, setDrawer] = useState<DrawerState>({ mode: 'closed' })\n const [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 const actionColumnWidth = Math.max(160, schema.table.actions.length * 80 + 32)\n configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\n fixed: 'right',\n width: actionColumnWidth,\n render: (_, record) =>\n schema.table.actions?.map((action) => (\n <ActionButton action={action} key={action.id} record={record} onExecute={handleAction} />\n ))\n })\n return configuredColumns\n }, [\n handleAction,\n registry.dictionaries,\n registry.slots,\n schema.search,\n schema.table.actions,\n schema.table.columns,\n useBestSearch\n ])\n\n const pageRequest = useMemo(\n () =>\n createLatestPageRequest(listService, (error) =>\n message.error(errorMessage(error, `${schema.title}\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n ),\n [listService, schema.title]\n )\n const rowKey = schema.table.rowKey\n const request = useCallback(\n (params: RecordValue, sort?: Record<string, unknown>) =>\n pageRequest.request(\n toBestListQuery({ ...params, ...(useBestSearch ? queryRef.current : {}) }, sort)\n ),\n [pageRequest, useBestSearch]\n )\n\n useLayoutEffect(() => {\n const previous = queryStateRef.current\n if (previous.schemaId === schema.id && previous.searchSchemaSignature === searchSchemaSignature)\n return\n\n const shouldUseDefaults = previous.schemaId !== schema.id || !previous.userTouched\n const nextQuery = shouldUseDefaults\n ? searchDefaultValues\n : Object.fromEntries(\n Object.entries(queryRef.current).filter(([field]) => searchFieldNames.has(field))\n )\n queryRef.current = nextQuery\n setQuery(nextQuery)\n queryStateRef.current = {\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: shouldUseDefaults ? false : previous.userTouched\n }\n }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature])\n\n useEffect(() => () => pageRequest.abort(), [pageRequest])\n\n const submitForm = useCallback(\n async (values: RecordValue) => {\n if (submittingRef.current) return\n const serviceKey =\n drawer.mode === 'edit' ? schema.dataSource.update : schema.dataSource.create\n if (!serviceKey) {\n message.error(`${drawer.mode === 'edit' ? '\u66F4\u65B0' : '\u521B\u5EFA'}\u670D\u52A1\u672A\u914D\u7F6E`)\n return\n }\n const service = registry.services[serviceKey]\n if (!service) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${serviceKey}`)\n return\n }\n const record = drawer.mode === 'closed' ? undefined : drawer.record\n const payloadValues =\n drawer.mode === 'edit'\n ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey)\n : projectSubmittedValues(values, formFields)\n submittingRef.current = true\n setSubmitting(true)\n try {\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues)\n : (adapter?.toCreatePayload?.(payloadValues) ?? payloadValues)\n await service(payload)\n message.success('\u4FDD\u5B58\u6210\u529F')\n setDrawer({ mode: 'closed' })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n } finally {\n setSubmitting(false)\n submittingRef.current = false\n }\n },\n [\n adapter,\n drawer,\n formFields,\n registry.services,\n rowKey,\n schema.dataSource.create,\n schema.dataSource.update\n ]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={(values) => {\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n onSearch={(values) => {\n // Keep the latest filters synchronously available to request().\n // reload() may execute before React commits a state update.\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n />\n ) : null}\n <BestTable<RecordValue, RecordValue>\n actionRef={actionRef}\n className={className}\n columns={columns}\n pagination={{ showSizeChanger: true, defaultPageSize: schema.table.pageSize ?? 20 }}\n request={request}\n rowKey={\n Array.isArray(rowKey)\n ? (record) => rowKey.map((field) => String(record[field] ?? '')).join('-')\n : rowKey\n }\n search={useBestSearch ? false : undefined}\n scroll={schema.table.scrollX ? { x: schema.table.scrollX } : undefined}\n toolBarRender={() =>\n schema.toolbar?.map((action) => (\n <ActionButton action={action} key={action.id} onExecute={handleAction} />\n )) ?? []\n }\n />\n <BestModal\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 </BestModal>\n </>\n )\n\n function ActionButton({\n action,\n record,\n onExecute\n }: {\n action: PageActionSchema\n record?: RecordValue\n onExecute: (action: PageActionSchema, record?: RecordValue) => Promise<void>\n }) {\n const permitted = !action.access || registry.access(action.access)\n if (!permitted) return null\n if (action.effect === 'slot' && action.slot) {\n return registry.slots[action.slot]?.({ record }) ?? null\n }\n return (\n <Button\n key={action.id}\n type={action.buttonType ?? 'link'}\n onClick={() => {\n void onExecute(action, record)\n }}\n >\n {action.label}\n </Button>\n )\n }\n}\n", "import type { ThemeConfig } from 'antd'\nimport { ConfigProvider } from 'antd'\nimport type { ReactNode } from 'react'\nimport { createContext, 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 pageId?: string\n tabKey?: string\n field?: string\n record?: Record<string, unknown>\n value?: unknown\n values?: Record<string, unknown>\n}\nexport type BestActionContext = BestSlotContext\nexport type BestAction = (context: BestActionContext) => void | Promise<void>\nexport type BestSlot = (context: BestSlotContext) => ReactNode\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\nexport type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {\n access?: BestRegistry['access']\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 composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry {\n const result: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: emptyRegistry.access\n }\n const groups = ['listServices', 'services', 'dictionaries', 'actions', 'slots'] as const\n for (const layer of layers) {\n for (const group of groups) {\n for (const [key, value] of Object.entries(layer[group] ?? {})) {\n if (Object.hasOwn(result[group], key)) {\n throw new Error(`Registry key \u91CD\u590D\uFF1A${group}.${key}`)\n }\n result[group][key] = value as never\n }\n }\n if (layer.access) {\n const previousAccess = result.access\n result.access = (key) => previousAccess(key) && layer.access?.(key) !== false\n }\n }\n return result\n}\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return composeBestRegistry(registry)\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 type { FormRule } from 'antd'\nimport { Button, DatePicker, Form, Input, InputNumber, Select, Space } from 'antd'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormMode } from '../lowcode/schema'\nimport { useBestRegistry } from '../runtime'\nimport type { BestFieldDefinition, BestFieldRule, BestOption } from './types'\n\nexport type BestFormProps = {\n fields: BestFieldDefinition[]\n initialValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n mode?: FormMode\n onSubmit: (value: Record<string, unknown>) => void\n onCancel?: () => void\n}\n\ntype FormControlProps = {\n field: BestFieldDefinition\n values: Record<string, unknown>\n scopeValues?: Record<string, unknown>\n namePath?: string | number | (string | number)[]\n value?: unknown\n onChange?: (...args: unknown[]) => void\n} & Record<string, unknown>\n\nfunction toNamePath(path?: string | number | (string | number)[]) {\n return path === undefined ? [] : Array.isArray(path) ? path : [path]\n}\n\nfunction isNamePath(value: string | number | (string | number)[]) {\n return Array.isArray(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return false\n }\n if (dayjs.isDayjs(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction appendNamePath(\n path: string | number | (string | number)[] | undefined,\n ...segments: (string | number)[]\n) {\n return [...toNamePath(path), ...segments]\n}\n\nfunction getConditionFieldValue(values: Record<string, unknown>, field: string) {\n if (Object.hasOwn(values, field)) return values[field]\n return getPathValue(values, field.split('.'))\n}\n\nfunction getScopedValues(values: Record<string, unknown>, itemPath: (string | number)[]) {\n const itemValues = getPathValue(values, itemPath)\n return isRecord(itemValues) ? { ...values, ...itemValues } : values\n}\n\nfunction isFieldVisible(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n}\n\nfunction resolveFieldDisabled(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return (\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n )\n}\n\nfunction toDayjsValue(value: unknown): Dayjs | null {\n if (dayjs.isDayjs(value)) return value\n if (value instanceof Date) return dayjs(value)\n if (typeof value === 'number') {\n const normalized = Math.abs(value) >= 1_000_000_000_000 ? value : value * 1000\n const parsed = dayjs(normalized)\n return parsed.isValid() ? parsed : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = dayjs(trimmed)\n return parsed.isValid() ? parsed : null\n }\n return null\n}\n\nexport function toDatePickerValue(value: unknown): Dayjs | null {\n return toDayjsValue(value)\n}\n\nexport function toDateRangePickerValue(value: unknown): [Dayjs | null, Dayjs | null] | null {\n if (!Array.isArray(value)) return null\n const nextValue: [Dayjs | null, Dayjs | null] = [toDayjsValue(value[0]), toDayjsValue(value[1])]\n return nextValue[0] || nextValue[1] ? nextValue : null\n}\n\nexport function serializeDatePickerValue(_: Dayjs | null, dateString: string) {\n return dateString || undefined\n}\n\nexport function serializeDateRangePickerValue(\n _: [Dayjs | null, Dayjs | null] | null,\n dateStrings: [string, string]\n) {\n return dateStrings[0] || dateStrings[1] ? dateStrings : undefined\n}\n\nfunction fieldSignature(field: BestFieldDefinition): unknown {\n return {\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n itemFields: field.itemFields?.map((itemField) => fieldSignature(itemField))\n }\n}\n\nfunction FormControl({\n field,\n values,\n scopeValues,\n mode = 'create',\n form,\n namePath,\n value,\n onChange,\n ...controlProps\n}: FormControlProps & { mode?: FormMode; form: ReturnType<typeof Form.useForm>[0] }) {\n const registry = useBestRegistry()\n const renderValues = scopeValues ?? values\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value !== undefined ? value : getPathValue(values, namePath ?? field.field)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n onChange={(nextValue) => {\n if (onChange) onChange(nextValue)\n else form.setFieldValue(namePath ?? field.field, nextValue)\n }}\n registry={registry}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n case 'slot':\n return (\n <>\n {field.render?.({\n field: field.field,\n values: renderValues,\n value: value !== undefined ? value : getPathValue(values, namePath ?? field.field),\n mode,\n disabled: field.disabled,\n setValue: (name, nextValue) =>\n form.setFieldValue(\n namePath\n ? isNamePath(name)\n ? name\n : [...toNamePath(namePath).slice(0, -1), name]\n : name,\n nextValue\n )\n })}\n </>\n )\n case 'repeatable':\n return (\n <RepeatableField\n field={field}\n form={form}\n mode={mode}\n namePath={namePath}\n values={values}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction RepeatableField({\n field,\n form,\n mode,\n namePath,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n mode: FormMode\n namePath?: string | number | (string | number)[]\n values: Record<string, unknown>\n}) {\n const listName = namePath ?? field.field\n return (\n <Form.List name={listName}>\n {(items, { add, remove }) => (\n <>\n {items.map((item) => (\n <RepeatableFieldRow\n key={item.key}\n field={field}\n form={form}\n itemCount={items.length}\n itemName={item.name}\n itemKey={item.key}\n listName={listName}\n mode={mode}\n remove={remove}\n values={values}\n />\n ))}\n <Button\n disabled={field.maxItems !== undefined && items.length >= field.maxItems}\n onClick={() => add(resolveInitialValues(field.itemFields ?? [], undefined))}\n type='dashed'\n >\n \u65B0\u589E\u4E00\u9879\n </Button>\n </>\n )}\n </Form.List>\n )\n}\n\nfunction RepeatableFieldRow({\n field,\n form,\n itemCount,\n itemName,\n itemKey,\n listName,\n mode,\n remove,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n itemCount: number\n itemName: number\n itemKey: React.Key\n listName: string | number | (string | number)[]\n mode: FormMode\n remove: (index: number) => void\n values: Record<string, unknown>\n}) {\n const itemPath = appendNamePath(listName, itemName)\n const itemValues = getPathValue(values, itemPath)\n const scopeValues = getScopedValues(values, itemPath)\n\n useEffect(() => {\n field.itemFields?.forEach((itemField) => {\n if (!itemField.clearWhenHidden) return\n const nextPath = appendNamePath(itemPath, itemField.field)\n if (\n !isFieldVisible(itemField, scopeValues, mode) &&\n getPathValue(values, nextPath) !== undefined\n ) {\n form.setFieldValue(nextPath, undefined)\n }\n })\n }, [field.itemFields, form, itemPath, mode, scopeValues, values])\n\n return (\n <Space key={itemKey} align='start'>\n {field.itemFields?.map((itemField) => {\n if (!isFieldVisible(itemField, scopeValues, mode)) return null\n const nextPath = appendNamePath(itemPath, itemField.field)\n return (\n <Form.Item\n key={itemField.field}\n label={itemField.label}\n name={[itemName, itemField.field]}\n rules={toAntRules(itemField.rules)}\n >\n <FormControl\n field={{\n ...itemField,\n disabled: resolveFieldDisabled(itemField, scopeValues, mode)\n }}\n form={form}\n mode={mode}\n namePath={nextPath}\n scopeValues={scopeValues}\n values={isRecord(itemValues) ? { ...values, ...itemValues } : values}\n />\n </Form.Item>\n )\n })}\n <Button\n disabled={itemCount <= (field.minItems ?? 0)}\n onClick={() => remove(itemName)}\n type='link'\n >\n \u5220\u9664\n </Button>\n </Space>\n )\n}\n\ntype FormFieldsProps = Pick<BestFormProps, 'fields' | 'initialValues' | 'mode'> & {\n form: ReturnType<typeof Form.useForm>[0]\n}\n\nfunction FormFields({ fields, form, initialValues, mode = 'create' }: FormFieldsProps) {\n const values =\n (Form.useWatch([], { form, preserve: true }) as Record<string, unknown> | undefined) ??\n initialValues ??\n {}\n const isVisible = (field: BestFieldDefinition) =>\n !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n useEffect(() => {\n fields\n .filter((field) => field.clearWhenHidden && !isVisible(field))\n .forEach((field) => {\n if (values[field.field] !== undefined) form.setFieldValue(field.field, undefined)\n })\n }, [fields, form, mode, values])\n return (\n <>\n {fields\n .filter((field) => isVisible(field))\n .map((field) => {\n const control = (\n <FormControl\n key={field.field}\n field={{\n ...field,\n disabled:\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n }}\n form={form}\n mode={mode}\n values={values}\n />\n )\n return field.component === 'repeatable' ? (\n <Form.Item key={field.field} label={field.label}>\n {control}\n </Form.Item>\n ) : (\n <Form.Item\n key={field.field}\n label={field.label}\n name={field.field}\n rules={toAntRules(field.rules)}\n >\n {control}\n </Form.Item>\n )\n })}\n </>\n )\n}\n\nexport function toAntRules(rules: BestFieldRule[] | undefined): FormRule[] | undefined {\n return rules?.map(\n (rule) =>\n Object.fromEntries(\n Object.entries({\n required: rule.required,\n type: rule.type === 'string' ? undefined : rule.type,\n min: rule.min ?? rule.minLength,\n max: rule.max ?? rule.maxLength,\n pattern: safeRegExp(rule.pattern),\n message: rule.message,\n validator:\n rule.type === 'integer'\n ? async (_: unknown, value: unknown) => {\n if (value === undefined || value === null || value === '') return\n if (!Number.isInteger(Number(value)))\n throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\n }).filter(([, value]) => value !== undefined)\n ) as FormRule\n )\n}\n\nfunction safeRegExp(pattern: string | undefined) {\n if (!pattern) return undefined\n try {\n return new RegExp(pattern)\n } catch {\n return undefined\n }\n}\n\nexport function RemoteSelect({\n field,\n value,\n disabled,\n placeholder,\n onChange,\n registry\n}: {\n field: BestFieldDefinition\n value?: unknown\n disabled?: boolean\n placeholder?: string\n onChange: (value: unknown) => void\n registry: ReturnType<typeof useBestRegistry>\n}) {\n const [keywordOptions, setKeywordOptions] = useState<BestOption[]>([])\n const [selectedOptions, setSelectedOptions] = useState<BestOption[]>([])\n const [loading, setLoading] = useState(false)\n const [keyword, setKeyword] = useState('')\n const keywordRequestId = useRef(0)\n const selectedRequestId = useRef(0)\n const service = field.remoteService ? registry.services[field.remoteService] : undefined\n const labelField = field.labelField ?? 'label'\n const valueField = field.valueField ?? 'value'\n const searchField = field.searchField ?? 'keyword'\n const debounceMs = field.debounceMs ?? 300\n const pageSize = field.pageSize ?? 20\n\n const parseOptions = (response: unknown): BestOption[] => {\n const raw = Array.isArray(response)\n ? response\n : ((response as { items?: unknown[]; list?: unknown[] })?.items ??\n (response as { list?: unknown[] })?.list ??\n [])\n return raw.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const record = item as Record<string, unknown>\n const optionValue = record[valueField]\n if (typeof optionValue !== 'string' && typeof optionValue !== 'number') return []\n return [\n {\n label: String(record[labelField] ?? optionValue ?? ''),\n value: optionValue,\n disabled: Boolean(record.disabled)\n }\n ]\n })\n }\n\n const mergeOptions = (base: BestOption[], extra: BestOption[]) => {\n const merged = new Map(base.map((item) => [String(item.value), item]))\n extra.forEach((item) => {\n merged.set(String(item.value), item)\n })\n return [...merged.values()]\n }\n\n const options = useMemo(\n () => mergeOptions(keywordOptions, selectedOptions),\n [keywordOptions, selectedOptions]\n )\n\n useEffect(() => {\n const currentRequestId = ++keywordRequestId.current\n if (!service) {\n setKeywordOptions([])\n setLoading(false)\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === keywordRequestId.current && !controller.signal.aborted\n const timer = window.setTimeout(async () => {\n setLoading(true)\n try {\n const response = await service(\n { [searchField]: keyword, page: 1, pageSize },\n { signal: controller.signal }\n )\n if (isCurrent()) setKeywordOptions(parseOptions(response))\n } catch {\n if (isCurrent()) setKeywordOptions([])\n } finally {\n if (isCurrent()) setLoading(false)\n }\n }, debounceMs)\n return () => {\n window.clearTimeout(timer)\n controller.abort()\n }\n }, [debounceMs, keyword, labelField, pageSize, searchField, service, valueField])\n\n useEffect(() => {\n const currentRequestId = ++selectedRequestId.current\n if (!service) {\n setSelectedOptions([])\n return\n }\n if (value === undefined || value === null || value === '') {\n setSelectedOptions([])\n return\n }\n if (typeof value !== 'string' && typeof value !== 'number') {\n setSelectedOptions([])\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === selectedRequestId.current && !controller.signal.aborted\n const fallbackOption: BestOption = {\n label: String(value),\n value: value as string | number\n }\n setSelectedOptions([fallbackOption])\n void service({ [valueField]: value, page: 1, pageSize }, { signal: controller.signal })\n .then((response) => {\n if (!isCurrent()) return\n const resolvedOptions = parseOptions(response)\n if (resolvedOptions.length) {\n setSelectedOptions(mergeOptions([fallbackOption], resolvedOptions))\n }\n })\n .catch(() => undefined)\n return () => {\n controller.abort()\n }\n }, [labelField, pageSize, service, value, valueField])\n\n return (\n <Select\n showSearch\n filterOption={false}\n loading={loading}\n value={value}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n onSearch={setKeyword}\n onChange={onChange}\n />\n )\n}\n\nexport function BestForm({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps) {\n const resolvedInitialValues = useMemo(\n () => resolveInitialValues(fields, initialValues),\n [fields, initialValues]\n )\n const formSignature = useMemo(\n () =>\n JSON.stringify([mode, fields.map((field) => fieldSignature(field)), resolvedInitialValues]),\n [fields, mode, resolvedInitialValues]\n )\n return (\n <BestFormBody\n key={formSignature}\n extra={extra}\n fields={fields}\n initialValues={resolvedInitialValues}\n loading={loading}\n mode={mode}\n onCancel={onCancel}\n onSubmit={onSubmit}\n submitText={submitText}\n />\n )\n}\n\nfunction BestFormBody({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n return (\n <Form form={form} initialValues={initialValues} layout='vertical' onFinish={onSubmit}>\n <FormFields fields={fields} form={form} initialValues={initialValues} mode={mode} />\n <Space>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n {onCancel ? <Button onClick={onCancel}>\u53D6\u6D88</Button> : null}\n {extra}\n </Space>\n </Form>\n )\n}\n\nexport function getDefaultValues(fields: BestFieldDefinition[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field) => field.defaultValue !== undefined)\n .map((field) => [field.field, field.defaultValue])\n )\n}\n\nfunction resolveInitialValues(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown> | undefined\n) {\n const values = mergeDefinedValues(getDefaultValues(fields), initialValues)\n const resolvedValues = { ...values }\n fields.forEach((field) => {\n if (field.component !== 'repeatable' || !field.itemFields) return\n const items: unknown[] = Array.isArray(resolvedValues[field.field])\n ? (resolvedValues[field.field] as unknown[])\n : []\n resolvedValues[field.field] = items.map((item) =>\n resolveInitialValues(field.itemFields ?? [], isRecord(item) ? item : {})\n )\n })\n return resolvedValues\n}\n\nexport function mergeDefinedValues(\n baseValues: Record<string, unknown>,\n nextValues: Record<string, unknown> | undefined\n) {\n const mergedValues = { ...baseValues }\n Object.entries(nextValues ?? {}).forEach(([key, value]) => {\n if (value === undefined) return\n const currentValue = mergedValues[key]\n if (isRecord(currentValue) && isRecord(value)) {\n mergedValues[key] = mergeDefinedValues(currentValue, value)\n return\n }\n mergedValues[key] = value\n })\n return mergedValues\n}\n\nfunction getPathValue(\n values: Record<string, unknown>,\n path: string | number | (string | number)[]\n) {\n const parts = Array.isArray(path) ? path : [path]\n return parts.reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as Record<string, unknown>)[part]\n return undefined\n }, values)\n}\n\nexport function evaluateCondition(\n condition: NonNullable<BestFieldDefinition['visibleWhen']>,\n values: Record<string, unknown>,\n mode: FormMode\n): boolean {\n switch (condition.operator) {\n case 'equals':\n return getConditionFieldValue(values, condition.field) === condition.value\n case 'notEmpty':\n return (\n getConditionFieldValue(values, condition.field) !== undefined &&\n getConditionFieldValue(values, condition.field) !== null &&\n getConditionFieldValue(values, condition.field) !== ''\n )\n case 'modeEquals':\n return mode === condition.value\n case 'and':\n return condition.conditions.every((item) => evaluateCondition(item, values, mode))\n case 'or':\n return condition.conditions.some((item) => evaluateCondition(item, values, mode))\n case 'not':\n return !evaluateCondition(condition.condition, values, mode)\n }\n}\n", "import type { TableColumnsType } from 'antd'\nimport { Table } from 'antd'\n\nexport type BestLightTableColumn<T extends Record<string, unknown>> = {\n field: keyof T & string\n title: string\n width?: number\n render?: (value: unknown, record: T, index: number) => React.ReactNode\n}\n\nexport type BestLightTableProps<T extends Record<string, unknown>> = {\n columns: BestLightTableColumn<T>[]\n data: T[]\n rowKey?: string\n}\n\nexport function BestLightTable<T extends Record<string, unknown>>({\n columns,\n data,\n rowKey\n}: BestLightTableProps<T>) {\n const tableColumns: TableColumnsType<T> = columns.map((column) => ({\n dataIndex: column.field,\n key: column.field,\n title: column.title,\n width: column.width,\n render: column.render\n }))\n return (\n <Table\n columns={tableColumns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n size='small'\n />\n )\n}\n", "import { Drawer, Modal } from 'antd'\nimport type { ReactNode } from 'react'\n\ntype OverlayProps = {\n children: ReactNode\n open: boolean\n title: ReactNode\n onClose: () => void\n}\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'\nimport './BestSearch.module.less'\n\nexport type BestSearchProps = {\n fields: BestFieldDefinition[]\n value?: Record<string, unknown>\n defaultValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n onChange?: (value: Record<string, unknown>) => void\n onSearch: (value: Record<string, unknown>) => void\n onReset?: (value: Record<string, unknown>) => void\n}\n\ntype FieldControlProps = {\n field: BestFieldDefinition\n value?: unknown\n onChange?: (value: unknown) => void\n} & Record<string, unknown>\n\nfunction searchFormSignature(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown>\n) {\n return JSON.stringify([\n fields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize\n })),\n initialValues\n ])\n}\n\nfunction FieldControl({ field, value, onChange, ...controlProps }: FieldControlProps) {\n const registry = useBestRegistry()\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value as never}\n onChange={onChange ?? (() => undefined)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n registry={registry}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction syncValues(\n form: FormInstance,\n value: Record<string, unknown>,\n fields: BestFieldDefinition[]\n) {\n form.setFieldsValue(Object.fromEntries(fields.map((field) => [field.field, undefined])) as never)\n form.setFieldsValue(value as never)\n}\n\nexport function BestSearch({\n fields,\n value,\n defaultValues,\n loading,\n submitText = '\u67E5\u8BE2',\n extra,\n onChange,\n onSearch,\n onReset\n}: BestSearchProps) {\n const initialValues = useMemo(\n () => mergeDefinedValues(getDefaultValues(fields), defaultValues),\n [fields, defaultValues]\n )\n return (\n <BestSearchBody\n key={searchFormSignature(fields, initialValues)}\n extra={extra}\n fields={fields}\n initialValues={initialValues}\n loading={loading}\n onChange={onChange}\n onReset={onReset}\n onSearch={onSearch}\n submitText={submitText}\n value={value}\n />\n )\n}\n\nfunction BestSearchBody({\n fields,\n value,\n initialValues,\n loading,\n submitText,\n extra,\n onChange,\n onSearch,\n onReset\n}: Omit<BestSearchProps, 'defaultValues'> & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n const valueSignatureRef = useRef<string | undefined>(undefined)\n const controlledRef = useRef(false)\n\n useEffect(() => {\n if (value === undefined) {\n if (controlledRef.current) {\n syncValues(form, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n controlledRef.current = false\n }\n return\n }\n controlledRef.current = true\n const signature = JSON.stringify(value)\n if (valueSignatureRef.current === signature) return\n syncValues(form, value, fields)\n valueSignatureRef.current = signature\n }, [fields, form, value])\n\n return (\n <Form\n form={form}\n initialValues={initialValues}\n layout='vertical'\n onFinish={(values) => onSearch(values as Record<string, unknown>)}\n onValuesChange={(_, values) => onChange?.(values as Record<string, unknown>)}\n className='best-lowcode-search'\n >\n <Row gutter={16} align='bottom'>\n {fields\n .filter((field) => !field.hidden)\n .map((field) => (\n <Col key={field.field} span={field.span ?? 6}>\n <Form.Item label={field.label} name={field.field} rules={toAntRules(field.rules)}>\n <FieldControl field={field} />\n </Form.Item>\n </Col>\n ))}\n <Col>\n <Form.Item>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n <Button\n onClick={() => {\n syncValues(form, initialValues, fields)\n valueSignatureRef.current = JSON.stringify(initialValues)\n onChange?.(initialValues)\n onReset?.(initialValues)\n }}\n style={{ marginInlineStart: 8 }}\n >\n \u91CD\u7F6E\n </Button>\n {extra}\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )\n}\n", "import { Empty, Result, Spin } from 'antd'\n\nexport function BestLoading({ description = '\u52A0\u8F7D\u4E2D' }: { description?: string }) {\n return (\n <div style={{ display: 'grid', minHeight: 160, placeItems: 'center' }}>\n <Spin tip={description} />\n </div>\n )\n}\n\nexport function BestEmpty({ description = '\u6682\u65E0\u6570\u636E' }: { description?: string }) {\n return <Empty description={description} />\n}\n\nexport function BestError({ description = '\u52A0\u8F7D\u5931\u8D25' }: { description?: string }) {\n return <Result status='error' title={description} />\n}\n", "import {\n type ParamsType,\n ProTable,\n type ProTableProps,\n type RequestData\n} from '@ant-design/pro-components'\nimport type { TableProps } from 'antd'\nimport type { ReactNode } from 'react'\nimport './BestTable.module.less'\n\nexport type BestTableColumn<T extends Record<string, unknown>> = NonNullable<\n ProTableProps<T, ParamsType>['columns']\n>[number]\n\nexport type BestTableProps<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n> = Omit<ProTableProps<DataSource, Params, ValueType>, 'columns'> & {\n columns?:\n | ProTableProps<DataSource, Params, ValueType>['columns']\n | TableProps<DataSource>['columns']\n emptyText?: ReactNode\n}\n\nconst defaultSearch: NonNullable<ProTableProps<Record<string, unknown>, ParamsType>['search']> = {\n layout: 'vertical',\n labelWidth: 'auto',\n defaultCollapsed: false,\n collapseRender: false,\n span: 6\n}\n\nfunction mergeSearch<T>(defaults: T, value: T | false | undefined): T | false {\n if (value === false) return false\n return { ...(defaults as object), ...((value ?? {}) as object) } as T\n}\n\nexport function BestTable<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n>({\n columns,\n cardProps,\n className,\n search,\n emptyText = '\u6682\u65E0\u6570\u636E',\n ...props\n}: BestTableProps<DataSource, Params, ValueType>) {\n return (\n <ProTable<DataSource, Params, ValueType>\n {...props}\n className={['best-lowcode-table', className].filter(Boolean).join(' ')}\n columns={columns as ProTableProps<DataSource, Params, ValueType>['columns']}\n options={false}\n search={mergeSearch(defaultSearch, search as typeof defaultSearch | false | undefined)}\n cardProps={\n cardProps === false\n ? false\n : {\n ...cardProps,\n styles: {\n ...cardProps?.styles,\n body: { ...cardProps?.styles?.body, padding: 12 }\n }\n }\n }\n locale={{ emptyText }}\n />\n )\n}\n\nexport type { RequestData }\n", "import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc.js'\nimport type { BestListQuery, BestListService } from './list'\nimport type { TableColumnSchema } from './schema'\n\ndayjs.extend(utc)\n\ntype ProTablePageResponse = { data: Record<string, unknown>[]; success: boolean; total: number }\n\nexport function toBestListQuery(\n params: Record<string, unknown>,\n sort?: Record<string, unknown>\n): BestListQuery {\n const { current, pageSize, ...filters } = params\n const normalizedSort = Object.fromEntries(\n Object.entries(sort ?? {}).filter(\n (entry): entry is [string, 'ascend' | 'descend'] =>\n entry[1] === 'ascend' || entry[1] === 'descend'\n )\n )\n return {\n page: typeof current === 'number' && current > 0 ? current : 1,\n pageSize: typeof pageSize === 'number' && pageSize > 0 ? pageSize : 20,\n filters,\n ...(Object.keys(normalizedSort).length ? { sort: normalizedSort } : {})\n }\n}\n\nexport function formatCrudValue(value: unknown, format: TableColumnSchema['format']): string {\n if (value == null || value === '') return '-'\n if (!format || format === 'text') return String(value)\n if (format === 'money') {\n const amount = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(amount)\n ? new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount)\n : String(value)\n }\n if (typeof value !== 'string' && typeof value !== 'number' && !(value instanceof Date)) {\n return String(value)\n }\n let timestamp: string | number | Date = value\n if (typeof value === 'number' || typeof value === 'string') {\n const numericValue = typeof value === 'number' ? value : Number(value.trim())\n timestamp =\n Number.isFinite(numericValue) && numericValue !== 0\n ? Math.abs(numericValue) >= 1_000_000_000_000\n ? numericValue\n : numericValue * 1000\n : value\n }\n const date = dayjs.utc(timestamp)\n if (!date.isValid()) return String(value)\n return date.format(format === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')\n}\n\nexport function errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback\n}\n\nexport function isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted || (error instanceof DOMException && error.name === 'AbortError')\n}\n\nexport async function confirmBeforeAction(\n content: string | undefined,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n return !content || confirm(content)\n}\n\nexport async function removeCrudRecord(\n record: Record<string, unknown>,\n service: (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ) => Promise<unknown>,\n content: string,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n if (!(await confirmBeforeAction(content, confirm))) return false\n await service(record)\n return true\n}\n\nexport function createLatestPageRequest(\n service: BestListService,\n onError: (error: unknown) => void\n) {\n let sequence = 0\n let controller: AbortController | undefined\n let latest: ProTablePageResponse = { data: [], success: false, total: 0 }\n\n return {\n async request(query: BestListQuery): Promise<ProTablePageResponse> {\n controller?.abort()\n controller = new AbortController()\n const currentController = controller\n const currentSequence = ++sequence\n try {\n const response = await service(query, { signal: currentController.signal })\n const pageResponse: ProTablePageResponse = {\n data: response.items,\n success: true,\n total: response.total\n }\n if (currentSequence !== sequence) return latest\n latest = pageResponse\n return pageResponse\n } catch (error) {\n if (currentSequence !== sequence || isAbortError(error, currentController.signal))\n return latest\n onError(error)\n return { data: [], success: false, total: 0 }\n }\n },\n abort() {\n controller?.abort()\n }\n }\n}\n", "import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\nexport const TABBED_PAGE_SCHEMA_ID = 'https://best.dev/schema/tabs/v1' as const\nexport const TABBED_PAGE_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n\nexport type TabContentSchema =\n | { type: 'crud'; schema: CrudPageSchema }\n | { type: 'slot'; slot: string }\n\nexport type TabSchema = {\n key: string\n label: string\n access?: string\n /** Defaults to true so inactive CRUD pages do not fetch until selected. */\n destroyOnHidden?: boolean\n content: TabContentSchema\n}\n\n/** A page composition schema with runtime-owned tab navigation. */\nexport type TabbedPageSchema = {\n $schema: typeof TABBED_PAGE_SCHEMA_ID\n version: typeof TABBED_PAGE_SCHEMA_VERSION\n id: string\n kind: 'tabs'\n tabs: TabSchema[]\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema,\n TABBED_PAGE_SCHEMA_ID,\n TABBED_PAGE_SCHEMA_VERSION,\n type TabbedPageSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot'\n])\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.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n !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\nexport function validateTabbedPageSchema(\n schema: TabbedPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`)\n if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {\n push(diagnostics, '/tabs', 'tabs.required', '\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E')\n return { valid: false, diagnostics }\n }\n const keys = new Set<string>()\n schema.tabs.forEach((tab, index) => {\n const path = `/tabs/${index}`\n if (!tab.key) push(diagnostics, path, 'tab.key', '\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A')\n if (keys.has(tab.key)) push(diagnostics, path, 'tab.duplicate', `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`)\n keys.add(tab.key)\n if (!tab.label) push(diagnostics, path, 'tab.label', '\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (tab.content.type === 'crud') {\n const result = validateCrudPageSchema(tab.content.schema, registry)\n diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })))\n } else if (tab.content.type === 'slot') {\n if (!tab.content.slot) push(diagnostics, path, 'tab.slot', 'slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key')\n if (tab.content.slot && registry && !registry.slots[tab.content.slot])\n push(diagnostics, path, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`)\n } else {\n push(diagnostics, path, 'tab.content', '\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B')\n }\n })\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry) {\n const result = validateTabbedPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import { Tabs } from 'antd'\nimport { useBestRegistry } from '../runtime'\nimport { BestCrudPage } from './BestCrudPage'\nimport type { TabbedPageSchema } from './schema'\nimport { assertValidTabbedPageSchema } from './validate'\n\nexport type BestTabbedPageProps = {\n className?: string\n schema: TabbedPageSchema\n}\n\n/** Renders declarative tabs whose contents are either a CRUD schema or a registered slot. */\nexport function BestTabbedPage({ className, schema }: BestTabbedPageProps) {\n const registry = useBestRegistry()\n assertValidTabbedPageSchema(schema, registry)\n const items = schema.tabs\n .filter((tab) => !tab.access || registry.access(tab.access))\n .map((tab) => ({\n key: tab.key,\n label: tab.label,\n destroyOnHidden: tab.destroyOnHidden,\n children:\n tab.content.type === 'crud' ? (\n <BestCrudPage schema={tab.content.schema} />\n ) : (\n registry.slots[tab.content.slot]?.({ pageId: schema.id, tabKey: tab.key }) ?? null\n )\n }))\n return <Tabs className={className} items={items} />\n}\n"],
5
- "mappings": "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",
6
- "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", "jsx"]
4
+ "sourcesContent": ["import dayjs from 'dayjs'\nimport type { CrudDataAdapter } from './BestCrudPage'\n\nexport type BestValueNormalizer = (value: unknown, field?: string) => unknown\n\nexport function normalizeBestValues(\n values: Record<string, unknown>,\n normalize: BestValueNormalizer = defaultNormalize\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([field, value]) => [\n field,\n normalizeNested(value, normalize, field)\n ])\n )\n}\n\nfunction normalizeNested(value: unknown, normalize: BestValueNormalizer, field?: string): unknown {\n if (Array.isArray(value)) return value.map((item) => normalizeNested(item, normalize, field))\n if (dayjs.isDayjs(value) || value instanceof Date) return value\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeNested(item, normalize, key)])\n )\n }\n return normalize(value, field)\n}\n\nfunction defaultNormalize(value: unknown) {\n if (typeof value === 'string') return value.trim() === '' ? undefined : value.trim()\n return value\n}\n\nexport function createBestCrudAdapter(\n options: {\n normalize?: BestValueNormalizer\n fromList?: CrudDataAdapter['fromList']\n fromDetail?: CrudDataAdapter['fromDetail']\n toCreatePayload?: CrudDataAdapter['toCreatePayload']\n toUpdatePayload?: CrudDataAdapter['toUpdatePayload']\n } = {}\n): CrudDataAdapter {\n const normalize = options.normalize ?? defaultNormalize\n return {\n fromList: options.fromList,\n fromDetail: options.fromDetail,\n toCreatePayload: (values) =>\n options.toCreatePayload?.(normalizeBestValues(values, normalize)) ??\n normalizeBestValues(values, normalize),\n toUpdatePayload: (values, record) =>\n options.toUpdatePayload?.(normalizeBestValues(values, normalize), record) ??\n normalizeBestValues(values, normalize)\n }\n}\n", "import type { ActionType } from '@ant-design/pro-components'\nimport { Button, Modal, message } from 'antd'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useBestListService, useBestRegistry } from '../runtime'\nimport {\n BestDetail,\n type BestDetailField,\n type BestFieldDefinition,\n BestForm,\n BestModal,\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 fixed: column.fixed,\n valueEnum,\n renderText:\n column.format && !slot && !column.dict\n ? (value) => formatCrudValue(value, column.format)\n : undefined,\n render: slot\n ? (_value, record) =>\n slots[slot]?.({\n field: column.field,\n record,\n value: record[column.field]\n }) ?? '-'\n : undefined\n }\n}\n\nfunction toProTableSearchColumn(\n field: FieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>\n): BestTableColumn<RecordValue> {\n const valueType = (() => {\n switch (field.component) {\n case 'number':\n return 'digit' as const\n case 'select':\n return 'select' as const\n case 'date':\n return 'date' as const\n case 'dateRange':\n return 'dateRange' as const\n default:\n return 'text' as const\n }\n })()\n const options = field.dict ? (dictionary[field.dict] ?? []) : undefined\n return {\n dataIndex: field.field,\n title: field.label,\n valueType,\n search: true,\n hideInTable: true,\n initialValue: field.defaultValue,\n fieldProps: {\n ...(options ? { options } : {}),\n ...(field.maxDate === 'today'\n ? { disabledDate: (current: dayjs.Dayjs) => current.isAfter(dayjs(), 'day') }\n : {})\n }\n }\n}\n\nfunction confirmAction(content: string) {\n return new Promise<boolean>((resolve) => {\n Modal.confirm({\n content,\n okText: '\u786E\u8BA4',\n cancelText: '\u53D6\u6D88',\n onOk: () => resolve(true),\n onCancel: () => resolve(false)\n })\n })\n}\n\nexport function BestCrudPage({ adapter, className, schema }: BestCrudPageProps) {\n const registry = useBestRegistry()\n assertValidCrudPageSchema(schema, registry)\n const registeredListService = useBestListService(schema.dataSource.list)\n if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`)\n const listService = useCallback(\n async (\n query: Parameters<typeof registeredListService>[0],\n options?: Parameters<typeof registeredListService>[1]\n ) => {\n const response = await registeredListService(query, options)\n return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response\n },\n [adapter, registeredListService]\n )\n const searchFields = useFields(schema.search)\n const useBestSearch =\n schema.searchMode === 'bestSearch' ||\n schema.search?.some((field) => field.component === 'remoteSelect')\n const formFields = useFields(schema.form)\n const actionRef = useRef<ActionType>(undefined)\n const searchDefaultValues = useMemo(() => getDefaultValues(searchFields), [searchFields])\n const searchFieldNames = useMemo(\n () => new Set(searchFields.map((field) => field.field)),\n [searchFields]\n )\n const searchSchemaSignature = useMemo(\n () =>\n JSON.stringify(\n searchFields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue\n }))\n ),\n [searchFields]\n )\n const [query, setQuery] = useState<RecordValue>(searchDefaultValues)\n const queryRef = useRef<RecordValue>(searchDefaultValues)\n const queryStateRef = useRef({\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: false\n })\n const [drawer, setDrawer] = useState<DrawerState>({ mode: 'closed' })\n const [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 const actionColumnWidth = Math.max(160, schema.table.actions.length * 80 + 32)\n configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\n fixed: 'right',\n width: actionColumnWidth,\n render: (_, record) =>\n schema.table.actions?.map((action) => (\n <ActionButton action={action} key={action.id} record={record} onExecute={handleAction} />\n ))\n })\n return configuredColumns\n }, [\n handleAction,\n registry.dictionaries,\n registry.slots,\n schema.search,\n schema.table.actions,\n schema.table.columns,\n useBestSearch\n ])\n\n const pageRequest = useMemo(\n () =>\n createLatestPageRequest(listService, (error) =>\n message.error(errorMessage(error, `${schema.title}\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n ),\n [listService, schema.title]\n )\n const rowKey = schema.table.rowKey\n const request = useCallback(\n (params: RecordValue, sort?: Record<string, unknown>) =>\n pageRequest.request(\n toBestListQuery({ ...params, ...(useBestSearch ? queryRef.current : {}) }, sort)\n ),\n [pageRequest, useBestSearch]\n )\n\n useLayoutEffect(() => {\n const previous = queryStateRef.current\n if (previous.schemaId === schema.id && previous.searchSchemaSignature === searchSchemaSignature)\n return\n\n const shouldUseDefaults = previous.schemaId !== schema.id || !previous.userTouched\n const nextQuery = shouldUseDefaults\n ? searchDefaultValues\n : Object.fromEntries(\n Object.entries(queryRef.current).filter(([field]) => searchFieldNames.has(field))\n )\n queryRef.current = nextQuery\n setQuery(nextQuery)\n queryStateRef.current = {\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: shouldUseDefaults ? false : previous.userTouched\n }\n }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature])\n\n useEffect(() => () => pageRequest.abort(), [pageRequest])\n\n const submitForm = useCallback(\n async (values: RecordValue) => {\n if (submittingRef.current) return\n const serviceKey =\n drawer.mode === 'edit' ? schema.dataSource.update : schema.dataSource.create\n if (!serviceKey) {\n message.error(`${drawer.mode === 'edit' ? '\u66F4\u65B0' : '\u521B\u5EFA'}\u670D\u52A1\u672A\u914D\u7F6E`)\n return\n }\n const service = registry.services[serviceKey]\n if (!service) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${serviceKey}`)\n return\n }\n const record = drawer.mode === 'closed' ? undefined : drawer.record\n const payloadValues =\n drawer.mode === 'edit'\n ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey)\n : projectSubmittedValues(values, formFields)\n submittingRef.current = true\n setSubmitting(true)\n try {\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues)\n : (adapter?.toCreatePayload?.(payloadValues) ?? payloadValues)\n await service(payload)\n message.success('\u4FDD\u5B58\u6210\u529F')\n setDrawer({ mode: 'closed' })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n } finally {\n setSubmitting(false)\n submittingRef.current = false\n }\n },\n [\n adapter,\n drawer,\n formFields,\n registry.services,\n rowKey,\n schema.dataSource.create,\n schema.dataSource.update\n ]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={(values) => {\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n onSearch={(values) => {\n // Keep the latest filters synchronously available to request().\n // reload() may execute before React commits a state update.\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n />\n ) : null}\n <BestTable<RecordValue, RecordValue>\n actionRef={actionRef}\n className={className}\n columns={columns}\n pagination={{ showSizeChanger: true, defaultPageSize: schema.table.pageSize ?? 20 }}\n request={request}\n rowKey={\n Array.isArray(rowKey)\n ? (record) => rowKey.map((field) => String(record[field] ?? '')).join('-')\n : rowKey\n }\n search={useBestSearch ? false : undefined}\n scroll={schema.table.scrollX ? { x: schema.table.scrollX } : undefined}\n toolBarRender={() =>\n schema.toolbar?.map((action) => (\n <ActionButton action={action} key={action.id} onExecute={handleAction} />\n )) ?? []\n }\n />\n <BestModal\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 </BestModal>\n </>\n )\n\n function ActionButton({\n action,\n record,\n onExecute\n }: {\n action: PageActionSchema\n record?: RecordValue\n onExecute: (action: PageActionSchema, record?: RecordValue) => Promise<void>\n }) {\n const permitted = !action.access || registry.access(action.access)\n if (!permitted) return null\n if (action.effect === 'slot' && action.slot) {\n return registry.slots[action.slot]?.({ record }) ?? null\n }\n return (\n <Button\n key={action.id}\n type={action.buttonType ?? 'link'}\n onClick={() => {\n void onExecute(action, record)\n }}\n >\n {action.label}\n </Button>\n )\n }\n}\n", "import type { ThemeConfig } from 'antd'\nimport { ConfigProvider } from 'antd'\nimport type { ReactNode } from 'react'\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react'\nimport type { BestListService } from '../lowcode/list'\n\nexport type BestDictionaryItem = { label: string; value: string | number; disabled?: boolean }\nexport type BestService = (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n) => Promise<unknown>\nexport type BestSlotContext = {\n pageId?: string\n tabKey?: string\n field?: string\n record?: Record<string, unknown>\n value?: unknown\n values?: Record<string, unknown>\n}\nexport type BestActionContext = BestSlotContext\nexport type BestAction = (context: BestActionContext) => void | Promise<void>\nexport type BestSlot = (context: BestSlotContext) => ReactNode\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\nexport type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {\n access?: BestRegistry['access']\n}\n\nexport type BestDictionaryActions = {\n setDictionary: (key: string, items: BestDictionaryItem[]) => void\n}\n\nconst emptyRegistry: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: () => true\n}\n\nconst defaultTheme: ThemeConfig = {\n token: {\n borderRadius: 6,\n controlHeight: 32,\n fontSize: 14\n }\n}\n\nconst BestRuntimeContext = createContext<BestRegistry>(emptyRegistry)\nconst BestDictionaryActionsContext = createContext<BestDictionaryActions | null>(null)\n\nexport function composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry {\n const result: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: emptyRegistry.access\n }\n const groups = ['listServices', 'services', 'dictionaries', 'actions', 'slots'] as const\n for (const layer of layers) {\n for (const group of groups) {\n for (const [key, value] of Object.entries(layer[group] ?? {})) {\n if (Object.hasOwn(result[group], key)) {\n throw new Error(`Registry key \u91CD\u590D\uFF1A${group}.${key}`)\n }\n result[group][key] = value as never\n }\n }\n if (layer.access) {\n const previousAccess = result.access\n result.access = (key) => previousAccess(key) && layer.access?.(key) !== false\n }\n }\n return result\n}\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return composeBestRegistry(registry)\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const [dictionaryUpdates, setDictionaryUpdates] = useState<Record<string, BestDictionaryItem[]>>({})\n const setDictionary = useCallback((key: string, items: BestDictionaryItem[]) => {\n setDictionaryUpdates((current) => ({ ...current, [key]: items }))\n }, [])\n const value = useMemo(() => {\n const next = createBestRegistry(registry)\n Object.assign(next.dictionaries, dictionaryUpdates)\n return next\n }, [dictionaryUpdates, registry])\n const mergedTheme = useMemo<ThemeConfig>(\n () => ({ ...defaultTheme, ...theme, token: { ...defaultTheme.token, ...theme?.token } }),\n [theme]\n )\n return (\n <BestRuntimeContext.Provider value={value}>\n <ConfigProvider theme={mergedTheme}>\n <BestDictionaryActionsContext.Provider value={{ setDictionary }}>\n {children}\n </BestDictionaryActionsContext.Provider>\n </ConfigProvider>\n </BestRuntimeContext.Provider>\n )\n}\n\nexport function useBestRegistry() {\n return useContext(BestRuntimeContext)\n}\n\nexport function useBestService(key: string): BestService {\n const service = useBestRegistry().services[key]\n if (!service) throw new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${key}`)\n return service\n}\n\nexport function useBestListService(key: string): BestListService | undefined {\n return useBestRegistry().listServices[key]\n}\n\nexport function useBestAccess(key?: string): boolean {\n const registry = useBestRegistry()\n return key ? registry.access(key) : true\n}\n\nexport function useBestDictionary(key?: string): BestDictionaryItem[] {\n const dictionaries = useBestRegistry().dictionaries\n return key ? (dictionaries[key] ?? []) : []\n}\n\nexport function useBestDictionaryActions(): BestDictionaryActions {\n const actions = useContext(BestDictionaryActionsContext)\n if (!actions) throw new Error('useBestDictionaryActions \u5FC5\u987B\u5728 BestProvider \u5185\u4F7F\u7528')\n return actions\n}\n\nexport function useBestAction(key: string): BestAction {\n const action = useBestRegistry().actions[key]\n if (!action) throw new Error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${key}`)\n return action\n}\n", "import { Input } from 'antd'\nimport type { TextAreaProps } from 'antd/es/input'\nimport { useImperativeHandle, useMemo, useState } from 'react'\n\nexport type BestBatchInputRef = {\n getParsedValue: () => string[][]\n}\n\nexport type BestBatchInputProps = Omit<TextAreaProps, 'onChange'> & {\n ref?: React.Ref<BestBatchInputRef>\n separator?: string\n onChange?: (value: string, parsed: string[][]) => void\n}\n\nfunction parse(value: string, separator: string) {\n const escaped = separator.replace(/[\\\\\\]\\-^]/g, '\\\\$&')\n const delimiter = new RegExp(`[${escaped}]`)\n return value\n .split('\\n')\n .map((row) => row.trim())\n .filter(Boolean)\n .map((row) => row.split(delimiter).map((cell) => cell.trim()))\n}\n\nexport function BestBatchInput({\n ref,\n separator = '|',\n value,\n defaultValue,\n onChange,\n ...props\n}: BestBatchInputProps) {\n const [innerValue, setInnerValue] = useState(String(defaultValue ?? ''))\n const currentValue = value == null ? innerValue : String(value)\n const parsed = useMemo(() => parse(currentValue, separator), [currentValue, separator])\n\n useImperativeHandle(ref, () => ({ getParsedValue: () => parsed }), [parsed])\n\n return (\n <Input.TextArea\n {...props}\n value={currentValue}\n onChange={(event) => {\n const nextValue = event.target.value\n if (value == null) setInnerValue(nextValue)\n onChange?.(nextValue, parse(nextValue, separator))\n }}\n />\n )\n}\n", "import { Descriptions } 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 type { FormRule } from 'antd'\nimport { Button, DatePicker, Form, Input, InputNumber, Select, Space } from 'antd'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormMode } from '../lowcode/schema'\nimport { useBestRegistry } from '../runtime'\nimport type { BestFieldDefinition, BestFieldRule, BestOption } from './types'\n\nexport type BestFormProps = {\n fields: BestFieldDefinition[]\n initialValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n mode?: FormMode\n onSubmit: (value: Record<string, unknown>) => void\n onCancel?: () => void\n}\n\ntype FormControlProps = {\n field: BestFieldDefinition\n values: Record<string, unknown>\n scopeValues?: Record<string, unknown>\n namePath?: string | number | (string | number)[]\n value?: unknown\n onChange?: (...args: unknown[]) => void\n} & Record<string, unknown>\n\nfunction toNamePath(path?: string | number | (string | number)[]) {\n return path === undefined ? [] : Array.isArray(path) ? path : [path]\n}\n\nfunction isNamePath(value: string | number | (string | number)[]) {\n return Array.isArray(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return false\n }\n if (dayjs.isDayjs(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction appendNamePath(\n path: string | number | (string | number)[] | undefined,\n ...segments: (string | number)[]\n) {\n return [...toNamePath(path), ...segments]\n}\n\nfunction getConditionFieldValue(values: Record<string, unknown>, field: string) {\n if (Object.hasOwn(values, field)) return values[field]\n return getPathValue(values, field.split('.'))\n}\n\nfunction getScopedValues(values: Record<string, unknown>, itemPath: (string | number)[]) {\n const itemValues = getPathValue(values, itemPath)\n return isRecord(itemValues) ? { ...values, ...itemValues } : values\n}\n\nfunction isFieldVisible(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n}\n\nfunction resolveFieldDisabled(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return (\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n )\n}\n\nfunction toDayjsValue(value: unknown): Dayjs | null {\n if (dayjs.isDayjs(value)) return value\n if (value instanceof Date) return dayjs(value)\n if (typeof value === 'number') {\n const normalized = Math.abs(value) >= 1_000_000_000_000 ? value : value * 1000\n const parsed = dayjs(normalized)\n return parsed.isValid() ? parsed : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = dayjs(trimmed)\n return parsed.isValid() ? parsed : null\n }\n return null\n}\n\nexport function toDatePickerValue(value: unknown): Dayjs | null {\n return toDayjsValue(value)\n}\n\nexport function toDateRangePickerValue(value: unknown): [Dayjs | null, Dayjs | null] | null {\n if (!Array.isArray(value)) return null\n const nextValue: [Dayjs | null, Dayjs | null] = [toDayjsValue(value[0]), toDayjsValue(value[1])]\n return nextValue[0] || nextValue[1] ? nextValue : null\n}\n\nexport function serializeDatePickerValue(_: Dayjs | null, dateString: string) {\n return dateString || undefined\n}\n\nexport function serializeDateRangePickerValue(\n _: [Dayjs | null, Dayjs | null] | null,\n dateStrings: [string, string]\n) {\n return dateStrings[0] || dateStrings[1] ? dateStrings : undefined\n}\n\nfunction fieldSignature(field: BestFieldDefinition): unknown {\n return {\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n itemFields: field.itemFields?.map((itemField) => fieldSignature(itemField))\n }\n}\n\nfunction FormControl({\n field,\n values,\n scopeValues,\n mode = 'create',\n form,\n namePath,\n value,\n onChange,\n ...controlProps\n}: FormControlProps & { mode?: FormMode; form: ReturnType<typeof Form.useForm>[0] }) {\n const registry = useBestRegistry()\n const renderValues = scopeValues ?? values\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value !== undefined ? value : getPathValue(values, namePath ?? field.field)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n onChange={(nextValue) => {\n if (onChange) onChange(nextValue)\n else form.setFieldValue(namePath ?? field.field, nextValue)\n }}\n registry={registry}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n case 'slot':\n return (\n <>\n {field.render?.({\n field: field.field,\n values: renderValues,\n value: value !== undefined ? value : getPathValue(values, namePath ?? field.field),\n mode,\n disabled: field.disabled,\n setValue: (name, nextValue) =>\n form.setFieldValue(\n namePath\n ? isNamePath(name)\n ? name\n : [...toNamePath(namePath).slice(0, -1), name]\n : name,\n nextValue\n )\n })}\n </>\n )\n case 'repeatable':\n return (\n <RepeatableField\n field={field}\n form={form}\n mode={mode}\n namePath={namePath}\n values={values}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction RepeatableField({\n field,\n form,\n mode,\n namePath,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n mode: FormMode\n namePath?: string | number | (string | number)[]\n values: Record<string, unknown>\n}) {\n const listName = namePath ?? field.field\n return (\n <Form.List name={listName}>\n {(items, { add, remove }) => (\n <>\n {items.map((item) => (\n <RepeatableFieldRow\n key={item.key}\n field={field}\n form={form}\n itemCount={items.length}\n itemName={item.name}\n itemKey={item.key}\n listName={listName}\n mode={mode}\n remove={remove}\n values={values}\n />\n ))}\n <Button\n disabled={field.maxItems !== undefined && items.length >= field.maxItems}\n onClick={() => add(resolveInitialValues(field.itemFields ?? [], undefined))}\n type='dashed'\n >\n \u65B0\u589E\u4E00\u9879\n </Button>\n </>\n )}\n </Form.List>\n )\n}\n\nfunction RepeatableFieldRow({\n field,\n form,\n itemCount,\n itemName,\n itemKey,\n listName,\n mode,\n remove,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n itemCount: number\n itemName: number\n itemKey: React.Key\n listName: string | number | (string | number)[]\n mode: FormMode\n remove: (index: number) => void\n values: Record<string, unknown>\n}) {\n const itemPath = appendNamePath(listName, itemName)\n const itemValues = getPathValue(values, itemPath)\n const scopeValues = getScopedValues(values, itemPath)\n\n useEffect(() => {\n field.itemFields?.forEach((itemField) => {\n if (!itemField.clearWhenHidden) return\n const nextPath = appendNamePath(itemPath, itemField.field)\n if (\n !isFieldVisible(itemField, scopeValues, mode) &&\n getPathValue(values, nextPath) !== undefined\n ) {\n form.setFieldValue(nextPath, undefined)\n }\n })\n }, [field.itemFields, form, itemPath, mode, scopeValues, values])\n\n return (\n <Space key={itemKey} align='start'>\n {field.itemFields?.map((itemField) => {\n if (!isFieldVisible(itemField, scopeValues, mode)) return null\n const nextPath = appendNamePath(itemPath, itemField.field)\n return (\n <Form.Item\n key={itemField.field}\n label={itemField.label}\n name={[itemName, itemField.field]}\n rules={toAntRules(itemField.rules)}\n >\n <FormControl\n field={{\n ...itemField,\n disabled: resolveFieldDisabled(itemField, scopeValues, mode)\n }}\n form={form}\n mode={mode}\n namePath={nextPath}\n scopeValues={scopeValues}\n values={isRecord(itemValues) ? { ...values, ...itemValues } : values}\n />\n </Form.Item>\n )\n })}\n <Button\n disabled={itemCount <= (field.minItems ?? 0)}\n onClick={() => remove(itemName)}\n type='link'\n >\n \u5220\u9664\n </Button>\n </Space>\n )\n}\n\ntype FormFieldsProps = Pick<BestFormProps, 'fields' | 'initialValues' | 'mode'> & {\n form: ReturnType<typeof Form.useForm>[0]\n}\n\nfunction FormFields({ fields, form, initialValues, mode = 'create' }: FormFieldsProps) {\n const values =\n (Form.useWatch([], { form, preserve: true }) as Record<string, unknown> | undefined) ??\n initialValues ??\n {}\n const isVisible = (field: BestFieldDefinition) =>\n !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n useEffect(() => {\n fields\n .filter((field) => field.clearWhenHidden && !isVisible(field))\n .forEach((field) => {\n if (values[field.field] !== undefined) form.setFieldValue(field.field, undefined)\n })\n }, [fields, form, mode, values])\n return (\n <>\n {fields\n .filter((field) => isVisible(field))\n .map((field) => {\n const control = (\n <FormControl\n key={field.field}\n field={{\n ...field,\n disabled:\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n }}\n form={form}\n mode={mode}\n values={values}\n />\n )\n return field.component === 'repeatable' ? (\n <Form.Item key={field.field} label={field.label}>\n {control}\n </Form.Item>\n ) : (\n <Form.Item\n key={field.field}\n label={field.label}\n name={field.field}\n rules={toAntRules(field.rules)}\n >\n {control}\n </Form.Item>\n )\n })}\n </>\n )\n}\n\nexport function toAntRules(rules: BestFieldRule[] | undefined): FormRule[] | undefined {\n return rules?.map(\n (rule) =>\n Object.fromEntries(\n Object.entries({\n required: rule.required,\n type: rule.type === 'string' ? undefined : rule.type,\n min: rule.min ?? rule.minLength,\n max: rule.max ?? rule.maxLength,\n pattern: safeRegExp(rule.pattern),\n message: rule.message,\n validator:\n rule.type === 'integer'\n ? async (_: unknown, value: unknown) => {\n if (value === undefined || value === null || value === '') return\n if (!Number.isInteger(Number(value)))\n throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\n }).filter(([, value]) => value !== undefined)\n ) as FormRule\n )\n}\n\nfunction safeRegExp(pattern: string | undefined) {\n if (!pattern) return undefined\n try {\n return new RegExp(pattern)\n } catch {\n return undefined\n }\n}\n\nexport function RemoteSelect({\n field,\n value,\n disabled,\n placeholder,\n onChange,\n registry\n}: {\n field: BestFieldDefinition\n value?: unknown\n disabled?: boolean\n placeholder?: string\n onChange: (value: unknown) => void\n registry: ReturnType<typeof useBestRegistry>\n}) {\n const [keywordOptions, setKeywordOptions] = useState<BestOption[]>([])\n const [selectedOptions, setSelectedOptions] = useState<BestOption[]>([])\n const [loading, setLoading] = useState(false)\n const [keyword, setKeyword] = useState('')\n const keywordRequestId = useRef(0)\n const selectedRequestId = useRef(0)\n const service = field.remoteService ? registry.services[field.remoteService] : undefined\n const labelField = field.labelField ?? 'label'\n const valueField = field.valueField ?? 'value'\n const searchField = field.searchField ?? 'keyword'\n const debounceMs = field.debounceMs ?? 300\n const pageSize = field.pageSize ?? 20\n\n const parseOptions = (response: unknown): BestOption[] => {\n const raw = Array.isArray(response)\n ? response\n : ((response as { items?: unknown[]; list?: unknown[] })?.items ??\n (response as { list?: unknown[] })?.list ??\n [])\n return raw.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const record = item as Record<string, unknown>\n const optionValue = record[valueField]\n if (typeof optionValue !== 'string' && typeof optionValue !== 'number') return []\n return [\n {\n label: String(record[labelField] ?? optionValue ?? ''),\n value: optionValue,\n disabled: Boolean(record.disabled)\n }\n ]\n })\n }\n\n const mergeOptions = (base: BestOption[], extra: BestOption[]) => {\n const merged = new Map(base.map((item) => [String(item.value), item]))\n extra.forEach((item) => {\n merged.set(String(item.value), item)\n })\n return [...merged.values()]\n }\n\n const options = useMemo(\n () => mergeOptions(keywordOptions, selectedOptions),\n [keywordOptions, selectedOptions]\n )\n\n useEffect(() => {\n const currentRequestId = ++keywordRequestId.current\n if (!service) {\n setKeywordOptions([])\n setLoading(false)\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === keywordRequestId.current && !controller.signal.aborted\n const timer = window.setTimeout(async () => {\n setLoading(true)\n try {\n const response = await service(\n { [searchField]: keyword, page: 1, pageSize },\n { signal: controller.signal }\n )\n if (isCurrent()) setKeywordOptions(parseOptions(response))\n } catch {\n if (isCurrent()) setKeywordOptions([])\n } finally {\n if (isCurrent()) setLoading(false)\n }\n }, debounceMs)\n return () => {\n window.clearTimeout(timer)\n controller.abort()\n }\n }, [debounceMs, keyword, labelField, pageSize, searchField, service, valueField])\n\n useEffect(() => {\n const currentRequestId = ++selectedRequestId.current\n if (!service) {\n setSelectedOptions([])\n return\n }\n if (value === undefined || value === null || value === '') {\n setSelectedOptions([])\n return\n }\n if (typeof value !== 'string' && typeof value !== 'number') {\n setSelectedOptions([])\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === selectedRequestId.current && !controller.signal.aborted\n const fallbackOption: BestOption = {\n label: String(value),\n value: value as string | number\n }\n setSelectedOptions([fallbackOption])\n void service({ [valueField]: value, page: 1, pageSize }, { signal: controller.signal })\n .then((response) => {\n if (!isCurrent()) return\n const resolvedOptions = parseOptions(response)\n if (resolvedOptions.length) {\n setSelectedOptions(mergeOptions([fallbackOption], resolvedOptions))\n }\n })\n .catch(() => undefined)\n return () => {\n controller.abort()\n }\n }, [labelField, pageSize, service, value, valueField])\n\n return (\n <Select\n showSearch\n filterOption={false}\n loading={loading}\n value={value}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n onSearch={setKeyword}\n onChange={onChange}\n />\n )\n}\n\nexport function BestForm({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps) {\n const resolvedInitialValues = useMemo(\n () => resolveInitialValues(fields, initialValues),\n [fields, initialValues]\n )\n const formSignature = useMemo(\n () =>\n JSON.stringify([mode, fields.map((field) => fieldSignature(field)), resolvedInitialValues]),\n [fields, mode, resolvedInitialValues]\n )\n return (\n <BestFormBody\n key={formSignature}\n extra={extra}\n fields={fields}\n initialValues={resolvedInitialValues}\n loading={loading}\n mode={mode}\n onCancel={onCancel}\n onSubmit={onSubmit}\n submitText={submitText}\n />\n )\n}\n\nfunction BestFormBody({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n return (\n <Form form={form} initialValues={initialValues} layout='vertical' onFinish={onSubmit}>\n <FormFields fields={fields} form={form} initialValues={initialValues} mode={mode} />\n <Space>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n {onCancel ? <Button onClick={onCancel}>\u53D6\u6D88</Button> : null}\n {extra}\n </Space>\n </Form>\n )\n}\n\nexport function getDefaultValues(fields: BestFieldDefinition[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field) => field.defaultValue !== undefined)\n .map((field) => [field.field, field.defaultValue])\n )\n}\n\nfunction resolveInitialValues(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown> | undefined\n) {\n const values = mergeDefinedValues(getDefaultValues(fields), initialValues)\n const resolvedValues = { ...values }\n fields.forEach((field) => {\n if (field.component !== 'repeatable' || !field.itemFields) return\n const items: unknown[] = Array.isArray(resolvedValues[field.field])\n ? (resolvedValues[field.field] as unknown[])\n : []\n resolvedValues[field.field] = items.map((item) =>\n resolveInitialValues(field.itemFields ?? [], isRecord(item) ? item : {})\n )\n })\n return resolvedValues\n}\n\nexport function mergeDefinedValues(\n baseValues: Record<string, unknown>,\n nextValues: Record<string, unknown> | undefined\n) {\n const mergedValues = { ...baseValues }\n Object.entries(nextValues ?? {}).forEach(([key, value]) => {\n if (value === undefined) return\n const currentValue = mergedValues[key]\n if (isRecord(currentValue) && isRecord(value)) {\n mergedValues[key] = mergeDefinedValues(currentValue, value)\n return\n }\n mergedValues[key] = value\n })\n return mergedValues\n}\n\nfunction getPathValue(\n values: Record<string, unknown>,\n path: string | number | (string | number)[]\n) {\n const parts = Array.isArray(path) ? path : [path]\n return parts.reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as Record<string, unknown>)[part]\n return undefined\n }, values)\n}\n\nexport function evaluateCondition(\n condition: NonNullable<BestFieldDefinition['visibleWhen']>,\n values: Record<string, unknown>,\n mode: FormMode\n): boolean {\n switch (condition.operator) {\n case 'equals':\n return getConditionFieldValue(values, condition.field) === condition.value\n case 'notEmpty':\n return (\n getConditionFieldValue(values, condition.field) !== undefined &&\n getConditionFieldValue(values, condition.field) !== null &&\n getConditionFieldValue(values, condition.field) !== ''\n )\n case 'modeEquals':\n return mode === condition.value\n case 'and':\n return condition.conditions.every((item) => evaluateCondition(item, values, mode))\n case 'or':\n return condition.conditions.some((item) => evaluateCondition(item, values, mode))\n case 'not':\n return !evaluateCondition(condition.condition, values, mode)\n }\n}\n", "import type { TableColumnsType } from 'antd'\nimport { Table } from 'antd'\n\nexport type BestLightTableColumn<T extends Record<string, unknown>> = {\n field: keyof T & string\n title: string\n width?: number\n render?: (value: unknown, record: T, index: number) => React.ReactNode\n}\n\nexport type BestLightTableProps<T extends Record<string, unknown>> = {\n columns: BestLightTableColumn<T>[]\n data: T[]\n rowKey?: string\n}\n\nexport function BestLightTable<T extends Record<string, unknown>>({\n columns,\n data,\n rowKey\n}: BestLightTableProps<T>) {\n const tableColumns: TableColumnsType<T> = columns.map((column) => ({\n dataIndex: column.field,\n key: column.field,\n title: column.title,\n width: column.width,\n render: column.render\n }))\n return (\n <Table\n columns={tableColumns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n size='small'\n />\n )\n}\n", "import { Drawer, Modal } from 'antd'\nimport type { ReactNode } from 'react'\n\ntype OverlayProps = {\n children: ReactNode\n open: boolean\n title: ReactNode\n onClose: () => void\n}\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'\nimport './BestSearch.module.less'\n\nexport type BestSearchProps = {\n fields: BestFieldDefinition[]\n value?: Record<string, unknown>\n defaultValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n onChange?: (value: Record<string, unknown>) => void\n onSearch: (value: Record<string, unknown>) => void\n onReset?: (value: Record<string, unknown>) => void\n}\n\ntype FieldControlProps = {\n field: BestFieldDefinition\n value?: unknown\n onChange?: (value: unknown) => void\n} & Record<string, unknown>\n\nfunction searchFormSignature(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown>\n) {\n return JSON.stringify([\n fields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize\n })),\n initialValues\n ])\n}\n\nfunction FieldControl({ field, value, onChange, ...controlProps }: FieldControlProps) {\n const registry = useBestRegistry()\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value as never}\n onChange={onChange ?? (() => undefined)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n registry={registry}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction syncValues(\n form: FormInstance,\n value: Record<string, unknown>,\n fields: BestFieldDefinition[]\n) {\n form.setFieldsValue(Object.fromEntries(fields.map((field) => [field.field, undefined])) as never)\n form.setFieldsValue(value as never)\n}\n\nexport function BestSearch({\n fields,\n value,\n defaultValues,\n loading,\n submitText = '\u67E5\u8BE2',\n extra,\n onChange,\n onSearch,\n onReset\n}: BestSearchProps) {\n const initialValues = useMemo(\n () => mergeDefinedValues(getDefaultValues(fields), defaultValues),\n [fields, defaultValues]\n )\n return (\n <BestSearchBody\n key={searchFormSignature(fields, initialValues)}\n extra={extra}\n fields={fields}\n initialValues={initialValues}\n loading={loading}\n onChange={onChange}\n onReset={onReset}\n onSearch={onSearch}\n submitText={submitText}\n value={value}\n />\n )\n}\n\nfunction BestSearchBody({\n fields,\n value,\n initialValues,\n loading,\n submitText,\n extra,\n onChange,\n onSearch,\n onReset\n}: Omit<BestSearchProps, 'defaultValues'> & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n const valueSignatureRef = useRef<string | undefined>(undefined)\n const controlledRef = useRef(false)\n\n useEffect(() => {\n if (value === undefined) {\n if (controlledRef.current) {\n syncValues(form, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n controlledRef.current = false\n }\n return\n }\n controlledRef.current = true\n const signature = JSON.stringify(value)\n if (valueSignatureRef.current === signature) return\n syncValues(form, value, fields)\n valueSignatureRef.current = signature\n }, [fields, form, value])\n\n return (\n <Form\n form={form}\n initialValues={initialValues}\n layout='vertical'\n onFinish={(values) => onSearch(values as Record<string, unknown>)}\n onValuesChange={(_, values) => onChange?.(values as Record<string, unknown>)}\n className='best-lowcode-search'\n >\n <Row gutter={16} align='bottom'>\n {fields\n .filter((field) => !field.hidden)\n .map((field) => (\n <Col key={field.field} span={field.span ?? 6}>\n <Form.Item label={field.label} name={field.field} rules={toAntRules(field.rules)}>\n <FieldControl field={field} />\n </Form.Item>\n </Col>\n ))}\n <Col>\n <Form.Item>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n <Button\n onClick={() => {\n syncValues(form, initialValues, fields)\n valueSignatureRef.current = JSON.stringify(initialValues)\n onChange?.(initialValues)\n onReset?.(initialValues)\n }}\n style={{ marginInlineStart: 8 }}\n >\n \u91CD\u7F6E\n </Button>\n {extra}\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )\n}\n", "import { Empty, Result, Spin } from 'antd'\n\nexport function BestLoading({ description = '\u52A0\u8F7D\u4E2D' }: { description?: string }) {\n return (\n <div style={{ display: 'grid', minHeight: 160, placeItems: 'center' }}>\n <Spin tip={description} />\n </div>\n )\n}\n\nexport function BestEmpty({ description = '\u6682\u65E0\u6570\u636E' }: { description?: string }) {\n return <Empty description={description} />\n}\n\nexport function BestError({ description = '\u52A0\u8F7D\u5931\u8D25' }: { description?: string }) {\n return <Result status='error' title={description} />\n}\n", "import {\n type ParamsType,\n ProTable,\n type ProTableProps,\n type RequestData\n} from '@ant-design/pro-components'\nimport type { TableProps } from 'antd'\nimport type { ReactNode } from 'react'\nimport './BestTable.module.less'\n\nexport type BestTableColumn<T extends Record<string, unknown>> = NonNullable<\n ProTableProps<T, ParamsType>['columns']\n>[number]\n\nexport type BestTableProps<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n> = Omit<ProTableProps<DataSource, Params, ValueType>, 'columns'> & {\n columns?:\n | ProTableProps<DataSource, Params, ValueType>['columns']\n | TableProps<DataSource>['columns']\n emptyText?: ReactNode\n}\n\nconst defaultSearch: NonNullable<ProTableProps<Record<string, unknown>, ParamsType>['search']> = {\n layout: 'vertical',\n labelWidth: 'auto',\n defaultCollapsed: false,\n collapseRender: false,\n span: 6\n}\n\nfunction mergeSearch<T>(defaults: T, value: T | false | undefined): T | false {\n if (value === false) return false\n return { ...(defaults as object), ...((value ?? {}) as object) } as T\n}\n\nexport function BestTable<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n>({\n columns,\n cardProps,\n className,\n search,\n emptyText = '\u6682\u65E0\u6570\u636E',\n ...props\n}: BestTableProps<DataSource, Params, ValueType>) {\n return (\n <ProTable<DataSource, Params, ValueType>\n {...props}\n className={['best-lowcode-table', className].filter(Boolean).join(' ')}\n columns={columns as ProTableProps<DataSource, Params, ValueType>['columns']}\n options={false}\n search={mergeSearch(defaultSearch, search as typeof defaultSearch | false | undefined)}\n cardProps={\n cardProps === false\n ? false\n : {\n ...cardProps,\n styles: {\n ...cardProps?.styles,\n body: { ...cardProps?.styles?.body, padding: 12 }\n }\n }\n }\n locale={{ emptyText }}\n />\n )\n}\n\nexport type { RequestData }\n", "import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc.js'\nimport type { BestListQuery, BestListService } from './list'\nimport type { TableColumnSchema } from './schema'\n\ndayjs.extend(utc)\n\ntype ProTablePageResponse = { data: Record<string, unknown>[]; success: boolean; total: number }\n\nexport function toBestListQuery(\n params: Record<string, unknown>,\n sort?: Record<string, unknown>\n): BestListQuery {\n const { current, pageSize, ...filters } = params\n const normalizedSort = Object.fromEntries(\n Object.entries(sort ?? {}).filter(\n (entry): entry is [string, 'ascend' | 'descend'] =>\n entry[1] === 'ascend' || entry[1] === 'descend'\n )\n )\n return {\n page: typeof current === 'number' && current > 0 ? current : 1,\n pageSize: typeof pageSize === 'number' && pageSize > 0 ? pageSize : 20,\n filters,\n ...(Object.keys(normalizedSort).length ? { sort: normalizedSort } : {})\n }\n}\n\nexport function formatCrudValue(value: unknown, format: TableColumnSchema['format']): string {\n if (value == null || value === '') return '-'\n if (!format || format === 'text') return String(value)\n if (format === 'money') {\n const amount = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(amount)\n ? new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount)\n : String(value)\n }\n if (typeof value !== 'string' && typeof value !== 'number' && !(value instanceof Date)) {\n return String(value)\n }\n let timestamp: string | number | Date = value\n if (typeof value === 'number' || typeof value === 'string') {\n const numericValue = typeof value === 'number' ? value : Number(value.trim())\n timestamp =\n Number.isFinite(numericValue) && numericValue !== 0\n ? Math.abs(numericValue) >= 1_000_000_000_000\n ? numericValue\n : numericValue * 1000\n : value\n }\n const date = dayjs.utc(timestamp)\n if (!date.isValid()) return String(value)\n return date.format(format === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')\n}\n\nexport function errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback\n}\n\nexport function isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted || (error instanceof DOMException && error.name === 'AbortError')\n}\n\nexport async function confirmBeforeAction(\n content: string | undefined,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n return !content || confirm(content)\n}\n\nexport async function removeCrudRecord(\n record: Record<string, unknown>,\n service: (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ) => Promise<unknown>,\n content: string,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n if (!(await confirmBeforeAction(content, confirm))) return false\n await service(record)\n return true\n}\n\nexport function createLatestPageRequest(\n service: BestListService,\n onError: (error: unknown) => void\n) {\n let sequence = 0\n let controller: AbortController | undefined\n let latest: ProTablePageResponse = { data: [], success: false, total: 0 }\n\n return {\n async request(query: BestListQuery): Promise<ProTablePageResponse> {\n controller?.abort()\n controller = new AbortController()\n const currentController = controller\n const currentSequence = ++sequence\n try {\n const response = await service(query, { signal: currentController.signal })\n const pageResponse: ProTablePageResponse = {\n data: response.items,\n success: true,\n total: response.total\n }\n if (currentSequence !== sequence) return latest\n latest = pageResponse\n return pageResponse\n } catch (error) {\n if (currentSequence !== sequence || isAbortError(error, currentController.signal))\n return latest\n onError(error)\n return { data: [], success: false, total: 0 }\n }\n },\n abort() {\n controller?.abort()\n }\n }\n}\n", "import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\nexport const TABBED_PAGE_SCHEMA_ID = 'https://best.dev/schema/tabs/v1' as const\nexport const TABBED_PAGE_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n\nexport type TabContentSchema =\n | { type: 'crud'; schema: CrudPageSchema }\n | { type: 'slot'; slot: string }\n\nexport type TabSchema = {\n key: string\n label: string\n access?: string\n /** Defaults to true so inactive CRUD pages do not fetch until selected. */\n destroyOnHidden?: boolean\n content: TabContentSchema\n}\n\n/** A page composition schema with runtime-owned tab navigation. */\nexport type TabbedPageSchema = {\n $schema: typeof TABBED_PAGE_SCHEMA_ID\n version: typeof TABBED_PAGE_SCHEMA_VERSION\n id: string\n kind: 'tabs'\n tabs: TabSchema[]\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema,\n TABBED_PAGE_SCHEMA_ID,\n TABBED_PAGE_SCHEMA_VERSION,\n type TabbedPageSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot'\n])\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.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n !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\nexport function validateTabbedPageSchema(\n schema: TabbedPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`)\n if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {\n push(diagnostics, '/tabs', 'tabs.required', '\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E')\n return { valid: false, diagnostics }\n }\n const keys = new Set<string>()\n schema.tabs.forEach((tab, index) => {\n const path = `/tabs/${index}`\n if (!tab.key) push(diagnostics, path, 'tab.key', '\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A')\n if (keys.has(tab.key)) push(diagnostics, path, 'tab.duplicate', `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`)\n keys.add(tab.key)\n if (!tab.label) push(diagnostics, path, 'tab.label', '\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (tab.content.type === 'crud') {\n const result = validateCrudPageSchema(tab.content.schema, registry)\n diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })))\n } else if (tab.content.type === 'slot') {\n if (!tab.content.slot) push(diagnostics, path, 'tab.slot', 'slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key')\n if (tab.content.slot && registry && !registry.slots[tab.content.slot])\n push(diagnostics, path, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`)\n } else {\n push(diagnostics, path, 'tab.content', '\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B')\n }\n })\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry) {\n const result = validateTabbedPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import { Tabs } from 'antd'\nimport { useBestRegistry } from '../runtime'\nimport { BestCrudPage } from './BestCrudPage'\nimport type { TabbedPageSchema } from './schema'\nimport { assertValidTabbedPageSchema } from './validate'\n\nexport type BestTabbedPageProps = {\n className?: string\n schema: TabbedPageSchema\n}\n\n/** Renders declarative tabs whose contents are either a CRUD schema or a registered slot. */\nexport function BestTabbedPage({ className, schema }: BestTabbedPageProps) {\n const registry = useBestRegistry()\n assertValidTabbedPageSchema(schema, registry)\n const items = schema.tabs\n .filter((tab) => !tab.access || registry.access(tab.access))\n .map((tab) => ({\n key: tab.key,\n label: tab.label,\n destroyOnHidden: tab.destroyOnHidden,\n children:\n tab.content.type === 'crud' ? (\n <BestCrudPage schema={tab.content.schema} />\n ) : (\n registry.slots[tab.content.slot]?.({ pageId: schema.id, tabKey: tab.key }) ?? null\n )\n }))\n return <Tabs className={className} items={items} />\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Button", "Modal", "dayjs", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useMemo", "useState", "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", "useCallback", "query", "useRef", "useMemo", "useState", "useEffect", "Button", "jsx"]
7
7
  }
@@ -40,6 +40,9 @@ export type BestProviderProps = {
40
40
  export type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {
41
41
  access?: BestRegistry['access'];
42
42
  };
43
+ export type BestDictionaryActions = {
44
+ setDictionary: (key: string, items: BestDictionaryItem[]) => void;
45
+ };
43
46
  export declare function composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry;
44
47
  export declare function createBestRegistry(registry?: BestProviderProps['registry']): BestRegistry;
45
48
  export declare function BestProvider({ children, registry, theme }: BestProviderProps): import("react").JSX.Element;
@@ -48,5 +51,6 @@ export declare function useBestService(key: string): BestService;
48
51
  export declare function useBestListService(key: string): BestListService | undefined;
49
52
  export declare function useBestAccess(key?: string): boolean;
50
53
  export declare function useBestDictionary(key?: string): BestDictionaryItem[];
54
+ export declare function useBestDictionaryActions(): BestDictionaryActions;
51
55
  export declare function useBestAction(key: string): BestAction;
52
56
  //# sourceMappingURL=BestProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BestProvider.d.ts","sourceRoot":"","sources":["../../src/runtime/BestProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BestProvider.d.ts","sourceRoot":"","sources":["../../src/runtime/BestProvider.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export type { BestListQuery, BestListResult, BestListService } from '../lowcode/list';
2
- export type { BestAction, BestActionContext, BestDictionaryItem, BestProviderProps, BestRegistry, BestRegistryLayer, BestService, BestSlot, BestSlotContext } from './BestProvider';
3
- export { BestProvider, composeBestRegistry, createBestRegistry, useBestAccess, useBestAction, useBestDictionary, useBestListService, useBestRegistry, useBestService } from './BestProvider';
2
+ export type { BestAction, BestActionContext, BestDictionaryActions, BestDictionaryItem, BestProviderProps, BestRegistry, BestRegistryLayer, BestService, BestSlot, BestSlotContext } from './BestProvider';
3
+ export { BestProvider, composeBestRegistry, createBestRegistry, useBestAccess, useBestAction, useBestDictionary, useBestDictionaryActions, useBestListService, useBestRegistry, useBestService } from './BestProvider';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrF,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,eAAe,EAChB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACf,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrF,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,eAAe,EAChB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACf,MAAM,gBAAgB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-lowcode-runtime",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "BEST React low-code runtime, CRUD page renderer, and UI components.",
5
5
  "keywords": [
6
6
  "best",
@@ -30,12 +30,6 @@
30
30
  },
31
31
  "./style.css": "./dist/index.css"
32
32
  },
33
- "scripts": {
34
- "build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
35
- "check": "tsc -p tsconfig.json --noEmit",
36
- "prepack": "pnpm run build",
37
- "test": "vitest run"
38
- },
39
33
  "peerDependencies": {
40
34
  "@ant-design/pro-components": "^3.1.5-0",
41
35
  "antd": "^6.2.1",
@@ -52,5 +46,10 @@
52
46
  "publishConfig": {
53
47
  "access": "public",
54
48
  "registry": "https://registry.npmjs.org/"
49
+ },
50
+ "scripts": {
51
+ "build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
52
+ "check": "tsc -p tsconfig.json --noEmit",
53
+ "test": "vitest run"
55
54
  }
56
- }
55
+ }