@aiao/rxdb-model 0.0.19 → 0.0.28

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 (182) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +43 -6
  3. package/dist/cn.d.ts +19 -0
  4. package/dist/cn.d.ts.map +1 -0
  5. package/dist/entity-capabilities.d.ts +25 -0
  6. package/dist/entity-capabilities.d.ts.map +1 -0
  7. package/dist/entity-detail/detail-tabs.d.ts +7 -1
  8. package/dist/entity-detail/detail-tabs.d.ts.map +1 -1
  9. package/dist/entity-detail/index.d.ts +5 -0
  10. package/dist/entity-detail/index.d.ts.map +1 -1
  11. package/dist/entity-detail/interfaces.d.ts +25 -1
  12. package/dist/entity-detail/interfaces.d.ts.map +1 -1
  13. package/dist/entity-field.utils.d.ts +54 -2
  14. package/dist/entity-field.utils.d.ts.map +1 -1
  15. package/dist/entity-form/form-data.d.ts +21 -0
  16. package/dist/entity-form/form-data.d.ts.map +1 -1
  17. package/dist/entity-form/form-fields.d.ts +19 -1
  18. package/dist/entity-form/form-fields.d.ts.map +1 -1
  19. package/dist/entity-form/form-validation.d.ts +13 -0
  20. package/dist/entity-form/form-validation.d.ts.map +1 -1
  21. package/dist/entity-form/index.d.ts +5 -0
  22. package/dist/entity-form/index.d.ts.map +1 -1
  23. package/dist/entity-form/interfaces.d.ts +60 -0
  24. package/dist/entity-form/interfaces.d.ts.map +1 -1
  25. package/dist/entity-list/manual-order-list.d.ts +92 -0
  26. package/dist/entity-list/manual-order-list.d.ts.map +1 -0
  27. package/dist/entity-list/types.d.ts +25 -0
  28. package/dist/entity-list/types.d.ts.map +1 -0
  29. package/dist/entity-table/columns/build-editable-columns.d.ts +24 -2
  30. package/dist/entity-table/columns/build-editable-columns.d.ts.map +1 -1
  31. package/dist/entity-table/columns/column-utils.d.ts +75 -9
  32. package/dist/entity-table/columns/column-utils.d.ts.map +1 -1
  33. package/dist/entity-table/editors/color-editor.d.ts +23 -0
  34. package/dist/entity-table/editors/color-editor.d.ts.map +1 -0
  35. package/dist/entity-table/editors/date-editor.d.ts +5 -0
  36. package/dist/entity-table/editors/date-editor.d.ts.map +1 -1
  37. package/dist/entity-table/editors/enum-editor.d.ts +10 -0
  38. package/dist/entity-table/editors/enum-editor.d.ts.map +1 -1
  39. package/dist/entity-table/editors/global-overlay-editor.d.ts +26 -3
  40. package/dist/entity-table/editors/global-overlay-editor.d.ts.map +1 -1
  41. package/dist/entity-table/editors/icon-list-editor.d.ts +12 -0
  42. package/dist/entity-table/editors/icon-list-editor.d.ts.map +1 -1
  43. package/dist/entity-table/editors/json-editor.d.ts +5 -0
  44. package/dist/entity-table/editors/json-editor.d.ts.map +1 -1
  45. package/dist/entity-table/editors/key-value-editor.d.ts +11 -1
  46. package/dist/entity-table/editors/key-value-editor.d.ts.map +1 -1
  47. package/dist/entity-table/editors/lucide-svg.d.ts +3 -2
  48. package/dist/entity-table/editors/lucide-svg.d.ts.map +1 -1
  49. package/dist/entity-table/editors/multiselect-editor.d.ts +24 -6
  50. package/dist/entity-table/editors/multiselect-editor.d.ts.map +1 -1
  51. package/dist/entity-table/editors/number-editor.d.ts +32 -2
  52. package/dist/entity-table/editors/number-editor.d.ts.map +1 -1
  53. package/dist/entity-table/editors/relation-editor.d.ts +12 -0
  54. package/dist/entity-table/editors/relation-editor.d.ts.map +1 -1
  55. package/dist/entity-table/editors/safe-list-editor.d.ts +1 -0
  56. package/dist/entity-table/editors/safe-list-editor.d.ts.map +1 -1
  57. package/dist/entity-table/editors/tags-editor.d.ts +11 -0
  58. package/dist/entity-table/editors/tags-editor.d.ts.map +1 -1
  59. package/dist/entity-table/editors/text-format-editor.d.ts +32 -0
  60. package/dist/entity-table/editors/text-format-editor.d.ts.map +1 -0
  61. package/dist/entity-table/editors/uuid-editor.d.ts +13 -0
  62. package/dist/entity-table/editors/uuid-editor.d.ts.map +1 -1
  63. package/dist/entity-table/index.d.ts +13 -3
  64. package/dist/entity-table/index.d.ts.map +1 -1
  65. package/dist/entity-table/interfaces.d.ts +38 -0
  66. package/dist/entity-table/interfaces.d.ts.map +1 -1
  67. package/dist/entity-table/vtable/table-clipboard.d.ts +30 -1
  68. package/dist/entity-table/vtable/table-clipboard.d.ts.map +1 -1
  69. package/dist/entity-table/vtable/table-factory.d.ts +23 -3
  70. package/dist/entity-table/vtable/table-factory.d.ts.map +1 -1
  71. package/dist/entity-table/vtable/table-keyboard.d.ts +18 -1
  72. package/dist/entity-table/vtable/table-keyboard.d.ts.map +1 -1
  73. package/dist/entity-table/vtable/table-operations.d.ts +42 -1
  74. package/dist/entity-table/vtable/table-operations.d.ts.map +1 -1
  75. package/dist/entity-table/vtable/table-row-move.d.ts +88 -0
  76. package/dist/entity-table/vtable/table-row-move.d.ts.map +1 -0
  77. package/dist/entity-table/vtable/table-theme.d.ts +47 -2
  78. package/dist/entity-table/vtable/table-theme.d.ts.map +1 -1
  79. package/dist/entity-table/vtable/table-tooltip.d.ts +7 -1
  80. package/dist/entity-table/vtable/table-tooltip.d.ts.map +1 -1
  81. package/dist/entity-table/vtable/vtable-compat.d.ts +33 -5
  82. package/dist/entity-table/vtable/vtable-compat.d.ts.map +1 -1
  83. package/dist/entity-value.utils.d.ts +49 -1
  84. package/dist/entity-value.utils.d.ts.map +1 -1
  85. package/dist/index.d.ts +10 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +4394 -64471
  88. package/dist/query-builder/models/operator.interface.d.ts +5 -1
  89. package/dist/query-builder/models/operator.interface.d.ts.map +1 -1
  90. package/dist/query-builder/models/query-builder-state.d.ts +31 -2
  91. package/dist/query-builder/models/query-builder-state.d.ts.map +1 -1
  92. package/dist/query-builder/models/validation.interface.d.ts +1 -1
  93. package/dist/query-builder/services/operator-registry.service.d.ts +7 -1
  94. package/dist/query-builder/services/operator-registry.service.d.ts.map +1 -1
  95. package/dist/query-builder/services/query-builder.service.d.ts +10 -4
  96. package/dist/query-builder/services/query-builder.service.d.ts.map +1 -1
  97. package/dist/query-builder/services/query-converter.service.d.ts +5 -1
  98. package/dist/query-builder/services/query-converter.service.d.ts.map +1 -1
  99. package/dist/query-builder/services/schema-parser.service.d.ts +5 -1
  100. package/dist/query-builder/services/schema-parser.service.d.ts.map +1 -1
  101. package/dist/query-builder/services/validation.service.d.ts +29 -3
  102. package/dist/query-builder/services/validation.service.d.ts.map +1 -1
  103. package/dist/query-builder/utils/date.d.ts +12 -0
  104. package/dist/query-builder/utils/date.d.ts.map +1 -1
  105. package/dist/query-builder/utils/field-tree.d.ts.map +1 -1
  106. package/dist/query-builder/utils/id.d.ts +2 -0
  107. package/dist/query-builder/utils/id.d.ts.map +1 -1
  108. package/dist/query-builder/utils/metadata-field-extractor.d.ts +13 -2
  109. package/dist/query-builder/utils/metadata-field-extractor.d.ts.map +1 -1
  110. package/dist/query-builder/utils/popover-position.d.ts +11 -0
  111. package/dist/query-builder/utils/popover-position.d.ts.map +1 -1
  112. package/dist/query-builder/utils/schema-factory.d.ts +1 -1
  113. package/dist/query-builder/utils/structural-equal.d.ts +4 -0
  114. package/dist/query-builder/utils/structural-equal.d.ts.map +1 -1
  115. package/dist/query-builder/utils/value-input.d.ts +20 -0
  116. package/dist/query-builder/utils/value-input.d.ts.map +1 -1
  117. package/dist/structural-equal.d.ts +5 -1
  118. package/dist/structural-equal.d.ts.map +1 -1
  119. package/package.json +34 -10
  120. package/src/cn.ts +21 -0
  121. package/src/entity-capabilities.ts +37 -0
  122. package/src/entity-detail/detail-tabs.ts +48 -0
  123. package/src/entity-detail/index.ts +7 -0
  124. package/src/entity-detail/interfaces.ts +55 -0
  125. package/src/entity-field.utils.ts +205 -0
  126. package/src/entity-form/form-data.ts +83 -0
  127. package/src/entity-form/form-fields.ts +48 -0
  128. package/src/entity-form/form-validation.ts +34 -0
  129. package/src/entity-form/index.ts +9 -0
  130. package/src/entity-form/interfaces.ts +116 -0
  131. package/src/entity-list/manual-order-list.ts +159 -0
  132. package/src/entity-list/types.ts +22 -0
  133. package/src/entity-table/columns/build-editable-columns.ts +184 -0
  134. package/src/entity-table/columns/column-utils.ts +657 -0
  135. package/src/entity-table/editors/color-editor.ts +239 -0
  136. package/src/entity-table/editors/date-editor.ts +169 -0
  137. package/src/entity-table/editors/enum-editor.ts +167 -0
  138. package/src/entity-table/editors/global-overlay-editor.ts +277 -0
  139. package/src/entity-table/editors/icon-list-editor.ts +130 -0
  140. package/src/entity-table/editors/json-editor.ts +212 -0
  141. package/src/entity-table/editors/key-value-editor.ts +595 -0
  142. package/src/entity-table/editors/lucide-svg.ts +78 -0
  143. package/src/entity-table/editors/multiselect-editor.ts +171 -0
  144. package/src/entity-table/editors/number-editor.ts +322 -0
  145. package/src/entity-table/editors/relation-editor.ts +316 -0
  146. package/src/entity-table/editors/safe-list-editor.ts +17 -0
  147. package/src/entity-table/editors/tags-editor.ts +239 -0
  148. package/src/entity-table/editors/text-format-editor.ts +220 -0
  149. package/src/entity-table/editors/uuid-editor.ts +198 -0
  150. package/src/entity-table/index.ts +96 -0
  151. package/src/entity-table/interfaces.ts +100 -0
  152. package/src/entity-table/vtable/table-clipboard.ts +419 -0
  153. package/src/entity-table/vtable/table-factory.ts +117 -0
  154. package/src/entity-table/vtable/table-keyboard.ts +89 -0
  155. package/src/entity-table/vtable/table-operations.ts +123 -0
  156. package/src/entity-table/vtable/table-row-move.ts +122 -0
  157. package/src/entity-table/vtable/table-theme.ts +181 -0
  158. package/src/entity-table/vtable/table-tooltip.ts +70 -0
  159. package/src/entity-table/vtable/vtable-compat.ts +84 -0
  160. package/src/entity-value.utils.ts +456 -0
  161. package/src/index.ts +58 -0
  162. package/src/query-builder/models/config.interface.ts +31 -0
  163. package/src/query-builder/models/index.ts +8 -0
  164. package/src/query-builder/models/operator.interface.ts +191 -0
  165. package/src/query-builder/models/query-builder-state.ts +222 -0
  166. package/src/query-builder/models/validation.interface.ts +184 -0
  167. package/src/query-builder/services/index.ts +9 -0
  168. package/src/query-builder/services/operator-registry.service.ts +243 -0
  169. package/src/query-builder/services/query-builder.service.ts +568 -0
  170. package/src/query-builder/services/query-converter.service.ts +153 -0
  171. package/src/query-builder/services/schema-parser.service.ts +312 -0
  172. package/src/query-builder/services/validation.service.ts +390 -0
  173. package/src/query-builder/utils/date.ts +35 -0
  174. package/src/query-builder/utils/field-tree.ts +400 -0
  175. package/src/query-builder/utils/id.ts +15 -0
  176. package/src/query-builder/utils/index.ts +12 -0
  177. package/src/query-builder/utils/metadata-field-extractor.ts +460 -0
  178. package/src/query-builder/utils/popover-position.ts +63 -0
  179. package/src/query-builder/utils/schema-factory.ts +75 -0
  180. package/src/query-builder/utils/structural-equal.ts +5 -0
  181. package/src/query-builder/utils/value-input.ts +105 -0
  182. package/src/structural-equal.ts +49 -0
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Aiao Team
3
+ Copyright (c) 2025-2026 Aiao Team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,11 +1,48 @@
1
- # rxdb-model
1
+ # @aiao/rxdb-model
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ 框架无关的 RxDB 实体模型核心库:从实体元数据(`EntityMetadata`)派生表单、详情页、可编辑表格与可视化查询构建器所需的全部纯逻辑,并配套 VTable 表格运行时基础设施。
4
4
 
5
- ## Building
5
+ ## 定位与边界
6
6
 
7
- Run `nx build rxdb-model` to build the library.
7
+ - **唯一输入源**:`@aiao/rxdb` 的实体装饰器体系产出的 `EntityMetadata`。
8
+ - **框架无关**:本包不含任何 Angular / React / Vue 依赖,可被任意前端技术栈消费;三框架 UI 组件层见 `@aiao/rxdb-model-angular`(React / Vue 版本陆续提供)。
9
+ - **与 `@aiao/rxdb` 的边界**:核心包的 `entity-field.utils`(Field Descriptor 字段语义元数据)与 `entity-value.utils`(`parseEntityFieldValue`/`formatEntityFieldValue`/`validateFieldValue` 等)服务于核心内部与插件契约;本包的同名模块面向「实体管理界面」场景(表单字段提取、字段值解析/格式化/校验、表格列构建),语义不同、请勿混用。
10
+ - **表格引擎**:`@visactor/vtable` 与 `@visactor/vtable-editors` 为 peer 依赖(`~1.26.x`),由消费方提供。
8
11
 
9
- ## Running unit tests
12
+ ## 模块一览
10
13
 
11
- Run `nx test rxdb-model` to execute the unit tests via [Vitest](https://vitest.dev/).
14
+ | 目录 | 职责 |
15
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
16
+ | 根目录 `entity-field.utils` / `entity-value.utils` / `structural-equal` | 字段配置提取、字段值解析/格式化/校验、键序无关的结构化深比较 |
17
+ | `entity-form/` | 元数据 → 表单字段配置(create/edit/view 三模式)、实体与表单数据双向转换(仅变化字段)、表单校验 |
18
+ | `entity-detail/` | 元数据 → 详情页 Tab 结构(基础表单 + 每关系一个表格 Tab) |
19
+ | `entity-table/` | 可编辑表格列构建、15 个 VTable 单元格编辑器、剪贴板 / 键盘 / 主题 / tooltip / 拖拽重排等运行时基础设施 |
20
+ | `query-builder/` | 可视化查询构建器引擎:状态服务、操作符注册表、查询转换、schema 解析、即时校验、字段树等工具 |
21
+
22
+ ## 使用
23
+
24
+ ```ts
25
+ import { buildFormFields, buildEditableColumns, buildDetailTabs } from '@aiao/rxdb-model';
26
+
27
+ const fields = buildFormFields(metadata, 'create');
28
+ const columns = buildEditableColumns(metadata);
29
+ const tabs = buildDetailTabs(metadata);
30
+ ```
31
+
32
+ 查询构建器(框架无关服务层):
33
+
34
+ ```ts
35
+ import { createQueryBuilderService } from '@aiao/rxdb-model';
36
+
37
+ const qb = createQueryBuilderService<MyEntity>({ schema: { fields } });
38
+ qb.state$.subscribe(state => console.log(state));
39
+ qb.addRule({ field: 'title', operator: 'contains', value: 'a' });
40
+ const rxdbQuery = qb.toRxDBQuery();
41
+ ```
42
+
43
+ ## 开发
44
+
45
+ ```bash
46
+ pnpm nx test rxdb-model # Vitest(node 默认环境,DOM 用例经文件头 pragma 切 happy-dom)
47
+ pnpm nx build rxdb-model # Vite 库构建(ES 单格式 + dts)
48
+ ```
package/dist/cn.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { ClassValue } from 'clsx';
2
+ /**
3
+ * 拼接 CSS 类名(clsx 的薄封装)。
4
+ *
5
+ * 过滤 falsy 值并支持对象 / 数组形式的条件类名,用于替代模板字符串拼接:
6
+ * 模板字符串中条件类名前的分隔空格若位于行尾,会被格式化工具的尾随空白
7
+ * 裁剪吃掉,产生 `flex-coloverflow-auto` 这类拼接错误;本函数不存在该问题。
8
+ *
9
+ * @param inputs - 字符串类名、条件对象或数组,falsy 值会被自动忽略
10
+ * @returns 以单个空格连接后的类名字符串
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * cn('tab-content flex-col', isForm ? 'overflow-auto p-4' : 'overflow-hidden')
15
+ * // 'tab-content flex-col overflow-auto p-4'
16
+ * ```
17
+ */
18
+ export declare function cn(...inputs: ClassValue[]): string;
19
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../src/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAElD"}
@@ -0,0 +1,25 @@
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
+ /**
3
+ * 实体在公开写入口上允许的界面操作
4
+ */
5
+ export interface EntityCapabilities {
6
+ /** 可新增:`create` 为 `'both'` */
7
+ readonly canCreate: boolean;
8
+ /** 已有行可编辑:`update` 为 `'both'`;否则行只读、详情以查看模式打开 */
9
+ readonly canEdit: boolean;
10
+ /** 已有行可删除:`delete` 为 `'both'` */
11
+ readonly canDelete: boolean;
12
+ }
13
+ /**
14
+ * 由实体元数据派生界面能力
15
+ *
16
+ * @param metadata - 实体元数据(只读其中的 `permissions`)
17
+ * @returns 三项能力;未声明的操作按 `'both'` 计,即可用
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const { canCreate, canEdit, canDelete } = deriveEntityCapabilities(getEntityMetadata(Invoice));
22
+ * ```
23
+ */
24
+ export declare const deriveEntityCapabilities: (metadata: Pick<EntityMetadata, "permissions">) => EntityCapabilities;
25
+ //# sourceMappingURL=entity-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-capabilities.d.ts","sourceRoot":"","sources":["../src/entity-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,YAAY,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GAAI,UAAU,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,KAAG,kBAIvF,CAAC"}
@@ -1,4 +1,10 @@
1
- import { EntityMetadata } from '../../packages/rxdb/src/index.ts';
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
2
  import { DetailTab } from './interfaces.js';
3
+ /**
4
+ * 根据实体元数据构建详情页标签列表
5
+ * @remarks 基本信息表单标签固定排在首位,其后为每个一对多 / 多对多关系生成一个表格标签
6
+ * @param metadata - 实体元数据
7
+ * @returns 详情页标签配置列表
8
+ */
3
9
  export declare function buildDetailTabs(metadata: EntityMetadata): DetailTab[];
4
10
  //# sourceMappingURL=detail-tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detail-tabs.d.ts","sourceRoot":"","sources":["../../src/entity-detail/detail-tabs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,KAAK,EAAiB,SAAS,EAAkB,MAAM,iBAAiB,CAAC;AAEhF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,CAgCrE"}
1
+ {"version":3,"file":"detail-tabs.d.ts","sourceRoot":"","sources":["../../src/entity-detail/detail-tabs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,KAAK,EAAiB,SAAS,EAAkB,MAAM,iBAAiB,CAAC;AAEhF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,CAgCrE"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Entity Detail 模块
3
+ * 提供实体详情页标签的类型定义与构建工具
4
+ * @module entity-detail
5
+ */
1
6
  export * from './detail-tabs.js';
2
7
  export * from './interfaces.js';
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity-detail/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity-detail/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -1,23 +1,47 @@
1
- import { RelationKind } from '../../packages/rxdb/src/index.ts';
1
+ import { RelationKind } from '@aiao/rxdb';
2
+ /**
3
+ * 详情页标签类型
4
+ */
2
5
  export type DetailTabType = 'form' | 'table';
6
+ /**
7
+ * 详情页标签基础配置
8
+ */
3
9
  export interface DetailTabBase {
10
+ /** 标签唯一标识 */
4
11
  key: string;
12
+ /** 标签显示名称 */
5
13
  label: string;
14
+ /** 标签类型 */
6
15
  type: DetailTabType;
7
16
  }
17
+ /**
18
+ * 表单标签配置(展示实体的基本信息表单)
19
+ */
8
20
  export interface DetailFormTab extends DetailTabBase {
21
+ /** 标签类型:表单 */
9
22
  type: 'form';
10
23
  }
24
+ /**
25
+ * 表格标签配置(展示关联实体的关系数据)
26
+ */
11
27
  export interface DetailTableTab extends DetailTabBase {
28
+ /** 标签类型:表格 */
12
29
  type: 'table';
30
+ /** 关系名 */
13
31
  relationName: string;
32
+ /** 关联实体名 */
14
33
  relatedEntityName: string;
34
+ /** 关联实体命名空间 */
15
35
  relatedNamespace: string;
36
+ /** 关系类型 */
16
37
  relationKind: RelationKind;
17
38
  /** ONE_TO_MANY: 关联实体中指向当前实体的外键字段,如 'ownerId' */
18
39
  foreignKeyField?: string;
19
40
  /** MANY_TO_MANY: 关联实体中指向当前实体的关系属性名,如 'orderItems' */
20
41
  mappedProperty?: string;
21
42
  }
43
+ /**
44
+ * 详情页标签配置
45
+ */
22
46
  export type DetailTab = DetailFormTab | DetailTableTab;
23
47
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/entity-detail/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/entity-detail/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,cAAc;IACd,IAAI,EAAE,OAAO,CAAC;IACd,UAAU;IACV,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW;IACX,YAAY,EAAE,YAAY,CAAC;IAC3B,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC"}
@@ -1,24 +1,76 @@
1
- import { EntityMetadata, PropertyType } from '../packages/rxdb/src/index.ts';
2
- export type EntityFieldType = PropertyType | `${PropertyType.boolean}` | `${PropertyType.date}` | `${PropertyType.enum}` | `${PropertyType.integer}` | `${PropertyType.number}` | `${PropertyType.string}` | `${PropertyType.uuid}` | `${PropertyType.numberArray}` | `${PropertyType.stringArray}` | `${PropertyType.keyValue}` | `${PropertyType.json}` | 'oneToOne' | 'manyToOne' | 'computed';
1
+ import { EntityMetadata, PropertyType, FieldFormat, FieldOptions } from '@aiao/rxdb';
2
+ /**
3
+ * 实体字段类型
4
+ * @remarks 兼容 PropertyType 枚举值及其字符串字面量形式,并包含关系字段(oneToOne / manyToOne)与计算字段(computed)的标识
5
+ */
6
+ export type EntityFieldType = PropertyType | `${PropertyType.bigint}` | `${PropertyType.binary}` | `${PropertyType.boolean}` | `${PropertyType.date}` | `${PropertyType.enum}` | `${PropertyType.integer}` | `${PropertyType.number}` | `${PropertyType.string}` | `${PropertyType.uuid}` | `${PropertyType.numberArray}` | `${PropertyType.stringArray}` | `${PropertyType.keyValue}` | `${PropertyType.json}` | 'oneToOne' | 'manyToOne' | 'computed';
7
+ /**
8
+ * 键值类型字段中单个键的 Schema 配置
9
+ */
3
10
  export interface KeyValueSchemaEntry {
11
+ /** 键的显示名称 */
4
12
  label?: string;
13
+ /** 值的类型 */
5
14
  type?: 'string' | 'number' | 'integer' | 'boolean' | 'date';
15
+ /** 是否必填 */
6
16
  required?: boolean;
17
+ /** 是否可为空 */
7
18
  nullable?: boolean;
8
19
  }
20
+ /**
21
+ * 实体字段配置
22
+ */
9
23
  export interface EntityFieldConfig {
24
+ /** 字段名 */
10
25
  field: string;
26
+ /** 显示名称 */
11
27
  displayName: string;
28
+ /** 字段类型 */
12
29
  type: EntityFieldType;
30
+ /** 是否只读 */
13
31
  readonly?: boolean;
32
+ /** 是否可为空 */
14
33
  nullable?: boolean;
34
+ /** 是否必填 */
15
35
  required?: boolean;
36
+ /** 是否唯一 */
16
37
  unique?: boolean;
38
+ /** 枚举类型的可选值 */
17
39
  enumValues?: readonly string[];
40
+ /** 键值类型字段的 Schema */
18
41
  keyValueSchema?: Record<string, KeyValueSchemaEntry>;
42
+ /** 关系字段关联的实体名 */
19
43
  relatedEntityName?: string;
44
+ /** 关系字段关联实体的命名空间 */
20
45
  relatedNamespace?: string;
46
+ /**
47
+ * 字段语义标注(只影响展示与控件选择,不改变运行时值类型)
48
+ * 仅在元数据声明 `format` 时输出该键
49
+ */
50
+ format?: FieldFormat;
51
+ /**
52
+ * 枚举/多选值的展示元数据(label / color / disabled),键是 `enum` 的子集
53
+ * 仅在元数据声明 `options` 时输出该键
54
+ */
55
+ options?: FieldOptions;
56
+ /**
57
+ * 是否为加密列
58
+ * 仅在元数据声明 `encrypted: true` 时输出该键
59
+ */
60
+ encrypted?: boolean;
21
61
  }
62
+ /**
63
+ * 从实体元数据中提取全部业务字段配置
64
+ * @remarks 跳过系统字段,依次收集普通属性、计算属性与关系字段
65
+ * @param metadata - 实体元数据
66
+ * @returns 字段配置列表
67
+ */
22
68
  export declare function extractEntityFields(metadata: EntityMetadata): EntityFieldConfig[];
69
+ /**
70
+ * 从实体元数据中提取系统字段配置
71
+ * @remarks 始终包含只读的 id 字段,并按元数据中实际存在的属性补充时间戳与审计字段
72
+ * @param metadata - 实体元数据
73
+ * @returns 系统字段配置列表
74
+ */
23
75
  export declare function extractSystemFields(metadata: EntityMetadata): EntityFieldConfig[];
24
76
  //# sourceMappingURL=entity-field.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-field.utils.d.ts","sourceRoot":"","sources":["../src/entity-field.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,YAAY,EAKb,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,GAAG,YAAY,CAAC,OAAO,EAAE,GACzB,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,GAAG,YAAY,CAAC,OAAO,EAAE,GACzB,GAAG,YAAY,CAAC,MAAM,EAAE,GACxB,GAAG,YAAY,CAAC,MAAM,EAAE,GACxB,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,GAAG,YAAY,CAAC,WAAW,EAAE,GAC7B,GAAG,YAAY,CAAC,WAAW,EAAE,GAC7B,GAAG,YAAY,CAAC,QAAQ,EAAE,GAC1B,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,UAAU,GACV,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6CD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAsBjF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAiBjF"}
1
+ {"version":3,"file":"entity-field.utils.d.ts","sourceRoot":"","sources":["../src/entity-field.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,YAAY,EAIZ,KAAK,WAAW,EAChB,KAAK,YAAY,EAElB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,GAAG,YAAY,CAAC,MAAM,EAAE,GACxB,GAAG,YAAY,CAAC,MAAM,EAAE,GACxB,GAAG,YAAY,CAAC,OAAO,EAAE,GACzB,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,GAAG,YAAY,CAAC,OAAO,EAAE,GACzB,GAAG,YAAY,CAAC,MAAM,EAAE,GACxB,GAAG,YAAY,CAAC,MAAM,EAAE,GACxB,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,GAAG,YAAY,CAAC,WAAW,EAAE,GAC7B,GAAG,YAAY,CAAC,WAAW,EAAE,GAC7B,GAAG,YAAY,CAAC,QAAQ,EAAE,GAC1B,GAAG,YAAY,CAAC,IAAI,EAAE,GACtB,UAAU,GACV,WAAW,GACX,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW;IACX,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5D,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe;IACf,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,qBAAqB;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,iBAAiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AA2DD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAsBjF;AASD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAQjF"}
@@ -1,5 +1,26 @@
1
1
  import { EntityFormData, FormFieldConfig } from './interfaces.js';
2
+ /**
3
+ * 将实体对象转换为表单数据
4
+ * @remarks 实体上不存在的字段以 null 填充
5
+ * @param entity - 源实体对象
6
+ * @param fields - 表单字段配置
7
+ * @returns 仅包含字段配置中声明字段的表单数据
8
+ */
2
9
  export declare function entityToFormData(entity: Record<string, unknown>, fields: FormFieldConfig[]): EntityFormData;
10
+ /**
11
+ * 计算表单数据相对原实体对象的变更集
12
+ * @remarks 只读字段跳过;值相同(引用相等或结构化相等)的字段不进入变更集
13
+ * @param original - 原实体对象
14
+ * @param formData - 表单数据
15
+ * @param fields - 表单字段配置
16
+ * @returns 发生变化的字段及其解析后的新值
17
+ */
3
18
  export declare function formDataToEntityChanges(original: Record<string, unknown>, formData: EntityFormData, fields: FormFieldConfig[]): Record<string, unknown>;
19
+ /**
20
+ * 根据字段配置创建默认表单数据
21
+ * @remarks 只读字段不参与;布尔字段默认为 false,字符串 / 数字数组默认为空数组,其余字段默认为 null
22
+ * @param fields - 表单字段配置
23
+ * @returns 默认表单数据
24
+ */
4
25
  export declare function createDefaultFormData(fields: FormFieldConfig[]): EntityFormData;
5
26
  //# sourceMappingURL=form-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-data.d.ts","sourceRoot":"","sources":["../../src/entity-form/form-data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,cAAc,CAM3G;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,eAAe,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,cAAc,CAqB/E"}
1
+ {"version":3,"file":"form-data.d.ts","sourceRoot":"","sources":["../../src/entity-form/form-data.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,cAAc,CAM3G;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,eAAe,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,cAAc,CAqB/E"}
@@ -1,6 +1,24 @@
1
- import { EntityMetadata } from '../../packages/rxdb/src/index.ts';
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
2
  import { FormFieldConfig, FormMode } from './interfaces.js';
3
+ /**
4
+ * 根据实体元数据和表单模式构建表单字段列表
5
+ * @remarks 创建模式排除计算字段且不含系统字段;编辑模式追加只读的系统字段;查看模式全部字段设为只读
6
+ * @param metadata - 实体元数据
7
+ * @param mode - 表单模式
8
+ * @returns 表单字段配置列表
9
+ */
3
10
  export declare function buildFormFields(metadata: EntityMetadata, mode: FormMode): FormFieldConfig[];
11
+ /**
12
+ * 按字段的 order 升序排序
13
+ * @remarks 未设置 order 的字段按 0 处理,返回新数组而不修改原数组
14
+ * @param fields - 表单字段配置
15
+ * @returns 排序后的字段列表
16
+ */
4
17
  export declare function sortFormFields(fields: FormFieldConfig[]): FormFieldConfig[];
18
+ /**
19
+ * 过滤掉标记为隐藏的字段
20
+ * @param fields - 表单字段配置
21
+ * @returns 可见字段列表
22
+ */
5
23
  export declare function filterVisibleFields(fields: FormFieldConfig[]): FormFieldConfig[];
6
24
  //# sourceMappingURL=form-fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-fields.d.ts","sourceRoot":"","sources":["../../src/entity-form/form-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEjE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG,eAAe,EAAE,CAY3F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAEhF"}
1
+ {"version":3,"file":"form-fields.d.ts","sourceRoot":"","sources":["../../src/entity-form/form-fields.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG,eAAe,EAAE,CAY3F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAEhF"}
@@ -1,5 +1,18 @@
1
1
  import { FieldValidationError } from '../entity-value.utils.js';
2
2
  import { EntityFormData, FormFieldConfig, FormValidationResult } from './interfaces.js';
3
+ /**
4
+ * 校验单个表单字段值
5
+ * @param field - 表单字段配置
6
+ * @param value - 待校验的字段值
7
+ * @returns 校验错误;校验通过时返回 null
8
+ */
3
9
  export declare function validateField(field: FormFieldConfig, value: unknown): FieldValidationError | null;
10
+ /**
11
+ * 校验整份表单数据
12
+ * @remarks 只读与隐藏字段不参与校验
13
+ * @param fields - 表单字段配置
14
+ * @param data - 表单数据
15
+ * @returns 校验结果(是否通过及错误列表)
16
+ */
4
17
  export declare function validateForm(fields: FormFieldConfig[], data: EntityFormData): FormValidationResult;
5
18
  //# sourceMappingURL=form-validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-validation.d.ts","sourceRoot":"","sources":["../../src/entity-form/form-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE7F,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAEjG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,oBAAoB,CAQlG"}
1
+ {"version":3,"file":"form-validation.d.ts","sourceRoot":"","sources":["../../src/entity-form/form-validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE7F;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAEjG;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,oBAAoB,CAQlG"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Entity Form 模块
3
+ * 提供表单数据转换、字段构建与校验等工具
4
+ * @module entity-form
5
+ */
1
6
  export * from './form-data.js';
2
7
  export * from './form-fields.js';
3
8
  export * from './form-validation.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity-form/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity-form/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
@@ -1,45 +1,105 @@
1
+ import { FieldFormat, FieldOptions } from '@aiao/rxdb';
1
2
  import { EntityFieldType, KeyValueSchemaEntry } from '../entity-field.utils.js';
3
+ /**
4
+ * 表单模式
5
+ */
2
6
  export type FormMode = 'view' | 'edit' | 'create';
7
+ /**
8
+ * 表单字段配置
9
+ */
3
10
  export interface FormFieldConfig {
11
+ /** 字段名 */
4
12
  field: string;
13
+ /** 显示名称 */
5
14
  displayName: string;
15
+ /** 字段类型 */
6
16
  type: EntityFieldType;
17
+ /** 是否只读 */
7
18
  readonly?: boolean;
19
+ /** 是否可为空 */
8
20
  nullable?: boolean;
21
+ /** 是否必填 */
9
22
  required?: boolean;
23
+ /** 是否唯一 */
10
24
  unique?: boolean;
25
+ /** 枚举类型的可选值 */
11
26
  enumValues?: readonly string[];
27
+ /** 键值类型字段的 Schema */
12
28
  keyValueSchema?: Record<string, KeyValueSchemaEntry>;
29
+ /** 关系字段关联的实体名 */
13
30
  relatedEntityName?: string;
31
+ /** 关系字段关联实体的命名空间 */
14
32
  relatedNamespace?: string;
33
+ /** 字段语义标注(只影响展示与控件选择,不改变运行时值类型) */
34
+ format?: FieldFormat;
35
+ /** 枚举/多选值的展示元数据(label / color / disabled) */
36
+ options?: FieldOptions;
37
+ /** 是否为加密列 */
38
+ encrypted?: boolean;
39
+ /** 是否隐藏 */
15
40
  hidden?: boolean;
41
+ /** 排序权重 */
16
42
  order?: number;
43
+ /** 占位提示 */
17
44
  placeholder?: string;
45
+ /** 帮助文本 */
18
46
  helpText?: string;
47
+ /** 占据的栅格列数(1 或 2) */
19
48
  span?: 1 | 2;
20
49
  }
50
+ /**
51
+ * 表单字段值变更事件
52
+ */
21
53
  export interface FormFieldChangeEvent {
54
+ /** 字段名 */
22
55
  field: string;
56
+ /** 字段类型 */
23
57
  type: EntityFieldType;
58
+ /** 变更后的值 */
24
59
  value: unknown;
60
+ /** 变更前的值 */
25
61
  previousValue: unknown;
26
62
  }
63
+ /**
64
+ * 表单数据(字段名到字段值的映射)
65
+ */
27
66
  export interface EntityFormData {
67
+ /** 字段值(字段名 → 值) */
28
68
  [field: string]: unknown;
29
69
  }
70
+ /**
71
+ * 表单校验结果
72
+ */
30
73
  export interface FormValidationResult {
74
+ /** 是否通过校验 */
31
75
  valid: boolean;
76
+ /** 错误列表 */
32
77
  errors: FormFieldValidationError[];
33
78
  }
79
+ /**
80
+ * 表单字段校验错误
81
+ */
34
82
  export interface FormFieldValidationError {
83
+ /** 出错字段名 */
35
84
  field: string;
85
+ /** 错误提示信息 */
36
86
  message: string;
37
87
  }
88
+ /**
89
+ * 关联实体数据提供者
90
+ * @remarks 根据实体名(与可选命名空间)返回可选的关联实体列表
91
+ */
38
92
  export interface RelatedEntityProvider {
93
+ /** 按实体名(与可选命名空间)取得可关联实体条目 */
39
94
  (entityName: string, namespace?: string): RelatedEntityItem[];
40
95
  }
96
+ /**
97
+ * 关联实体条目
98
+ */
41
99
  export interface RelatedEntityItem {
100
+ /** 实体 ID */
42
101
  id: string;
102
+ /** 显示名称 */
43
103
  displayName: string;
44
104
  }
45
105
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/entity-form/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAErF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;CAC/D;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/entity-form/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAErF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe;IACf,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,qBAAqB;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,iBAAiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,aAAa;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,YAAY;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,YAAY;IACZ,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa;IACb,KAAK,EAAE,OAAO,CAAC;IACf,WAAW;IACX,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,92 @@
1
+ import { EntityMetadata, OrderBy } from '@aiao/rxdb';
2
+ import { RowMoveEvent } from '../entity-table/vtable/table-row-move.js';
3
+ /** 列表排序判定需要的实体元数据 */
4
+ export type ManualOrderListMetadata = Pick<EntityMetadata, 'manualOrder' | 'propertyMap'>;
5
+ /** 列表的固定查询(详情页关系标签传入),结构同查询构建器的规则组 */
6
+ export interface ListFixedQuery {
7
+ /** 规则组合方式 */
8
+ readonly combinator: 'and' | 'or';
9
+ /** 规则;嵌套规则组视为不能钉住排序域 */
10
+ readonly rules: readonly unknown[];
11
+ }
12
+ /**
13
+ * 判定列表能否拖拽排序时用到的列表状态
14
+ */
15
+ export interface ListReorderState {
16
+ /** 当前实体元数据;未注册实体为 `undefined` */
17
+ readonly metadata: ManualOrderListMetadata | undefined;
18
+ /** 列头排序状态;只有 `normal`(未按列排序)时显示的才是手动顺序 */
19
+ readonly sortOrder: 'asc' | 'desc' | 'normal';
20
+ /** 用户在筛选框里加了条件 */
21
+ readonly hasUserFilter: boolean;
22
+ /** 列表处于关联选择模式 */
23
+ readonly selectMode: boolean;
24
+ /** 外部传入的固定查询 */
25
+ readonly fixedQuery: ListFixedQuery | undefined;
26
+ /** 排序域已全部加载:没有下一页且不在加载中 */
27
+ readonly fullyLoaded: boolean;
28
+ /** 存在只读行(无编辑权限) */
29
+ readonly hasReadonlyRows: boolean;
30
+ /** 存在未落库的草稿行 */
31
+ readonly hasDrafts: boolean;
32
+ /** 存在未完成的单元格编辑写入 */
33
+ readonly hasPendingEdits: boolean;
34
+ /** 上一次拖拽的重排还没落定 */
35
+ readonly reorderPending: boolean;
36
+ }
37
+ /**
38
+ * 固定查询是否恰好钉住一条完整的排序域
39
+ *
40
+ * @param groupFields - 实体声明的分组字段
41
+ * @param fixedQuery - 列表的固定查询
42
+ * @returns 整表排序要求没有固定条件;分组排序要求只有对全部分组字段各一条等值(或 `null`)条件
43
+ */
44
+ export declare function pinsSingleOrderDomain(groupFields: readonly string[], fixedQuery: ListFixedQuery | undefined): boolean;
45
+ /**
46
+ * 实体列表当前是否允许拖拽排序
47
+ *
48
+ * @param state - 列表状态
49
+ * @returns 全部条件满足时为 `true`:手动排序实体、字符串主键、未按列排序、无用户筛选、非选择模式、
50
+ * 固定查询钉住一条完整排序域、已全部加载、没有只读行 / 草稿 / 未完成编辑 / 未落定的重排
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const enabled = canReorderEntityList({ metadata, sortOrder: 'normal', fixedQuery, ...flags });
55
+ * ```
56
+ */
57
+ export declare function canReorderEntityList(state: ListReorderState): boolean;
58
+ /**
59
+ * 列表未按列排序时的游标排序
60
+ *
61
+ * @param metadata - 实体元数据;未注册实体为 `undefined`
62
+ * @returns 手动排序实体为 `[分组字段… asc, sortOrder asc, id asc]`,其余为 `[id desc]`
63
+ */
64
+ export declare function defaultListOrderBy(metadata: Pick<EntityMetadata, 'manualOrder'> | undefined): OrderBy[];
65
+ /**
66
+ * 行拖放落库时与界面交互的钩子
67
+ */
68
+ export interface RowMoveCommitHooks {
69
+ /** 放下这一刻列表是否允许拖拽排序({@link canReorderEntityList} 的结论) */
70
+ readonly enabled: boolean;
71
+ /** 落库重排,通常是 `repository.reorder(move.id, { prevId, nextId })` */
72
+ reorder(move: RowMoveEvent): Promise<unknown>;
73
+ /** 把表格行恢复成最近一次已提交的顺序 */
74
+ restore(): void;
75
+ /** 重排进行中状态变化 */
76
+ setPending(pending: boolean): void;
77
+ /** 显示(或用 `null` 清除)落库错误 */
78
+ setError(error: unknown): void;
79
+ }
80
+ /**
81
+ * 协调一次行拖放的落库
82
+ *
83
+ * @param move - 表格读出的拖放结果
84
+ * @param hooks - 界面钩子
85
+ * @returns 落库成功为 `true`;不允许拖拽或落库失败为 `false`,此时表格已恢复原顺序
86
+ *
87
+ * @remarks
88
+ * 不允许时零写入,直接恢复表格(程序触发的拖放事件同样被拒)。成功后不改表格,
89
+ * 由活查询按数据库重查的结果刷新;失败时显式恢复,下一次拖拽照常可用。
90
+ */
91
+ export declare function commitRowMove(move: RowMoveEvent, hooks: RowMoveCommitHooks): Promise<boolean>;
92
+ //# sourceMappingURL=manual-order-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual-order-list.d.ts","sourceRoot":"","sources":["../../src/entity-list/manual-order-list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,OAAO,EAKb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAE7E,qBAAqB;AACrB,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,aAAa,CAAC,CAAC;AAE1F,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;IAClC,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACvD,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC9C,kBAAkB;IAClB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,iBAAiB;IACjB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,gBAAgB;IAChB,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,SAAS,CAAC;IAChD,2BAA2B;IAC3B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,mBAAmB;IACnB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,gBAAgB;IAChB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,oBAAoB;IACpB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,mBAAmB;IACnB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAUD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAQrH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CASrE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,SAAS,GAAG,OAAO,EAAE,CAIvG;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,wBAAwB;IACxB,OAAO,IAAI,IAAI,CAAC;IAChB,gBAAgB;IAChB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBnG"}