@tianyr/schema-antd 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +188 -2
- package/dist/SchemaField.d.ts +15 -0
- package/dist/SchemaField.d.ts.map +1 -0
- package/dist/SchemaField.js +107 -0
- package/dist/SchemaField.js.map +1 -0
- package/dist/SchemaForm.d.ts +22 -0
- package/dist/SchemaForm.d.ts.map +1 -0
- package/dist/SchemaForm.js +19 -0
- package/dist/SchemaForm.js.map +1 -0
- package/dist/TableFooter.d.ts +38 -0
- package/dist/TableFooter.d.ts.map +1 -0
- package/dist/TableFooter.js +16 -0
- package/dist/TableFooter.js.map +1 -0
- package/dist/biz-select/BizSelect.d.ts +3 -0
- package/dist/biz-select/BizSelect.d.ts.map +1 -0
- package/dist/biz-select/BizSelect.js +87 -0
- package/dist/biz-select/BizSelect.js.map +1 -0
- package/dist/biz-select/BizSelectDisplay.d.ts +3 -0
- package/dist/biz-select/BizSelectDisplay.d.ts.map +1 -0
- package/dist/biz-select/BizSelectDisplay.js +58 -0
- package/dist/biz-select/BizSelectDisplay.js.map +1 -0
- package/dist/biz-select/cache.d.ts +16 -0
- package/dist/biz-select/cache.d.ts.map +1 -0
- package/dist/biz-select/cache.js +130 -0
- package/dist/biz-select/cache.js.map +1 -0
- package/dist/biz-select/compile.d.ts +25 -0
- package/dist/biz-select/compile.d.ts.map +1 -0
- package/dist/biz-select/compile.js +82 -0
- package/dist/biz-select/compile.js.map +1 -0
- package/dist/biz-select/factories.d.ts +23 -0
- package/dist/biz-select/factories.d.ts.map +1 -0
- package/dist/biz-select/factories.js +17 -0
- package/dist/biz-select/factories.js.map +1 -0
- package/dist/biz-select/format.d.ts +48 -0
- package/dist/biz-select/format.d.ts.map +1 -0
- package/dist/biz-select/format.js +110 -0
- package/dist/biz-select/format.js.map +1 -0
- package/dist/biz-select/index.d.ts +23 -0
- package/dist/biz-select/index.d.ts.map +1 -0
- package/dist/biz-select/index.js +22 -0
- package/dist/biz-select/index.js.map +1 -0
- package/dist/biz-select/key.d.ts +15 -0
- package/dist/biz-select/key.d.ts.map +1 -0
- package/dist/biz-select/key.js +69 -0
- package/dist/biz-select/key.js.map +1 -0
- package/dist/biz-select/normalize.d.ts +40 -0
- package/dist/biz-select/normalize.d.ts.map +1 -0
- package/dist/biz-select/normalize.js +46 -0
- package/dist/biz-select/normalize.js.map +1 -0
- package/dist/biz-select/registry.d.ts +15 -0
- package/dist/biz-select/registry.d.ts.map +1 -0
- package/dist/biz-select/registry.js +81 -0
- package/dist/biz-select/registry.js.map +1 -0
- package/dist/biz-select/schema.d.ts +5 -0
- package/dist/biz-select/schema.d.ts.map +1 -0
- package/dist/biz-select/schema.js +21 -0
- package/dist/biz-select/schema.js.map +1 -0
- package/dist/biz-select/source-id.d.ts +8 -0
- package/dist/biz-select/source-id.d.ts.map +1 -0
- package/dist/biz-select/source-id.js +10 -0
- package/dist/biz-select/source-id.js.map +1 -0
- package/dist/biz-select/types.d.ts +104 -0
- package/dist/biz-select/types.d.ts.map +1 -0
- package/dist/biz-select/types.js +2 -0
- package/dist/biz-select/types.js.map +1 -0
- package/dist/biz-select/useCandidates.d.ts +40 -0
- package/dist/biz-select/useCandidates.d.ts.map +1 -0
- package/dist/biz-select/useCandidates.js +292 -0
- package/dist/biz-select/useCandidates.js.map +1 -0
- package/dist/biz-select/useSelectedLabel.d.ts +18 -0
- package/dist/biz-select/useSelectedLabel.d.ts.map +1 -0
- package/dist/biz-select/useSelectedLabel.js +158 -0
- package/dist/biz-select/useSelectedLabel.js.map +1 -0
- package/dist/biz-select/useStableSourceKey.d.ts +3 -0
- package/dist/biz-select/useStableSourceKey.d.ts.map +1 -0
- package/dist/biz-select/useStableSourceKey.js +48 -0
- package/dist/biz-select/useStableSourceKey.js.map +1 -0
- package/dist/editable-table/EditableTable.d.ts +3 -0
- package/dist/editable-table/EditableTable.d.ts.map +1 -0
- package/dist/editable-table/EditableTable.js +499 -0
- package/dist/editable-table/EditableTable.js.map +1 -0
- package/dist/editable-table/dirty.d.ts +17 -0
- package/dist/editable-table/dirty.d.ts.map +1 -0
- package/dist/editable-table/dirty.js +72 -0
- package/dist/editable-table/dirty.js.map +1 -0
- package/dist/editable-table/index.d.ts +4 -0
- package/dist/editable-table/index.d.ts.map +1 -0
- package/dist/editable-table/index.js +3 -0
- package/dist/editable-table/index.js.map +1 -0
- package/dist/editable-table/types.d.ts +109 -0
- package/dist/editable-table/types.d.ts.map +1 -0
- package/dist/editable-table/types.js +2 -0
- package/dist/editable-table/types.js.map +1 -0
- package/dist/env.d.ts +3 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +11 -0
- package/dist/env.js.map +1 -0
- package/dist/form/FormRuntimeHost.d.ts +39 -0
- package/dist/form/FormRuntimeHost.d.ts.map +1 -0
- package/dist/form/FormRuntimeHost.js +184 -0
- package/dist/form/FormRuntimeHost.js.map +1 -0
- package/dist/form/SchemaFormField.d.ts +15 -0
- package/dist/form/SchemaFormField.d.ts.map +1 -0
- package/dist/form/SchemaFormField.js +143 -0
- package/dist/form/SchemaFormField.js.map +1 -0
- package/dist/form/derive.d.ts +28 -0
- package/dist/form/derive.d.ts.map +1 -0
- package/dist/form/derive.js +87 -0
- package/dist/form/derive.js.map +1 -0
- package/dist/form/namePath.d.ts +12 -0
- package/dist/form/namePath.d.ts.map +1 -0
- package/dist/form/namePath.js +33 -0
- package/dist/form/namePath.js.map +1 -0
- package/dist/full-editable-table/EditableCell.d.ts +12 -0
- package/dist/full-editable-table/EditableCell.d.ts.map +1 -0
- package/dist/full-editable-table/EditableCell.js +8 -0
- package/dist/full-editable-table/EditableCell.js.map +1 -0
- package/dist/full-editable-table/EditableRow.d.ts +8 -0
- package/dist/full-editable-table/EditableRow.d.ts.map +1 -0
- package/dist/full-editable-table/EditableRow.js +23 -0
- package/dist/full-editable-table/EditableRow.js.map +1 -0
- package/dist/full-editable-table/FullEditableTable.d.ts +3 -0
- package/dist/full-editable-table/FullEditableTable.d.ts.map +1 -0
- package/dist/full-editable-table/FullEditableTable.js +384 -0
- package/dist/full-editable-table/FullEditableTable.js.map +1 -0
- package/dist/full-editable-table/context.d.ts +4 -0
- package/dist/full-editable-table/context.d.ts.map +1 -0
- package/dist/full-editable-table/context.js +6 -0
- package/dist/full-editable-table/context.js.map +1 -0
- package/dist/full-editable-table/index.d.ts +3 -0
- package/dist/full-editable-table/index.d.ts.map +1 -0
- package/dist/full-editable-table/index.js +2 -0
- package/dist/full-editable-table/index.js.map +1 -0
- package/dist/full-editable-table/types.d.ts +95 -0
- package/dist/full-editable-table/types.d.ts.map +1 -0
- package/dist/full-editable-table/types.js +2 -0
- package/dist/full-editable-table/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/read.d.ts +14 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +151 -0
- package/dist/read.js.map +1 -0
- package/dist/registry.d.ts +29 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +49 -0
- package/dist/registry.js.map +1 -0
- package/dist/rowMerge.d.ts +2 -0
- package/dist/rowMerge.d.ts.map +1 -0
- package/dist/rowMerge.js +32 -0
- package/dist/rowMerge.js.map +1 -0
- package/dist/tableScroll.d.ts +10 -0
- package/dist/tableScroll.d.ts.map +1 -0
- package/dist/tableScroll.js +14 -0
- package/dist/tableScroll.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 tianyr
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,189 @@
|
|
|
1
|
-
#
|
|
1
|
+
# schema-antd
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
基于 antd v5 的 Schema 驱动表单、可编辑表格与业务下拉。一份扁平的字段配置,同时用于普通表单、
|
|
4
|
+
单活动行编辑表格和全行常驻编辑表格,字段的显隐、禁用、校验、选项和联动都由配置描述。
|
|
5
|
+
|
|
6
|
+
- **不内置 antd**:`antd` / `react` 全部是 peer 依赖,产物只有 ESM 与类型声明
|
|
7
|
+
- **一份绑定层**:普通表单和两种表格的行复用同一个字段绑定,联动语义完全一致
|
|
8
|
+
- **可编辑列三态**:`true` 编辑、`'read'` 只读但跟随本行 Form(能看到联动带出的值)、`false` 直接读行记录
|
|
9
|
+
- **业务下拉**:`BizSelect` 把候选来源、编码回显、级联接入收进一个组件,值默认存编码
|
|
10
|
+
|
|
11
|
+
## 安装
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm i @tianyr/schema-antd
|
|
15
|
+
|
|
16
|
+
# 以下由你自己安装,本包不打包它们
|
|
17
|
+
npm i react react-dom antd dayjs @ant-design/icons
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
要求:React 18.2+、antd 5.20+、Node 18+(仅构建期)。只提供 ESM。
|
|
21
|
+
|
|
22
|
+
## 表单
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { SchemaForm } from '@tianyr/schema-antd'
|
|
26
|
+
import type { FormFieldSchema } from '@tianyr/schema-antd'
|
|
27
|
+
|
|
28
|
+
const schema: FormFieldSchema[] = [
|
|
29
|
+
{ type: 'InputNumber', name: 'qty', label: '数量', rules: [{ required: true, message: '请填写数量' }] },
|
|
30
|
+
{ type: 'InputNumber', name: 'price', label: '单价' },
|
|
31
|
+
{
|
|
32
|
+
type: 'InputNumber',
|
|
33
|
+
name: 'amount',
|
|
34
|
+
label: '金额',
|
|
35
|
+
// immediate: 不区分变更来源,初始化、回填、setData 都会重算(默认只在用户交互时执行)
|
|
36
|
+
linkage: [{
|
|
37
|
+
dependencies: ['qty', 'price'],
|
|
38
|
+
immediate: true,
|
|
39
|
+
handler: (ctx) => ctx.set('amount', Number(ctx.get('qty') ?? 0) * Number(ctx.get('price') ?? 0)),
|
|
40
|
+
}],
|
|
41
|
+
},
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
export function OrderForm() {
|
|
45
|
+
return <SchemaForm schema={schema} columns={2} onFinish={(values) => console.log(values)} />
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`dynamic.dependencies` 必须显式列出影响派生结果的所有字段,不做自动依赖收集:
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
{
|
|
53
|
+
type: 'Select',
|
|
54
|
+
name: 'city',
|
|
55
|
+
label: '城市',
|
|
56
|
+
dynamic: {
|
|
57
|
+
dependencies: ['province'],
|
|
58
|
+
disabled: (ctx) => !ctx.get('province'),
|
|
59
|
+
props: (ctx) => ({ options: CITIES[ctx.get('province') as string] ?? [] }),
|
|
60
|
+
},
|
|
61
|
+
linkage: [{
|
|
62
|
+
dependencies: ['province'],
|
|
63
|
+
handler: (ctx) => ctx.set('city', undefined),
|
|
64
|
+
}],
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 可编辑表格
|
|
69
|
+
|
|
70
|
+
两种形态,按数据量选:
|
|
71
|
+
|
|
72
|
+
| | `FullEditableTable` | `EditableTable` |
|
|
73
|
+
| --- | --- | --- |
|
|
74
|
+
| 状态 | 每行一个 `FormInstance`,全行常驻 | 单个 `FormInstance`,只挂活动行 |
|
|
75
|
+
| 适用 | 需要全行同时可编辑、逐行校验 | 行数大,单行编辑 + 行级保存 |
|
|
76
|
+
| 成本 | 约 **2.5ms / 单元格** | 约 **0.24ms / 单元格** |
|
|
77
|
+
|
|
78
|
+
实测(生产构建,100 行 × 10 列 = 1000 单元格,混合控件):全行常驻挂载约 2.5s,
|
|
79
|
+
单活动行约 0.24s。**超过约 1000 个可编辑单元格建议改用 `EditableTable`**,
|
|
80
|
+
150 行 × 15 列以上的场景没有实测数据。
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
import { FullEditableTable } from '@tianyr/schema-antd'
|
|
84
|
+
import type { EditableColumn } from '@tianyr/schema-antd'
|
|
85
|
+
|
|
86
|
+
const columns: EditableColumn<OrderRow>[] = [
|
|
87
|
+
{
|
|
88
|
+
title: '品名',
|
|
89
|
+
dataIndex: 'name',
|
|
90
|
+
editable: true,
|
|
91
|
+
field: { type: 'Input', name: 'name', rules: [{ required: true, message: '请填写品名' }] },
|
|
92
|
+
},
|
|
93
|
+
{ title: '数量', dataIndex: 'qty', editable: true, field: { type: 'InputNumber', name: 'qty' } },
|
|
94
|
+
// 'read':不参与校验,但跟随本行 Form,能显示 linkage 写进来的值
|
|
95
|
+
{ title: '金额', dataIndex: 'amount', editable: 'read', field: { type: 'InputNumber', name: 'amount' } },
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
<FullEditableTable<OrderRow> rowKey="id" columns={columns} initialRows={rows} />
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`editable` 三态别混:
|
|
102
|
+
|
|
103
|
+
- `true`:编辑控件,写进本行 Form,参与校验。「只读外观 + 仍要校验」用 `true` + `props.disabled`;
|
|
104
|
+
- `'read'`:挂字段但只读渲染,值跟随本行 Form,因此能看到 `events` / `linkage` 的带出值,**不参与校验**;
|
|
105
|
+
- `false` / 缺省:不挂字段,单元格直接读行记录,**看不到 Form 里的写值**。
|
|
106
|
+
|
|
107
|
+
`EditableTable` 的 `dataSource` 受控,新增/删除通过 `onSetData` 回传;泛型要显式传,
|
|
108
|
+
从 `dataSource` 推断会退化成 `object`:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
<EditableTable<OrderRow>
|
|
112
|
+
rowKey="id"
|
|
113
|
+
columns={columns}
|
|
114
|
+
dataSource={rows}
|
|
115
|
+
onSave={async (next, original) => { await api.save(next); return next }}
|
|
116
|
+
onSetData={setRows}
|
|
117
|
+
createRow={() => ({ id: nanoid() })}
|
|
118
|
+
/>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## BizSelect
|
|
122
|
+
|
|
123
|
+
业务下拉:候选从哪来、只有一个编码时名称怎么还原、切换上级后旧候选怎么办。
|
|
124
|
+
值默认是标量编码(`valueMode="object"` 可存对象),字段类型由使用方显式注册。
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { defineSelectSources, loaded, remote, staticList } from '@tianyr/schema-antd'
|
|
128
|
+
|
|
129
|
+
defineSelectSources({
|
|
130
|
+
province: staticList(PROVINCES), // 前端常量,不发请求
|
|
131
|
+
currency: loaded(api.listCurrency), // 一次拉全量,之后前端过滤
|
|
132
|
+
material: remote({ // 关键词交给后端,另配编码精确回显
|
|
133
|
+
search: (keyword, params, signal) => api.pageMaterial({ keyword, ...params }, signal),
|
|
134
|
+
resolve: (code, params, signal) => api.getMaterial(code, params, signal),
|
|
135
|
+
requiredParams: ['warehouseCode'], // 缺参数不发请求,避免查到别家数据
|
|
136
|
+
}),
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
// 独立使用:受控,value / onChange 必配
|
|
142
|
+
<BizSelect source="currency" value={currency} onChange={setCurrency} />
|
|
143
|
+
|
|
144
|
+
// 只读:同一套名称解析,不挂 Select
|
|
145
|
+
<BizSelectDisplay source="material" params={{ warehouseCode }} value={materialCode} />
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
在 schema 里用,级联一行配完(先调一次 `registerBizSelectField()` 注册类型):
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
{
|
|
152
|
+
type: 'BizSelect',
|
|
153
|
+
name: 'materialCode',
|
|
154
|
+
label: '物料',
|
|
155
|
+
source: 'material',
|
|
156
|
+
paramsFrom: { warehouseCode: 'warehouseCode' }, // 参数名 ← 字段名
|
|
157
|
+
blockedText: '请先选择仓库',
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
约定:
|
|
162
|
+
|
|
163
|
+
- 行为由源的能力推导:`options` 前端常量、`load` 一次拉全量后前端过滤、`search` 后端搜索,三者可组合。
|
|
164
|
+
- `resolve(code)` 专用于按编码精确回显,不要用模糊搜索冒充。
|
|
165
|
+
- `requiredParams` 不齐时进入 `blocked`:候选为空、不发请求。
|
|
166
|
+
- `invalidateSelectSource(name)` 让已挂载的实例重新取数;`useCandidates` 可把同一份候选给树、弹窗复用。
|
|
167
|
+
- 内联源要跨实例共享缓存,就传导入的函数或显式 `cacheKey`;内联箭头每次渲染都换键,缓存命中不了。
|
|
168
|
+
|
|
169
|
+
## 其他导出
|
|
170
|
+
|
|
171
|
+
`SchemaField`(单字段渲染,不含 name/label/rules)、`SchemaFormField`(唯一具名绑定层)、
|
|
172
|
+
`FormRuntimeHost` / `FormRuntimeHostProvider` / `useFormRuntimeHost`(联动运行时)、
|
|
173
|
+
`registerField` / `getFieldDefinition`(自定义控件类型)、`defaultRenderRead` / `renderReadValue`、
|
|
174
|
+
`mergeRowValues`,以及全部类型(`FormFieldSchema` / `EditableColumn` / `FullEditableTableRef` ……)。
|
|
175
|
+
|
|
176
|
+
字段的取值与写入只走 `ctx`:`ctx.get` / `ctx.getValues` / `ctx.set` / `ctx.setValues` / `ctx.clear`。
|
|
177
|
+
|
|
178
|
+
## 说明
|
|
179
|
+
|
|
180
|
+
- 只提供 ESM,不支持 CJS 消费方。
|
|
181
|
+
- 用 `import.meta.env.DEV` 判断开发态以输出告警,非 Vite 环境(如 SSR)下恒为 `false`,
|
|
182
|
+
不影响功能,只是少几条开发提示。
|
|
183
|
+
- `virtual` 不开放:虚拟滚动会卸载离屏行,全行常驻表格的行 Form 会随之销毁、输入丢失。
|
|
184
|
+
|
|
185
|
+
版本变更见 [CHANGELOG.md](./CHANGELOG.md)。
|
|
186
|
+
|
|
187
|
+
## License
|
|
188
|
+
|
|
189
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AnyFieldSchema, FieldMode } from './types.js';
|
|
2
|
+
export interface SchemaFieldProps<TValue = unknown> {
|
|
3
|
+
schema: AnyFieldSchema<TValue>;
|
|
4
|
+
value?: TValue;
|
|
5
|
+
/** 统一为 (value, ...meta);Select/BizSelect 的 meta[0] 即选中项 */
|
|
6
|
+
onChange?: (value: TValue, ...meta: unknown[]) => void;
|
|
7
|
+
/** 高于 schema.mode */
|
|
8
|
+
mode?: FieldMode;
|
|
9
|
+
/** 运行态禁用,优先于 schema.props.disabled */
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** Form.Item 注入,用于 label 关联与 scrollToField */
|
|
12
|
+
id?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function SchemaField<TValue = unknown>({ schema, value, onChange, mode, disabled, id, }: SchemaFieldProps<TValue>): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=SchemaField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaField.d.ts","sourceRoot":"","sources":["../src/SchemaField.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,cAAc,EAGd,SAAS,EAEV,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,gBAAgB,CAAC,MAAM,GAAG,OAAO;IAChD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvD,qBAAqB;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AA0CD,wBAAgB,WAAW,CAAC,MAAM,GAAG,OAAO,EAAE,EAC5C,MAAM,EACN,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,EAAE,GACH,EAAE,gBAAgB,CAAC,MAAM,CAAC,+BA8C1B"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { getFieldDefinition } from './registry.js';
|
|
3
|
+
import { IS_DEV } from './env.js';
|
|
4
|
+
import { renderReadValue } from './read.js';
|
|
5
|
+
/** 这三个属性由 SchemaField 独占,schema.props 中的同名项必须剔除 */
|
|
6
|
+
const CONTROLLED_KEYS = ['value', 'defaultValue', 'onChange'];
|
|
7
|
+
function Editor({ definition, schema, value, onChange, disabled, id }) {
|
|
8
|
+
const Component = definition.component;
|
|
9
|
+
const valuePropName = definition.valuePropName ?? 'value';
|
|
10
|
+
const componentProps = { ...schema.props };
|
|
11
|
+
for (const key of CONTROLLED_KEYS)
|
|
12
|
+
delete componentProps[key];
|
|
13
|
+
const finalDisabled = disabled ?? schema.props?.disabled;
|
|
14
|
+
const handleChange = (...args) => {
|
|
15
|
+
const [rawValue, ...meta] = args;
|
|
16
|
+
const nextValue = definition.getValueFromEvent
|
|
17
|
+
? definition.getValueFromEvent(...args)
|
|
18
|
+
: rawValue;
|
|
19
|
+
onChange?.(nextValue, ...meta);
|
|
20
|
+
};
|
|
21
|
+
return (_jsx(Component, { ...componentProps, [valuePropName]: value, onChange: handleChange, ...(finalDisabled === undefined ? {} : { disabled: finalDisabled }), ...(id === undefined ? {} : { id }) }));
|
|
22
|
+
}
|
|
23
|
+
export function SchemaField({ schema, value, onChange, mode, disabled, id, }) {
|
|
24
|
+
const finalMode = mode ?? schema.mode ?? 'edit';
|
|
25
|
+
// 局部自定义字段:必须在查 Registry 之前拦下,否则会落到「未注册类型」的报错路径
|
|
26
|
+
if (schema.type === 'Custom') {
|
|
27
|
+
return (_jsx(CustomField, { schema: schema, value: value, onChange: onChange, mode: finalMode, disabled: disabled, id: id }));
|
|
28
|
+
}
|
|
29
|
+
const definition = getFieldDefinition(schema.type);
|
|
30
|
+
if (finalMode === 'read') {
|
|
31
|
+
return (_jsx("span", { className: "schema-field schema-field-read", children: renderReadValue(value, schema, definition) }));
|
|
32
|
+
}
|
|
33
|
+
if (!definition) {
|
|
34
|
+
// 未注册类型是配置错误,开发态直接炸出来,生产态降级为可见提示
|
|
35
|
+
if (IS_DEV) {
|
|
36
|
+
throw new Error(`[schema] 未注册的字段类型:"${schema.type}"`);
|
|
37
|
+
}
|
|
38
|
+
return _jsxs("span", { className: "schema-field schema-field-error", children: ["\u672A\u77E5\u5B57\u6BB5\u7C7B\u578B\uFF1A", schema.type] });
|
|
39
|
+
}
|
|
40
|
+
// 编辑态不额外包 DOM,避免影响控件在表格单元格里的宽度与对齐
|
|
41
|
+
return (_jsx(Editor, { definition: definition, schema: schema, value: value, onChange: onChange, disabled: disabled, id: id }));
|
|
42
|
+
}
|
|
43
|
+
/** 只读空展示按 render 函数去重提示:schema 允许每帧重建,用函数引用才稳定 */
|
|
44
|
+
const warnedEmptyRead = new WeakSet();
|
|
45
|
+
// TValue 在这里无关紧要,只取用于报错的身份信息,避免被泛型不变量卡住
|
|
46
|
+
function describeCustomField(schema) {
|
|
47
|
+
const extra = schema;
|
|
48
|
+
const parts = [];
|
|
49
|
+
if (typeof extra.label === 'string' && extra.label)
|
|
50
|
+
parts.push(extra.label);
|
|
51
|
+
if (extra.name !== undefined)
|
|
52
|
+
parts.push(`name=${JSON.stringify(extra.name)}`);
|
|
53
|
+
return parts.length ? parts.join(' · ') : '未命名字段';
|
|
54
|
+
}
|
|
55
|
+
/** 配置错误:开发态直接抛,生产态给可见提示,不回退成普通输入 */
|
|
56
|
+
function failCustomField(schema, reason) {
|
|
57
|
+
const message = `[schema] 自定义字段配置错误(${reason}):${describeCustomField(schema)}`;
|
|
58
|
+
if (IS_DEV)
|
|
59
|
+
throw new Error(message);
|
|
60
|
+
return _jsxs("span", { className: "schema-field schema-field-error", children: ["\u81EA\u5B9A\u4E49\u5B57\u6BB5\u914D\u7F6E\u9519\u8BEF\uFF1A", reason] });
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 局部自定义字段:不查 Registry,把最终属性交给 schema.render。
|
|
64
|
+
*
|
|
65
|
+
* 属性组装(统一运行契约 §3.1):dynamic.props 已在上层合并,这里补
|
|
66
|
+
* disabled / id、剔除受控键,并保证 ctx.schema.props 与 ctx.props 同一引用。
|
|
67
|
+
*/
|
|
68
|
+
function CustomField({ schema, value, onChange, mode, disabled, id, }) {
|
|
69
|
+
if (typeof schema.render !== 'function') {
|
|
70
|
+
return failCustomField(schema, 'render 必须是函数');
|
|
71
|
+
}
|
|
72
|
+
const props = { ...(schema.props ?? {}) };
|
|
73
|
+
// schema.props 里的受控键不得覆盖表单注入的通道
|
|
74
|
+
for (const key of CONTROLLED_KEYS)
|
|
75
|
+
delete props[key];
|
|
76
|
+
// 表单级 disabled / dynamic.disabled 已合并成 SchemaField.disabled
|
|
77
|
+
if (disabled !== undefined)
|
|
78
|
+
props.disabled = disabled;
|
|
79
|
+
if (id !== undefined)
|
|
80
|
+
props.id = id;
|
|
81
|
+
const effectiveSchema = { ...schema, props };
|
|
82
|
+
if (mode === 'read') {
|
|
83
|
+
// 只读 JSX 不套文本 span:render 可能返回块级元素或 Portal
|
|
84
|
+
if (schema.renderRead) {
|
|
85
|
+
return _jsx(_Fragment, { children: schema.renderRead(value, effectiveSchema) });
|
|
86
|
+
}
|
|
87
|
+
const node = schema.render({ mode: 'read', value, props, schema: effectiveSchema });
|
|
88
|
+
if (IS_DEV && (node === null || node === undefined) && !warnedEmptyRead.has(schema.render)) {
|
|
89
|
+
warnedEmptyRead.add(schema.render);
|
|
90
|
+
console.warn(`[schema] 自定义字段的只读分支返回了 ${node === null ? 'null' : 'undefined'}:` +
|
|
91
|
+
`${describeCustomField(schema)}。若无 renderRead,请确认是有意不展示。`);
|
|
92
|
+
}
|
|
93
|
+
return _jsx(_Fragment, { children: node });
|
|
94
|
+
}
|
|
95
|
+
if (typeof onChange !== 'function') {
|
|
96
|
+
return failCustomField(schema, '编辑态缺少 onChange');
|
|
97
|
+
}
|
|
98
|
+
const ctx = {
|
|
99
|
+
mode: 'edit',
|
|
100
|
+
value,
|
|
101
|
+
onChange,
|
|
102
|
+
props,
|
|
103
|
+
schema: effectiveSchema,
|
|
104
|
+
};
|
|
105
|
+
return _jsx(_Fragment, { children: schema.render(ctx) });
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=SchemaField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaField.js","sourceRoot":"","sources":["../src/SchemaField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SchemaForm:用扁平 FormFieldSchema 组织一个普通表单。
|
|
3
|
+
*
|
|
4
|
+
* V1 只提供最小布局(columns + colSpan)与字段绑定;表单状态完全交给
|
|
5
|
+
* AntD FormInstance,不另维护一份受控整表 API。
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from 'react';
|
|
8
|
+
import type { FormProps } from 'antd';
|
|
9
|
+
import type { AnyFormFieldSchema, FieldMode } from './types.js';
|
|
10
|
+
export interface SchemaFormProps extends Omit<FormProps, 'children'> {
|
|
11
|
+
schema: AnyFormFieldSchema[];
|
|
12
|
+
/** 多列布局,默认 1 */
|
|
13
|
+
columns?: number;
|
|
14
|
+
/** 表单级只读,强制覆盖字段 mode */
|
|
15
|
+
mode?: FieldMode;
|
|
16
|
+
/** 表单级禁用,永远优先于字段配置 */
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** 允许混用原生 Form.Item,共享同一个 FormInstance */
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
export declare function SchemaForm({ schema, columns, mode, disabled, children, ...formProps }: SchemaFormProps): import("react").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=SchemaForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaForm.d.ts","sourceRoot":"","sources":["../src/SchemaForm.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAKtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IAClE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,OAAW,EACX,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EACb,EAAE,eAAe,+BA4BjB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Form } from 'antd';
|
|
3
|
+
import { FormRuntimeHostProvider } from './form/FormRuntimeHost.js';
|
|
4
|
+
import { SchemaFormField } from './form/SchemaFormField.js';
|
|
5
|
+
import { namePathKey } from './form/namePath.js';
|
|
6
|
+
export function SchemaForm({ schema, columns = 1, mode, disabled, children, ...formProps }) {
|
|
7
|
+
const [innerForm] = Form.useForm();
|
|
8
|
+
const form = formProps.form ?? innerForm;
|
|
9
|
+
const columnCount = Math.max(1, columns);
|
|
10
|
+
return (_jsx(Form, { ...formProps, form: form, children: _jsxs(FormRuntimeHostProvider, { form: form, children: [_jsx("div", { style: {
|
|
11
|
+
display: 'grid',
|
|
12
|
+
gridTemplateColumns: `repeat(${columnCount}, minmax(0, 1fr))`,
|
|
13
|
+
columnGap: 16,
|
|
14
|
+
}, children: schema.map((field) => {
|
|
15
|
+
const span = Math.min(Math.max(field.colSpan ?? 1, 1), columnCount);
|
|
16
|
+
return (_jsx("div", { style: span > 1 ? { gridColumn: `span ${span}` } : undefined, children: _jsx(SchemaFormField, { schema: field, mode: mode, disabled: disabled }) }, namePathKey(field.name)));
|
|
17
|
+
}) }), children] }) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=SchemaForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaForm.js","sourceRoot":"","sources":["../src/SchemaForm.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAe9C,MAAM,UAAU,UAAU,CAAC,EACzB,MAAM,EACN,OAAO,GAAG,CAAC,EACX,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EACI;IAChB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzC,OAAO,CACL,KAAC,IAAI,OAAK,SAAS,EAAE,IAAI,EAAE,IAAI,YAC7B,MAAC,uBAAuB,IAAC,IAAI,EAAE,IAAI,aACjC,cACE,KAAK,EAAE;wBACL,OAAO,EAAE,MAAM;wBACf,mBAAmB,EAAE,UAAU,WAAW,mBAAmB;wBAC7D,SAAS,EAAE,EAAE;qBACd,YAEA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;wBACpE,OAAO,CACL,cAAmC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,YAC7F,KAAC,eAAe,IAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAD1D,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAE3B,CACP,CAAC;oBACJ,CAAC,CAAC,GACE,EACL,QAAQ,IACe,GACrB,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 两个可编辑表格共用的工具条:新增按钮 + 插槽 + 批量删除。
|
|
3
|
+
*
|
|
4
|
+
* 位置由 placement 决定(默认底部;顶部与老家族 BatchEdit 的工具条一致),
|
|
5
|
+
* 按钮顺序固定为「新增 → 插槽 → 批量删除」:插槽紧跟新增按钮是既有约定,
|
|
6
|
+
* 批量删除是危险操作,放最右端避免误触。位置变化不改变顺序语义。
|
|
7
|
+
*
|
|
8
|
+
* 插槽是 render props:调用方拿到的 ctx 与 ref 上的行操作能力一致,
|
|
9
|
+
* 快捷录入之类的弹窗确认后可以直接 addRow,不必再额外持一份 ref。
|
|
10
|
+
*/
|
|
11
|
+
import type { ReactNode } from 'react';
|
|
12
|
+
import type { ToolbarPlacement } from './types.js';
|
|
13
|
+
/** 工具条能拿到的行操作能力;两边表格都提供 */
|
|
14
|
+
export interface TableFooterContext<T> {
|
|
15
|
+
addRow(record?: Partial<T>): void;
|
|
16
|
+
/** 当前已确认的数据快照,不含正在编辑的草稿 */
|
|
17
|
+
getDataSync(): T[];
|
|
18
|
+
}
|
|
19
|
+
interface TableFooterProps {
|
|
20
|
+
addText?: string;
|
|
21
|
+
/** 不传则不渲染新增按钮(只留插槽) */
|
|
22
|
+
onAdd?: () => void;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
extra?: ReactNode;
|
|
25
|
+
/** 批量删除文案,默认「批量删除」 */
|
|
26
|
+
batchDeleteText?: string;
|
|
27
|
+
/** 已选行数;为 0 时批量删除不可点 */
|
|
28
|
+
selectedCount?: number;
|
|
29
|
+
/** 不传则不渲染批量删除按钮(只留新增与插槽) */
|
|
30
|
+
onBatchDelete?: () => void;
|
|
31
|
+
/** 工具条位置,默认底部 */
|
|
32
|
+
placement?: ToolbarPlacement;
|
|
33
|
+
/** 内置按钮是否带图标(新增 / 批量删除),默认不带 */
|
|
34
|
+
showIcon?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function TableFooter({ addText, onAdd, disabled, extra, batchDeleteText, selectedCount, onBatchDelete, placement, showIcon, }: TableFooterProps): import("react").JSX.Element | null;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=TableFooter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableFooter.d.ts","sourceRoot":"","sources":["../src/TableFooter.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAItD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,2BAA2B;AAC3B,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClC,2BAA2B;IAC3B,WAAW,IAAI,CAAC,EAAE,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sBAAsB;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB;IACjB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,wBAAgB,WAAW,CAAC,EAC1B,OAAc,EACd,KAAK,EACL,QAAQ,EACR,KAAK,EACL,eAAwB,EACxB,aAAiB,EACjB,aAAa,EACb,SAAoB,EACpB,QAAQ,GACT,EAAE,gBAAgB,sCAoClB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from 'antd';
|
|
3
|
+
import { DeleteOutlined, PlusOutlined } from '@ant-design/icons';
|
|
4
|
+
const BASE_STYLE = {
|
|
5
|
+
display: 'flex',
|
|
6
|
+
alignItems: 'center',
|
|
7
|
+
gap: 8,
|
|
8
|
+
};
|
|
9
|
+
export function TableFooter({ addText = '新增', onAdd, disabled, extra, batchDeleteText = '批量删除', selectedCount = 0, onBatchDelete, placement = 'bottom', showIcon, }) {
|
|
10
|
+
if (!onAdd && !extra && !onBatchDelete)
|
|
11
|
+
return null;
|
|
12
|
+
return (_jsxs("div", { className: "schema-table-footer", style: placement === 'top'
|
|
13
|
+
? { ...BASE_STYLE, marginTop: 8, marginBottom: 8 }
|
|
14
|
+
: { ...BASE_STYLE, marginTop: 8 }, children: [onAdd ? (_jsx(Button, { type: "dashed", disabled: disabled, icon: showIcon ? _jsx(PlusOutlined, {}) : undefined, onClick: onAdd, children: addText })) : null, extra, onBatchDelete ? (_jsxs(Button, { danger: true, disabled: disabled || selectedCount === 0, icon: showIcon ? _jsx(DeleteOutlined, {}) : undefined, onClick: onBatchDelete, children: [batchDeleteText, selectedCount > 0 ? `(${selectedCount})` : ''] })) : null] }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=TableFooter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableFooter.js","sourceRoot":"","sources":["../src/TableFooter.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA6BjE,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,GAAG,IAAI,EACd,KAAK,EACL,QAAQ,EACR,KAAK,EACL,eAAe,GAAG,MAAM,EACxB,aAAa,GAAG,CAAC,EACjB,aAAa,EACb,SAAS,GAAG,QAAQ,EACpB,QAAQ,GACS;IACjB,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEpD,OAAO,CACL,eACE,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EACH,SAAS,KAAK,KAAK;YACjB,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;YAClD,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,aAGpC,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,SAAS,EAC7C,OAAO,EAAE,KAAK,YAEb,OAAO,GACD,CACV,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,EACL,aAAa,CAAC,CAAC,CAAC,CACf,MAAC,MAAM,IACL,MAAM,QACN,QAAQ,EAAE,QAAQ,IAAI,aAAa,KAAK,CAAC,EACzC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAC,cAAc,KAAG,CAAC,CAAC,CAAC,SAAS,EAC/C,OAAO,EAAE,aAAa,aAErB,eAAe,EACf,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IACvC,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizSelect.d.ts","sourceRoot":"","sources":["../../src/biz-select/BizSelect.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAa,cAAc,EAAyB,MAAM,SAAS,CAAC;AAIhF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAmH9C"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* BizSelect:业务下拉的可编辑态。
|
|
4
|
+
*
|
|
5
|
+
* 渲染层只吃「候选列表 + 已选名称 + 展示模式」,不认识 load / search / resolve。
|
|
6
|
+
* 所有取数与解析都在 hook 里完成。
|
|
7
|
+
*/
|
|
8
|
+
import { useEffect, useMemo } from 'react';
|
|
9
|
+
import { Select } from 'antd';
|
|
10
|
+
import { normalizeSource } from './normalize.js';
|
|
11
|
+
import { resolveSelectSource } from './registry.js';
|
|
12
|
+
import { useCandidates } from './useCandidates.js';
|
|
13
|
+
import { useSelectedLabel } from './useSelectedLabel.js';
|
|
14
|
+
import { buildObjectValue, defaultSearchFields, readCode, readObjectName, toAntOption, } from './format.js';
|
|
15
|
+
const DEFAULT_BLOCKED_TEXT = '请先选择上级';
|
|
16
|
+
export function BizSelect(props) {
|
|
17
|
+
const { source, params, displayMode = 'L', searchFields, seedOptions, debounceMs, cacheKey, blockedText = DEFAULT_BLOCKED_TEXT, valueMode = 'primitive', valueFields, value, onChange, disabled, placeholder, ...rest } = props;
|
|
18
|
+
const sourceObj = resolveSelectSource(source);
|
|
19
|
+
const fields = searchFields ?? defaultSearchFields(displayMode);
|
|
20
|
+
const code = readCode(value, valueMode, valueFields);
|
|
21
|
+
const valueName = readObjectName(value, valueMode, valueFields);
|
|
22
|
+
// 源直接交给 Hook:解析与来源键(含版本订阅)都在里面,组件不再自己算一份
|
|
23
|
+
const candidates = useCandidates({
|
|
24
|
+
source,
|
|
25
|
+
cacheKey,
|
|
26
|
+
params,
|
|
27
|
+
searchFields: fields,
|
|
28
|
+
debounceMs,
|
|
29
|
+
});
|
|
30
|
+
const { sourceKey } = candidates;
|
|
31
|
+
const selected = useSelectedLabel({
|
|
32
|
+
source: sourceObj,
|
|
33
|
+
sourceKey,
|
|
34
|
+
code,
|
|
35
|
+
valueName,
|
|
36
|
+
seedOptions,
|
|
37
|
+
// 回显查的是未过滤全集,否则输入关键词后已选项会被筛掉、名称退回编码
|
|
38
|
+
candidates: candidates.echoOptions,
|
|
39
|
+
params,
|
|
40
|
+
});
|
|
41
|
+
// 只有 load 型需要为了回显提前拉一次全集:它没有 resolve,名称只能从全集里找。
|
|
42
|
+
// 对象值自带名称、seed 已命中时不用拉。
|
|
43
|
+
const hasKnownName = Boolean(valueName) || Boolean(seedOptions?.some((item) => item.code === code));
|
|
44
|
+
const needEchoLoad = code !== undefined && !hasKnownName && normalizeSource(sourceObj).candidateMode === 'load';
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (needEchoLoad)
|
|
47
|
+
candidates.open();
|
|
48
|
+
}, [needEchoLoad, sourceKey, candidates.open]);
|
|
49
|
+
// 搜索中不要补回已选项:否则结果里会混进一条不匹配的记录。
|
|
50
|
+
// 关闭下拉后 keyword 归零,已选项会重新补回,闭合态照常显示名称。
|
|
51
|
+
// 取数失败时也不补:补上一条会让列表非空,antd 就不渲染 notFoundContent,
|
|
52
|
+
// 重试入口跟着被藏起来,用户只看到孤零零一条已选项。
|
|
53
|
+
const searching = candidates.keyword.trim().length > 0;
|
|
54
|
+
const antOptions = useMemo(() => {
|
|
55
|
+
const list = candidates.options.map((item) => toAntOption(item, displayMode));
|
|
56
|
+
if (searching || candidates.error)
|
|
57
|
+
return list;
|
|
58
|
+
const selectedOption = selected.option;
|
|
59
|
+
if (selectedOption && !list.some((item) => item.value === selectedOption.code)) {
|
|
60
|
+
list.unshift(toAntOption(selectedOption, displayMode));
|
|
61
|
+
}
|
|
62
|
+
return list;
|
|
63
|
+
}, [candidates.options, candidates.error, displayMode, selected.option, searching]);
|
|
64
|
+
const handleChange = (next, antOption) => {
|
|
65
|
+
const picked = antOption?.raw ??
|
|
66
|
+
antOptions.find((item) => item.value === next)?.raw;
|
|
67
|
+
const emit = onChange;
|
|
68
|
+
if (valueMode === 'object') {
|
|
69
|
+
emit?.(next === undefined || next === null ? undefined : buildObjectValue(next, picked, valueFields), picked);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
emit?.(next ?? undefined, picked);
|
|
73
|
+
};
|
|
74
|
+
return (_jsx(Select, { ...rest,
|
|
75
|
+
// 候选由数据源决定,一律关掉 antd 自带过滤:本地过滤已在 hook 里做
|
|
76
|
+
filterOption: false, showSearch: true, options: antOptions, value: code, loading: candidates.loading || selected.status === 'loading' || rest.loading, disabled: disabled || candidates.blocked, placeholder: candidates.blocked ? blockedText : placeholder, notFoundContent: candidates.blocked ? (blockedText) : candidates.error ? (
|
|
77
|
+
// 失败得能重试:静默给一个空列表等于让用户以为「确实没有」
|
|
78
|
+
_jsx("a", { onClick: () => candidates.reload(), children: "\u52A0\u8F7D\u5931\u8D25\uFF0C\u70B9\u51FB\u91CD\u8BD5" })) : (rest.notFoundContent), onSearch: candidates.search, onChange: handleChange, onDropdownVisibleChange: (opened) => {
|
|
79
|
+
// 只有展开时才取默认候选,避免挂载即发请求
|
|
80
|
+
if (opened)
|
|
81
|
+
candidates.open();
|
|
82
|
+
else
|
|
83
|
+
candidates.resetKeyword();
|
|
84
|
+
rest.onDropdownVisibleChange?.(opened);
|
|
85
|
+
} }));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=BizSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizSelect.js","sourceRoot":"","sources":["../../src/biz-select/BizSelect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizSelectDisplay.d.ts","sourceRoot":"","sources":["../../src/biz-select/BizSelectDisplay.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAUrD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAmD5D"}
|