@tianyr/schema-antd 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -2
  3. package/dist/SchemaField.d.ts +15 -0
  4. package/dist/SchemaField.d.ts.map +1 -0
  5. package/dist/SchemaField.js +107 -0
  6. package/dist/SchemaField.js.map +1 -0
  7. package/dist/SchemaForm.d.ts +22 -0
  8. package/dist/SchemaForm.d.ts.map +1 -0
  9. package/dist/SchemaForm.js +19 -0
  10. package/dist/SchemaForm.js.map +1 -0
  11. package/dist/TableFooter.d.ts +38 -0
  12. package/dist/TableFooter.d.ts.map +1 -0
  13. package/dist/TableFooter.js +16 -0
  14. package/dist/TableFooter.js.map +1 -0
  15. package/dist/app-select/AppSelect.d.ts +3 -0
  16. package/dist/app-select/AppSelect.d.ts.map +1 -0
  17. package/dist/app-select/AppSelect.js +56 -0
  18. package/dist/app-select/AppSelect.js.map +1 -0
  19. package/dist/app-select/AppSelectDisplay.d.ts +3 -0
  20. package/dist/app-select/AppSelectDisplay.d.ts.map +1 -0
  21. package/dist/app-select/AppSelectDisplay.js +39 -0
  22. package/dist/app-select/AppSelectDisplay.js.map +1 -0
  23. package/dist/app-select/cache.d.ts +26 -0
  24. package/dist/app-select/cache.d.ts.map +1 -0
  25. package/dist/app-select/cache.js +82 -0
  26. package/dist/app-select/cache.js.map +1 -0
  27. package/dist/app-select/hooks.d.ts +56 -0
  28. package/dist/app-select/hooks.d.ts.map +1 -0
  29. package/dist/app-select/hooks.js +322 -0
  30. package/dist/app-select/hooks.js.map +1 -0
  31. package/dist/app-select/index.d.ts +7 -0
  32. package/dist/app-select/index.d.ts.map +1 -0
  33. package/dist/app-select/index.js +6 -0
  34. package/dist/app-select/index.js.map +1 -0
  35. package/dist/app-select/register.d.ts +2 -0
  36. package/dist/app-select/register.d.ts.map +1 -0
  37. package/dist/app-select/register.js +10 -0
  38. package/dist/app-select/register.js.map +1 -0
  39. package/dist/app-select/sources.d.ts +20 -0
  40. package/dist/app-select/sources.d.ts.map +1 -0
  41. package/dist/app-select/sources.js +59 -0
  42. package/dist/app-select/sources.js.map +1 -0
  43. package/dist/app-select/types.d.ts +68 -0
  44. package/dist/app-select/types.d.ts.map +1 -0
  45. package/dist/app-select/types.js +2 -0
  46. package/dist/app-select/types.js.map +1 -0
  47. package/dist/app-select/utils.d.ts +30 -0
  48. package/dist/app-select/utils.d.ts.map +1 -0
  49. package/dist/app-select/utils.js +76 -0
  50. package/dist/app-select/utils.js.map +1 -0
  51. package/dist/editable-table/EditableTable.d.ts +3 -0
  52. package/dist/editable-table/EditableTable.d.ts.map +1 -0
  53. package/dist/editable-table/EditableTable.js +499 -0
  54. package/dist/editable-table/EditableTable.js.map +1 -0
  55. package/dist/editable-table/dirty.d.ts +17 -0
  56. package/dist/editable-table/dirty.d.ts.map +1 -0
  57. package/dist/editable-table/dirty.js +72 -0
  58. package/dist/editable-table/dirty.js.map +1 -0
  59. package/dist/editable-table/index.d.ts +4 -0
  60. package/dist/editable-table/index.d.ts.map +1 -0
  61. package/dist/editable-table/index.js +3 -0
  62. package/dist/editable-table/index.js.map +1 -0
  63. package/dist/editable-table/types.d.ts +109 -0
  64. package/dist/editable-table/types.d.ts.map +1 -0
  65. package/dist/editable-table/types.js +2 -0
  66. package/dist/editable-table/types.js.map +1 -0
  67. package/dist/env.d.ts +3 -0
  68. package/dist/env.d.ts.map +1 -0
  69. package/dist/env.js +11 -0
  70. package/dist/env.js.map +1 -0
  71. package/dist/form/FormRuntimeHost.d.ts +39 -0
  72. package/dist/form/FormRuntimeHost.d.ts.map +1 -0
  73. package/dist/form/FormRuntimeHost.js +184 -0
  74. package/dist/form/FormRuntimeHost.js.map +1 -0
  75. package/dist/form/SchemaFormField.d.ts +15 -0
  76. package/dist/form/SchemaFormField.d.ts.map +1 -0
  77. package/dist/form/SchemaFormField.js +142 -0
  78. package/dist/form/SchemaFormField.js.map +1 -0
  79. package/dist/form/derive.d.ts +33 -0
  80. package/dist/form/derive.d.ts.map +1 -0
  81. package/dist/form/derive.js +59 -0
  82. package/dist/form/derive.js.map +1 -0
  83. package/dist/form/namePath.d.ts +12 -0
  84. package/dist/form/namePath.d.ts.map +1 -0
  85. package/dist/form/namePath.js +33 -0
  86. package/dist/form/namePath.js.map +1 -0
  87. package/dist/full-editable-table/EditableCell.d.ts +12 -0
  88. package/dist/full-editable-table/EditableCell.d.ts.map +1 -0
  89. package/dist/full-editable-table/EditableCell.js +8 -0
  90. package/dist/full-editable-table/EditableCell.js.map +1 -0
  91. package/dist/full-editable-table/EditableRow.d.ts +8 -0
  92. package/dist/full-editable-table/EditableRow.d.ts.map +1 -0
  93. package/dist/full-editable-table/EditableRow.js +23 -0
  94. package/dist/full-editable-table/EditableRow.js.map +1 -0
  95. package/dist/full-editable-table/FullEditableTable.d.ts +3 -0
  96. package/dist/full-editable-table/FullEditableTable.d.ts.map +1 -0
  97. package/dist/full-editable-table/FullEditableTable.js +384 -0
  98. package/dist/full-editable-table/FullEditableTable.js.map +1 -0
  99. package/dist/full-editable-table/context.d.ts +4 -0
  100. package/dist/full-editable-table/context.d.ts.map +1 -0
  101. package/dist/full-editable-table/context.js +6 -0
  102. package/dist/full-editable-table/context.js.map +1 -0
  103. package/dist/full-editable-table/index.d.ts +3 -0
  104. package/dist/full-editable-table/index.d.ts.map +1 -0
  105. package/dist/full-editable-table/index.js +2 -0
  106. package/dist/full-editable-table/index.js.map +1 -0
  107. package/dist/full-editable-table/types.d.ts +95 -0
  108. package/dist/full-editable-table/types.d.ts.map +1 -0
  109. package/dist/full-editable-table/types.js +2 -0
  110. package/dist/full-editable-table/types.js.map +1 -0
  111. package/dist/index.d.ts +19 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +15 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/read.d.ts +14 -0
  116. package/dist/read.d.ts.map +1 -0
  117. package/dist/read.js +151 -0
  118. package/dist/read.js.map +1 -0
  119. package/dist/registry.d.ts +24 -0
  120. package/dist/registry.d.ts.map +1 -0
  121. package/dist/registry.js +49 -0
  122. package/dist/registry.js.map +1 -0
  123. package/dist/rowMerge.d.ts +2 -0
  124. package/dist/rowMerge.d.ts.map +1 -0
  125. package/dist/rowMerge.js +32 -0
  126. package/dist/rowMerge.js.map +1 -0
  127. package/dist/tableScroll.d.ts +10 -0
  128. package/dist/tableScroll.d.ts.map +1 -0
  129. package/dist/tableScroll.js +14 -0
  130. package/dist/tableScroll.js.map +1 -0
  131. package/dist/types.d.ts +128 -0
  132. package/dist/types.d.ts.map +1 -0
  133. package/dist/types.js +2 -0
  134. package/dist/types.js.map +1 -0
  135. package/package.json +60 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/full-editable-table/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAIlD,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAA+B,IAAI,CAAC,CAAC;AAEzF,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,CAAC,uBAAuB,CAA+B,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { FullEditableTable } from './FullEditableTable.js';
2
+ export type { FullEditableTableComponent, FullEditableTableProps, FullEditableTableRef, RowStructureChange, RowValidationError, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/full-editable-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FullEditableTable } from './FullEditableTable.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/full-editable-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,95 @@
1
+ import type { Key, ReactElement, ReactNode, Ref } from 'react';
2
+ import type { FormInstance, TableProps } from 'antd';
3
+ import type { TableFooterContext } from '../TableFooter.js';
4
+ import type { EditableColumn, NamePath, ToolbarPlacement } from '../types.js';
5
+ export interface RowValidationError {
6
+ rowKey: Key;
7
+ name: NamePath;
8
+ messages: string[];
9
+ }
10
+ /**
11
+ * 结构变化通知。
12
+ *
13
+ * 批量删除(勾选后删除)时**逐行触发**,且触发时表格数据已是删除后的状态:
14
+ * 回调里调 `getDataSync()` 拿到的是删完的集合,被删行只通过这里的 `row` 提供。
15
+ */
16
+ export interface RowStructureChange<T> {
17
+ type: 'add' | 'insert' | 'remove' | 'replace';
18
+ rowKey: Key;
19
+ row?: T;
20
+ }
21
+ export interface FullEditableTableRef<T> {
22
+ addRow(record?: Partial<T>): void;
23
+ insertRow(anchorKey: Key, position: 'before' | 'after', record?: Partial<T>): void;
24
+ removeRow(rowKey: Key): void;
25
+ /** 按 rowOrder 读取每行常驻 Form 的当前值,合并未映射到表单的原始字段 */
26
+ getDataSync(): T[];
27
+ validate(): Promise<{
28
+ valid: true;
29
+ rows: T[];
30
+ } | {
31
+ valid: false;
32
+ errors: RowValidationError[];
33
+ }>;
34
+ submit(): Promise<void>;
35
+ /** 显式替换整表数据并重建身份;动态属性重算,但不触发 linkage/events */
36
+ setData(rows: T[]): void;
37
+ }
38
+ export interface FullEditableTableProps<T extends object> extends Omit<TableProps<T>, 'columns' | 'dataSource' | 'rowKey' | 'components'> {
39
+ columns: EditableColumn<T>[];
40
+ /** 只在初始化与 setData 时使用,不随 props 变化覆盖用户正在输入的内容;缺省为空表 */
41
+ initialRows?: T[];
42
+ /** 业务 rowKey;缺省时由组件生成稳定的本地 key */
43
+ rowKey?: keyof T | ((row: T) => Key);
44
+ createRow?: () => Partial<T>;
45
+ minRows?: number;
46
+ maxRows?: number;
47
+ disabled?: boolean;
48
+ /** 表体最大高度(scroll.y 的便捷入口):超过后表体自身滚动;不传则整表撑开 */
49
+ maxHeight?: number;
50
+ /** 新增按钮(追加到末尾),默认显示 */
51
+ showAddButton?: boolean;
52
+ /** 新增按钮文案,默认「新增」 */
53
+ addButtonText?: string;
54
+ /** 行内操作列:插入按钮(默认插到本行之后),默认显示 */
55
+ showInsertAction?: boolean;
56
+ /** 行内操作列:删除按钮,默认显示 */
57
+ showDeleteAction?: boolean;
58
+ /** 插入位置,默认 after(插到本行之后) */
59
+ insertPosition?: 'before' | 'after';
60
+ /** 内置操作列的覆盖属性(标题 / 宽度 / fixed 等) */
61
+ actionColumnProps?: Partial<EditableColumn<T>>;
62
+ /** 底部新增按钮右侧插槽;不传则只渲染新增按钮 */
63
+ renderFooterExtra?: (ctx: FullTableFooterContext<T>) => ReactNode;
64
+ /** 行多选(勾选框),默认关闭;调用方自己传 rowSelection 时以调用方为准 */
65
+ showRowSelection?: boolean;
66
+ /** 底部批量删除按钮,默认关闭;只删勾选行,需同时开启 showRowSelection */
67
+ showBatchDelete?: boolean;
68
+ /** 批量删除文案,默认「批量删除」 */
69
+ batchDeleteText?: string;
70
+ /** 内置工具条(新增 / 插槽 / 批量删除)位置,默认顶部(与老家族 BatchEdit 一致) */
71
+ toolbarPlacement?: ToolbarPlacement;
72
+ /** 内置按钮是否带图标(新增 / 批量删除),默认不带 */
73
+ showButtonIcon?: boolean;
74
+ onSubmit?: (rows: T[]) => Promise<void> | void;
75
+ /** 观察回调,不是组件内部正确性依赖的同步通道 */
76
+ onRowValuesChange?: (rowKey: Key, changed: Partial<T>) => void;
77
+ onRowsStructureChange?: (info: RowStructureChange<T>) => void;
78
+ onValidationFailed?: (errors: RowValidationError[]) => void;
79
+ /** 表级校验出口:行级校验全部通过后执行,返回错误则阻断提交 */
80
+ onValidateRows?: (rows: T[]) => Promise<RowValidationError[] | void> | RowValidationError[] | void;
81
+ }
82
+ /** 底部插槽:比普通表格多一个插入能力 */
83
+ export interface FullTableFooterContext<T> extends TableFooterContext<T> {
84
+ insertRow(anchorKey: Key, position: 'before' | 'after', record?: Partial<T>): void;
85
+ }
86
+ export interface FullTableRuntime<T> {
87
+ getInitialRecord(key: string): T | undefined;
88
+ registerForm(key: string, form: FormInstance): () => void;
89
+ disabled?: boolean;
90
+ onRowValuesChange?: (rowKey: Key, changed: Record<string, unknown>) => void;
91
+ }
92
+ export type FullEditableTableComponent = <T extends object>(props: FullEditableTableProps<T> & {
93
+ ref?: Ref<FullEditableTableRef<T>>;
94
+ }) => ReactElement;
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/full-editable-table/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/full-editable-table/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /** packages/schema 对外出口:底层字段渲染,后续追加 SchemaForm / 表格组件 */
2
+ export * from './types.js';
3
+ export { registerField, getFieldDefinition, getRegisteredFieldTypes } from './registry.js';
4
+ export type { FieldDefinition } from './registry.js';
5
+ export { SchemaField } from './SchemaField.js';
6
+ export type { SchemaFieldProps } from './SchemaField.js';
7
+ export { defaultRenderRead, renderReadValue, EMPTY_TEXT } from './read.js';
8
+ export { SchemaForm } from './SchemaForm.js';
9
+ export type { SchemaFormProps } from './SchemaForm.js';
10
+ export { SchemaFormField } from './form/SchemaFormField.js';
11
+ export type { SchemaFormFieldProps } from './form/SchemaFormField.js';
12
+ export { FormRuntimeHost, FormRuntimeHostProvider, useFormRuntimeHost } from './form/FormRuntimeHost.js';
13
+ export { namePathKey, normalizeNamePath, getNestedValue } from './form/namePath.js';
14
+ export * from './app-select/index.js';
15
+ export * from './editable-table/index.js';
16
+ export * from './full-editable-table/index.js';
17
+ export { mergeRowValues } from './rowMerge.js';
18
+ export type { TableFooterContext } from './TableFooter.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjF,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ /** packages/schema 对外出口:底层字段渲染,后续追加 SchemaForm / 表格组件 */
2
+ export * from './types.js';
3
+ export { registerField, getFieldDefinition, getRegisteredFieldTypes } from './registry.js';
4
+ export { SchemaField } from './SchemaField.js';
5
+ export { defaultRenderRead, renderReadValue, EMPTY_TEXT } from './read.js';
6
+ export { SchemaForm } from './SchemaForm.js';
7
+ export { SchemaFormField } from './form/SchemaFormField.js';
8
+ export { FormRuntimeHost, FormRuntimeHostProvider, useFormRuntimeHost } from './form/FormRuntimeHost.js';
9
+ export { namePathKey, normalizeNamePath, getNestedValue } from './form/namePath.js';
10
+ // 副作用导入:注册 AppSelect 字段类型,保证只导入本包时即可用
11
+ export * from './app-select/index.js';
12
+ export * from './editable-table/index.js';
13
+ export * from './full-editable-table/index.js';
14
+ export { mergeRowValues } from './rowMerge.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjF,sCAAsC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
package/dist/read.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 只读展示的内置格式化。
3
+ *
4
+ * 原则:宁缺毋猜。用 schema 里真实存在的 options / treeData / dataSource 解析 label;
5
+ * 解析不到就显示原始值或占位符,绝不把 ID 伪装成名称,也不发请求去猜。
6
+ */
7
+ import type { ReactNode } from 'react';
8
+ import type { FieldDefinition } from './registry.js';
9
+ import type { FieldSchema } from './types.js';
10
+ export declare const EMPTY_TEXT = "\u2014";
11
+ export declare function defaultRenderRead<TValue>(value: TValue | undefined, schema: FieldSchema<TValue>): ReactNode;
12
+ /** 只读内容优先级:schema.renderRead > 注册项 renderRead > 内置格式化 */
13
+ export declare function renderReadValue<TValue>(value: TValue | undefined, schema: FieldSchema<TValue>, definition?: FieldDefinition): ReactNode;
14
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,UAAU,WAAM,CAAC;AAoJ9B,wBAAgB,iBAAiB,CAAC,MAAM,EACtC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAC1B,SAAS,CAGX;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,MAAM,EACpC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAC3B,UAAU,CAAC,EAAE,eAAe,GAC3B,SAAS,CAQX"}
package/dist/read.js ADDED
@@ -0,0 +1,151 @@
1
+ import dayjs from 'dayjs';
2
+ export const EMPTY_TEXT = '—';
3
+ const DATE_TYPES = new Set(['DatePicker']);
4
+ const TIME_TYPES = new Set(['TimePicker']);
5
+ const BOOLEAN_TYPES = new Set(['Checkbox']);
6
+ const OPTION_TYPES = new Set(['Select', 'RadioGroup', 'CheckboxGroup', 'TreeSelect', 'Cascader']);
7
+ const UPLOAD_TYPES = new Set(['Upload']);
8
+ const TRANSFER_TYPES = new Set(['Transfer']);
9
+ /** 多值展示分隔符:与数组默认展示保持一致 */
10
+ const MULTI_SEPARATOR = '、';
11
+ /** Cascader 层级分隔符 */
12
+ const PATH_SEPARATOR = ' / ';
13
+ function isEmpty(value) {
14
+ return (value === undefined ||
15
+ value === null ||
16
+ value === '' ||
17
+ (Array.isArray(value) && value.length === 0));
18
+ }
19
+ function toDateText(value, props) {
20
+ const date = dayjs.isDayjs(value) ? value : dayjs(value);
21
+ if (!date.isValid())
22
+ return EMPTY_TEXT;
23
+ const format = typeof props.format === 'string' ? props.format : 'YYYY-MM-DD';
24
+ return date.format(format);
25
+ }
26
+ function toTimeText(value, props) {
27
+ const time = dayjs.isDayjs(value) ? value : dayjs(value);
28
+ if (!time.isValid())
29
+ return EMPTY_TEXT;
30
+ const format = typeof props.format === 'string' ? props.format : 'HH:mm:ss';
31
+ return time.format(format);
32
+ }
33
+ /** 取节点的 label(TreeSelect 用 title,Transfer 用 title) */
34
+ function nodeLabel(node) {
35
+ const label = node.label ?? node.title;
36
+ return typeof label === 'string' && label ? label : undefined;
37
+ }
38
+ /**
39
+ * 深度查找:支持 TreeSelect / Cascader 的 children 嵌套。
40
+ * 找不到返回 undefined,由调用方降级成原始值。
41
+ */
42
+ function findLabelDeep(items, value) {
43
+ if (!Array.isArray(items))
44
+ return undefined;
45
+ for (const item of items) {
46
+ if (!item || typeof item !== 'object')
47
+ continue;
48
+ const node = item;
49
+ // TreeSelect 允许 value ?? key 的降级,这里照搬
50
+ if ((node.value ?? node.key) === value) {
51
+ return nodeLabel(node);
52
+ }
53
+ const nested = findLabelDeep(node.children, value);
54
+ if (nested !== undefined)
55
+ return nested;
56
+ }
57
+ return undefined;
58
+ }
59
+ /** Cascader:值是路径数组,逐层下钻后拼成「浙江 / 杭州」 */
60
+ function resolveCascaderPath(options, path) {
61
+ const labels = [];
62
+ let level = options;
63
+ for (const key of path) {
64
+ if (!Array.isArray(level))
65
+ break;
66
+ const node = level.find((item) => item && typeof item === 'object' && (item.value ?? item.key) === key);
67
+ if (!node) {
68
+ // 中间层断了就把这一层及以下按原始值输出,不做半截猜测
69
+ labels.push(String(key));
70
+ level = undefined;
71
+ break;
72
+ }
73
+ labels.push(nodeLabel(node) ?? String(key));
74
+ level = node.children;
75
+ }
76
+ return labels.join(PATH_SEPARATOR);
77
+ }
78
+ /** 不同控件的选项容器不同 */
79
+ function getOptionItems(type, props) {
80
+ if (TRANSFER_TYPES.has(type))
81
+ return props.dataSource;
82
+ if (type === 'TreeSelect')
83
+ return props.treeData ?? props.options;
84
+ return props.options ?? props.treeData;
85
+ }
86
+ function toPlainText(value, type, props) {
87
+ if (BOOLEAN_TYPES.has(type))
88
+ return value ? '是' : '否';
89
+ if (DATE_TYPES.has(type))
90
+ return toDateText(value, props);
91
+ if (TIME_TYPES.has(type))
92
+ return toTimeText(value, props);
93
+ // Cascader 的路径数组必须整条解析,不能按普通多值拼
94
+ if (type === 'Cascader' && Array.isArray(value)) {
95
+ return resolveCascaderPath(getOptionItems(type, props), value);
96
+ }
97
+ if (OPTION_TYPES.has(type) || TRANSFER_TYPES.has(type)) {
98
+ const items = getOptionItems(type, props);
99
+ if (Array.isArray(value)) {
100
+ return value
101
+ .map((item) => findLabelDeep(items, item) ?? toPlainText(item, 'Input', {}))
102
+ .join(MULTI_SEPARATOR);
103
+ }
104
+ const label = findLabelDeep(items, value);
105
+ if (label !== undefined)
106
+ return label;
107
+ }
108
+ // 上传控件:展示文件名,拿不到 name 就退回序号
109
+ if (UPLOAD_TYPES.has(type) && Array.isArray(value)) {
110
+ return value
111
+ .map((item, index) => {
112
+ if (item && typeof item === 'object') {
113
+ const file = item;
114
+ if (typeof file.name === 'string' && file.name)
115
+ return file.name;
116
+ if (typeof file.url === 'string' && file.url)
117
+ return file.url;
118
+ }
119
+ return typeof item === 'string' ? item : `文件 ${index + 1}`;
120
+ })
121
+ .join(MULTI_SEPARATOR);
122
+ }
123
+ // 历史 {value,label} 协议:有 label 就用 label,没有就落到原始值
124
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
125
+ const legacy = value;
126
+ if (typeof legacy.label === 'string' && legacy.label)
127
+ return legacy.label;
128
+ }
129
+ if (Array.isArray(value)) {
130
+ return value.map((item) => toPlainText(item, 'Input', {})).join(MULTI_SEPARATOR);
131
+ }
132
+ if (typeof value === 'boolean')
133
+ return value ? '是' : '否';
134
+ return String(value);
135
+ }
136
+ export function defaultRenderRead(value, schema) {
137
+ if (isEmpty(value))
138
+ return EMPTY_TEXT;
139
+ return toPlainText(value, schema.type, schema.props ?? {});
140
+ }
141
+ /** 只读内容优先级:schema.renderRead > 注册项 renderRead > 内置格式化 */
142
+ export function renderReadValue(value, schema, definition) {
143
+ if (schema.renderRead) {
144
+ return schema.renderRead(value, schema);
145
+ }
146
+ if (definition?.renderRead) {
147
+ return definition.renderRead(value, schema.props ?? {});
148
+ }
149
+ return defaultRenderRead(value, schema);
150
+ }
151
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 字段注册表:type -> 组件 + 事件适配 + 只读展示。
3
+ *
4
+ * 注册项只描述“怎么渲染一个受控控件”,不承担 Form 绑定、校验和联动,
5
+ * 这些由 SchemaForm 层的 SchemaFormField 负责。
6
+ */
7
+ import type { ComponentType, ReactNode } from 'react';
8
+ import type { FieldType } from './types.js';
9
+ export interface FieldDefinition<T = unknown> {
10
+ component: ComponentType<any>;
11
+ /** 受控值属性名,默认 value;Checkbox 用 checked */
12
+ valuePropName?: string;
13
+ /** 从原始事件参数中取出业务值,默认取第一个参数 */
14
+ getValueFromEvent?: (...args: any[]) => T;
15
+ /** 只读展示;返回 undefined 表示退到内置格式化 */
16
+ renderRead?: (value: T, props: Record<string, unknown>) => ReactNode;
17
+ }
18
+ /** 注册字段类型;重复注册默认拒绝,覆盖必须显式声明 */
19
+ export declare function registerField(type: FieldType, definition: FieldDefinition, options?: {
20
+ override?: boolean;
21
+ }): void;
22
+ export declare function getFieldDefinition(type: string): FieldDefinition | undefined;
23
+ export declare function getRegisteredFieldTypes(): string[];
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAmBtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,iBAAiB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,kCAAkC;IAClC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,CAAC;CACtE;AAID,+BAA+B;AAC/B,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,eAAe,EAC3B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,IAAI,CAWN;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAElD"}
@@ -0,0 +1,49 @@
1
+ import { AutoComplete, Cascader, Checkbox, ColorPicker, DatePicker, Input, InputNumber, Radio, Rate, Select, Slider, TimePicker, Transfer, TreeSelect, Upload, } from 'antd';
2
+ const registry = new Map();
3
+ /** 注册字段类型;重复注册默认拒绝,覆盖必须显式声明 */
4
+ export function registerField(type, definition, options) {
5
+ // 'Custom' 由 SchemaField 直接分支处理,注册进来也是永不执行的死代码
6
+ if (type === 'Custom') {
7
+ console.warn('[schema] "Custom" 是保留类型,由字段自身的 render 提供,不能注册');
8
+ return;
9
+ }
10
+ if (registry.has(type) && !options?.override) {
11
+ console.warn(`[schema] 字段类型 "${type}" 已注册,如需覆盖请显式传入 { override: true }`);
12
+ return;
13
+ }
14
+ registry.set(type, definition);
15
+ }
16
+ export function getFieldDefinition(type) {
17
+ return registry.get(type);
18
+ }
19
+ export function getRegisteredFieldTypes() {
20
+ return [...registry.keys()];
21
+ }
22
+ // ---- 内置注册:首期只覆盖常用控件,其余按需补充 ----
23
+ registerField('Input', { component: Input });
24
+ registerField('Input.TextArea', { component: Input.TextArea });
25
+ registerField('Input.Password', { component: Input.Password });
26
+ registerField('InputNumber', { component: InputNumber });
27
+ registerField('AutoComplete', { component: AutoComplete });
28
+ registerField('Cascader', { component: Cascader });
29
+ registerField('Select', { component: Select });
30
+ registerField('TreeSelect', { component: TreeSelect });
31
+ registerField('Slider', { component: Slider });
32
+ registerField('Rate', { component: Rate });
33
+ registerField('DatePicker', { component: DatePicker });
34
+ registerField('TimePicker', { component: TimePicker });
35
+ registerField('ColorPicker', { component: ColorPicker });
36
+ registerField('RadioGroup', { component: Radio.Group });
37
+ registerField('CheckboxGroup', { component: Checkbox.Group });
38
+ registerField('Transfer', { component: Transfer, valuePropName: 'targetKeys' });
39
+ registerField('Checkbox', {
40
+ component: Checkbox,
41
+ valuePropName: 'checked',
42
+ getValueFromEvent: (event) => event.target.checked,
43
+ });
44
+ registerField('Upload', {
45
+ component: Upload,
46
+ valuePropName: 'fileList',
47
+ getValueFromEvent: (info) => info.fileList,
48
+ });
49
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function mergeRowValues<T extends object>(initial: T, values: unknown): T;
2
+ //# sourceMappingURL=rowMerge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowMerge.d.ts","sourceRoot":"","sources":["../src/rowMerge.ts"],"names":[],"mappings":"AA0BA,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAI/E"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 把 Form Store 的值合并回完整业务记录。
3
+ *
4
+ * 只合并普通对象;数组、日期等整体替换。表单里被显式清空(undefined)的字段
5
+ * 必须覆盖初始值,不能被旧数据“复活”。
6
+ *
7
+ * EditableTable 与 FullEditableTable 共用,避免各自实现一份合并策略。
8
+ */
9
+ function isPlainObject(value) {
10
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
11
+ return false;
12
+ const proto = Object.getPrototypeOf(value);
13
+ return proto === Object.prototype || proto === null;
14
+ }
15
+ function mergeInto(base, patch) {
16
+ const result = isPlainObject(base) ? { ...base } : {};
17
+ for (const [key, value] of Object.entries(patch)) {
18
+ if (value === undefined) {
19
+ result[key] = undefined;
20
+ continue;
21
+ }
22
+ result[key] = isPlainObject(value) ? mergeInto(result[key], value) : value;
23
+ }
24
+ return result;
25
+ }
26
+ export function mergeRowValues(initial, values) {
27
+ if (!isPlainObject(values))
28
+ return { ...initial };
29
+ // 初始记录本身不是普通对象时(极少见)直接以表单值为准
30
+ return mergeInto(initial, values);
31
+ }
32
+ //# sourceMappingURL=rowMerge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowMerge.js","sourceRoot":"","sources":["../src/rowMerge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,IAAa,EAAE,KAA8B;IAC9D,MAAM,MAAM,GAA4B,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAmB,OAAU,EAAE,MAAe;IAC1E,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAClD,6BAA6B;IAC7B,OAAO,SAAS,CAAC,OAAO,EAAE,MAAM,CAAM,CAAC;AACzC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 表体高度约定:两个可编辑表格共用。
3
+ *
4
+ * antd 把 scroll.y 直接写成表体的 max-height(rc-table Table.js),
5
+ * 所以短内容不会被拉高、超过才纵向滚动。这里把 maxHeight 收敛成一行配置,
6
+ * 外层不要再包 overflow 盒子——那会让表头跟着滚走、固定列错位。
7
+ */
8
+ import type { TableProps } from 'antd';
9
+ export declare function resolveTableScroll<T>(scroll: TableProps<T>['scroll'], maxHeight: number | undefined, tag: string): TableProps<T>['scroll'];
10
+ //# sourceMappingURL=tableScroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableScroll.d.ts","sourceRoot":"","sources":["../src/tableScroll.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAIvC,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CASzB"}
@@ -0,0 +1,14 @@
1
+ import { IS_DEV } from './env.js';
2
+ export function resolveTableScroll(scroll, maxHeight, tag) {
3
+ if (maxHeight === undefined)
4
+ return scroll;
5
+ if (!Number.isFinite(maxHeight) || maxHeight <= 0) {
6
+ // 0 或负数会把表体压没,按配置错误处理,不静默生效
7
+ if (IS_DEV)
8
+ console.warn(`[${tag}] maxHeight 必须是正数,当前为 ${maxHeight},已忽略`);
9
+ return scroll;
10
+ }
11
+ // 显式 scroll.y 优先:透传属性比便捷属性更具体
12
+ return { ...scroll, y: scroll?.y ?? maxHeight };
13
+ }
14
+ //# sourceMappingURL=tableScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableScroll.js","sourceRoot":"","sources":["../src/tableScroll.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,kBAAkB,CAChC,MAA+B,EAC/B,SAA6B,EAC7B,GAAW;IAEX,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,4BAA4B;QAC5B,IAAI,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,yBAAyB,SAAS,MAAM,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,8BAA8B;IAC9B,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;AAClD,CAAC"}