@aiao/rxdb-model-angular 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.
@@ -1,146 +1,312 @@
1
- import * as packages_rxdb_dist_entity_metadata_interface from 'packages/rxdb/dist/entity/metadata.interface';
2
- import * as _angular_core from '@angular/core';
3
- import { AfterViewInit, WritableSignal, TemplateRef, InjectionToken, OnDestroy, ElementRef, Signal, OnInit, ViewContainerRef, Type, Provider } from '@angular/core';
4
- import { EntityMetadata, RelationKind } from '@aiao/rxdb';
5
- import * as _aiao_rxdb_model from '@aiao/rxdb-model';
6
- import { FormFieldConfig, EntityFormData, FormMode, RelatedEntityProvider, FormFieldChangeEvent, FormValidationResult, DetailTab, DetailTableTab, RelatedEntityItem, EntityTableRecord, FieldMetadata, ValidationResult, CellChangeEvent, BatchChangeItem, EntityTableConfig, UIRule, ValidationError, SchemaInfo, QueryBuilderRuleGroup, FieldTreeNode } from '@aiao/rxdb-model';
7
- export * from '@aiao/rxdb-model';
8
- import * as i1 from '@angular/cdk/drag-drop';
9
- import * as lucide_angular from 'lucide-angular';
10
- import { ChevronDownIcon } from 'lucide-angular';
11
- import * as VTable from '@visactor/vtable';
12
- import { ColumnsDefine, ListTableConstructorOptions, ListTable } from '@visactor/vtable';
13
- import * as _aiao_rxdb_model_angular from '@aiao/rxdb-model-angular';
14
- import { Highlightable } from '@angular/cdk/a11y';
15
-
16
- type EntityInstance$1 = {
17
- [key: string]: unknown;
18
- readonly id: string;
19
- save(): Promise<void>;
20
- remove(): Promise<void>;
21
- };
1
+ import { BatchChangeItem, CellChangeEvent, DetailTab, DetailTableTab, EntityFormData, EntityInstance, EntityTableConfig, EntityTableHandle, EntityTableRecord, FieldMetadata, FieldTreeNode, FilterQuery, FormFieldChangeEvent, FormFieldConfig, FormMode, FormValidationResult, QueryBuilderRuleGroup, QueryTableHandle, RelatedEntityItem, RelatedEntityProvider, RowMoveEvent, SchemaInfo, UIRule, ValidationError, ValidationResult, cn, findNodeByValue } from "@aiao/rxdb-model";
2
+ import { EntityMetadata, RelationKind } from "@aiao/rxdb";
3
+ import * as i0 from "@angular/core";
4
+ import { AfterViewInit, ElementRef, InjectionToken, InputSignal, OnDestroy, OnInit, Provider, Signal, TemplateRef, Type, ViewContainerRef, WritableSignal } from "@angular/core";
5
+ import * as i1 from "@angular/cdk/drag-drop";
6
+ import { VersionManager } from "@aiao/rxdb-plugin-history";
7
+ import { LucideChevronDown, LucideChevronRight, LucideFunnel, LucideIconInput, LucideRedo2, LucideType, LucideUndo2 } from "@lucide/angular";
8
+ import * as VTable from "@visactor/vtable";
9
+ import { ColumnsDefine, ListTable, ListTableConstructorOptions } from "@visactor/vtable";
10
+ import { Highlightable } from "@angular/cdk/a11y";
11
+ export * from "@aiao/rxdb-model";
22
12
  /** CDK Dialog 传入的数据结构 */
23
- interface EntityDetailDialogData {
24
- metadata: EntityMetadata;
25
- formFields: FormFieldConfig[];
26
- formData: EntityFormData;
27
- formMode: FormMode;
28
- relatedEntityProvider?: RelatedEntityProvider;
29
- /** 预填充的外键数据(不可编辑),用于级联新增场景 */
30
- fixedFormData?: EntityFormData;
31
- /** 委托保存:不创建草稿实体,仅 emit formSubmitted 让调用方处理 */
32
- delegateSave?: boolean;
33
- /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */
34
- creationChain?: string[];
13
+ export interface EntityDetailDialogData {
14
+ metadata: EntityMetadata;
15
+ formFields: FormFieldConfig[];
16
+ formData: EntityFormData;
17
+ formMode: FormMode;
18
+ /** 编辑模式:按 id 从 Repository 加载实体实例;缺省时表单数据为纯透传 */
19
+ entityId?: string;
20
+ /** 已打开详情对话框的记录 id 栈(含当前记录),关系 tab 列表据此阻断无限套娃 */
21
+ editChain?: string[];
22
+ relatedEntityProvider?: RelatedEntityProvider;
23
+ /** 预填充的外键数据(不可编辑),用于级联新增场景 */
24
+ fixedFormData?: EntityFormData;
25
+ /** 委托保存:不创建草稿实体,仅 emit formSubmitted 让调用方处理 */
26
+ delegateSave?: boolean;
27
+ /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */
28
+ creationChain?: string[];
35
29
  }
36
- declare class EntityDetailComponent {
37
- #private;
38
- readonly namespace: _angular_core.InputSignal<string | undefined>;
39
- readonly name: _angular_core.InputSignal<string | undefined>;
40
- readonly entityId: _angular_core.InputSignal<string | undefined>;
41
- /** 唯一的 radio group name,避免多个 EntityDetailComponent 实例之间的 radio 冲突 */
42
- readonly tabGroupName: string;
43
- readonly metadata: _angular_core.InputSignal<Readonly<packages_rxdb_dist_entity_metadata_interface.EntityMetadataType> | undefined>;
44
- readonly formFields: _angular_core.InputSignal<FormFieldConfig[] | undefined>;
45
- readonly formData: _angular_core.InputSignal<EntityFormData | undefined>;
46
- readonly formMode: _angular_core.InputSignal<FormMode | undefined>;
47
- readonly relatedEntityProvider: _angular_core.InputSignal<RelatedEntityProvider | undefined>;
48
- readonly formSubmitted: _angular_core.OutputEmitterRef<EntityFormData>;
49
- readonly formCancelled: _angular_core.OutputEmitterRef<void>;
50
- readonly fieldChanged: _angular_core.OutputEmitterRef<FormFieldChangeEvent>;
51
- readonly validationErrors: _angular_core.OutputEmitterRef<FormValidationResult>;
52
- /** 是否使用外部保存模式(create 模式下,保存/取消按钮在 tabs 下面,而非 form 内) */
53
- readonly isCreateMode: _angular_core.Signal<boolean>;
54
- /** 当前表单编辑数据(create 模式下跟踪用户输入) */
55
- readonly draftFormData: _angular_core.WritableSignal<EntityFormData>;
56
- /** 暴露草稿实体给模板(关系 tab 的 entity-list 需要) */
57
- readonly draftEntitySignal: _angular_core.WritableSignal<EntityInstance$1 | null>;
58
- /** 父实体(草稿或已保存实例),用于关系 tab 的 entity-list */
59
- readonly parentEntityForRelation: _angular_core.Signal<EntityInstance$1 | null>;
60
- /** 弹框标题 */
61
- readonly dialogTitle: _angular_core.Signal<string>;
62
- /** 创建链路:当前实体 + 祖先链路,传递给子 entity-list 以阻断循环创建 */
63
- readonly creationChain: _angular_core.Signal<string[]>;
64
- /** 当前活动关系 tab 的 relationName(用于子实体注册关系) */
65
- readonly activeRelationName: _angular_core.Signal<string | undefined>;
66
- readonly tabs: _angular_core.Signal<DetailTab[]>;
67
- readonly activeTabKey: _angular_core.WritableSignal<string>;
68
- readonly activeTab: _angular_core.Signal<DetailTab | undefined>;
69
- get metadataValue(): EntityMetadata;
70
- get formFieldsValue(): FormFieldConfig[];
71
- get formDataValue(): EntityFormData;
72
- get formModeValue(): FormMode;
73
- get relatedEntityProviderValue(): RelatedEntityProvider | undefined;
74
- constructor();
75
- selectTab(key: string): void;
76
- onFormDataChanged(data: EntityFormData): void;
77
- onFormSubmitted(data: EntityFormData): void;
78
- onFormCancelled(): void;
79
- onFieldChanged(event: FormFieldChangeEvent): void;
80
- onValidationErrors(result: FormValidationResult): void;
81
- /** 外部保存按钮(create 模式) */
82
- onSave(): void;
83
- onCancel(): void;
84
- buildFixedQuery(tab: DetailTableTab): {
85
- combinator: 'and';
86
- rules: unknown[];
87
- } | undefined;
88
- buildFixedFormData(tab: DetailTableTab): EntityFormData | undefined;
89
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityDetailComponent, never>;
90
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityDetailComponent, "rxdb-entity-detail", never, { "namespace": { "alias": "namespace"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "entityId": { "alias": "entityId"; "required": false; "isSignal": true; }; "metadata": { "alias": "metadata"; "required": false; "isSignal": true; }; "formFields": { "alias": "formFields"; "required": false; "isSignal": true; }; "formData": { "alias": "formData"; "required": false; "isSignal": true; }; "formMode": { "alias": "formMode"; "required": false; "isSignal": true; }; "relatedEntityProvider": { "alias": "relatedEntityProvider"; "required": false; "isSignal": true; }; }, { "formSubmitted": "formSubmitted"; "formCancelled": "formCancelled"; "fieldChanged": "fieldChanged"; "validationErrors": "validationErrors"; }, never, never, true, never>;
30
+ /**
31
+ * Tab 式实体详情组件:基础表单 Tab + 每个一对多/多对多关系一个表格 Tab;
32
+ * create 模式先生成内存草稿实体,校验通过并保存时才落库;
33
+ * edit 模式按 `entityId`(路由输入或 DIALOG_DATA)从 Repository 加载实例,保存时内部落库。
34
+ * 关系 Tab 内嵌的实体列表可继续打开子实体详情对话框(套娃),由 `editChain` 阻断环。
35
+ */
36
+ export declare class EntityDetailComponent {
37
+ #private;
38
+ readonly namespace: InputSignal<string | undefined>;
39
+ readonly name: InputSignal<string | undefined>;
40
+ readonly entityId: InputSignal<string | undefined>;
41
+ /** 唯一的 radio group name,避免多个 EntityDetailComponent 实例之间的 radio 冲突 */
42
+ readonly tabGroupName: string;
43
+ readonly metadata: InputSignal<EntityMetadata | undefined>;
44
+ readonly formFields: InputSignal<FormFieldConfig[] | undefined>;
45
+ readonly formData: InputSignal<EntityFormData | undefined>;
46
+ readonly formMode: InputSignal<FormMode | undefined>;
47
+ readonly relatedEntityProvider: InputSignal<RelatedEntityProvider | undefined>;
48
+ /**
49
+ * 已打开详情对话框的记录 id 栈(含当前记录)的 input。
50
+ *
51
+ * @remarks 绑定名是 `editChain`,与 React / Vue 的同名 prop 对齐;同名类成员 `editChain`
52
+ * 是 input 与 DIALOG_DATA 合并后的有效值(main 起就公开),所以 input 以别名声明。
53
+ */
54
+ readonly editChainInput: InputSignal<string[] | undefined>;
55
+ /** 预填充的外键数据(不可编辑),用于级联新增场景 */
56
+ readonly fixedFormData: InputSignal<EntityFormData | undefined>;
57
+ /** 委托保存:不创建草稿实体,仅 emit formSubmitted 让调用方处理 */
58
+ readonly delegateSave: InputSignal<boolean | undefined>;
59
+ /**
60
+ * 祖先创建链路(实体类型 `namespace:name`)的 input,用于阻断循环创建。
61
+ *
62
+ * @remarks 绑定名是 `creationChain`,与 React / Vue 的同名 prop 对齐;同名类成员 `creationChain`
63
+ * 是追加了当前实体之后的有效链路(main 起就公开),所以 input 以别名声明。
64
+ */
65
+ readonly creationChainInput: InputSignal<string[] | undefined>;
66
+ readonly formSubmitted: import("@angular/core").OutputEmitterRef<EntityFormData>;
67
+ readonly formCancelled: import("@angular/core").OutputEmitterRef<void>;
68
+ readonly fieldChanged: import("@angular/core").OutputEmitterRef<FormFieldChangeEvent>;
69
+ readonly validationErrors: import("@angular/core").OutputEmitterRef<FormValidationResult>;
70
+ /** 是否使用外部保存模式(create 模式下,保存/取消按钮在 tabs 下面,而非 form 内) */
71
+ readonly isCreateMode: import("@angular/core").Signal<boolean>;
72
+ /** 当前表单编辑数据(create 模式下跟踪用户输入) */
73
+ readonly draftFormData: import("@angular/core").WritableSignal<EntityFormData>;
74
+ /** 暴露草稿实体给模板(关系 tab 的 entity-list 需要) */
75
+ readonly draftEntitySignal: import("@angular/core").WritableSignal<EntityInstance | null>;
76
+ /** 父实体(草稿或已保存实例),用于关系 tab 的 entity-list */
77
+ readonly parentEntityForRelation: import("@angular/core").Signal<EntityInstance | null>;
78
+ /** 弹框标题 */
79
+ readonly dialogTitle: import("@angular/core").Signal<string>;
80
+ /** 创建链路:当前实体 + 祖先链路,传递给子 entity-list 以阻断循环创建(祖先链路 input 优先,缺省回退 DIALOG_DATA) */
81
+ readonly creationChain: import("@angular/core").Signal<string[]>;
82
+ /** 已打开详情对话框的记录 id 栈(input 优先,缺省回退 DIALOG_DATA,含当前记录),关系 tab 列表据此阻断无限套娃 */
83
+ readonly editChain: import("@angular/core").Signal<string[]>;
84
+ /** 当前活动关系 tab 的 relationName(用于子实体注册关系) */
85
+ readonly activeRelationName: import("@angular/core").Signal<string | undefined>;
86
+ readonly tabs: import("@angular/core").Signal<DetailTab[]>;
87
+ readonly activeTabKey: import("@angular/core").WritableSignal<string>;
88
+ readonly activeTab: import("@angular/core").Signal<DetailTab | undefined>;
89
+ get metadataValue(): EntityMetadata;
90
+ get formFieldsValue(): FormFieldConfig[];
91
+ get formDataValue(): EntityFormData;
92
+ get formModeValue(): FormMode;
93
+ get relatedEntityProviderValue(): RelatedEntityProvider | undefined;
94
+ /** 预填充外键数据(input 优先,缺省回退 DIALOG_DATA) */
95
+ get fixedFormDataValue(): EntityFormData | undefined;
96
+ /** 是否委托保存(input 优先,缺省回退 DIALOG_DATA) */
97
+ get delegateSaveValue(): boolean;
98
+ constructor();
99
+ selectTab(key: string): void;
100
+ onFormDataChanged(data: EntityFormData): void;
101
+ onFormSubmitted(data: EntityFormData): void;
102
+ onFormCancelled(): void;
103
+ onFieldChanged(event: FormFieldChangeEvent): void;
104
+ onValidationErrors(result: FormValidationResult): void;
105
+ /** 外部保存按钮(create 模式) */
106
+ onSave(): void;
107
+ onCancel(): void;
108
+ buildFixedQuery(tab: DetailTableTab): {
109
+ combinator: 'and';
110
+ rules: unknown[];
111
+ } | undefined;
112
+ buildFixedFormData(tab: DetailTableTab): EntityFormData | undefined;
113
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntityDetailComponent, never>;
114
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityDetailComponent, "rxdb-entity-detail", never, {
115
+ "namespace": {
116
+ "alias": "namespace";
117
+ "required": false;
118
+ "isSignal": true;
119
+ };
120
+ "name": {
121
+ "alias": "name";
122
+ "required": false;
123
+ "isSignal": true;
124
+ };
125
+ "entityId": {
126
+ "alias": "entityId";
127
+ "required": false;
128
+ "isSignal": true;
129
+ };
130
+ "metadata": {
131
+ "alias": "metadata";
132
+ "required": false;
133
+ "isSignal": true;
134
+ };
135
+ "formFields": {
136
+ "alias": "formFields";
137
+ "required": false;
138
+ "isSignal": true;
139
+ };
140
+ "formData": {
141
+ "alias": "formData";
142
+ "required": false;
143
+ "isSignal": true;
144
+ };
145
+ "formMode": {
146
+ "alias": "formMode";
147
+ "required": false;
148
+ "isSignal": true;
149
+ };
150
+ "relatedEntityProvider": {
151
+ "alias": "relatedEntityProvider";
152
+ "required": false;
153
+ "isSignal": true;
154
+ };
155
+ "editChainInput": {
156
+ "alias": "editChain";
157
+ "required": false;
158
+ "isSignal": true;
159
+ };
160
+ "fixedFormData": {
161
+ "alias": "fixedFormData";
162
+ "required": false;
163
+ "isSignal": true;
164
+ };
165
+ "delegateSave": {
166
+ "alias": "delegateSave";
167
+ "required": false;
168
+ "isSignal": true;
169
+ };
170
+ "creationChainInput": {
171
+ "alias": "creationChain";
172
+ "required": false;
173
+ "isSignal": true;
174
+ };
175
+ }, {
176
+ "formSubmitted": "formSubmitted";
177
+ "formCancelled": "formCancelled";
178
+ "fieldChanged": "fieldChanged";
179
+ "validationErrors": "validationErrors";
180
+ }, never, never, true, never>;
91
181
  }
92
-
93
- declare class EntityDialogComponent implements AfterViewInit {
94
- #private;
95
- readonly title: _angular_core.InputSignal<string>;
96
- readonly closeRequested: _angular_core.OutputEmitterRef<void>;
97
- readonly isFullscreen: _angular_core.WritableSignal<boolean>;
98
- readonly isInDialog: boolean;
99
- constructor();
100
- ngAfterViewInit(): void;
101
- close(): void;
102
- toggleFullscreen(): void;
103
- startResize(e: MouseEvent, dir: string): void;
104
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityDialogComponent, never>;
105
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityDialogComponent, "rxdb-entity-dialog", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; }, { "closeRequested": "closeRequested"; }, never, ["*"], true, [{ directive: typeof i1.CdkDrag; inputs: { "cdkDragBoundary": "cdkDragBoundary"; }; outputs: {}; }]>;
182
+ /**
183
+ * 对话框外壳组件(CDK Dialog 内使用):支持拖拽(CdkDrag)、8 向缩放与全屏切换。
184
+ */
185
+ export declare class EntityDialogComponent implements AfterViewInit {
186
+ #private;
187
+ readonly title: import("@angular/core").InputSignal<string>;
188
+ readonly closeRequested: import("@angular/core").OutputEmitterRef<void>;
189
+ readonly isFullscreen: import("@angular/core").WritableSignal<boolean>;
190
+ readonly isInDialog: boolean;
191
+ constructor();
192
+ ngAfterViewInit(): void;
193
+ close(): void;
194
+ toggleFullscreen(): void;
195
+ startResize(e: MouseEvent, dir: string): void;
196
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntityDialogComponent, never>;
197
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityDialogComponent, "rxdb-entity-dialog", never, {
198
+ "title": {
199
+ "alias": "title";
200
+ "required": true;
201
+ "isSignal": true;
202
+ };
203
+ }, {
204
+ "closeRequested": "closeRequested";
205
+ }, never, ["*"], true, [{
206
+ directive: typeof i1.CdkDrag;
207
+ inputs: {
208
+ "cdkDragBoundary": "cdkDragBoundary";
209
+ };
210
+ outputs: {};
211
+ }]>;
106
212
  }
107
-
108
- declare class EntityFormComponent {
109
- readonly fields: _angular_core.InputSignal<FormFieldConfig[]>;
110
- readonly data: _angular_core.InputSignal<EntityFormData>;
111
- readonly mode: _angular_core.InputSignal<FormMode>;
112
- readonly relatedEntityProvider: _angular_core.InputSignal<RelatedEntityProvider | undefined>;
113
- readonly showActions: _angular_core.InputSignal<boolean>;
114
- readonly fieldChanged: _angular_core.OutputEmitterRef<FormFieldChangeEvent>;
115
- readonly formSubmitted: _angular_core.OutputEmitterRef<EntityFormData>;
116
- readonly formCancelled: _angular_core.OutputEmitterRef<void>;
117
- readonly validationErrors: _angular_core.OutputEmitterRef<FormValidationResult>;
118
- readonly formData: _angular_core.WritableSignal<{
119
- [field: string]: unknown;
120
- }>;
121
- readonly editableFields: _angular_core.Signal<FormFieldConfig[]>;
122
- readonly isReadonly: _angular_core.Signal<boolean>;
123
- readonly relatedItemsMap: _angular_core.Signal<Map<string, RelatedEntityItem[]>>;
124
- readonly displayValueMap: _angular_core.Signal<Map<string, string>>;
125
- onFieldChange(field: FormFieldConfig, rawValue: unknown): void;
126
- onSubmit(): void;
127
- onCancel(): void;
128
- isFieldReadonly(field: FormFieldConfig): boolean;
129
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityFormComponent, never>;
130
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityFormComponent, "rxdb-entity-form", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "relatedEntityProvider": { "alias": "relatedEntityProvider"; "required": false; "isSignal": true; }; "showActions": { "alias": "showActions"; "required": false; "isSignal": true; }; }, { "fieldChanged": "fieldChanged"; "formSubmitted": "formSubmitted"; "formCancelled": "formCancelled"; "validationErrors": "validationErrors"; }, never, never, true, never>;
213
+ /**
214
+ * 元数据驱动表单组件:按字段类型渲染对应输入控件,支持 create / edit / view 三模式;
215
+ * 解析、格式化与校验全部委托 @aiao/rxdb-model。
216
+ */
217
+ export declare class EntityFormComponent {
218
+ readonly fields: import("@angular/core").InputSignal<FormFieldConfig[]>;
219
+ readonly data: import("@angular/core").InputSignal<EntityFormData>;
220
+ readonly mode: import("@angular/core").InputSignal<FormMode>;
221
+ readonly relatedEntityProvider: import("@angular/core").InputSignal<RelatedEntityProvider | undefined>;
222
+ readonly showActions: import("@angular/core").InputSignal<boolean>;
223
+ readonly fieldChanged: import("@angular/core").OutputEmitterRef<FormFieldChangeEvent>;
224
+ readonly formSubmitted: import("@angular/core").OutputEmitterRef<EntityFormData>;
225
+ readonly formCancelled: import("@angular/core").OutputEmitterRef<void>;
226
+ readonly validationErrors: import("@angular/core").OutputEmitterRef<FormValidationResult>;
227
+ readonly initialData: import("@angular/core").WritableSignal<{
228
+ [field: string]: unknown;
229
+ }>;
230
+ readonly formData: import("@angular/core").WritableSignal<{
231
+ [field: string]: unknown;
232
+ }>;
233
+ readonly editableFields: import("@angular/core").Signal<FormFieldConfig[]>;
234
+ readonly isReadonly: import("@angular/core").Signal<boolean>;
235
+ readonly relatedItemsMap: import("@angular/core").Signal<Map<string, RelatedEntityItem[]>>;
236
+ readonly displayValueMap: import("@angular/core").Signal<Map<string, string>>;
237
+ onFieldChange(field: FormFieldConfig, rawValue: unknown): void;
238
+ onSubmit(): void;
239
+ onCancel(): void;
240
+ isFieldReadonly(field: FormFieldConfig): boolean;
241
+ /** 占据两列栅格的字段:json / keyValue / binary / 多行文本类 format / 显式 span */
242
+ isWideField(field: FormFieldConfig): boolean;
243
+ /** 多行文本类 format:渲染 textarea */
244
+ isTextareaFormat(field: FormFieldConfig): boolean;
245
+ /** dateTime format 的显示模式映射到原生输入类型 */
246
+ dateInputType(field: FormFieldConfig): 'date' | 'datetime-local' | 'time';
247
+ /** dateTime format 的显示模式映射到 DatePipe 格式 */
248
+ datePipeFormat(field: FormFieldConfig): string;
249
+ /** 数字类 format 的值域约束(min / max / step) */
250
+ numericBounds(field: FormFieldConfig): {
251
+ min?: number;
252
+ max?: number;
253
+ step?: number;
254
+ };
255
+ /** 数字类 format 的单位标注(currency 代码 / 百分号 / 时长单位) */
256
+ numericUnitLabel(field: FormFieldConfig): string;
257
+ /** enum / 多选值的展示 label(无 options 时退回原值) */
258
+ enumOptionLabel(field: FormFieldConfig, value: string): string;
259
+ /** options 中声明 disabled 的值不可选 */
260
+ enumOptionDisabled(field: FormFieldConfig, value: string): boolean;
261
+ /** 字符串 format 映射到原生输入类型 */
262
+ textInputType(field: FormFieldConfig): string;
263
+ /** 取色器回显值:非法或空值退回黑色 */
264
+ colorValue(field: FormFieldConfig): string;
265
+ /** 字节序列回显为 hex 字符串 */
266
+ binaryToHex(value: unknown): string;
267
+ /** 复选组的当前选中状态(支持数组与逗号字符串两种存储形态) */
268
+ multiSelected(field: FormFieldConfig, value: string): boolean;
269
+ /** 复选组切换:合并出新数组后走统一解析链路 */
270
+ onMultiSelectChange(field: FormFieldConfig, value: string, checked: boolean): void;
271
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntityFormComponent, never>;
272
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityFormComponent, "rxdb-entity-form", never, {
273
+ "fields": {
274
+ "alias": "fields";
275
+ "required": true;
276
+ "isSignal": true;
277
+ };
278
+ "data": {
279
+ "alias": "data";
280
+ "required": true;
281
+ "isSignal": true;
282
+ };
283
+ "mode": {
284
+ "alias": "mode";
285
+ "required": false;
286
+ "isSignal": true;
287
+ };
288
+ "relatedEntityProvider": {
289
+ "alias": "relatedEntityProvider";
290
+ "required": false;
291
+ "isSignal": true;
292
+ };
293
+ "showActions": {
294
+ "alias": "showActions";
295
+ "required": false;
296
+ "isSignal": true;
297
+ };
298
+ }, {
299
+ "fieldChanged": "fieldChanged";
300
+ "formSubmitted": "formSubmitted";
301
+ "formCancelled": "formCancelled";
302
+ "validationErrors": "validationErrors";
303
+ }, never, never, true, never>;
304
+ }
305
+ declare module '@aiao/rxdb' {
306
+ interface RxDB {
307
+ versionManager: VersionManager;
308
+ }
131
309
  }
132
-
133
- /** RxDB 实体实例(用于 CRUD 操作) */
134
- type EntityInstance = {
135
- [key: string]: unknown;
136
- readonly id: string;
137
- save(): Promise<void>;
138
- remove(): Promise<void>;
139
- };
140
- type FilterQuery = {
141
- combinator: 'and' | 'or';
142
- rules: unknown[];
143
- };
144
310
  /**
145
311
  * 实体列表组件
146
312
  *
@@ -152,110 +318,204 @@ type FilterQuery = {
152
318
  * <rxdb-entity-list [namespace]="namespace()" [name]="name()" />
153
319
  * ```
154
320
  */
155
- declare class EntityListComponent {
156
- #private;
157
- protected readonly Undo2: lucide_angular.LucideIconData;
158
- protected readonly Redo2: lucide_angular.LucideIconData;
159
- protected readonly Funnel: lucide_angular.LucideIconData;
160
- /** CDK Overlay 定位策略:优先下方右对齐,其次上方右对齐 */
161
- protected readonly overlayPositions: ({
162
- originX: "end";
163
- originY: "bottom";
164
- overlayX: "end";
165
- overlayY: "top";
166
- offsetY: number;
167
- } | {
168
- originX: "end";
169
- originY: "top";
170
- overlayX: "end";
171
- overlayY: "bottom";
172
- offsetY: number;
173
- })[];
174
- protected readonly loadMore: _angular_core.Signal<(() => void) | undefined>;
175
- readonly namespace: _angular_core.InputSignal<string>;
176
- readonly name: _angular_core.InputSignal<string>;
177
- /** 固定查询条件,与用户筛选条件做 AND 合并(用于关系属性过滤,如 ownerId = currentId) */
178
- readonly fixedQuery: _angular_core.InputSignal<FilterQuery | undefined>;
179
- /** 预填充的外键数据(级联新增时传递给子实体对话框) */
180
- readonly fixedFormData: _angular_core.InputSignal<EntityFormData | undefined>;
181
- /** 草稿父实体(用于级联新增场景,子实体通过关系API注册到父实体) */
182
- readonly draftParentEntity: _angular_core.InputSignal<EntityInstance | null>;
183
- /** 父实体上关系属性名(如 'children'),用于调用 parent.children$.add(child) */
184
- readonly parentRelationName: _angular_core.InputSignal<string | undefined>;
185
- /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */
186
- readonly creationChain: _angular_core.InputSignal<string[]>;
187
- /** 关系类型(MANY_TO_MANY 时启用选择模式) */
188
- readonly relationKind: _angular_core.InputSignal<RelationKind | undefined>;
189
- /** 父实体实例(用于 M2M 关系操作,包含 draft 和已保存实体) */
190
- readonly parentEntity: _angular_core.InputSignal<EntityInstance | null>;
191
- /** 列表模式:default=普通列表, select=选择模式(带 checkbox 列) */
192
- readonly mode: _angular_core.InputSignal<"select" | "default">;
193
- /** 已关联的实体 ID 集合(选择模式下过滤掉,不再展示) */
194
- readonly alreadyLinkedIds: _angular_core.InputSignal<Set<string>>;
195
- /** 点击「查看」按钮时触发,携带对应行记录 */
196
- readonly viewEntity: _angular_core.OutputEmitterRef<EntityTableRecord>;
197
- /** 选择模式:确认选择时触发,携带选中的实体实例 */
198
- readonly selectionConfirmed: _angular_core.OutputEmitterRef<EntityInstance[]>;
199
- /** 选择模式:取消选择时触发 */
200
- readonly selectionCancelled: _angular_core.OutputEmitterRef<void>;
201
- readonly filterQuery: WritableSignal<FilterQuery>;
202
- readonly $isFilterQuery: _angular_core.Signal<boolean>;
203
- readonly showFilterPopover: WritableSignal<boolean>;
204
- readonly pendingQuery: WritableSignal<FilterQuery>;
205
- readonly pendingQueryValid: WritableSignal<boolean>;
206
- readonly isBrowser: boolean;
207
- readonly displayName: _angular_core.Signal<string>;
208
- /** 当前实体是否存在于祖先创建链路中(循环创建检测) */
209
- readonly isCreateBlocked: _angular_core.Signal<boolean>;
210
- readonly isQueryActive: _angular_core.Signal<boolean>;
211
- readonly filteredCount: _angular_core.Signal<number>;
212
- readonly isInitialLoading: _angular_core.Signal<boolean>;
213
- readonly isLoadingMore: _angular_core.Signal<boolean>;
214
- readonly undoCount: _angular_core.Signal<number>;
215
- readonly redoCount: _angular_core.Signal<number>;
216
- readonly canUndo: _angular_core.Signal<boolean>;
217
- readonly canRedo: _angular_core.Signal<boolean>;
218
- readonly queryBuilderFields: _angular_core.Signal<FieldMetadata[]>;
219
- readonly tableRecords: _angular_core.Signal<EntityTableRecord[]>;
220
- readonly tableColumns: _angular_core.Signal<ColumnsDefine>;
221
- readonly createFormFieldConfigs: _angular_core.Signal<FormFieldConfig[]>;
222
- readonly isSelectMode: _angular_core.Signal<boolean>;
223
- readonly isM2m: _angular_core.Signal<boolean>;
224
- readonly m2mSelectTpl: _angular_core.Signal<TemplateRef<void> | undefined>;
225
- readonly selectedIds: WritableSignal<Set<string>>;
226
- readonly selectedCount: _angular_core.Signal<number>;
227
- readonly m2mAlreadyLinkedIds: _angular_core.Signal<Set<string>>;
228
- constructor();
229
- toggleFilterPopover(): void;
230
- applyFilter(): void;
231
- resetFilter(): void;
232
- onKeydown(e: KeyboardEvent): void;
233
- onQueryChange(query: {
234
- combinator: 'and' | 'or';
235
- rules: unknown[];
236
- } | undefined): void;
237
- onValidationChange(result: ValidationResult): void;
238
- onCellChanged(event: CellChangeEvent): void;
239
- undo(): void;
240
- redo(): void;
241
- onIconClicked(event: {
242
- name: string;
243
- record: EntityTableRecord;
244
- }): Promise<void>;
245
- onRowDeleted(event: EntityTableRecord): Promise<void>;
246
- onBatchUpdated(mutations: BatchChangeItem[]): void;
247
- openCreateDialog(): void;
248
- openM2mSelectDialog(): void;
249
- onM2mSelectionConfirmed(entities: EntityInstance[]): void;
250
- m2mCancelSelection(): void;
251
- confirmSelection(): void;
252
- cancelSelection(): void;
253
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityListComponent, never>;
254
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityListComponent, "rxdb-entity-list", never, { "namespace": { "alias": "namespace"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": true; "isSignal": true; }; "fixedQuery": { "alias": "fixedQuery"; "required": false; "isSignal": true; }; "fixedFormData": { "alias": "fixedFormData"; "required": false; "isSignal": true; }; "draftParentEntity": { "alias": "draftParentEntity"; "required": false; "isSignal": true; }; "parentRelationName": { "alias": "parentRelationName"; "required": false; "isSignal": true; }; "creationChain": { "alias": "creationChain"; "required": false; "isSignal": true; }; "relationKind": { "alias": "relationKind"; "required": false; "isSignal": true; }; "parentEntity": { "alias": "parentEntity"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "alreadyLinkedIds": { "alias": "alreadyLinkedIds"; "required": false; "isSignal": true; }; }, { "viewEntity": "viewEntity"; "selectionConfirmed": "selectionConfirmed"; "selectionCancelled": "selectionCancelled"; }, never, never, true, never>;
321
+ export declare class EntityListComponent {
322
+ #private;
323
+ /** 内部查询表格:拖放被拒或落库失败时恢复行序 */
324
+ private readonly queryTable;
325
+ protected readonly Undo2: typeof LucideUndo2;
326
+ protected readonly Redo2: typeof LucideRedo2;
327
+ protected readonly Funnel: typeof LucideFunnel;
328
+ protected readonly listTableOptions: Partial<ListTableConstructorOptions>;
329
+ /** CDK Overlay 定位策略:优先下方右对齐,其次上方右对齐 */
330
+ protected readonly overlayPositions: ({
331
+ originX: "end";
332
+ originY: "bottom";
333
+ overlayX: "end";
334
+ overlayY: "top";
335
+ offsetY: number;
336
+ } | {
337
+ originX: "end";
338
+ originY: "top";
339
+ overlayX: "end";
340
+ overlayY: "bottom";
341
+ offsetY: number;
342
+ })[];
343
+ protected readonly loadMore: import("@angular/core").Signal<(() => void) | undefined>;
344
+ readonly namespace: import("@angular/core").InputSignal<string>;
345
+ readonly name: import("@angular/core").InputSignal<string>;
346
+ /** 固定查询条件,与用户筛选条件做 AND 合并(用于关系属性过滤,如 ownerId = currentId) */
347
+ readonly fixedQuery: import("@angular/core").InputSignal<FilterQuery | undefined>;
348
+ /** 外部导航传入的初始筛选条件(JSON 字符串),如 Query Builder「应用到实体浏览」 */
349
+ readonly initialFilter: import("@angular/core").InputSignal<string | undefined>;
350
+ /** 预填充的外键数据(级联新增时传递给子实体对话框) */
351
+ readonly fixedFormData: import("@angular/core").InputSignal<EntityFormData | undefined>;
352
+ /** 草稿父实体(用于级联新增场景,子实体通过关系API注册到父实体) */
353
+ readonly draftParentEntity: import("@angular/core").InputSignal<EntityInstance | null>;
354
+ /** 父实体上关系属性名(如 'children'),用于调用 parent.children$.add(child) */
355
+ readonly parentRelationName: import("@angular/core").InputSignal<string | undefined>;
356
+ /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */
357
+ readonly creationChain: import("@angular/core").InputSignal<string[]>;
358
+ /** 已打开详情对话框的记录 id 栈(含祖先记录),「查看」前检查以防无限套娃 */
359
+ readonly editChain: import("@angular/core").InputSignal<string[]>;
360
+ /** 关系类型(MANY_TO_MANY 时启用选择模式) */
361
+ readonly relationKind: import("@angular/core").InputSignal<RelationKind | undefined>;
362
+ /** 父实体实例(用于 M2M 关系操作,包含 draft 和已保存实体) */
363
+ readonly parentEntity: import("@angular/core").InputSignal<EntityInstance | null>;
364
+ /** 列表模式:default=普通列表, select=选择模式(带 checkbox 列) */
365
+ readonly mode: import("@angular/core").InputSignal<"select" | "default">;
366
+ /** 已关联的实体 ID 集合(选择模式下过滤掉,不再展示) */
367
+ readonly alreadyLinkedIds: import("@angular/core").InputSignal<Set<string>>;
368
+ /** 点击「查看」按钮时触发,携带对应行记录;组件同时打开内置编辑对话框(记录已在 editChain 中或为未保存草稿时仅 emit) */
369
+ readonly viewEntity: import("@angular/core").OutputEmitterRef<EntityTableRecord>;
370
+ /** 选择模式:确认选择时触发,携带选中的实体实例 */
371
+ readonly selectionConfirmed: import("@angular/core").OutputEmitterRef<EntityInstance[]>;
372
+ /** 选择模式:取消选择时触发 */
373
+ readonly selectionCancelled: import("@angular/core").OutputEmitterRef<void>;
374
+ readonly filterQuery: WritableSignal<FilterQuery>;
375
+ readonly $isFilterQuery: import("@angular/core").Signal<boolean>;
376
+ readonly showFilterPopover: WritableSignal<boolean>;
377
+ readonly pendingQuery: WritableSignal<FilterQuery>;
378
+ readonly pendingQueryValid: WritableSignal<boolean>;
379
+ readonly isBrowser: boolean;
380
+ readonly displayName: import("@angular/core").Signal<string>;
381
+ /** 当前实体不接受从列表新增:`create` 只许系统写,或已在祖先创建链路中(循环创建检测) */
382
+ readonly isCreateBlocked: import("@angular/core").Signal<boolean>;
383
+ readonly isQueryActive: import("@angular/core").Signal<boolean>;
384
+ readonly filteredCount: import("@angular/core").Signal<number>;
385
+ readonly isInitialLoading: import("@angular/core").Signal<boolean>;
386
+ readonly isLoadingMore: import("@angular/core").Signal<boolean>;
387
+ readonly undoCount: import("@angular/core").Signal<number>;
388
+ readonly redoCount: import("@angular/core").Signal<number>;
389
+ readonly canUndo: import("@angular/core").Signal<boolean>;
390
+ readonly canRedo: import("@angular/core").Signal<boolean>;
391
+ readonly queryBuilderFields: import("@angular/core").Signal<FieldMetadata[]>;
392
+ readonly tableRecords: import("@angular/core").Signal<EntityTableRecord[]>;
393
+ readonly tableColumns: import("@angular/core").Signal<ColumnsDefine>;
394
+ readonly createFormFieldConfigs: import("@angular/core").Signal<FormFieldConfig[]>;
395
+ readonly isSelectMode: import("@angular/core").Signal<boolean>;
396
+ readonly isM2m: import("@angular/core").Signal<boolean>;
397
+ readonly m2mSelectTpl: import("@angular/core").Signal<TemplateRef<void> | undefined>;
398
+ /** 最近一次拖放排序落库失败的提示;`null` 为无错误 */
399
+ readonly reorderError: WritableSignal<string | null>;
400
+ /** 当前列表是否允许拖放排序(行拖动手柄是否显示) */
401
+ readonly rowDragEnabled: import("@angular/core").Signal<boolean>;
402
+ readonly selectedIds: WritableSignal<Set<string>>;
403
+ readonly selectedCount: import("@angular/core").Signal<number>;
404
+ readonly m2mAlreadyLinkedIds: import("@angular/core").Signal<Set<string>>;
405
+ constructor();
406
+ toggleFilterPopover(): void;
407
+ applyFilter(): void;
408
+ resetFilter(): void;
409
+ onKeydown(e: KeyboardEvent): void;
410
+ onQueryChange(query: {
411
+ combinator: 'and' | 'or';
412
+ rules: unknown[];
413
+ } | undefined): void;
414
+ onValidationChange(result: ValidationResult): void;
415
+ onCellChanged(event: CellChangeEvent): void;
416
+ undo(): void;
417
+ redo(): void;
418
+ onIconClicked(event: {
419
+ name: string;
420
+ record: EntityTableRecord;
421
+ }): Promise<void>;
422
+ onRowDeleted(event: EntityTableRecord): Promise<void>;
423
+ onBatchUpdated(mutations: BatchChangeItem[]): void;
424
+ openCreateDialog(): Promise<void>;
425
+ openM2mSelectDialog(): void;
426
+ onM2mSelectionConfirmed(entities: EntityInstance[]): void;
427
+ m2mCancelSelection(): void;
428
+ confirmSelection(): void;
429
+ cancelSelection(): void;
430
+ /**
431
+ * 单行拖放:允许时按界面上的邻居落库重排,不允许或失败时把表格恢复原顺序(US-028)。
432
+ */
433
+ onRowMoved(move: RowMoveEvent): void;
434
+ /**
435
+ * 列头排序点击:驱动 cursor orderBy 重查(VTable 客户端排序已禁用)。
436
+ */
437
+ onSortClicked(event: {
438
+ field: unknown;
439
+ order: unknown;
440
+ }): void;
441
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntityListComponent, never>;
442
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityListComponent, "rxdb-entity-list", never, {
443
+ "namespace": {
444
+ "alias": "namespace";
445
+ "required": true;
446
+ "isSignal": true;
447
+ };
448
+ "name": {
449
+ "alias": "name";
450
+ "required": true;
451
+ "isSignal": true;
452
+ };
453
+ "fixedQuery": {
454
+ "alias": "fixedQuery";
455
+ "required": false;
456
+ "isSignal": true;
457
+ };
458
+ "initialFilter": {
459
+ "alias": "initialFilter";
460
+ "required": false;
461
+ "isSignal": true;
462
+ };
463
+ "fixedFormData": {
464
+ "alias": "fixedFormData";
465
+ "required": false;
466
+ "isSignal": true;
467
+ };
468
+ "draftParentEntity": {
469
+ "alias": "draftParentEntity";
470
+ "required": false;
471
+ "isSignal": true;
472
+ };
473
+ "parentRelationName": {
474
+ "alias": "parentRelationName";
475
+ "required": false;
476
+ "isSignal": true;
477
+ };
478
+ "creationChain": {
479
+ "alias": "creationChain";
480
+ "required": false;
481
+ "isSignal": true;
482
+ };
483
+ "editChain": {
484
+ "alias": "editChain";
485
+ "required": false;
486
+ "isSignal": true;
487
+ };
488
+ "relationKind": {
489
+ "alias": "relationKind";
490
+ "required": false;
491
+ "isSignal": true;
492
+ };
493
+ "parentEntity": {
494
+ "alias": "parentEntity";
495
+ "required": false;
496
+ "isSignal": true;
497
+ };
498
+ "mode": {
499
+ "alias": "mode";
500
+ "required": false;
501
+ "isSignal": true;
502
+ };
503
+ "alreadyLinkedIds": {
504
+ "alias": "alreadyLinkedIds";
505
+ "required": false;
506
+ "isSignal": true;
507
+ };
508
+ }, {
509
+ "viewEntity": "viewEntity";
510
+ "selectionConfirmed": "selectionConfirmed";
511
+ "selectionCancelled": "selectionCancelled";
512
+ }, never, never, true, never>;
255
513
  }
256
-
257
- declare const ENTITY_TABLE_CONFIG: InjectionToken<EntityTableConfig>;
258
-
514
+ /**
515
+ * 实体表格配置注入令牌
516
+ * 用于在 Angular 应用中注入全局实体表格配置
517
+ */
518
+ export declare const ENTITY_TABLE_CONFIG: InjectionToken<EntityTableConfig>;
259
519
  /**
260
520
  * 通用实体数据表格组件
261
521
  *
@@ -267,51 +527,131 @@ declare const ENTITY_TABLE_CONFIG: InjectionToken<EntityTableConfig>;
267
527
  * - 主题系统(daisyUI CSS 变量)
268
528
  * - 校验错误 tooltip
269
529
  */
270
- declare class EntityTableComponent implements OnDestroy {
271
- #private;
272
- readonly tableContainer: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
273
- readonly records: _angular_core.InputSignal<EntityTableRecord[]>;
274
- readonly columns: _angular_core.InputSignal<VTable.TYPES.ColumnsDefine | undefined>;
275
- readonly isDarkMode: _angular_core.InputSignal<boolean>;
276
- readonly idField: _angular_core.InputSignal<string>;
277
- readonly nonClearableFields: _angular_core.InputSignal<ReadonlySet<string>>;
278
- readonly tableOptions: _angular_core.InputSignal<Partial<ListTableConstructorOptions> | undefined>;
279
- readonly cellErrorDetector: _angular_core.InputSignal<((record: EntityTableRecord, field: string) => string | null) | undefined>;
280
- readonly loading: _angular_core.InputSignal<boolean>;
281
- /** 业务层回调判断单元格是否可清空(返回 false 跳过),替代领域特定的硬编码逻辑 */
282
- readonly cellClearable: _angular_core.InputSignal<((record: Record<string, unknown>, field: string) => boolean) | undefined>;
283
- /** 触底时加载更多数据的回调,由表格内部在滚动到底部时调用 */
284
- readonly loadMore: _angular_core.InputSignal<(() => void) | undefined>;
285
- /** 加载更多中状态(已有数据,底部小 spinner,不拦截滚动) */
286
- readonly loadingMore: _angular_core.InputSignal<boolean>;
287
- readonly cellChanged: _angular_core.OutputEmitterRef<CellChangeEvent>;
288
- readonly rowDeleted: _angular_core.OutputEmitterRef<EntityTableRecord>;
289
- readonly iconClicked: _angular_core.OutputEmitterRef<{
290
- name: string;
291
- record: EntityTableRecord;
292
- }>;
293
- readonly batchUpdated: _angular_core.OutputEmitterRef<BatchChangeItem[]>;
294
- readonly rowReordered: _angular_core.OutputEmitterRef<string[]>;
295
- readonly scrollNearBottom: _angular_core.OutputEmitterRef<void>;
296
- readonly cellTooltip: _angular_core.WritableSignal<{
297
- x: number;
298
- y: number;
299
- content: string;
300
- } | null>;
301
- readonly headerHeight: _angular_core.WritableSignal<number>;
302
- get tableInstance(): VTable.ListTable | null;
303
- constructor();
304
- /**
305
- * 从业务层回滚单元格值(校验失败时恢复原值)。
306
- * 避免外部直接访问 tableInstance。
307
- */
308
- changeCellValue(col: number, row: number, value: unknown): void;
309
- redrawTheme(): void;
310
- ngOnDestroy(): void;
311
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityTableComponent, never>;
312
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityTableComponent, "rxdb-entity-table", never, { "records": { "alias": "records"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "isDarkMode": { "alias": "isDarkMode"; "required": false; "isSignal": true; }; "idField": { "alias": "idField"; "required": false; "isSignal": true; }; "nonClearableFields": { "alias": "nonClearableFields"; "required": false; "isSignal": true; }; "tableOptions": { "alias": "tableOptions"; "required": false; "isSignal": true; }; "cellErrorDetector": { "alias": "cellErrorDetector"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "cellClearable": { "alias": "cellClearable"; "required": false; "isSignal": true; }; "loadMore": { "alias": "loadMore"; "required": false; "isSignal": true; }; "loadingMore": { "alias": "loadingMore"; "required": false; "isSignal": true; }; }, { "cellChanged": "cellChanged"; "rowDeleted": "rowDeleted"; "iconClicked": "iconClicked"; "batchUpdated": "batchUpdated"; "rowReordered": "rowReordered"; "scrollNearBottom": "scrollNearBottom"; }, never, ["[emptyState]"], true, never>;
530
+ export declare class EntityTableComponent implements OnDestroy, EntityTableHandle {
531
+ #private;
532
+ readonly tableContainer: import("@angular/core").Signal<ElementRef<HTMLDivElement> | undefined>;
533
+ readonly records: import("@angular/core").InputSignal<EntityTableRecord[]>;
534
+ readonly columns: import("@angular/core").InputSignal<VTable.TYPES.ColumnsDefine | undefined>;
535
+ readonly isDarkMode: import("@angular/core").InputSignal<boolean | undefined>;
536
+ readonly idField: import("@angular/core").InputSignal<string>;
537
+ readonly nonClearableFields: import("@angular/core").InputSignal<ReadonlySet<string>>;
538
+ readonly tableOptions: import("@angular/core").InputSignal<Partial<ListTableConstructorOptions> | undefined>;
539
+ readonly cellErrorDetector: import("@angular/core").InputSignal<((record: EntityTableRecord, field: string) => string | null) | undefined>;
540
+ readonly loading: import("@angular/core").InputSignal<boolean>;
541
+ /** 业务层回调判断单元格是否可清空(返回 false 跳过),替代领域特定的硬编码逻辑 */
542
+ readonly cellClearable: import("@angular/core").InputSignal<((record: Record<string, unknown>, field: string) => boolean) | undefined>;
543
+ /** 触底时加载更多数据的回调,由表格内部在滚动到底部时调用 */
544
+ readonly loadMore: import("@angular/core").InputSignal<(() => void) | undefined>;
545
+ /** 加载更多中状态(已有数据,底部小 spinner,不拦截滚动) */
546
+ readonly loadingMore: import("@angular/core").InputSignal<boolean>;
547
+ /** 是否显示行拖动手柄,缺省 `true`;运行时切换即时生效(建表需开启 `rowSeriesNumber.dragOrder`) */
548
+ readonly rowDragEnabled: import("@angular/core").InputSignal<boolean>;
549
+ readonly cellChanged: import("@angular/core").OutputEmitterRef<CellChangeEvent>;
550
+ readonly rowDeleted: import("@angular/core").OutputEmitterRef<EntityTableRecord>;
551
+ readonly iconClicked: import("@angular/core").OutputEmitterRef<{
552
+ name: string;
553
+ record: EntityTableRecord;
554
+ }>;
555
+ readonly batchUpdated: import("@angular/core").OutputEmitterRef<BatchChangeItem[]>;
556
+ readonly rowReordered: import("@angular/core").OutputEmitterRef<string[]>;
557
+ /** 单行拖放:被拖行与落点前后邻居(US-028) */
558
+ readonly rowMoved: import("@angular/core").OutputEmitterRef<RowMoveEvent>;
559
+ readonly scrollNearBottom: import("@angular/core").OutputEmitterRef<void>;
560
+ /** 列头排序点击;业务层接管查询排序,表格不执行客户端排序 */
561
+ readonly sortClicked: import("@angular/core").OutputEmitterRef<{
562
+ field: unknown;
563
+ order: unknown;
564
+ }>;
565
+ readonly cellTooltip: import("@angular/core").WritableSignal<{
566
+ x: number;
567
+ y: number;
568
+ content: string;
569
+ } | null>;
570
+ readonly headerHeight: import("@angular/core").WritableSignal<number>;
571
+ get tableInstance(): VTable.ListTable | null;
572
+ constructor();
573
+ /**
574
+ * 从业务层回滚单元格值(校验失败时恢复原值)。
575
+ * 避免外部直接访问 tableInstance。
576
+ */
577
+ changeCellValue(col: number, row: number, value: unknown): void;
578
+ redrawTheme(): void;
579
+ /** 把行恢复成最近一次交给表格的顺序(拖放被拒或落库失败时调用)。 */
580
+ restoreRecords(): void;
581
+ ngOnDestroy(): void;
582
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntityTableComponent, never>;
583
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityTableComponent, "rxdb-entity-table", never, {
584
+ "records": {
585
+ "alias": "records";
586
+ "required": true;
587
+ "isSignal": true;
588
+ };
589
+ "columns": {
590
+ "alias": "columns";
591
+ "required": true;
592
+ "isSignal": true;
593
+ };
594
+ "isDarkMode": {
595
+ "alias": "isDarkMode";
596
+ "required": false;
597
+ "isSignal": true;
598
+ };
599
+ "idField": {
600
+ "alias": "idField";
601
+ "required": false;
602
+ "isSignal": true;
603
+ };
604
+ "nonClearableFields": {
605
+ "alias": "nonClearableFields";
606
+ "required": false;
607
+ "isSignal": true;
608
+ };
609
+ "tableOptions": {
610
+ "alias": "tableOptions";
611
+ "required": false;
612
+ "isSignal": true;
613
+ };
614
+ "cellErrorDetector": {
615
+ "alias": "cellErrorDetector";
616
+ "required": false;
617
+ "isSignal": true;
618
+ };
619
+ "loading": {
620
+ "alias": "loading";
621
+ "required": false;
622
+ "isSignal": true;
623
+ };
624
+ "cellClearable": {
625
+ "alias": "cellClearable";
626
+ "required": false;
627
+ "isSignal": true;
628
+ };
629
+ "loadMore": {
630
+ "alias": "loadMore";
631
+ "required": false;
632
+ "isSignal": true;
633
+ };
634
+ "loadingMore": {
635
+ "alias": "loadingMore";
636
+ "required": false;
637
+ "isSignal": true;
638
+ };
639
+ "rowDragEnabled": {
640
+ "alias": "rowDragEnabled";
641
+ "required": false;
642
+ "isSignal": true;
643
+ };
644
+ }, {
645
+ "cellChanged": "cellChanged";
646
+ "rowDeleted": "rowDeleted";
647
+ "iconClicked": "iconClicked";
648
+ "batchUpdated": "batchUpdated";
649
+ "rowReordered": "rowReordered";
650
+ "rowMoved": "rowMoved";
651
+ "scrollNearBottom": "scrollNearBottom";
652
+ "sortClicked": "sortClicked";
653
+ }, never, ["[emptyState]"], true, never>;
313
654
  }
314
-
315
655
  /**
316
656
  * 集成查询构建器的实体表格组件
317
657
  *
@@ -328,73 +668,169 @@ declare class EntityTableComponent implements OnDestroy {
328
668
  * </rxdb-query-table>
329
669
  * ```
330
670
  */
331
- declare class QueryTableComponent {
332
- readonly records: _angular_core.InputSignal<EntityTableRecord[]>;
333
- readonly columns: _angular_core.InputSignal<VTable.ColumnsDefine | undefined>;
334
- readonly idField: _angular_core.InputSignal<string>;
335
- readonly nonClearableFields: _angular_core.InputSignal<ReadonlySet<string>>;
336
- readonly tableOptions: _angular_core.InputSignal<Partial<ListTableConstructorOptions> | undefined>;
337
- readonly cellErrorDetector: _angular_core.InputSignal<((record: EntityTableRecord, field: string) => string | null) | undefined>;
338
- readonly isDarkMode: _angular_core.InputSignal<boolean>;
339
- /** 业务层回调判断单元格是否可清空 */
340
- readonly cellClearable: _angular_core.InputSignal<((record: Record<string, unknown>, field: string) => boolean) | undefined>;
341
- /** 查询条件是否激活(显示筛选状态标签) */
342
- readonly queryActive: _angular_core.InputSignal<boolean>;
343
- /** 结果总数(显示在筛选状态栏中) */
344
- readonly totalCount: _angular_core.InputSignal<number | undefined>;
345
- /** 筛选后结果数 */
346
- readonly filteredCount: _angular_core.InputSignal<number | undefined>;
347
- /** 是否显示加载状态 */
348
- readonly loading: _angular_core.InputSignal<boolean>;
349
- /** 加载更多中(已有数据,底部小 spinner,不拦截滚动) */
350
- readonly loadingMore: _angular_core.InputSignal<boolean>;
351
- /** 触底时加载更多数据的回调,透传给 EntityTableComponent */
352
- readonly loadMore: _angular_core.InputSignal<(() => void) | undefined>;
353
- readonly cellChanged: _angular_core.OutputEmitterRef<CellChangeEvent>;
354
- readonly rowDeleted: _angular_core.OutputEmitterRef<EntityTableRecord>;
355
- readonly iconClicked: _angular_core.OutputEmitterRef<{
356
- name: string;
357
- record: EntityTableRecord;
358
- }>;
359
- readonly batchUpdated: _angular_core.OutputEmitterRef<BatchChangeItem[]>;
360
- readonly rowReordered: _angular_core.OutputEmitterRef<string[]>;
361
- readonly scrollNearBottom: _angular_core.OutputEmitterRef<void>;
362
- readonly entityTable: _angular_core.Signal<EntityTableComponent | undefined>;
363
- readonly statusText: _angular_core.Signal<string>;
364
- get tableInstance(): ListTable | null;
365
- changeCellValue(col: number, row: number, value: unknown): void;
366
- redrawTheme(): void;
367
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryTableComponent, never>;
368
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryTableComponent, "rxdb-query-table", never, { "records": { "alias": "records"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "idField": { "alias": "idField"; "required": false; "isSignal": true; }; "nonClearableFields": { "alias": "nonClearableFields"; "required": false; "isSignal": true; }; "tableOptions": { "alias": "tableOptions"; "required": false; "isSignal": true; }; "cellErrorDetector": { "alias": "cellErrorDetector"; "required": false; "isSignal": true; }; "isDarkMode": { "alias": "isDarkMode"; "required": false; "isSignal": true; }; "cellClearable": { "alias": "cellClearable"; "required": false; "isSignal": true; }; "queryActive": { "alias": "queryActive"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "filteredCount": { "alias": "filteredCount"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingMore": { "alias": "loadingMore"; "required": false; "isSignal": true; }; "loadMore": { "alias": "loadMore"; "required": false; "isSignal": true; }; }, { "cellChanged": "cellChanged"; "rowDeleted": "rowDeleted"; "iconClicked": "iconClicked"; "batchUpdated": "batchUpdated"; "rowReordered": "rowReordered"; "scrollNearBottom": "scrollNearBottom"; }, never, ["[filterBar]", "[emptyState]"], true, never>;
671
+ export declare class QueryTableComponent implements QueryTableHandle {
672
+ readonly records: import("@angular/core").InputSignal<EntityTableRecord[]>;
673
+ readonly columns: import("@angular/core").InputSignal<import("@visactor/vtable").ColumnsDefine | undefined>;
674
+ readonly idField: import("@angular/core").InputSignal<string>;
675
+ readonly nonClearableFields: import("@angular/core").InputSignal<ReadonlySet<string>>;
676
+ readonly tableOptions: import("@angular/core").InputSignal<Partial<ListTableConstructorOptions> | undefined>;
677
+ readonly cellErrorDetector: import("@angular/core").InputSignal<((record: EntityTableRecord, field: string) => string | null) | undefined>;
678
+ readonly isDarkMode: import("@angular/core").InputSignal<boolean | undefined>;
679
+ /** 业务层回调判断单元格是否可清空 */
680
+ readonly cellClearable: import("@angular/core").InputSignal<((record: Record<string, unknown>, field: string) => boolean) | undefined>;
681
+ /** 查询条件是否激活(显示筛选状态标签) */
682
+ readonly queryActive: import("@angular/core").InputSignal<boolean>;
683
+ /** 结果总数(显示在筛选状态栏中) */
684
+ readonly totalCount: import("@angular/core").InputSignal<number | undefined>;
685
+ /** 筛选后结果数 */
686
+ readonly filteredCount: import("@angular/core").InputSignal<number | undefined>;
687
+ /** 是否显示加载状态 */
688
+ readonly loading: import("@angular/core").InputSignal<boolean>;
689
+ /** 加载更多中(已有数据,底部小 spinner,不拦截滚动) */
690
+ readonly loadingMore: import("@angular/core").InputSignal<boolean>;
691
+ /** 触底时加载更多数据的回调,透传给 EntityTableComponent */
692
+ readonly loadMore: import("@angular/core").InputSignal<(() => void) | undefined>;
693
+ /** 是否显示行拖动手柄,缺省 `true`,透传给 EntityTableComponent */
694
+ readonly rowDragEnabled: import("@angular/core").InputSignal<boolean>;
695
+ readonly cellChanged: import("@angular/core").OutputEmitterRef<CellChangeEvent>;
696
+ readonly rowDeleted: import("@angular/core").OutputEmitterRef<EntityTableRecord>;
697
+ readonly iconClicked: import("@angular/core").OutputEmitterRef<{
698
+ name: string;
699
+ record: EntityTableRecord;
700
+ }>;
701
+ readonly batchUpdated: import("@angular/core").OutputEmitterRef<BatchChangeItem[]>;
702
+ readonly rowReordered: import("@angular/core").OutputEmitterRef<string[]>;
703
+ /** 单行拖放:被拖行与落点前后邻居 */
704
+ readonly rowMoved: import("@angular/core").OutputEmitterRef<RowMoveEvent>;
705
+ readonly scrollNearBottom: import("@angular/core").OutputEmitterRef<void>;
706
+ readonly sortClicked: import("@angular/core").OutputEmitterRef<{
707
+ field: unknown;
708
+ order: unknown;
709
+ }>;
710
+ readonly entityTable: import("@angular/core").Signal<EntityTableComponent | undefined>;
711
+ readonly statusText: import("@angular/core").Signal<string>;
712
+ get tableInstance(): ListTable | null;
713
+ changeCellValue(col: number, row: number, value: unknown): void;
714
+ redrawTheme(): void;
715
+ /** 把行恢复成最近一次交给表格的顺序(委托给内部实体表格) */
716
+ restoreRecords(): void;
717
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryTableComponent, never>;
718
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryTableComponent, "rxdb-query-table", never, {
719
+ "records": {
720
+ "alias": "records";
721
+ "required": true;
722
+ "isSignal": true;
723
+ };
724
+ "columns": {
725
+ "alias": "columns";
726
+ "required": true;
727
+ "isSignal": true;
728
+ };
729
+ "idField": {
730
+ "alias": "idField";
731
+ "required": false;
732
+ "isSignal": true;
733
+ };
734
+ "nonClearableFields": {
735
+ "alias": "nonClearableFields";
736
+ "required": false;
737
+ "isSignal": true;
738
+ };
739
+ "tableOptions": {
740
+ "alias": "tableOptions";
741
+ "required": false;
742
+ "isSignal": true;
743
+ };
744
+ "cellErrorDetector": {
745
+ "alias": "cellErrorDetector";
746
+ "required": false;
747
+ "isSignal": true;
748
+ };
749
+ "isDarkMode": {
750
+ "alias": "isDarkMode";
751
+ "required": false;
752
+ "isSignal": true;
753
+ };
754
+ "cellClearable": {
755
+ "alias": "cellClearable";
756
+ "required": false;
757
+ "isSignal": true;
758
+ };
759
+ "queryActive": {
760
+ "alias": "queryActive";
761
+ "required": false;
762
+ "isSignal": true;
763
+ };
764
+ "totalCount": {
765
+ "alias": "totalCount";
766
+ "required": false;
767
+ "isSignal": true;
768
+ };
769
+ "filteredCount": {
770
+ "alias": "filteredCount";
771
+ "required": false;
772
+ "isSignal": true;
773
+ };
774
+ "loading": {
775
+ "alias": "loading";
776
+ "required": false;
777
+ "isSignal": true;
778
+ };
779
+ "loadingMore": {
780
+ "alias": "loadingMore";
781
+ "required": false;
782
+ "isSignal": true;
783
+ };
784
+ "loadMore": {
785
+ "alias": "loadMore";
786
+ "required": false;
787
+ "isSignal": true;
788
+ };
789
+ "rowDragEnabled": {
790
+ "alias": "rowDragEnabled";
791
+ "required": false;
792
+ "isSignal": true;
793
+ };
794
+ }, {
795
+ "cellChanged": "cellChanged";
796
+ "rowDeleted": "rowDeleted";
797
+ "iconClicked": "iconClicked";
798
+ "batchUpdated": "batchUpdated";
799
+ "rowReordered": "rowReordered";
800
+ "rowMoved": "rowMoved";
801
+ "scrollNearBottom": "scrollNearBottom";
802
+ "sortClicked": "sortClicked";
803
+ }, never, ["[filterBar]", "[emptyState]"], true, never>;
369
804
  }
370
-
371
805
  /**
372
806
  * UI 规则组(宽松类型)
373
807
  */
374
808
  interface UIRuleGroup {
375
- id: string;
376
- combinator: 'and' | 'or';
377
- rules: Array<UIRule | UIRuleGroup>;
809
+ id: string;
810
+ combinator: 'and' | 'or';
811
+ rules: Array<UIRule | UIRuleGroup>;
378
812
  }
379
813
  type QueryDropMode = 'before' | 'after' | 'into';
380
814
  interface QueryDragDropState {
381
- draggedItemId: string | null;
382
- targetItemId: string | null;
383
- dropMode: QueryDropMode | null;
384
- isValidTarget: boolean;
385
- depth?: number;
815
+ draggedItemId: string | null;
816
+ targetItemId: string | null;
817
+ dropMode: QueryDropMode | null;
818
+ isValidTarget: boolean;
819
+ depth?: number;
386
820
  }
387
- declare class QueryDragDropHandler {
388
- private readonly moveItemFn;
389
- readonly state: _angular_core.WritableSignal<QueryDragDropState>;
390
- constructor(moveItemFn: (itemId: string, targetGroupId: string, targetIndex: number) => void);
391
- start(itemId: string): void;
392
- over(targetItemId: string, dropMode: QueryDropMode, isValid: boolean, depth: number): void;
393
- leave(): void;
394
- drop(itemId: string, targetGroupId: string, targetIndex: number): void;
395
- end(): void;
396
- private reset;
821
+ export declare class QueryDragDropHandler {
822
+ private readonly moveItemFn;
823
+ readonly state: import("@angular/core").WritableSignal<QueryDragDropState>;
824
+ constructor(moveItemFn: (itemId: string, targetGroupId: string, targetIndex: number) => void);
825
+ start(itemId: string): void;
826
+ over(targetItemId: string, dropMode: QueryDropMode, isValid: boolean, depth: number): void;
827
+ leave(): void;
828
+ drop(itemId: string, targetGroupId: string, targetIndex: number): void;
829
+ end(): void;
830
+ private reset;
397
831
  }
832
+ /** 按 clientY 与目标矩形计算放置模式(组模式支持 into)。 */
833
+ export declare function calculateDropMode(clientY: number, rect: DOMRect, isGroup: boolean): QueryDropMode;
398
834
  /**
399
835
  * 查询规则组组件(递归)
400
836
  *
@@ -405,80 +841,123 @@ declare class QueryDragDropHandler {
405
841
  * - 删除组
406
842
  * - 递归嵌套显示
407
843
  */
408
- declare class QueryGroupComponent {
409
- readonly group: _angular_core.InputSignal<UIRuleGroup>;
410
- readonly fields: _angular_core.InputSignal<FieldMetadata[]>;
411
- readonly errors: _angular_core.InputSignal<ValidationError[]>;
412
- readonly depth: _angular_core.InputSignal<number>;
413
- readonly maxDepth: _angular_core.InputSignal<number>;
414
- readonly dragDropHandler: _angular_core.InputSignal<QueryDragDropHandler | undefined>;
415
- /** 是否允许展开/收起组(默认开启) */
416
- readonly allowCollapse: _angular_core.InputSignal<boolean>;
417
- readonly addRule: _angular_core.OutputEmitterRef<{
418
- parentId: string;
419
- rule: Omit<UIRule, "id">;
420
- }>;
421
- readonly addGroup: _angular_core.OutputEmitterRef<string>;
422
- readonly removeItem: _angular_core.OutputEmitterRef<string>;
423
- readonly updateRule: _angular_core.OutputEmitterRef<{
424
- id: string;
425
- updates: Partial<UIRule>;
426
- }>;
427
- readonly updateCombinator: _angular_core.OutputEmitterRef<{
428
- id: string;
429
- combinator: "and" | "or";
430
- }>;
431
- /** 当前组是否已折叠 */
432
- readonly collapsed: _angular_core.WritableSignal<boolean>;
433
- /** 是否可以添加子组(未达到最大深度) */
434
- readonly canAddGroup: _angular_core.Signal<boolean>;
435
- /** 切换折叠状态 */
436
- toggleCollapse(): void;
437
- /** 切换组合器 */
438
- toggleCombinator(combinator: 'and' | 'or'): void;
439
- /** 添加规则 */
440
- onAddRule(): void;
441
- /** 添加子组 */
442
- onAddGroup(): void;
443
- /** 删除此组 */
444
- onRemove(): void;
445
- /** 规则更新 */
446
- onRuleUpdate(event: {
447
- id: string;
448
- updates: Partial<UIRule>;
449
- }): void;
450
- /** 删除规则 */
451
- onRuleRemove(id: string): void;
452
- /** 类型守卫:是否为规则组 */
453
- isRuleGroup(item: UIRuleGroup | UIRule): item is UIRuleGroup;
454
- /** 类型转换:转为规则组 */
455
- asRuleGroup(item: UIRuleGroup | UIRule): UIRuleGroup;
456
- /** 类型转换:转为规则 */
457
- asRule(item: UIRuleGroup | UIRule): UIRule;
458
- /** 追踪函数 */
459
- trackByItem(item: UIRuleGroup | UIRule): string;
460
- isDragging(itemId: string): boolean;
461
- isDropTarget(itemId: string, mode: QueryDropMode): boolean;
462
- isDropInvalid(itemId: string): boolean;
463
- onItemDragStart(event: DragEvent, item: UIRule | UIRuleGroup): void;
464
- onItemDragOver(event: DragEvent, item: UIRule | UIRuleGroup, index: number, isGroup: boolean): void;
465
- onItemDragLeave(event: DragEvent): void;
466
- onItemDrop(event: DragEvent, targetItem: UIRule | UIRuleGroup, targetIndex: number, isGroup: boolean): void;
467
- onItemDragEnd(): void;
468
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryGroupComponent, never>;
469
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryGroupComponent, "rxdb-query-group", never, { "group": { "alias": "group"; "required": true; "isSignal": true; }; "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "depth": { "alias": "depth"; "required": false; "isSignal": true; }; "maxDepth": { "alias": "maxDepth"; "required": false; "isSignal": true; }; "dragDropHandler": { "alias": "dragDropHandler"; "required": false; "isSignal": true; }; "allowCollapse": { "alias": "allowCollapse"; "required": false; "isSignal": true; }; }, { "addRule": "addRule"; "addGroup": "addGroup"; "removeItem": "removeItem"; "updateRule": "updateRule"; "updateCombinator": "updateCombinator"; }, never, never, true, never>;
844
+ export declare class QueryGroupComponent {
845
+ readonly group: import("@angular/core").InputSignal<UIRuleGroup>;
846
+ readonly fields: import("@angular/core").InputSignal<FieldMetadata[]>;
847
+ readonly errors: import("@angular/core").InputSignal<ValidationError[]>;
848
+ readonly depth: import("@angular/core").InputSignal<number>;
849
+ readonly maxDepth: import("@angular/core").InputSignal<number>;
850
+ readonly dragDropHandler: import("@angular/core").InputSignal<QueryDragDropHandler | undefined>;
851
+ /** 是否允许展开/收起组(默认开启) */
852
+ readonly allowCollapse: import("@angular/core").InputSignal<boolean>;
853
+ readonly addRule: import("@angular/core").OutputEmitterRef<{
854
+ parentId: string;
855
+ rule: Omit<UIRule, "id">;
856
+ }>;
857
+ readonly addGroup: import("@angular/core").OutputEmitterRef<string>;
858
+ readonly removeItem: import("@angular/core").OutputEmitterRef<string>;
859
+ readonly updateRule: import("@angular/core").OutputEmitterRef<{
860
+ id: string;
861
+ updates: Partial<UIRule>;
862
+ }>;
863
+ readonly updateCombinator: import("@angular/core").OutputEmitterRef<{
864
+ id: string;
865
+ combinator: "and" | "or";
866
+ }>;
867
+ /** 当前组是否已折叠 */
868
+ readonly collapsed: import("@angular/core").WritableSignal<boolean>;
869
+ /** 是否可以添加子组(未达到最大深度) */
870
+ readonly canAddGroup: import("@angular/core").Signal<boolean>;
871
+ /** 达到嵌套上限时展示给用户的原因(AC 要求「超过提示」,不能静默) */
872
+ readonly nestingLimitHint: import("@angular/core").Signal<string>;
873
+ /** 切换折叠状态 */
874
+ toggleCollapse(): void;
875
+ /** 切换组合器 */
876
+ toggleCombinator(combinator: 'and' | 'or'): void;
877
+ /** 添加规则 */
878
+ onAddRule(): void;
879
+ /** 添加子组 */
880
+ onAddGroup(): void;
881
+ /** 删除此组 */
882
+ onRemove(): void;
883
+ /** 规则更新 */
884
+ onRuleUpdate(event: {
885
+ id: string;
886
+ updates: Partial<UIRule>;
887
+ }): void;
888
+ /** 删除规则 */
889
+ onRuleRemove(id: string): void;
890
+ /** 类型守卫:是否为规则组 */
891
+ isRuleGroup(item: UIRuleGroup | UIRule): item is UIRuleGroup;
892
+ /** 类型转换:转为规则组 */
893
+ asRuleGroup(item: UIRuleGroup | UIRule): UIRuleGroup;
894
+ /** 类型转换:转为规则 */
895
+ asRule(item: UIRuleGroup | UIRule): UIRule;
896
+ /** 追踪函数 */
897
+ trackByItem(item: UIRuleGroup | UIRule): string;
898
+ isDragging(itemId: string): boolean;
899
+ isDropTarget(itemId: string, mode: QueryDropMode): boolean;
900
+ isDropInvalid(itemId: string): boolean;
901
+ onItemDragStart(event: DragEvent, item: UIRule | UIRuleGroup): void;
902
+ onItemDragOver(event: DragEvent, item: UIRule | UIRuleGroup, index: number, isGroup: boolean): void;
903
+ onItemDragLeave(event: DragEvent): void;
904
+ onItemDrop(event: DragEvent, targetItem: UIRule | UIRuleGroup, targetIndex: number, isGroup: boolean): void;
905
+ onItemDragEnd(): void;
906
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryGroupComponent, never>;
907
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryGroupComponent, "rxdb-query-group", never, {
908
+ "group": {
909
+ "alias": "group";
910
+ "required": true;
911
+ "isSignal": true;
912
+ };
913
+ "fields": {
914
+ "alias": "fields";
915
+ "required": true;
916
+ "isSignal": true;
917
+ };
918
+ "errors": {
919
+ "alias": "errors";
920
+ "required": false;
921
+ "isSignal": true;
922
+ };
923
+ "depth": {
924
+ "alias": "depth";
925
+ "required": false;
926
+ "isSignal": true;
927
+ };
928
+ "maxDepth": {
929
+ "alias": "maxDepth";
930
+ "required": false;
931
+ "isSignal": true;
932
+ };
933
+ "dragDropHandler": {
934
+ "alias": "dragDropHandler";
935
+ "required": false;
936
+ "isSignal": true;
937
+ };
938
+ "allowCollapse": {
939
+ "alias": "allowCollapse";
940
+ "required": false;
941
+ "isSignal": true;
942
+ };
943
+ }, {
944
+ "addRule": "addRule";
945
+ "addGroup": "addGroup";
946
+ "removeItem": "removeItem";
947
+ "updateRule": "updateRule";
948
+ "updateCombinator": "updateCombinator";
949
+ }, never, never, true, never>;
470
950
  }
471
-
472
951
  /**
473
952
  * RxDB 查询输出格式
474
953
  */
475
954
  interface RxDBQueryOutput<T> {
476
- combinator: 'and' | 'or';
477
- rules: Array<RxDBQueryOutput<T> | {
478
- field: keyof T & string;
479
- operator: string;
480
- value: unknown;
481
- }>;
955
+ combinator: 'and' | 'or';
956
+ rules: Array<RxDBQueryOutput<T> | {
957
+ field: keyof T & string;
958
+ operator: string;
959
+ value: unknown;
960
+ }>;
482
961
  }
483
962
  /**
484
963
  * Angular Query Builder 主组件
@@ -498,93 +977,131 @@ interface RxDBQueryOutput<T> {
498
977
  * />
499
978
  * ```
500
979
  */
501
- declare class QueryBuilderComponent<T extends object> implements OnDestroy {
502
- private readonly service;
503
- /** 上次应用的 initialQuery 引用,用于检测是否有新查询需要加载 */
504
- private lastAppliedInitialQuery;
505
- private readonly scrollContainer;
506
- /** 根规则组 Signal */
507
- private readonly rootGroupSignal;
508
- /** 验证 Signal */
509
- private readonly validationSignal;
510
- /**
511
- * Schema 信息,包含字段定义
512
- */
513
- readonly schema: _angular_core.InputSignal<SchemaInfo | undefined>;
514
- /**
515
- * 字段列表(直接传入,优先于 schema)
516
- */
517
- readonly fields: _angular_core.InputSignal<FieldMetadata[]>;
518
- /**
519
- * 初始查询条件(可选)
520
- */
521
- readonly initialQuery: _angular_core.InputSignal<RxDBQueryOutput<T> | undefined>;
522
- /**
523
- * 最大嵌套层级(默认 5)
524
- */
525
- readonly maxDepth: _angular_core.InputSignal<number>;
526
- /**
527
- * 内容区域最大高度(超出后滚动),支持任意 CSS 长度值,如 `'400px'`、`'50vh'`
528
- */
529
- readonly height: _angular_core.InputSignal<string>;
530
- /**
531
- * 是否开启拖拽排序功能(默认开启)
532
- */
533
- readonly enableDrag: _angular_core.InputSignal<boolean>;
534
- /**
535
- * 是否开启分组展开/收起功能(默认开启)
536
- */
537
- readonly enableCollapse: _angular_core.InputSignal<boolean>;
538
- readonly dragDropHandler: QueryDragDropHandler;
539
- /**
540
- * 查询条件变更事件
541
- */
542
- readonly queryChange: _angular_core.OutputEmitterRef<RxDBQueryOutput<T>>;
543
- /**
544
- * 验证状态变更事件
545
- */
546
- readonly validationChange: _angular_core.OutputEmitterRef<ValidationResult>;
547
- /** 计算后的字段列表 */
548
- readonly fieldsComputed: Signal<FieldMetadata[]>;
549
- /** 根规则组 */
550
- readonly rootGroup: Signal<UIRuleGroup | undefined>;
551
- /** 验证错误列表 */
552
- readonly validationErrors: Signal<_aiao_rxdb_model.ValidationError[]>;
553
- /** 是否有规则 */
554
- readonly hasRules: Signal<boolean | undefined>;
555
- constructor();
556
- /** 销毁服务 */
557
- ngOnDestroy(): void;
558
- /** 添加第一个规则 */
559
- addFirstRule(): void;
560
- /** 清空所有规则 */
561
- clearAll(): void;
562
- /** 添加规则到指定组 */
563
- onAddRule(event: {
564
- parentId: string;
565
- rule: Omit<UIRule, 'id'>;
566
- }): void;
567
- /** 添加子组到指定组 */
568
- onAddGroup(parentId: string): void;
569
- /** 删除规则或组 */
570
- onRemoveItem(id: string): void;
571
- /** 更新规则 */
572
- onUpdateRule(event: {
573
- id: string;
574
- updates: Partial<UIRule>;
575
- }): void;
576
- /** 更新组合器 */
577
- onUpdateCombinator(event: {
578
- id: string;
579
- combinator: 'and' | 'or';
580
- }): void;
581
- /** 键盘快捷键处理 */
582
- onKeyDown(event: KeyboardEvent): void;
583
- private scrollToBottom;
584
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryBuilderComponent<any>, never>;
585
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryBuilderComponent<any>, "rxdb-query-builder", never, { "schema": { "alias": "schema"; "required": false; "isSignal": true; }; "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "initialQuery": { "alias": "initialQuery"; "required": false; "isSignal": true; }; "maxDepth": { "alias": "maxDepth"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "enableDrag": { "alias": "enableDrag"; "required": false; "isSignal": true; }; "enableCollapse": { "alias": "enableCollapse"; "required": false; "isSignal": true; }; }, { "queryChange": "queryChange"; "validationChange": "validationChange"; }, never, never, true, never>;
980
+ export declare class QueryBuilderComponent<T extends object> implements OnDestroy {
981
+ private readonly service;
982
+ /** 上次应用的 initialQuery 引用,用于检测是否有新查询需要加载 */
983
+ private lastAppliedInitialQuery;
984
+ private readonly scrollContainer;
985
+ /** 根规则组 Signal */
986
+ private readonly rootGroupSignal;
987
+ /** 验证 Signal */
988
+ private readonly validationSignal;
989
+ /**
990
+ * Schema 信息,包含字段定义
991
+ */
992
+ readonly schema: import("@angular/core").InputSignal<SchemaInfo | undefined>;
993
+ /**
994
+ * 字段列表(直接传入,优先于 schema)
995
+ */
996
+ readonly fields: import("@angular/core").InputSignal<FieldMetadata[]>;
997
+ /**
998
+ * 初始查询条件(可选)
999
+ */
1000
+ readonly initialQuery: import("@angular/core").InputSignal<RxDBQueryOutput<T> | undefined>;
1001
+ /**
1002
+ * 最大嵌套层级(默认 5)
1003
+ */
1004
+ readonly maxDepth: import("@angular/core").InputSignal<number>;
1005
+ /**
1006
+ * 内容区域最大高度(超出后滚动),支持任意 CSS 长度值,如 `'400px'`、`'50vh'`
1007
+ */
1008
+ readonly height: import("@angular/core").InputSignal<string>;
1009
+ /**
1010
+ * 是否开启拖拽排序功能(默认开启)
1011
+ */
1012
+ readonly enableDrag: import("@angular/core").InputSignal<boolean>;
1013
+ /**
1014
+ * 是否开启分组展开/收起功能(默认开启)
1015
+ */
1016
+ readonly enableCollapse: import("@angular/core").InputSignal<boolean>;
1017
+ readonly dragDropHandler: QueryDragDropHandler;
1018
+ /**
1019
+ * 查询条件变更事件
1020
+ */
1021
+ readonly queryChange: import("@angular/core").OutputEmitterRef<RxDBQueryOutput<T>>;
1022
+ /**
1023
+ * 验证状态变更事件
1024
+ */
1025
+ readonly validationChange: import("@angular/core").OutputEmitterRef<ValidationResult>;
1026
+ /** 计算后的字段列表 */
1027
+ readonly fieldsComputed: Signal<FieldMetadata[]>;
1028
+ /** 根规则组 */
1029
+ readonly rootGroup: Signal<UIRuleGroup | undefined>;
1030
+ /** 验证错误列表 */
1031
+ readonly validationErrors: Signal<import("@aiao/rxdb-model").ValidationError[]>;
1032
+ /** 是否有规则 */
1033
+ readonly hasRules: Signal<boolean | undefined>;
1034
+ constructor();
1035
+ /** 销毁服务 */
1036
+ ngOnDestroy(): void;
1037
+ /** 添加第一个规则 */
1038
+ addFirstRule(): void;
1039
+ /** 清空所有规则 */
1040
+ clearAll(): void;
1041
+ /** 添加规则到指定组 */
1042
+ onAddRule(event: {
1043
+ parentId: string;
1044
+ rule: Omit<UIRule, 'id'>;
1045
+ }): void;
1046
+ /** 添加子组到指定组 */
1047
+ onAddGroup(parentId: string): void;
1048
+ /** 删除规则或组 */
1049
+ onRemoveItem(id: string): void;
1050
+ /** 更新规则 */
1051
+ onUpdateRule(event: {
1052
+ id: string;
1053
+ updates: Partial<UIRule>;
1054
+ }): void;
1055
+ /** 更新组合器 */
1056
+ onUpdateCombinator(event: {
1057
+ id: string;
1058
+ combinator: 'and' | 'or';
1059
+ }): void;
1060
+ /** 键盘快捷键处理 */
1061
+ onKeyDown(event: KeyboardEvent): void;
1062
+ private scrollToBottom;
1063
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryBuilderComponent<any>, never>;
1064
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryBuilderComponent<any>, "rxdb-query-builder", never, {
1065
+ "schema": {
1066
+ "alias": "schema";
1067
+ "required": false;
1068
+ "isSignal": true;
1069
+ };
1070
+ "fields": {
1071
+ "alias": "fields";
1072
+ "required": false;
1073
+ "isSignal": true;
1074
+ };
1075
+ "initialQuery": {
1076
+ "alias": "initialQuery";
1077
+ "required": false;
1078
+ "isSignal": true;
1079
+ };
1080
+ "maxDepth": {
1081
+ "alias": "maxDepth";
1082
+ "required": false;
1083
+ "isSignal": true;
1084
+ };
1085
+ "height": {
1086
+ "alias": "height";
1087
+ "required": false;
1088
+ "isSignal": true;
1089
+ };
1090
+ "enableDrag": {
1091
+ "alias": "enableDrag";
1092
+ "required": false;
1093
+ "isSignal": true;
1094
+ };
1095
+ "enableCollapse": {
1096
+ "alias": "enableCollapse";
1097
+ "required": false;
1098
+ "isSignal": true;
1099
+ };
1100
+ }, {
1101
+ "queryChange": "queryChange";
1102
+ "validationChange": "validationChange";
1103
+ }, never, never, true, never>;
586
1104
  }
587
-
588
1105
  /**
589
1106
  * 字段选择器组件
590
1107
  *
@@ -597,20 +1114,42 @@ declare class QueryBuilderComponent<T extends object> implements OnDestroy {
597
1114
  * 1. 直接模板使用:监听 `(fieldChange)` output 事件
598
1115
  * 2. 通过 NgComponentOutlet 注入:传入 `fieldChangeFn` 回调 input
599
1116
  */
600
- declare class FieldSelectorComponent {
601
- readonly fields: _angular_core.InputSignal<FieldMetadata[]>;
602
- readonly selectedField: _angular_core.InputSignal<string>;
603
- readonly placeholder: _angular_core.InputSignal<string>;
604
- /** 通过 NgComponentOutlet 注入时使用的回调 input */
605
- readonly fieldChangeFn: _angular_core.InputSignal<((field: string) => void) | undefined>;
606
- /** 直接模板使用时的 output 事件 */
607
- readonly fieldChange: _angular_core.OutputEmitterRef<string>;
608
- readonly fieldTree: _angular_core.Signal<_aiao_rxdb_model.FieldTreeNode[]>;
609
- onSelect(field: string): void;
610
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldSelectorComponent, never>;
611
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldSelectorComponent, "rxdb-field-selector", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "selectedField": { "alias": "selectedField"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "fieldChangeFn": { "alias": "fieldChangeFn"; "required": false; "isSignal": true; }; }, { "fieldChange": "fieldChange"; }, never, never, true, never>;
1117
+ export declare class FieldSelectorComponent {
1118
+ readonly fields: import("@angular/core").InputSignal<FieldMetadata[]>;
1119
+ readonly selectedField: import("@angular/core").InputSignal<string>;
1120
+ readonly placeholder: import("@angular/core").InputSignal<string>;
1121
+ /** 通过 NgComponentOutlet 注入时使用的回调 input */
1122
+ readonly fieldChangeFn: import("@angular/core").InputSignal<((field: string) => void) | undefined>;
1123
+ /** 直接模板使用时的 output 事件 */
1124
+ readonly fieldChange: import("@angular/core").OutputEmitterRef<string>;
1125
+ readonly fieldTree: import("@angular/core").Signal<import("@aiao/rxdb-model").FieldTreeNode[]>;
1126
+ onSelect(field: string): void;
1127
+ static ɵfac: i0.ɵɵFactoryDeclaration<FieldSelectorComponent, never>;
1128
+ static ɵcmp: i0.ɵɵComponentDeclaration<FieldSelectorComponent, "rxdb-field-selector", never, {
1129
+ "fields": {
1130
+ "alias": "fields";
1131
+ "required": true;
1132
+ "isSignal": true;
1133
+ };
1134
+ "selectedField": {
1135
+ "alias": "selectedField";
1136
+ "required": false;
1137
+ "isSignal": true;
1138
+ };
1139
+ "placeholder": {
1140
+ "alias": "placeholder";
1141
+ "required": false;
1142
+ "isSignal": true;
1143
+ };
1144
+ "fieldChangeFn": {
1145
+ "alias": "fieldChangeFn";
1146
+ "required": false;
1147
+ "isSignal": true;
1148
+ };
1149
+ }, {
1150
+ "fieldChange": "fieldChange";
1151
+ }, never, never, true, never>;
612
1152
  }
613
-
614
1153
  /**
615
1154
  * 操作符选择器组件
616
1155
  *
@@ -623,24 +1162,46 @@ declare class FieldSelectorComponent {
623
1162
  * 1. 直接模板使用:监听 `(operatorChange)` output 事件
624
1163
  * 2. 通过 NgComponentOutlet 注入:传入 `operatorChangeFn` 回调 input
625
1164
  */
626
- declare class OperatorSelectorComponent {
627
- private readonly registry;
628
- readonly operatorOptions: _angular_core.Signal<{
629
- value: OperatorName;
630
- label: string;
631
- }[]>;
632
- readonly fieldMetadata: _angular_core.InputSignal<FieldMetadata | undefined>;
633
- readonly fieldType: _angular_core.InputSignal<string>;
634
- readonly selectedOperator: _angular_core.InputSignal<string>;
635
- /** 通过 NgComponentOutlet 注入时使用的回调 input */
636
- readonly operatorChangeFn: _angular_core.InputSignal<((op: string) => void) | undefined>;
637
- /** 直接模板使用时的 output 事件 */
638
- readonly operatorChange: _angular_core.OutputEmitterRef<string>;
639
- onOperatorChange(op: string): void;
640
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<OperatorSelectorComponent, never>;
641
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OperatorSelectorComponent, "rxdb-operator-selector", never, { "fieldMetadata": { "alias": "fieldMetadata"; "required": false; "isSignal": true; }; "fieldType": { "alias": "fieldType"; "required": false; "isSignal": true; }; "selectedOperator": { "alias": "selectedOperator"; "required": false; "isSignal": true; }; "operatorChangeFn": { "alias": "operatorChangeFn"; "required": false; "isSignal": true; }; }, { "operatorChange": "operatorChange"; }, never, never, true, never>;
1165
+ export declare class OperatorSelectorComponent {
1166
+ private readonly registry;
1167
+ readonly operatorOptions: import("@angular/core").Signal<{
1168
+ value: import("@aiao/rxdb").OperatorName;
1169
+ label: string;
1170
+ }[]>;
1171
+ readonly fieldMetadata: import("@angular/core").InputSignal<FieldMetadata | undefined>;
1172
+ readonly fieldType: import("@angular/core").InputSignal<string>;
1173
+ readonly selectedOperator: import("@angular/core").InputSignal<string>;
1174
+ /** 通过 NgComponentOutlet 注入时使用的回调 input */
1175
+ readonly operatorChangeFn: import("@angular/core").InputSignal<((op: string) => void) | undefined>;
1176
+ /** 直接模板使用时的 output 事件 */
1177
+ readonly operatorChange: import("@angular/core").OutputEmitterRef<string>;
1178
+ onOperatorChange(op: string): void;
1179
+ static ɵfac: i0.ɵɵFactoryDeclaration<OperatorSelectorComponent, never>;
1180
+ static ɵcmp: i0.ɵɵComponentDeclaration<OperatorSelectorComponent, "rxdb-operator-selector", never, {
1181
+ "fieldMetadata": {
1182
+ "alias": "fieldMetadata";
1183
+ "required": false;
1184
+ "isSignal": true;
1185
+ };
1186
+ "fieldType": {
1187
+ "alias": "fieldType";
1188
+ "required": false;
1189
+ "isSignal": true;
1190
+ };
1191
+ "selectedOperator": {
1192
+ "alias": "selectedOperator";
1193
+ "required": false;
1194
+ "isSignal": true;
1195
+ };
1196
+ "operatorChangeFn": {
1197
+ "alias": "operatorChangeFn";
1198
+ "required": false;
1199
+ "isSignal": true;
1200
+ };
1201
+ }, {
1202
+ "operatorChange": "operatorChange";
1203
+ }, never, never, true, never>;
642
1204
  }
643
-
644
1205
  /**
645
1206
  * 基于 Popover API 的下拉选择组件
646
1207
  *
@@ -650,43 +1211,65 @@ declare class OperatorSelectorComponent {
650
1211
  * 支持关键字过滤、键盘导航(↑↓ 移动、Enter 选中、Escape 关闭)。
651
1212
  * 打开弹框自动高亮第一项,搜索后也自动高亮第一条结果。
652
1213
  */
653
- declare class PopoverSelectComponent {
654
- private readonly trigger;
655
- private readonly popoverEl;
656
- private readonly filterInput;
657
- protected readonly uid: string;
658
- protected readonly listId: string;
659
- protected readonly filterText: _angular_core.WritableSignal<string>;
660
- protected readonly activeIndex: _angular_core.WritableSignal<number>;
661
- readonly options: _angular_core.InputSignal<readonly {
662
- value: string;
663
- label: string;
664
- }[]>;
665
- readonly selected: _angular_core.InputSignal<string>;
666
- readonly placeholder: _angular_core.InputSignal<string>;
667
- readonly minWidth: _angular_core.InputSignal<string>;
668
- readonly selectChange: _angular_core.OutputEmitterRef<string>;
669
- readonly currentLabel: _angular_core.Signal<string>;
670
- readonly filteredOptions: _angular_core.Signal<readonly {
671
- value: string;
672
- label: string;
673
- }[]>;
674
- readonly activeItemId: _angular_core.Signal<string | null>;
675
- constructor();
676
- onBeforeToggle(event: Event): void;
677
- onToggle(event: Event): void;
678
- onKeydown(event: KeyboardEvent): void;
679
- onSelect(value: string): void;
680
- private scrollActiveIntoView;
681
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopoverSelectComponent, never>;
682
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopoverSelectComponent, "rxdb-popover-select", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, { "selectChange": "selectChange"; }, never, never, true, never>;
1214
+ export declare class PopoverSelectComponent {
1215
+ private readonly trigger;
1216
+ private readonly popoverEl;
1217
+ private readonly filterInput;
1218
+ protected readonly uid: string;
1219
+ protected readonly listId: string;
1220
+ protected readonly filterText: import("@angular/core").WritableSignal<string>;
1221
+ protected readonly activeIndex: import("@angular/core").WritableSignal<number>;
1222
+ readonly options: import("@angular/core").InputSignal<readonly {
1223
+ value: string;
1224
+ label: string;
1225
+ }[]>;
1226
+ readonly selected: import("@angular/core").InputSignal<string>;
1227
+ readonly placeholder: import("@angular/core").InputSignal<string>;
1228
+ readonly minWidth: import("@angular/core").InputSignal<string>;
1229
+ readonly selectChange: import("@angular/core").OutputEmitterRef<string>;
1230
+ readonly currentLabel: import("@angular/core").Signal<string>;
1231
+ readonly filteredOptions: import("@angular/core").Signal<readonly {
1232
+ value: string;
1233
+ label: string;
1234
+ }[]>;
1235
+ readonly activeItemId: import("@angular/core").Signal<string | null>;
1236
+ constructor();
1237
+ onBeforeToggle(event: Event): void;
1238
+ onToggle(event: Event): void;
1239
+ onKeydown(event: KeyboardEvent): void;
1240
+ onSelect(value: string): void;
1241
+ private scrollActiveIntoView;
1242
+ static ɵfac: i0.ɵɵFactoryDeclaration<PopoverSelectComponent, never>;
1243
+ static ɵcmp: i0.ɵɵComponentDeclaration<PopoverSelectComponent, "rxdb-popover-select", never, {
1244
+ "options": {
1245
+ "alias": "options";
1246
+ "required": true;
1247
+ "isSignal": true;
1248
+ };
1249
+ "selected": {
1250
+ "alias": "selected";
1251
+ "required": false;
1252
+ "isSignal": true;
1253
+ };
1254
+ "placeholder": {
1255
+ "alias": "placeholder";
1256
+ "required": false;
1257
+ "isSignal": true;
1258
+ };
1259
+ "minWidth": {
1260
+ "alias": "minWidth";
1261
+ "required": false;
1262
+ "isSignal": true;
1263
+ };
1264
+ }, {
1265
+ "selectChange": "selectChange";
1266
+ }, never, never, true, never>;
683
1267
  }
684
-
685
1268
  /**
686
1269
  * 带 where 子查询的规则类型
687
1270
  */
688
1271
  type UIRuleWithWhere = UIRule & {
689
- where?: QueryBuilderRuleGroup<Record<string, unknown>>;
1272
+ where?: QueryBuilderRuleGroup<Record<string, unknown>>;
690
1273
  };
691
1274
  /**
692
1275
  * 单条查询规则组件
@@ -698,85 +1281,103 @@ type UIRuleWithWhere = UIRule & {
698
1281
  * - 值输入框
699
1282
  * - 删除按钮
700
1283
  */
701
- declare class QueryRuleComponent {
702
- private readonly existsOperators;
703
- private readonly noValueOperators;
704
- /** 注入的主题(回退到默认主题) */
705
- protected readonly theme: _aiao_rxdb_model_angular.QueryBuilderTheme;
706
- readonly rule: _angular_core.InputSignal<UIRuleWithWhere>;
707
- readonly fields: _angular_core.InputSignal<FieldMetadata[]>;
708
- readonly errors: _angular_core.InputSignal<ValidationError[]>;
709
- readonly update: _angular_core.OutputEmitterRef<{
710
- id: string;
711
- updates: Partial<UIRuleWithWhere>;
712
- }>;
713
- readonly remove: _angular_core.OutputEmitterRef<void>;
714
- readonly fieldAsString: _angular_core.Signal<string>;
715
- readonly ruleErrors: _angular_core.Signal<ValidationError[]>;
716
- readonly errorTooltip: _angular_core.Signal<string>;
717
- readonly isExistsOperator: _angular_core.Signal<boolean>;
718
- readonly isNoValueOperator: _angular_core.Signal<boolean>;
719
- /** 子查询面板是否展开(已有 where 规则时自动展开) */
720
- readonly showSubquery: _angular_core.WritableSignal<boolean>;
721
- /**
722
- * 当规则的 where 已有内容时自动展开。
723
- * 使用 computed 包装监听 rule().where,在显示按钮前检查。
724
- */
725
- readonly subqueryVisible: _angular_core.Signal<boolean>;
726
- readonly currentField: _angular_core.Signal<FieldMetadata | undefined>;
727
- readonly currentFieldType: _angular_core.Signal<_aiao_rxdb_model.PropertyType>;
728
- readonly currentEnumOptions: _angular_core.Signal<unknown[]>;
729
- /** 当前字段的关系目标实体字段列表 */
730
- readonly currentRelationFields: _angular_core.Signal<FieldMetadata[]>;
731
- /** 规则的 where 子查询 */
732
- readonly ruleWhere: _angular_core.Signal<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
733
- /** NgComponentOutlet inputs:字段选择器(fieldChangeCb 是 lazy 引用,声明顺序不影响运行时)*/
734
- readonly fieldSelectorInputs: _angular_core.Signal<{
735
- fields: FieldMetadata[];
736
- selectedField: string;
737
- fieldChangeFn: (field: string) => void;
738
- }>;
739
- /** NgComponentOutlet inputs:操作符选择器 */
740
- readonly operatorSelectorInputs: _angular_core.Signal<{
741
- fieldMetadata: FieldMetadata | undefined;
742
- fieldType: _aiao_rxdb_model.PropertyType;
743
- selectedOperator: string;
744
- operatorChangeFn: (op: string) => void;
745
- }>;
746
- /** NgComponentOutlet inputs:值输入 */
747
- readonly valueInputInputs: _angular_core.Signal<{
748
- fieldType: _aiao_rxdb_model.PropertyType;
749
- operator: string;
750
- value: unknown;
751
- enumOptions: unknown[];
752
- relationFields: FieldMetadata[];
753
- where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined;
754
- errorMessage: string;
755
- valueChangeFn: (value: unknown) => void;
756
- whereChangeFn: (where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined) => void;
757
- }>;
758
- /** 子条件清空/全部删除时自动收起面板并恢复 +子条件 按钮 */
759
- constructor();
760
- /** 字段变更 */
761
- onFieldChange(fieldName: string): void;
762
- /** 添加子条件:展开面板并创建一条默认子规则 */
763
- onAddSubcondition(): void;
764
- /** 操作符变更 */
765
- onOperatorChange(operator: string): void;
766
- /** 值变更 */
767
- onValueChange(value: unknown): void;
768
- /** 子查询条件变更 */
769
- onWhereChange(where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined): void;
770
- /** 删除规则 */
771
- onRemove(): void;
772
- private readonly fieldChangeCb;
773
- private readonly operatorChangeCb;
774
- private readonly valueChangeCb;
775
- private readonly whereChangeCb;
776
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryRuleComponent, never>;
777
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryRuleComponent, "rxdb-query-rule", never, { "rule": { "alias": "rule"; "required": true; "isSignal": true; }; "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "update": "update"; "remove": "remove"; }, never, never, true, never>;
1284
+ export declare class QueryRuleComponent {
1285
+ private readonly existsOperators;
1286
+ private readonly noValueOperators;
1287
+ /** 注入的主题(回退到默认主题) */
1288
+ protected readonly theme: import("@aiao/rxdb-model-angular").QueryBuilderTheme;
1289
+ readonly rule: import("@angular/core").InputSignal<UIRuleWithWhere>;
1290
+ readonly fields: import("@angular/core").InputSignal<FieldMetadata[]>;
1291
+ readonly errors: import("@angular/core").InputSignal<ValidationError[]>;
1292
+ readonly update: import("@angular/core").OutputEmitterRef<{
1293
+ id: string;
1294
+ updates: Partial<UIRuleWithWhere>;
1295
+ }>;
1296
+ readonly remove: import("@angular/core").OutputEmitterRef<void>;
1297
+ readonly fieldAsString: import("@angular/core").Signal<string>;
1298
+ readonly ruleErrors: import("@angular/core").Signal<ValidationError[]>;
1299
+ readonly errorTooltip: import("@angular/core").Signal<string>;
1300
+ readonly isExistsOperator: import("@angular/core").Signal<boolean>;
1301
+ readonly isNoValueOperator: import("@angular/core").Signal<boolean>;
1302
+ /** 子查询面板是否展开(已有 where 规则时自动展开) */
1303
+ readonly showSubquery: import("@angular/core").WritableSignal<boolean>;
1304
+ /**
1305
+ * 当规则的 where 已有内容时自动展开。
1306
+ * 使用 computed 包装监听 rule().where,在显示按钮前检查。
1307
+ */
1308
+ readonly subqueryVisible: import("@angular/core").Signal<boolean>;
1309
+ readonly currentField: import("@angular/core").Signal<FieldMetadata | undefined>;
1310
+ readonly currentFieldType: import("@angular/core").Signal<import("@aiao/rxdb-model").PropertyType>;
1311
+ readonly currentEnumOptions: import("@angular/core").Signal<unknown[]>;
1312
+ /** 当前字段的关系目标实体字段列表 */
1313
+ readonly currentRelationFields: import("@angular/core").Signal<FieldMetadata[]>;
1314
+ /** 规则的 where 子查询 */
1315
+ readonly ruleWhere: import("@angular/core").Signal<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
1316
+ /** NgComponentOutlet inputs:字段选择器(fieldChangeCb 是 lazy 引用,声明顺序不影响运行时)*/
1317
+ readonly fieldSelectorInputs: import("@angular/core").Signal<{
1318
+ fields: FieldMetadata[];
1319
+ selectedField: string;
1320
+ fieldChangeFn: (field: string) => void;
1321
+ }>;
1322
+ /** NgComponentOutlet inputs:操作符选择器 */
1323
+ readonly operatorSelectorInputs: import("@angular/core").Signal<{
1324
+ fieldMetadata: FieldMetadata | undefined;
1325
+ fieldType: import("@aiao/rxdb-model").PropertyType;
1326
+ selectedOperator: string;
1327
+ operatorChangeFn: (op: string) => void;
1328
+ }>;
1329
+ /** NgComponentOutlet inputs:值输入 */
1330
+ readonly valueInputInputs: import("@angular/core").Signal<{
1331
+ fieldType: import("@aiao/rxdb-model").PropertyType;
1332
+ operator: string;
1333
+ value: unknown;
1334
+ enumOptions: unknown[];
1335
+ relationFields: FieldMetadata[];
1336
+ where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined;
1337
+ errorMessage: string;
1338
+ valueChangeFn: (value: unknown) => void;
1339
+ whereChangeFn: (where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined) => void;
1340
+ }>;
1341
+ /** 子条件清空/全部删除时自动收起面板并恢复 +子条件 按钮 */
1342
+ constructor();
1343
+ /** 字段变更 */
1344
+ onFieldChange(fieldName: string): void;
1345
+ /** 添加子条件:展开面板并创建一条默认子规则 */
1346
+ onAddSubcondition(): void;
1347
+ /** 操作符变更 */
1348
+ onOperatorChange(operator: string): void;
1349
+ /** 值变更 */
1350
+ onValueChange(value: unknown): void;
1351
+ /** 子查询条件变更 */
1352
+ onWhereChange(where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined): void;
1353
+ /** 删除规则 */
1354
+ onRemove(): void;
1355
+ private readonly fieldChangeCb;
1356
+ private readonly operatorChangeCb;
1357
+ private readonly valueChangeCb;
1358
+ private readonly whereChangeCb;
1359
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryRuleComponent, never>;
1360
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryRuleComponent, "rxdb-query-rule", never, {
1361
+ "rule": {
1362
+ "alias": "rule";
1363
+ "required": true;
1364
+ "isSignal": true;
1365
+ };
1366
+ "fields": {
1367
+ "alias": "fields";
1368
+ "required": true;
1369
+ "isSignal": true;
1370
+ };
1371
+ "errors": {
1372
+ "alias": "errors";
1373
+ "required": false;
1374
+ "isSignal": true;
1375
+ };
1376
+ }, {
1377
+ "update": "update";
1378
+ "remove": "remove";
1379
+ }, never, never, true, never>;
778
1380
  }
779
-
780
1381
  /**
781
1382
  * 子查询构建器组件
782
1383
  *
@@ -787,67 +1388,85 @@ declare class QueryRuleComponent {
787
1388
  * - 嵌套规则组
788
1389
  * - 清空子条件
789
1390
  */
790
- declare class SubqueryBuilderComponent implements OnDestroy {
791
- private readonly service;
792
- /** initialQuery 是否已应用(只应用一次) */
793
- private initialQueryApplied;
794
- /** 根规则组 Signal */
795
- private readonly rootGroupSignal;
796
- /** 验证 Signal */
797
- private readonly validationSignal;
798
- /** 字段列表 */
799
- readonly fields: _angular_core.InputSignal<FieldMetadata[]>;
800
- /** 初始查询 */
801
- readonly initialQuery: _angular_core.InputSignal<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
802
- /** 最大嵌套层级 */
803
- readonly maxDepth: _angular_core.InputSignal<number>;
804
- /** 查询变更事件 */
805
- readonly queryChange: _angular_core.OutputEmitterRef<{
806
- combinator: "and" | "or";
807
- rules: unknown[];
808
- } | undefined>;
809
- /** 验证变更事件 */
810
- readonly validationChange: _angular_core.OutputEmitterRef<ValidationResult>;
811
- /** 根规则组 */
812
- readonly rootGroup: Signal<UIRuleGroup | undefined>;
813
- /** 是否有规则 */
814
- readonly hasRules: Signal<boolean | undefined>;
815
- constructor();
816
- /** 销毁服务 */
817
- ngOnDestroy(): void;
818
- /** 添加第一条规则 */
819
- handleAddFirstRule(): void;
820
- /** 清空所有规则 */
821
- handleClear(): void;
822
- /** 添加规则到指定组 */
823
- onAddRule(event: {
824
- parentId: string;
825
- rule: Omit<UIRule, 'id'>;
826
- }): void;
827
- /** 添加子组到指定组 */
828
- onAddGroup(parentId: string): void;
829
- /** 删除规则或组 */
830
- onRemoveItem(id: string): void;
831
- /** 更新规则 */
832
- onUpdateRule(event: {
833
- id: string;
834
- updates: Partial<UIRule>;
835
- }): void;
836
- /** 更新组合器 */
837
- onUpdateCombinator(event: {
838
- id: string;
839
- combinator: 'and' | 'or';
840
- }): void;
841
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SubqueryBuilderComponent, never>;
842
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SubqueryBuilderComponent, "rxdb-subquery-builder", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "initialQuery": { "alias": "initialQuery"; "required": false; "isSignal": true; }; "maxDepth": { "alias": "maxDepth"; "required": false; "isSignal": true; }; }, { "queryChange": "queryChange"; "validationChange": "validationChange"; }, never, never, true, never>;
1391
+ export declare class SubqueryBuilderComponent implements OnDestroy {
1392
+ private readonly service;
1393
+ /** initialQuery 是否已应用(只应用一次) */
1394
+ private initialQueryApplied;
1395
+ /** 根规则组 Signal */
1396
+ private readonly rootGroupSignal;
1397
+ /** 验证 Signal */
1398
+ private readonly validationSignal;
1399
+ /** 字段列表 */
1400
+ readonly fields: import("@angular/core").InputSignal<FieldMetadata[]>;
1401
+ /** 初始查询 */
1402
+ readonly initialQuery: import("@angular/core").InputSignal<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
1403
+ /** 最大嵌套层级 */
1404
+ readonly maxDepth: import("@angular/core").InputSignal<number>;
1405
+ /** 查询变更事件 */
1406
+ readonly queryChange: import("@angular/core").OutputEmitterRef<{
1407
+ combinator: "and" | "or";
1408
+ rules: unknown[];
1409
+ } | undefined>;
1410
+ /** 验证变更事件 */
1411
+ readonly validationChange: import("@angular/core").OutputEmitterRef<ValidationResult>;
1412
+ /** 根规则组 */
1413
+ readonly rootGroup: Signal<UIRuleGroup | undefined>;
1414
+ /** 是否有规则 */
1415
+ readonly hasRules: Signal<boolean | undefined>;
1416
+ constructor();
1417
+ /** 销毁服务 */
1418
+ ngOnDestroy(): void;
1419
+ /** 添加第一条规则 */
1420
+ handleAddFirstRule(): void;
1421
+ /** 清空所有规则 */
1422
+ handleClear(): void;
1423
+ /** 添加规则到指定组 */
1424
+ onAddRule(event: {
1425
+ parentId: string;
1426
+ rule: Omit<UIRule, 'id'>;
1427
+ }): void;
1428
+ /** 添加子组到指定组 */
1429
+ onAddGroup(parentId: string): void;
1430
+ /** 删除规则或组 */
1431
+ onRemoveItem(id: string): void;
1432
+ /** 更新规则 */
1433
+ onUpdateRule(event: {
1434
+ id: string;
1435
+ updates: Partial<UIRule>;
1436
+ }): void;
1437
+ /** 更新组合器 */
1438
+ onUpdateCombinator(event: {
1439
+ id: string;
1440
+ combinator: 'and' | 'or';
1441
+ }): void;
1442
+ static ɵfac: i0.ɵɵFactoryDeclaration<SubqueryBuilderComponent, never>;
1443
+ static ɵcmp: i0.ɵɵComponentDeclaration<SubqueryBuilderComponent, "rxdb-subquery-builder", never, {
1444
+ "fields": {
1445
+ "alias": "fields";
1446
+ "required": true;
1447
+ "isSignal": true;
1448
+ };
1449
+ "initialQuery": {
1450
+ "alias": "initialQuery";
1451
+ "required": false;
1452
+ "isSignal": true;
1453
+ };
1454
+ "maxDepth": {
1455
+ "alias": "maxDepth";
1456
+ "required": false;
1457
+ "isSignal": true;
1458
+ };
1459
+ }, {
1460
+ "queryChange": "queryChange";
1461
+ "validationChange": "validationChange";
1462
+ }, never, never, true, never>;
843
1463
  }
844
-
845
1464
  /** 扁平化的可见树节点(用于渲染和键盘导航) */
846
1465
  interface FlatItem {
847
- node: FieldTreeNode;
848
- depth: number;
849
- isExpandable: boolean;
850
- isExpanded: boolean;
1466
+ node: FieldTreeNode;
1467
+ depth: number;
1468
+ isExpandable: boolean;
1469
+ isExpanded: boolean;
851
1470
  }
852
1471
  /**
853
1472
  * 树节点 Directive,实现 CDK {@link Highlightable} 接口
@@ -855,13 +1474,13 @@ interface FlatItem {
855
1474
  * 用于 {@link ActiveDescendantKeyManager} 管理键盘导航时的激活样式。
856
1475
  * `exportAs: 'rxdbTreeItem'` 允许模板中通过 `#ref="rxdbTreeItem"` 访问实例。
857
1476
  */
858
- declare class TreeItemDirective implements Highlightable {
859
- private readonly _active;
860
- readonly isActive: _angular_core.Signal<boolean>;
861
- setActiveStyles(): void;
862
- setInactiveStyles(): void;
863
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TreeItemDirective, never>;
864
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TreeItemDirective, "[rxdbTreeItem]", ["rxdbTreeItem"], {}, {}, never, never, true, never>;
1477
+ export declare class TreeItemDirective implements Highlightable {
1478
+ private readonly _active;
1479
+ readonly isActive: import("@angular/core").Signal<boolean>;
1480
+ setActiveStyles(): void;
1481
+ setInactiveStyles(): void;
1482
+ static ɵfac: i0.ɵɵFactoryDeclaration<TreeItemDirective, never>;
1483
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TreeItemDirective, "[rxdbTreeItem]", ["rxdbTreeItem"], {}, {}, never, never, true, never>;
865
1484
  }
866
1485
  /**
867
1486
  * 树形下拉选择组件
@@ -884,45 +1503,67 @@ declare class TreeItemDirective implements Highlightable {
884
1503
  * />
885
1504
  * ```
886
1505
  */
887
- declare class TreeSelectComponent {
888
- private readonly trigger;
889
- private readonly popoverEl;
890
- private readonly filterInput;
891
- private readonly treeItemDirs;
892
- private readonly expandedPaths;
893
- private readonly keyManager;
894
- private readonly _activeIdx;
895
- protected readonly uid: string;
896
- protected readonly listId: string;
897
- protected readonly filterText: _angular_core.WritableSignal<string>;
898
- protected readonly ChevronDownIcon: lucide_angular.LucideIconData;
899
- protected readonly ChevronRightIcon: lucide_angular.LucideIconData;
900
- protected readonly typeIconMap: Partial<Record<string, typeof ChevronDownIcon>>;
901
- protected readonly typeColorMap: Partial<Record<string, string>>;
902
- protected readonly defaultTypeIcon: lucide_angular.LucideIconData;
903
- protected readonly defaultTypeColor = "text-base-content/40";
904
- readonly nodes: _angular_core.InputSignal<FieldTreeNode[]>;
905
- readonly selected: _angular_core.InputSignal<string>;
906
- readonly placeholder: _angular_core.InputSignal<string>;
907
- readonly minWidth: _angular_core.InputSignal<string>;
908
- readonly selectChange: _angular_core.OutputEmitterRef<string>;
909
- readonly displayValue: _angular_core.Signal<string>;
910
- readonly selectedNode: _angular_core.Signal<FieldTreeNode | null | undefined>;
911
- readonly visibleItems: _angular_core.Signal<FlatItem[]>;
912
- readonly activeItemId: _angular_core.Signal<string | null>;
913
- constructor();
914
- onBeforeToggle(event: Event): void;
915
- onToggle(event: Event): void;
916
- onKeydown(event: KeyboardEvent): void;
917
- onItemClick(item: FlatItem): void;
918
- /** 追踪函数:使用 value + isExistsOption 避免重复 key */
919
- protected trackItem(item: FlatItem): string;
920
- private scrollActiveIntoView;
921
- private toggleExpand;
922
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TreeSelectComponent, never>;
923
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TreeSelectComponent, "rxdb-tree-select", never, { "nodes": { "alias": "nodes"; "required": true; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, { "selectChange": "selectChange"; }, never, never, true, never>;
1506
+ export declare class TreeSelectComponent {
1507
+ private readonly trigger;
1508
+ private readonly popoverEl;
1509
+ private readonly filterInput;
1510
+ private readonly treeItemDirs;
1511
+ private readonly expandedPaths;
1512
+ private readonly keyManager;
1513
+ private readonly _activeIdx;
1514
+ protected readonly uid: string;
1515
+ protected readonly listId: string;
1516
+ protected readonly filterText: import("@angular/core").WritableSignal<string>;
1517
+ protected readonly ChevronDownIcon: typeof LucideChevronDown;
1518
+ protected readonly ChevronRightIcon: typeof LucideChevronRight;
1519
+ protected readonly typeIconMap: Partial<Record<string, LucideIconInput>>;
1520
+ protected readonly typeColorMap: Partial<Record<string, string>>;
1521
+ protected readonly defaultTypeIcon: typeof LucideType;
1522
+ protected readonly defaultTypeColor = "text-base-content/40";
1523
+ readonly nodes: import("@angular/core").InputSignal<FieldTreeNode[]>;
1524
+ readonly selected: import("@angular/core").InputSignal<string>;
1525
+ readonly placeholder: import("@angular/core").InputSignal<string>;
1526
+ readonly minWidth: import("@angular/core").InputSignal<string>;
1527
+ readonly selectChange: import("@angular/core").OutputEmitterRef<string>;
1528
+ readonly displayValue: import("@angular/core").Signal<string>;
1529
+ readonly selectedNode: import("@angular/core").Signal<FieldTreeNode | null | undefined>;
1530
+ readonly visibleItems: import("@angular/core").Signal<FlatItem[]>;
1531
+ readonly activeItemId: import("@angular/core").Signal<string | null>;
1532
+ constructor();
1533
+ onBeforeToggle(event: Event): void;
1534
+ onToggle(event: Event): void;
1535
+ onKeydown(event: KeyboardEvent): void;
1536
+ onItemClick(item: FlatItem): void;
1537
+ /** 追踪函数:使用 value + isExistsOption 避免重复 key */
1538
+ protected trackItem(item: FlatItem): string;
1539
+ private scrollActiveIntoView;
1540
+ private toggleExpand;
1541
+ static ɵfac: i0.ɵɵFactoryDeclaration<TreeSelectComponent, never>;
1542
+ static ɵcmp: i0.ɵɵComponentDeclaration<TreeSelectComponent, "rxdb-tree-select", never, {
1543
+ "nodes": {
1544
+ "alias": "nodes";
1545
+ "required": true;
1546
+ "isSignal": true;
1547
+ };
1548
+ "selected": {
1549
+ "alias": "selected";
1550
+ "required": false;
1551
+ "isSignal": true;
1552
+ };
1553
+ "placeholder": {
1554
+ "alias": "placeholder";
1555
+ "required": false;
1556
+ "isSignal": true;
1557
+ };
1558
+ "minWidth": {
1559
+ "alias": "minWidth";
1560
+ "required": false;
1561
+ "isSignal": true;
1562
+ };
1563
+ }, {
1564
+ "selectChange": "selectChange";
1565
+ }, never, never, true, never>;
924
1566
  }
925
-
926
1567
  /**
927
1568
  * 值输入组件
928
1569
  *
@@ -938,79 +1579,127 @@ declare class TreeSelectComponent {
938
1579
  * - null/notNull 操作符: 无输入
939
1580
  * - exists/notExists 操作符: 子查询构建器
940
1581
  */
941
- declare class ValueInputComponent implements OnInit, OnDestroy {
942
- private previousInputType;
943
- private subqueryComponentRef?;
944
- private subquerySubscription?;
945
- private subqueryLoading;
946
- private readonly injector;
947
- /** UUID 格式校验错误(基于 currentValue 派生,inputType 不是 uuid 时自动为空) */
948
- readonly uuidError: _angular_core.Signal<"" | "请输入合法的 UUID 格式">;
949
- subqueryContainer?: ViewContainerRef;
950
- readonly fieldType: _angular_core.InputSignal<string>;
951
- readonly operator: _angular_core.InputSignal<string>;
952
- readonly value: _angular_core.InputSignal<unknown>;
953
- readonly enumOptions: _angular_core.InputSignal<unknown[]>;
954
- readonly relationFields: _angular_core.InputSignal<FieldMetadata[]>;
955
- readonly where: _angular_core.InputSignal<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
956
- readonly valueChange: _angular_core.OutputEmitterRef<unknown>;
957
- readonly whereChange: _angular_core.OutputEmitterRef<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
958
- readonly errorMessage: _angular_core.InputSignal<string>;
959
- readonly hasError: _angular_core.Signal<boolean>;
960
- readonly valueChangeFn: _angular_core.InputSignal<((value: unknown) => void) | undefined>;
961
- readonly whereChangeFn: _angular_core.InputSignal<((where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined) => void) | undefined>;
962
- /** 信号状态 —— 替代原先的可变类属性 */
963
- readonly currentValue: _angular_core.WritableSignal<any>;
964
- readonly rangeMin: _angular_core.WritableSignal<any>;
965
- readonly rangeMax: _angular_core.WritableSignal<any>;
966
- readonly arrayInputValue: _angular_core.WritableSignal<string>;
967
- readonly currentDateStr: _angular_core.WritableSignal<string>;
968
- readonly dateRangeStart: _angular_core.WritableSignal<string>;
969
- readonly dateRangeEnd: _angular_core.WritableSignal<string>;
970
- readonly inputType: _angular_core.Signal<string>;
971
- readonly enumSelectOptions: _angular_core.Signal<{
972
- value: string;
973
- label: string;
974
- }[]>;
975
- constructor();
976
- ngOnDestroy(): void;
977
- ngOnInit(): void;
978
- /** 通用值变更(string / boolean…) */
979
- onValueChange(value: unknown): void;
980
- /** UUID 值变更(带格式校验) */
981
- onUuidChange(value: string): void;
982
- /** 数字输入变更 */
983
- onNumberInputChange(value: string): void;
984
- /** 枚举多选变更 */
985
- onEnumArrayChange(event: Event): void;
986
- /** 枚举选项是否选中 */
987
- isEnumSelected(opt: unknown): boolean;
988
- /** 枚举值选中(来自 PopoverSelectComponent) */
989
- onEnumSelect(value: string): void;
990
- /** 原生日期输入变更 */
991
- onNativeDateChange(value: string): void;
992
- /** 日期范围起始变更 */
993
- onDateRangeStartChange(value: string): void;
994
- /** 日期范围结束变更 */
995
- onDateRangeEndChange(value: string): void;
996
- onDateRangePartChange(): void;
997
- /** 范围最小值变更 */
998
- onRangeMinChange(value: string): void;
999
- /** 范围最大值变更 */
1000
- onRangeMaxChange(value: string): void;
1001
- onRangeChange(): void;
1002
- /** 数组输入值变更(逗号分隔字符串) */
1003
- onArrayInputChange(value: string): void;
1004
- handleWhereChange(where: {
1005
- combinator: 'and' | 'or';
1006
- rules: unknown[];
1007
- } | undefined): void;
1008
- private loadSubqueryComponent;
1009
- private destroySubqueryComponent;
1010
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ValueInputComponent, never>;
1011
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ValueInputComponent, "rxdb-value-input", never, { "fieldType": { "alias": "fieldType"; "required": false; "isSignal": true; }; "operator": { "alias": "operator"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "enumOptions": { "alias": "enumOptions"; "required": false; "isSignal": true; }; "relationFields": { "alias": "relationFields"; "required": false; "isSignal": true; }; "where": { "alias": "where"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "valueChangeFn": { "alias": "valueChangeFn"; "required": false; "isSignal": true; }; "whereChangeFn": { "alias": "whereChangeFn"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "whereChange": "whereChange"; }, never, never, true, never>;
1582
+ export declare class ValueInputComponent implements OnInit, OnDestroy {
1583
+ private previousInputType;
1584
+ private subqueryComponentRef?;
1585
+ private subquerySubscription?;
1586
+ private subqueryLoading;
1587
+ private readonly injector;
1588
+ /** UUID 格式校验错误(基于 currentValue 派生,inputType 不是 uuid 时自动为空) */
1589
+ readonly uuidError: import("@angular/core").Signal<"" | "请输入合法的 UUID 格式">;
1590
+ subqueryContainer?: ViewContainerRef;
1591
+ readonly fieldType: import("@angular/core").InputSignal<string>;
1592
+ readonly operator: import("@angular/core").InputSignal<string>;
1593
+ readonly value: import("@angular/core").InputSignal<unknown>;
1594
+ readonly enumOptions: import("@angular/core").InputSignal<unknown[]>;
1595
+ readonly relationFields: import("@angular/core").InputSignal<FieldMetadata[]>;
1596
+ readonly where: import("@angular/core").InputSignal<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
1597
+ readonly valueChange: import("@angular/core").OutputEmitterRef<unknown>;
1598
+ readonly whereChange: import("@angular/core").OutputEmitterRef<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>;
1599
+ readonly errorMessage: import("@angular/core").InputSignal<string>;
1600
+ readonly hasError: import("@angular/core").Signal<boolean>;
1601
+ readonly valueChangeFn: import("@angular/core").InputSignal<((value: unknown) => void) | undefined>;
1602
+ readonly whereChangeFn: import("@angular/core").InputSignal<((where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined) => void) | undefined>;
1603
+ /** 信号状态 —— 替代原先的可变类属性 */
1604
+ readonly currentValue: import("@angular/core").WritableSignal<unknown>;
1605
+ readonly rangeMin: import("@angular/core").WritableSignal<unknown>;
1606
+ readonly rangeMax: import("@angular/core").WritableSignal<unknown>;
1607
+ readonly arrayInputValue: import("@angular/core").WritableSignal<string>;
1608
+ readonly currentDateStr: import("@angular/core").WritableSignal<string>;
1609
+ readonly dateRangeStart: import("@angular/core").WritableSignal<string>;
1610
+ readonly dateRangeEnd: import("@angular/core").WritableSignal<string>;
1611
+ readonly inputType: import("@angular/core").Signal<string>;
1612
+ readonly enumSelectOptions: import("@angular/core").Signal<{
1613
+ value: string;
1614
+ label: string;
1615
+ }[]>;
1616
+ constructor();
1617
+ ngOnDestroy(): void;
1618
+ ngOnInit(): void;
1619
+ /** 通用值变更(string / boolean…) */
1620
+ onValueChange(value: unknown): void;
1621
+ /** UUID 值变更(带格式校验) */
1622
+ onUuidChange(value: string): void;
1623
+ /** 数字输入变更 */
1624
+ onNumberInputChange(value: string): void;
1625
+ /** 枚举多选变更 */
1626
+ onEnumArrayChange(event: Event): void;
1627
+ /** 枚举选项是否选中 */
1628
+ isEnumSelected(opt: unknown): boolean;
1629
+ /** 枚举值选中(来自 PopoverSelectComponent) */
1630
+ onEnumSelect(value: string): void;
1631
+ /** 原生日期输入变更 */
1632
+ onNativeDateChange(value: string): void;
1633
+ /** 日期范围起始变更 */
1634
+ onDateRangeStartChange(value: string): void;
1635
+ /** 日期范围结束变更 */
1636
+ onDateRangeEndChange(value: string): void;
1637
+ onDateRangePartChange(): void;
1638
+ /** 范围最小值变更 */
1639
+ onRangeMinChange(value: string): void;
1640
+ /** 范围最大值变更 */
1641
+ onRangeMaxChange(value: string): void;
1642
+ onRangeChange(): void;
1643
+ /** 数组输入值变更(逗号分隔字符串) */
1644
+ onArrayInputChange(value: string): void;
1645
+ handleWhereChange(where: {
1646
+ combinator: 'and' | 'or';
1647
+ rules: unknown[];
1648
+ } | undefined): void;
1649
+ private loadSubqueryComponent;
1650
+ private destroySubqueryComponent;
1651
+ static ɵfac: i0.ɵɵFactoryDeclaration<ValueInputComponent, never>;
1652
+ static ɵcmp: i0.ɵɵComponentDeclaration<ValueInputComponent, "rxdb-value-input", never, {
1653
+ "fieldType": {
1654
+ "alias": "fieldType";
1655
+ "required": false;
1656
+ "isSignal": true;
1657
+ };
1658
+ "operator": {
1659
+ "alias": "operator";
1660
+ "required": false;
1661
+ "isSignal": true;
1662
+ };
1663
+ "value": {
1664
+ "alias": "value";
1665
+ "required": false;
1666
+ "isSignal": true;
1667
+ };
1668
+ "enumOptions": {
1669
+ "alias": "enumOptions";
1670
+ "required": false;
1671
+ "isSignal": true;
1672
+ };
1673
+ "relationFields": {
1674
+ "alias": "relationFields";
1675
+ "required": false;
1676
+ "isSignal": true;
1677
+ };
1678
+ "where": {
1679
+ "alias": "where";
1680
+ "required": false;
1681
+ "isSignal": true;
1682
+ };
1683
+ "errorMessage": {
1684
+ "alias": "errorMessage";
1685
+ "required": false;
1686
+ "isSignal": true;
1687
+ };
1688
+ "valueChangeFn": {
1689
+ "alias": "valueChangeFn";
1690
+ "required": false;
1691
+ "isSignal": true;
1692
+ };
1693
+ "whereChangeFn": {
1694
+ "alias": "whereChangeFn";
1695
+ "required": false;
1696
+ "isSignal": true;
1697
+ };
1698
+ }, {
1699
+ "valueChange": "valueChange";
1700
+ "whereChange": "whereChange";
1701
+ }, never, never, true, never>;
1012
1702
  }
1013
-
1014
1703
  /**
1015
1704
  * QueryBuilder 主题接口
1016
1705
  *
@@ -1022,12 +1711,12 @@ declare class ValueInputComponent implements OnInit, OnDestroy {
1022
1711
  * - 同时支持 output() 事件和可选的 onXxx 回调 input(供 NgComponentOutlet 使用)
1023
1712
  */
1024
1713
  interface QueryBuilderTheme {
1025
- /** 字段选择器组件 */
1026
- fieldSelector: Type<unknown>;
1027
- /** 操作符选择器组件 */
1028
- operatorSelector: Type<unknown>;
1029
- /** 值输入组件 */
1030
- valueInput: Type<unknown>;
1714
+ /** 字段选择器组件 */
1715
+ fieldSelector: Type<unknown>;
1716
+ /** 操作符选择器组件 */
1717
+ operatorSelector: Type<unknown>;
1718
+ /** 值输入组件 */
1719
+ valueInput: Type<unknown>;
1031
1720
  }
1032
1721
  /**
1033
1722
  * QueryBuilder 主题注入 Token
@@ -1038,12 +1727,11 @@ interface QueryBuilderTheme {
1038
1727
  * providers: [provideQueryBuilderTheme(QUERY_BUILDER_XXX_THEME)]
1039
1728
  * ```
1040
1729
  */
1041
- declare const QUERY_BUILDER_THEME: InjectionToken<QueryBuilderTheme>;
1730
+ export declare const QUERY_BUILDER_THEME: InjectionToken<QueryBuilderTheme>;
1042
1731
  /**
1043
1732
  * 提供自定义主题
1044
1733
  */
1045
- declare function provideQueryBuilderTheme(theme: QueryBuilderTheme): Provider;
1046
-
1734
+ export declare function provideQueryBuilderTheme(theme: QueryBuilderTheme): Provider;
1047
1735
  /**
1048
1736
  * 默认主题(原生 HTML 实现)
1049
1737
  *
@@ -1057,7 +1745,5 @@ declare function provideQueryBuilderTheme(theme: QueryBuilderTheme): Provider;
1057
1745
  * imports: [QueryBuilderComponent]
1058
1746
  * ```
1059
1747
  */
1060
- declare const DEFAULT_QUERY_BUILDER_THEME: QueryBuilderTheme;
1061
-
1062
- export { DEFAULT_QUERY_BUILDER_THEME, ENTITY_TABLE_CONFIG, EntityDetailComponent, EntityDialogComponent, EntityFormComponent, EntityListComponent, EntityTableComponent, FieldSelectorComponent, OperatorSelectorComponent, PopoverSelectComponent, QUERY_BUILDER_THEME, QueryBuilderComponent, QueryGroupComponent, QueryRuleComponent, QueryTableComponent, SubqueryBuilderComponent, TreeItemDirective, TreeSelectComponent, ValueInputComponent, provideQueryBuilderTheme };
1063
- export type { EntityDetailDialogData, QueryBuilderTheme };
1748
+ export declare const DEFAULT_QUERY_BUILDER_THEME: QueryBuilderTheme;
1749
+ export { type QueryBuilderTheme, type QueryDragDropState, type QueryDropMode, type RxDBQueryOutput, type UIRuleGroup, type UIRuleWithWhere, cn };