@aiao/rxdb-model 0.0.26 → 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 (57) hide show
  1. package/dist/cn.d.ts +1 -1
  2. package/dist/entity-capabilities.d.ts +1 -7
  3. package/dist/entity-detail/detail-tabs.d.ts +2 -7
  4. package/dist/entity-detail/interfaces.d.ts +1 -5
  5. package/dist/entity-field.utils.d.ts +1 -7
  6. package/dist/entity-form/form-data.d.ts +1 -1
  7. package/dist/entity-form/form-fields.d.ts +2 -7
  8. package/dist/entity-form/form-validation.d.ts +2 -7
  9. package/dist/entity-form/interfaces.d.ts +2 -6
  10. package/dist/entity-list/manual-order-list.d.ts +2 -9
  11. package/dist/entity-list/types.d.ts +25 -0
  12. package/dist/entity-list/types.d.ts.map +1 -0
  13. package/dist/entity-table/columns/build-editable-columns.d.ts +4 -4
  14. package/dist/entity-table/columns/column-utils.d.ts +4 -4
  15. package/dist/entity-table/editors/color-editor.d.ts +1 -1
  16. package/dist/entity-table/editors/date-editor.d.ts +1 -1
  17. package/dist/entity-table/editors/enum-editor.d.ts +1 -1
  18. package/dist/entity-table/editors/global-overlay-editor.d.ts +1 -1
  19. package/dist/entity-table/editors/icon-list-editor.d.ts +1 -1
  20. package/dist/entity-table/editors/json-editor.d.ts +1 -1
  21. package/dist/entity-table/editors/key-value-editor.d.ts +3 -3
  22. package/dist/entity-table/editors/number-editor.d.ts +1 -1
  23. package/dist/entity-table/editors/relation-editor.d.ts +2 -2
  24. package/dist/entity-table/editors/tags-editor.d.ts +1 -1
  25. package/dist/entity-table/editors/text-format-editor.d.ts +1 -1
  26. package/dist/entity-table/editors/uuid-editor.d.ts +1 -1
  27. package/dist/entity-table/interfaces.d.ts +25 -0
  28. package/dist/entity-table/interfaces.d.ts.map +1 -1
  29. package/dist/entity-table/vtable/table-clipboard.d.ts +1 -1
  30. package/dist/entity-table/vtable/table-factory.d.ts +2 -2
  31. package/dist/entity-table/vtable/table-operations.d.ts +2 -2
  32. package/dist/entity-table/vtable/table-row-move.d.ts +1 -1
  33. package/dist/entity-value.utils.d.ts +2 -2
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +7 -5
  37. package/dist/query-builder/models/config.interface.d.ts +2 -2
  38. package/dist/query-builder/models/operator.interface.d.ts +2 -2
  39. package/dist/query-builder/models/validation.interface.d.ts +2 -2
  40. package/dist/query-builder/services/operator-registry.service.d.ts +3 -7
  41. package/dist/query-builder/services/query-builder.service.d.ts +4 -8
  42. package/dist/query-builder/services/query-converter.service.d.ts +2 -6
  43. package/dist/query-builder/services/schema-parser.service.d.ts +2 -6
  44. package/dist/query-builder/services/schema-parser.service.d.ts.map +1 -1
  45. package/dist/query-builder/services/validation.service.d.ts +2 -6
  46. package/dist/query-builder/utils/field-tree.d.ts +1 -7
  47. package/dist/query-builder/utils/metadata-field-extractor.d.ts +2 -3
  48. package/dist/query-builder/utils/popover-position.d.ts.map +1 -1
  49. package/dist/query-builder/utils/schema-factory.d.ts +3 -7
  50. package/dist/query-builder/utils/value-input.d.ts +1 -1
  51. package/package.json +5 -5
  52. package/src/entity-list/types.ts +22 -0
  53. package/src/entity-table/editors/key-value-editor.ts +1 -1
  54. package/src/entity-table/interfaces.ts +28 -0
  55. package/src/index.ts +1 -0
  56. package/src/query-builder/services/schema-parser.service.ts +5 -2
  57. package/src/query-builder/utils/popover-position.ts +5 -1
package/dist/cn.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ClassValue } from 'clsx';
1
+ import { ClassValue } from 'clsx';
2
2
  /**
3
3
  * 拼接 CSS 类名(clsx 的薄封装)。
4
4
  *
@@ -1,10 +1,4 @@
1
- /**
2
- * @fileoverview 实体界面能力派生(US-027)
3
- *
4
- * 实体管理界面的「新增 / 编辑 / 删除」入口只读这一份结论,结论只来自实体的 `permissions` 声明:
5
- * 是不是系统表、在哪个命名空间都不参与——系统表已经显式声明三项都为 `'system'`。
6
- */
7
- import { type EntityMetadata } from '@aiao/rxdb';
1
+ import { EntityMetadata } from '@aiao/rxdb';
8
2
  /**
9
3
  * 实体在公开写入口上允许的界面操作
10
4
  */
@@ -1,10 +1,5 @@
1
- /**
2
- * Entity Detail 标签构建工具
3
- * 根据实体元数据生成详情页标签配置
4
- * @module entity-detail/detail-tabs
5
- */
6
- import { type EntityMetadata } from '@aiao/rxdb';
7
- import type { DetailTab } from './interfaces.js';
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
+ import { DetailTab } from './interfaces.js';
8
3
  /**
9
4
  * 根据实体元数据构建详情页标签列表
10
5
  * @remarks 基本信息表单标签固定排在首位,其后为每个一对多 / 多对多关系生成一个表格标签
@@ -1,8 +1,4 @@
1
- /**
2
- * Entity Detail 类型定义
3
- * @module entity-detail/interfaces
4
- */
5
- import type { RelationKind } from '@aiao/rxdb';
1
+ import { RelationKind } from '@aiao/rxdb';
6
2
  /**
7
3
  * 详情页标签类型
8
4
  */
@@ -1,10 +1,4 @@
1
- /**
2
- * RxDB Model 实体字段工具模块
3
- * 提供实体字段值的解析、格式化、验证等功能
4
- * @module entity-field.utils
5
- */
6
- import type { EntityMetadata } from '@aiao/rxdb';
7
- import { PropertyType, type FieldFormat, type FieldOptions } from '@aiao/rxdb';
1
+ import { EntityMetadata, PropertyType, FieldFormat, FieldOptions } from '@aiao/rxdb';
8
2
  /**
9
3
  * 实体字段类型
10
4
  * @remarks 兼容 PropertyType 枚举值及其字符串字面量形式,并包含关系字段(oneToOne / manyToOne)与计算字段(computed)的标识
@@ -1,4 +1,4 @@
1
- import type { EntityFormData, FormFieldConfig } from './interfaces.js';
1
+ import { EntityFormData, FormFieldConfig } from './interfaces.js';
2
2
  /**
3
3
  * 将实体对象转换为表单数据
4
4
  * @remarks 实体上不存在的字段以 null 填充
@@ -1,10 +1,5 @@
1
- /**
2
- * 表单字段构建工具
3
- * 根据实体元数据与表单模式生成、排序与过滤表单字段
4
- * @module entity-form/form-fields
5
- */
6
- import type { EntityMetadata } from '@aiao/rxdb';
7
- import type { FormFieldConfig, FormMode } from './interfaces.js';
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
+ import { FormFieldConfig, FormMode } from './interfaces.js';
8
3
  /**
9
4
  * 根据实体元数据和表单模式构建表单字段列表
10
5
  * @remarks 创建模式排除计算字段且不含系统字段;编辑模式追加只读的系统字段;查看模式全部字段设为只读
@@ -1,10 +1,5 @@
1
- /**
2
- * 表单校验工具
3
- * 基于字段配置校验单个字段值与整份表单数据
4
- * @module entity-form/form-validation
5
- */
6
- import { type FieldValidationError } from '../entity-value.utils.js';
7
- import type { EntityFormData, FormFieldConfig, FormValidationResult } from './interfaces.js';
1
+ import { FieldValidationError } from '../entity-value.utils.js';
2
+ import { EntityFormData, FormFieldConfig, FormValidationResult } from './interfaces.js';
8
3
  /**
9
4
  * 校验单个表单字段值
10
5
  * @param field - 表单字段配置
@@ -1,9 +1,5 @@
1
- /**
2
- * Entity Form 类型定义
3
- * @module entity-form/interfaces
4
- */
5
- import type { FieldFormat, FieldOptions } from '@aiao/rxdb';
6
- import type { EntityFieldType, KeyValueSchemaEntry } from '../entity-field.utils.js';
1
+ import { FieldFormat, FieldOptions } from '@aiao/rxdb';
2
+ import { EntityFieldType, KeyValueSchemaEntry } from '../entity-field.utils.js';
7
3
  /**
8
4
  * 表单模式
9
5
  */
@@ -1,12 +1,5 @@
1
- /**
2
- * @fileoverview 实体列表的手动排序:拖拽启用谓词、默认排序与落库协调(US-028 阶段 B)
3
- *
4
- * 列表只在「看到的行就是一条完整排序域」时允许拖拽:邻居才是真邻居,
5
- * `Repository.reorder()` 才能按 `{ prevId, nextId }` 落到用户看到的位置。
6
- * 三端 `EntityList` 共用这一份判定与协调,框架层只负责收集状态和接线。
7
- */
8
- import { type EntityMetadata, type OrderBy } from '@aiao/rxdb';
9
- import type { RowMoveEvent } from '../entity-table/vtable/table-row-move.js';
1
+ import { EntityMetadata, OrderBy } from '@aiao/rxdb';
2
+ import { RowMoveEvent } from '../entity-table/vtable/table-row-move.js';
10
3
  /** 列表排序判定需要的实体元数据 */
11
4
  export type ManualOrderListMetadata = Pick<EntityMetadata, 'manualOrder' | 'propertyMap'>;
12
5
  /** 列表的固定查询(详情页关系标签传入),结构同查询构建器的规则组 */
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 实体列表共享类型。
3
+ *
4
+ * @module entity-list/types
5
+ */
6
+ /**
7
+ * RxDB 实体实例(用于 CRUD 操作)。
8
+ *
9
+ * 三端组件库(Angular / React / Vue)此前各自内联了同形副本,现收敛到核心包
10
+ * 统一透传:Angular / Vue 经包根 `export *` 链、React 经 entity-list 模块显式再导出。
11
+ */
12
+ export type EntityInstance = {
13
+ [key: string]: unknown;
14
+ readonly id: string;
15
+ save(): Promise<void>;
16
+ remove(): Promise<void>;
17
+ };
18
+ /**
19
+ * 筛选查询结构(与用户筛选条件做 AND 合并)。
20
+ */
21
+ export type FilterQuery = {
22
+ combinator: 'and' | 'or';
23
+ rules: unknown[];
24
+ };
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/entity-list/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { EntityMetadata, EntityPropertyMetadata } from '@aiao/rxdb';
2
- import type { ColumnDefine } from '@visactor/vtable/es/ts-types/index.js';
3
- import type { RelatedEntityItem } from '../../entity-form/interfaces.js';
4
- import { type KVSchemaEntry } from './column-utils.js';
1
+ import { EntityMetadata, EntityPropertyMetadata } from '@aiao/rxdb';
2
+ import { ColumnDefine } from '@visactor/vtable/es/ts-types/index.js';
3
+ import { RelatedEntityItem } from '../../entity-form/interfaces.js';
4
+ import { KVSchemaEntry } from './column-utils.js';
5
5
  /** 仅展示(不可编辑)的系统字段 */
6
6
  export declare const DISPLAY_ONLY_FIELDS: Set<string>;
7
7
  /** 跳过(不显示为独立列)的系统字段 */
@@ -1,7 +1,7 @@
1
- import type { FieldFormat, FieldOptions } from '@aiao/rxdb';
2
- import type { ColumnDefine, StylePropertyFunctionArg } from '@visactor/vtable/es/ts-types/index.js';
3
- import type { RelatedEntityItem } from '../../entity-form/interfaces.js';
4
- import { type EnumItem } from '../editors/enum-editor.js';
1
+ import { FieldFormat, FieldOptions } from '@aiao/rxdb';
2
+ import { ColumnDefine, StylePropertyFunctionArg } from '@visactor/vtable/es/ts-types/index.js';
3
+ import { RelatedEntityItem } from '../../entity-form/interfaces.js';
4
+ import { EnumItem } from '../editors/enum-editor.js';
5
5
  /** 删除图标默认颜色 */
6
6
  export declare const DELETE_COLOR = "var(--entity-table-delete, #ef4444)";
7
7
  /**
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
2
  /**
3
3
  * 颜色编辑器
4
4
  *
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor } from '@visactor/vtable-editors';
2
2
  /**
3
3
  * 日期时间选择编辑器
4
4
  *
@@ -1,5 +1,5 @@
1
1
  import { GlobalOverlayEditor } from './global-overlay-editor.js';
2
- import { type IconData } from './lucide-svg.js';
2
+ import { IconData } from './lucide-svg.js';
3
3
  /** 枚举选项配置 */
4
4
  export interface EnumItem {
5
5
  /** 存储值 */
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
2
  /** daisyUI v5 主题色引用(CSS 变量,主题自适应) */
3
3
  export declare const DAISY_COLORS: {
4
4
  readonly bg: "var(--color-base-100)";
@@ -1,5 +1,5 @@
1
1
  import { GlobalOverlayEditor } from './global-overlay-editor.js';
2
- import { type IconData } from './lucide-svg.js';
2
+ import { IconData } from './lucide-svg.js';
3
3
  /**
4
4
  * 带图标的列表条目
5
5
  * @deprecated 请改用 `EnumItem`,`EnumEditor` 已原生支持 icon 和 color 字段。
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor } from '@visactor/vtable-editors';
2
2
  /**
3
3
  * JSON / KeyValue 编辑器
4
4
  *
@@ -1,7 +1,7 @@
1
- import type { EditContext, IEditor } from '@visactor/vtable-editors';
2
- import type { KVSchemaEntry } from '../columns/column-utils.js';
1
+ import { EditContext, IEditor } from '@visactor/vtable-editors';
2
+ import { KVSchemaEntry } from '../columns/column-utils.js';
3
3
  /**
4
- * KeyValue (Record<string, unknown>) editor — Schema mode only
4
+ * KeyValue(`Record<string, unknown>`)editor — Schema mode only
5
5
  *
6
6
  * - Key is always a dropdown derived from schema definition
7
7
  * - Value input type adapts to the key's schema type
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
2
  /** 数字编辑器的可选行为配置 */
3
3
  export interface NumberEditorOptions {
4
4
  /** true 为 64 位大整数模式(值类型 bigint) */
@@ -1,5 +1,5 @@
1
- import type { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
- import type { RelatedEntityItem } from '../../entity-form/interfaces.js';
1
+ import { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
+ import { RelatedEntityItem } from '../../entity-form/interfaces.js';
3
3
  /** 关联实体选项项 */
4
4
  export { type RelatedEntityItem };
5
5
  /**
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor } from '@visactor/vtable-editors';
2
2
  /** 标签编辑器模式:'string' 字符串标签 / 'number' 数字标签 */
3
3
  export type TagsMode = 'string' | 'number';
4
4
  /**
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
2
  /** TextFormatEditor 支持的 format 判别 */
3
3
  export type TextFormatMode = 'email' | 'phone' | 'url';
4
4
  /**
@@ -1,4 +1,4 @@
1
- import type { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
1
+ import { EditContext, IEditor, RectProps } from '@visactor/vtable-editors';
2
2
  import { UUID_RE } from '../../entity-value.utils.js';
3
3
  /** UUID 格式正则(re-export,定义见 entity-value.utils) */
4
4
  export { UUID_RE };
@@ -1,3 +1,4 @@
1
+ import { ListTable } from '@visactor/vtable';
1
2
  /**
2
3
  * 通用实体表记录基础接口
3
4
  *
@@ -64,4 +65,28 @@ export interface EntityTableConfig {
64
65
  /** 单元格错误 tooltip 延迟(毫秒),默认 800 */
65
66
  tooltipDelay?: number;
66
67
  }
68
+ /**
69
+ * 实体表格的命令面:三端 `EntityTable` 组件对外暴露的同一组命令。
70
+ *
71
+ * @remarks
72
+ * React 经 `ref`(`forwardRef` + `useImperativeHandle`)、Vue 经 `defineExpose`、Angular 即组件实例
73
+ * 本身(`EntityTableComponent implements EntityTableHandle`)。三端各自另有的公开成员(Angular 的
74
+ * input / output、Vue 暴露给内部父组件的状态)不在契约内,按本类型写的调用方与 mock 三端通用。
75
+ */
76
+ export interface EntityTableHandle {
77
+ /** 当前 VTable 表格实例;未初始化时为 `null`。 */
78
+ readonly tableInstance: ListTable | null;
79
+ /** 从业务层回滚单元格值(校验失败时恢复原值)。 */
80
+ changeCellValue(col: number, row: number, value: unknown): void;
81
+ /** 用当前暗色模式与 CSS 变量重绘主题。 */
82
+ redrawTheme(): void;
83
+ /** 把行恢复成最近一次交给表格的顺序(拖放被拒或落库失败时调用)。 */
84
+ restoreRecords(): void;
85
+ }
86
+ /**
87
+ * 查询表格的命令面:成员与 {@link EntityTableHandle} 相同,全部委托给内部实体表格。
88
+ *
89
+ * @remarks 三端 `QueryTable` 组件的暴露方式同 {@link EntityTableHandle}。
90
+ */
91
+ export type QueryTableHandle = EntityTableHandle;
67
92
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/entity-table/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qBAAqB;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,qBAAqB;IACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACxC;AAED,cAAc;AACd,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,cAAc;IACd,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,YAAY;AACZ,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,cAAc;IACd,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,YAAY;AACZ,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,WAAW;AACX,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/entity-table/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qBAAqB;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,qBAAqB;IACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACxC;AAED,cAAc;AACd,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,cAAc;IACd,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,YAAY;AACZ,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,cAAc;IACd,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,YAAY;AACZ,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,WAAW;AACX,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,6BAA6B;IAC7B,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChE,2BAA2B;IAC3B,WAAW,IAAI,IAAI,CAAC;IACpB,sCAAsC;IACtC,cAAc,IAAI,IAAI,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC"}
@@ -1,5 +1,5 @@
1
+ import { PendingWrite } from '../interfaces.js';
1
2
  import type * as VTable from '@visactor/vtable';
2
- import type { PendingWrite } from '../interfaces.js';
3
3
  /** 单个单元格的剪贴板快照 */
4
4
  export interface ClipboardCell {
5
5
  /** 列索引 */
@@ -1,6 +1,6 @@
1
- import type { ListTableConstructorOptions } from '@visactor/vtable';
1
+ import { ListTableConstructorOptions } from '@visactor/vtable';
2
+ import { EntityTableRecord } from '../interfaces.js';
2
3
  import * as VTable from '@visactor/vtable';
3
- import type { EntityTableRecord } from '../interfaces.js';
4
4
  /** 注册 VTable 基础编辑器(全局单例,重复调用仅注册一次) */
5
5
  export declare function ensureBaseEditorRegistered(): void;
6
6
  /**
@@ -1,6 +1,6 @@
1
+ import { ListTableConstructorOptions } from '@visactor/vtable';
2
+ import { EntityTableRecord } from '../interfaces.js';
1
3
  import type * as VTable from '@visactor/vtable';
2
- import type { ListTableConstructorOptions } from '@visactor/vtable';
3
- import type { EntityTableRecord } from '../interfaces.js';
4
4
  /**
5
5
  * HACK: VTable 不提供禁用特定行拖拽的 API,通过 monkey-patch 内部属性实现
6
6
  *
@@ -1,3 +1,4 @@
1
+ import { EntityTableRecord } from '../interfaces.js';
1
2
  /**
2
3
  * @fileoverview 表格单行拖动的读取与动态开关(US-028 阶段 B)
3
4
  *
@@ -6,7 +7,6 @@
6
7
  * {@link setRowDragEnabled} 记下的开关在 `patchDragIconForReadonlyRows` 打的补丁里收掉手柄。
7
8
  */
8
9
  import type * as VTable from '@visactor/vtable';
9
- import type { EntityTableRecord } from '../interfaces.js';
10
10
  /**
11
11
  * 单行拖放的结果:被拖行与它落点前后的邻居
12
12
  *
@@ -1,5 +1,5 @@
1
- import type { FieldFormat } from '@aiao/rxdb';
2
- import type { EntityFieldConfig, EntityFieldType } from './entity-field.utils.js';
1
+ import { FieldFormat } from '@aiao/rxdb';
2
+ import { EntityFieldConfig, EntityFieldType } from './entity-field.utils.js';
3
3
  /**
4
4
  * RxDB Model 实体值处理工具模块
5
5
  * 提供实体字段值的解析、格式化、验证等功能
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export * from './cn.js';
11
11
  export * from './entity-detail/detail-tabs.js';
12
12
  export * from './entity-detail/interfaces.js';
13
13
  export * from './entity-list/manual-order-list.js';
14
+ export * from './entity-list/types.js';
14
15
  export * from './entity-form/form-data.js';
15
16
  export * from './entity-form/form-fields.js';
16
17
  export * from './entity-form/form-validation.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,SAAS,CAAC;AAGxB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,kDAAkD,CAAC;AACjE,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iDAAiD,CAAC;AAChE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,SAAS,CAAC;AAGxB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wBAAwB,CAAC;AAGvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,kDAAkD,CAAC;AACjE,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iDAAiD,CAAC;AAChE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC"}
package/dist/index.js CHANGED
@@ -3486,20 +3486,20 @@ function En() {
3486
3486
  return Tn ||= new Cn(), Tn;
3487
3487
  }
3488
3488
  //#endregion
3489
- //#region ../../node_modules/.pnpm/uuid@14.0.2/node_modules/uuid/dist/stringify.js
3489
+ //#region ../../node_modules/.pnpm/uuid@14.0.3/node_modules/uuid/dist/stringify.js
3490
3490
  var Z = [];
3491
3491
  for (let e = 0; e < 256; ++e) Z.push((e + 256).toString(16).slice(1));
3492
3492
  function Dn(e, t = 0) {
3493
3493
  return (Z[e[t + 0]] + Z[e[t + 1]] + Z[e[t + 2]] + Z[e[t + 3]] + "-" + Z[e[t + 4]] + Z[e[t + 5]] + "-" + Z[e[t + 6]] + Z[e[t + 7]] + "-" + Z[e[t + 8]] + Z[e[t + 9]] + "-" + Z[e[t + 10]] + Z[e[t + 11]] + Z[e[t + 12]] + Z[e[t + 13]] + Z[e[t + 14]] + Z[e[t + 15]]).toLowerCase();
3494
3494
  }
3495
3495
  //#endregion
3496
- //#region ../../node_modules/.pnpm/uuid@14.0.2/node_modules/uuid/dist/rng.js
3496
+ //#region ../../node_modules/.pnpm/uuid@14.0.3/node_modules/uuid/dist/rng.js
3497
3497
  var On = /* @__PURE__ */ new Uint8Array(16);
3498
3498
  function kn() {
3499
3499
  return crypto.getRandomValues(On);
3500
3500
  }
3501
3501
  //#endregion
3502
- //#region ../../node_modules/.pnpm/uuid@14.0.2/node_modules/uuid/dist/v7.js
3502
+ //#region ../../node_modules/.pnpm/uuid@14.0.3/node_modules/uuid/dist/v7.js
3503
3503
  var An = {};
3504
3504
  function jn(e, t, n) {
3505
3505
  let r;
@@ -4123,7 +4123,7 @@ var rr = {
4123
4123
  json: "object"
4124
4124
  };
4125
4125
  function ir(e, t) {
4126
- return t?.displayName ? t.displayName : e.replace(/([A-Z])/g, " $1").replace(/^./, (e) => e.toUpperCase()).trim();
4126
+ return t?.displayName ? t.displayName : e.replace(/(?<=[A-Z])(?=[A-Z][a-z])/g, " ").replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/^./, (e) => e.toUpperCase()).trim();
4127
4127
  }
4128
4128
  var ar = class e {
4129
4129
  options;
@@ -4375,7 +4375,9 @@ function br(e, t = 2, n = 120) {
4375
4375
  }
4376
4376
  function xr(e, t, n = 2, r = 120) {
4377
4377
  let i = br(t, n, r);
4378
- e.style.position = "fixed", e.style.margin = "0", e.style.inset = "unset", e.style.minWidth = `${i.minWidth}px`, e.style.left = `${i.left}px`, i.top == null ? (e.style.top = "unset", e.style.bottom = `${i.bottom}px`) : (e.style.top = `${i.top}px`, e.style.bottom = "unset");
4378
+ e.style.position = "fixed", e.style.margin = "0", e.style.inset = "unset", e.style.minWidth = `${i.minWidth}px`;
4379
+ let a = e.offsetWidth > 0 ? e.offsetWidth : i.minWidth, o = Math.max(8, Math.min(i.left, window.innerWidth - a - 8));
4380
+ e.style.left = `${o}px`, i.top == null ? (e.style.top = "unset", e.style.bottom = `${i.bottom}px`) : (e.style.top = `${i.top}px`, e.style.bottom = "unset");
4379
4381
  }
4380
4382
  function Sr(e, t, n) {
4381
4383
  return e.find((e) => e.value === t)?.label ?? n;
@@ -1,5 +1,5 @@
1
- import type { OperatorDefinition } from './operator.interface.js';
2
- import type { QueryBuilderRuleGroup, SchemaInfo } from './query-builder-state.js';
1
+ import { OperatorDefinition } from './operator.interface.js';
2
+ import { QueryBuilderRuleGroup, SchemaInfo } from './query-builder-state.js';
3
3
  /**
4
4
  * 查询构建器配置
5
5
  */
@@ -1,5 +1,5 @@
1
- import type { OperatorName } from '@aiao/rxdb';
2
- import type { PropertyType } from './query-builder-state.js';
1
+ import { OperatorName } from '@aiao/rxdb';
2
+ import { PropertyType } from './query-builder-state.js';
3
3
  /**
4
4
  * 操作符定义
5
5
  * 包含操作符的元数据和约束
@@ -1,5 +1,5 @@
1
- import type { OperatorName } from '@aiao/rxdb';
2
- import type { PropertyType } from './query-builder-state.js';
1
+ import { OperatorName } from '@aiao/rxdb';
2
+ import { PropertyType } from './query-builder-state.js';
3
3
  /**
4
4
  * 验证规则
5
5
  */
@@ -1,10 +1,6 @@
1
- /**
2
- * @fileoverview 操作符注册表服务
3
- * 管理操作符的注册、查询和类型过滤
4
- */
5
- import type { OperatorName } from '@aiao/rxdb';
6
- import { type OperatorDefinition } from '../models/operator.interface.js';
7
- import type { FieldMetadata, PropertyType } from '../models/query-builder-state.js';
1
+ import { OperatorName } from '@aiao/rxdb';
2
+ import { OperatorDefinition } from '../models/operator.interface.js';
3
+ import { FieldMetadata, PropertyType } from '../models/query-builder-state.js';
8
4
  /**
9
5
  * 操作符注册表选项
10
6
  */
@@ -1,12 +1,8 @@
1
- /**
2
- * @fileoverview QueryBuilder 核心服务
3
- * 提供 RxJS 响应式状态管理,支持规则增删改和双向转换
4
- */
5
- import type { RuleGroup } from '@aiao/rxdb';
1
+ import { RuleGroup } from '@aiao/rxdb';
6
2
  import { Observable } from 'rxjs';
7
- import type { QueryBuilderConfig } from '../models/config.interface.js';
8
- import type { FieldMetadata, QueryBuilderRuleGroup, QueryBuilderState, UIRule } from '../models/query-builder-state.js';
9
- import type { ValidationResult } from '../models/validation.interface.js';
3
+ import { QueryBuilderConfig } from '../models/config.interface.js';
4
+ import { FieldMetadata, QueryBuilderRuleGroup, QueryBuilderState, UIRule } from '../models/query-builder-state.js';
5
+ import { ValidationResult } from '../models/validation.interface.js';
10
6
  import { OperatorRegistry } from './operator-registry.service.js';
11
7
  import { QueryConverter } from './query-converter.service.js';
12
8
  import { ValidationService } from './validation.service.js';
@@ -1,9 +1,5 @@
1
- /**
2
- * @fileoverview Query 转换服务
3
- * 在 QueryBuilder 状态和 RxDB Query 之间进行双向转换
4
- */
5
- import type { RuleGroup } from '@aiao/rxdb';
6
- import type { QueryBuilderState } from '../models/query-builder-state.js';
1
+ import { RuleGroup } from '@aiao/rxdb';
2
+ import { QueryBuilderState } from '../models/query-builder-state.js';
7
3
  /**
8
4
  * 转换选项
9
5
  */
@@ -1,9 +1,5 @@
1
- /**
2
- * @fileoverview Schema 解析服务
3
- * 从 EntityMetadata 解析字段元数据,用于 QueryBuilder 组件
4
- */
5
- import type { EntityMetadata } from '@aiao/rxdb';
6
- import type { FieldMetadata } from '../models/query-builder-state.js';
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
+ import { FieldMetadata } from '../models/query-builder-state.js';
7
3
  /**
8
4
  * 解析器配置选项
9
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"schema-parser.service.d.ts","sourceRoot":"","sources":["../../../src/query-builder/services/schema-parser.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA0C,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAqBtE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IAEhD;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;CAC3F;AA4BD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;IAEF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAE1E,4CAA4C;gBAChC,OAAO,GAAE,mBAAwB;IAW7C;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,EAAE;IAwDhD;;;;;OAKG;IACH,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAUjF;;OAEG;IACH,OAAO,CAAC,aAAa;IA8CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAsCtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE9E"}
1
+ {"version":3,"file":"schema-parser.service.d.ts","sourceRoot":"","sources":["../../../src/query-builder/services/schema-parser.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA0C,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAqBtE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IAEhD;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;CAC3F;AA+BD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;IAEF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAE1E,4CAA4C;gBAChC,OAAO,GAAE,mBAAwB;IAW7C;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,EAAE;IAwDhD;;;;;OAKG;IACH,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAUjF;;OAEG;IACH,OAAO,CAAC,aAAa;IA8CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAsCtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE9E"}
@@ -1,9 +1,5 @@
1
- /**
2
- * @fileoverview 校验服务
3
- * 提供规则值的即时校验功能
4
- */
5
- import type { FieldMetadata, QueryBuilderRule, UIRule } from '../models/query-builder-state.js';
6
- import type { ValidationResult, ValidationRule } from '../models/validation.interface.js';
1
+ import { FieldMetadata, QueryBuilderRule, UIRule } from '../models/query-builder-state.js';
2
+ import { ValidationResult, ValidationRule } from '../models/validation.interface.js';
7
3
  import { OperatorRegistry } from './operator-registry.service.js';
8
4
  /**
9
5
  * 单条校验规则输入(兼容 QueryBuilderRule 与 UIRule)
@@ -1,10 +1,4 @@
1
- /**
2
- * @fileoverview 字段树工具函数
3
- *
4
- * 提供 Angular/React/Vue 共享的字段树构建和查找功能。
5
- * 用于将扁平的 FieldMetadata[] 转换为 CascadeSelect 组件所需的树形结构。
6
- */
7
- import type { FieldMetadata, PropertyType } from '../models/query-builder-state.js';
1
+ import { FieldMetadata, PropertyType } from '../models/query-builder-state.js';
8
2
  /**
9
3
  * 字段树节点(用于 CascadeSelect)
10
4
  *
@@ -1,6 +1,5 @@
1
- import type { EntityMetadata, EntityRelationMetadata, KeyValuePropertyMetadata } from '@aiao/rxdb';
2
- import { PropertyType } from '@aiao/rxdb';
3
- import type { FieldMetadata, PropertyType as QBPropertyType } from '../models/query-builder-state.js';
1
+ import { EntityMetadata, EntityRelationMetadata, KeyValuePropertyMetadata, PropertyType } from '@aiao/rxdb';
2
+ import { FieldMetadata, PropertyType as QBPropertyType } from '../models/query-builder-state.js';
4
3
  /**
5
4
  * 模型信息接口
6
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"popover-position.d.ts","sourceRoot":"","sources":["../../../src/query-builder/utils/popover-position.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,OAAO,EACpB,GAAG,SAAI,EACP,aAAa,SAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAMnE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,SAAI,EAAE,aAAa,SAAM,GAAG,IAAI,CAc9G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACxD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
1
+ {"version":3,"file":"popover-position.d.ts","sourceRoot":"","sources":["../../../src/query-builder/utils/popover-position.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,OAAO,EACpB,GAAG,SAAI,EACP,aAAa,SAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAMnE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,SAAI,EAAE,aAAa,SAAM,GAAG,IAAI,CAkB9G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACxD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
@@ -1,10 +1,6 @@
1
- /**
2
- * @fileoverview Schema 工厂函数
3
- * 提供便捷的工厂方法从 RxDB 实体创建 SchemaParser 实例并解析字段
4
- */
5
- import type { EntityMetadata } from '@aiao/rxdb';
6
- import type { FieldMetadata } from '../models/query-builder-state.js';
7
- import { type SchemaParserOptions } from '../services/schema-parser.service.js';
1
+ import { EntityMetadata } from '@aiao/rxdb';
2
+ import { FieldMetadata } from '../models/query-builder-state.js';
3
+ import { SchemaParserOptions } from '../services/schema-parser.service.js';
8
4
  /**
9
5
  * 从 EntityMetadata 创建字段元数据
10
6
  *
@@ -1,5 +1,5 @@
1
1
  import { UUID_RE } from '../../entity-value.utils.js';
2
- import type { OperatorRegistry } from '../services/operator-registry.service.js';
2
+ import { OperatorRegistry } from '../services/operator-registry.service.js';
3
3
  /** 标准 UUID 格式正则(8-4-4-4-12 十六进制,忽略大小写),重新导出供校验使用 */
4
4
  export { UUID_RE };
5
5
  /**
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@aiao/rxdb-model",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "description": "Framework-agnostic entity model core for Aiao RxDB: metadata-driven forms, details, editable tables and query builder.",
5
- "homepage": "https://rxdb.netlify.app/docs",
5
+ "homepage": "https://rxdb.aiao.io/docs",
6
6
  "bugs": {
7
7
  "url": "https://github.com/aiao-io/rxdb/issues"
8
8
  },
@@ -47,11 +47,11 @@
47
47
  "dependencies": {
48
48
  "clsx": "^2.1.1",
49
49
  "rxjs": "^7.8.2",
50
- "uuid": "^14.0.2",
51
- "@aiao/rxdb": "0.0.26"
50
+ "uuid": "^14.0.3"
52
51
  },
53
52
  "peerDependencies": {
54
53
  "@visactor/vtable": "~1.26.5",
55
- "@visactor/vtable-editors": "~1.26.5"
54
+ "@visactor/vtable-editors": "~1.26.5",
55
+ "@aiao/rxdb": "^0.0.28"
56
56
  }
57
57
  }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 实体列表共享类型。
3
+ *
4
+ * @module entity-list/types
5
+ */
6
+ /**
7
+ * RxDB 实体实例(用于 CRUD 操作)。
8
+ *
9
+ * 三端组件库(Angular / React / Vue)此前各自内联了同形副本,现收敛到核心包
10
+ * 统一透传:Angular / Vue 经包根 `export *` 链、React 经 entity-list 模块显式再导出。
11
+ */
12
+ export type EntityInstance = {
13
+ [key: string]: unknown;
14
+ readonly id: string;
15
+ save(): Promise<void>;
16
+ remove(): Promise<void>;
17
+ };
18
+
19
+ /**
20
+ * 筛选查询结构(与用户筛选条件做 AND 合并)。
21
+ */
22
+ export type FilterQuery = { combinator: 'and' | 'or'; rules: unknown[] };
@@ -13,7 +13,7 @@ interface SchemaRow {
13
13
  }
14
14
 
15
15
  /**
16
- * KeyValue (Record<string, unknown>) editor — Schema mode only
16
+ * KeyValue(`Record<string, unknown>`)editor — Schema mode only
17
17
  *
18
18
  * - Key is always a dropdown derived from schema definition
19
19
  * - Value input type adapts to the key's schema type
@@ -1,3 +1,5 @@
1
+ import type { ListTable } from '@visactor/vtable';
2
+
1
3
  /**
2
4
  * 通用实体表记录基础接口
3
5
  *
@@ -70,3 +72,29 @@ export interface EntityTableConfig {
70
72
  /** 单元格错误 tooltip 延迟(毫秒),默认 800 */
71
73
  tooltipDelay?: number;
72
74
  }
75
+
76
+ /**
77
+ * 实体表格的命令面:三端 `EntityTable` 组件对外暴露的同一组命令。
78
+ *
79
+ * @remarks
80
+ * React 经 `ref`(`forwardRef` + `useImperativeHandle`)、Vue 经 `defineExpose`、Angular 即组件实例
81
+ * 本身(`EntityTableComponent implements EntityTableHandle`)。三端各自另有的公开成员(Angular 的
82
+ * input / output、Vue 暴露给内部父组件的状态)不在契约内,按本类型写的调用方与 mock 三端通用。
83
+ */
84
+ export interface EntityTableHandle {
85
+ /** 当前 VTable 表格实例;未初始化时为 `null`。 */
86
+ readonly tableInstance: ListTable | null;
87
+ /** 从业务层回滚单元格值(校验失败时恢复原值)。 */
88
+ changeCellValue(col: number, row: number, value: unknown): void;
89
+ /** 用当前暗色模式与 CSS 变量重绘主题。 */
90
+ redrawTheme(): void;
91
+ /** 把行恢复成最近一次交给表格的顺序(拖放被拒或落库失败时调用)。 */
92
+ restoreRecords(): void;
93
+ }
94
+
95
+ /**
96
+ * 查询表格的命令面:成员与 {@link EntityTableHandle} 相同,全部委托给内部实体表格。
97
+ *
98
+ * @remarks 三端 `QueryTable` 组件的暴露方式同 {@link EntityTableHandle}。
99
+ */
100
+ export type QueryTableHandle = EntityTableHandle;
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ export * from './entity-detail/interfaces.js';
19
19
 
20
20
  // Entity List(US-028 手动排序)
21
21
  export * from './entity-list/manual-order-list.js';
22
+ export * from './entity-list/types.js';
22
23
 
23
24
  // Entity Form
24
25
  export * from './entity-form/form-data.js';
@@ -83,9 +83,12 @@ function defaultDisplayNameGenerator(fieldName: string, metadata?: { displayName
83
83
  if (metadata?.displayName) {
84
84
  return metadata.displayName;
85
85
  }
86
- // camelCase -> Camel Case
86
+ // 先切开缩写与普通单词,再切开普通 camelCase。
87
+ // 只用零宽断言定位「缩写末字母 + 大写单词首字母」的边界:没有任何带量词的
88
+ // 消费式片段,对任意输入都是线性时间(CodeQL 多项式正则告警)。
87
89
  return fieldName
88
- .replace(/([A-Z])/g, ' $1')
90
+ .replace(/(?<=[A-Z])(?=[A-Z][a-z])/g, ' ')
91
+ .replace(/([a-z\d])([A-Z])/g, '$1 $2')
89
92
  .replace(/^./, str => str.toUpperCase())
90
93
  .trim();
91
94
  }
@@ -32,7 +32,11 @@ export function applyPopoverPosition(el: HTMLElement, triggerRect: DOMRect, gap
32
32
  el.style.margin = '0';
33
33
  el.style.inset = 'unset';
34
34
  el.style.minWidth = `${pos.minWidth}px`;
35
- el.style.left = `${pos.left}px`;
35
+ // 水平夹回:右缘不超出视口(留 8px),左缘最多贴到视口左 8px。
36
+ // 窄屏(如移动端详情页靠右的字段选择)下浮层向右溢出会被截断。
37
+ const width = el.offsetWidth > 0 ? el.offsetWidth : pos.minWidth;
38
+ const clampedLeft = Math.max(8, Math.min(pos.left, window.innerWidth - width - 8));
39
+ el.style.left = `${clampedLeft}px`;
36
40
  if (pos.top != null) {
37
41
  el.style.top = `${pos.top}px`;
38
42
  el.style.bottom = 'unset';