@aiao/rxdb-model-angular 0.0.17

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.
@@ -0,0 +1,1063 @@
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
+ };
22
+ /** 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[];
35
+ }
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>;
91
+ }
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: {}; }]>;
106
+ }
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>;
131
+ }
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
+ /**
145
+ * 实体列表组件
146
+ *
147
+ * 封装了实体列表的完整 UI:工具栏(显示名称、筛选、撤销/重做、新增)+ 数据表格。
148
+ * 通过 `namespace` 和 `name` 输入定位 RxDB 实体,实现懒加载分页和 CRUD 操作。
149
+ *
150
+ * @example
151
+ * ```html
152
+ * <rxdb-entity-list [namespace]="namespace()" [name]="name()" />
153
+ * ```
154
+ */
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>;
255
+ }
256
+
257
+ declare const ENTITY_TABLE_CONFIG: InjectionToken<EntityTableConfig>;
258
+
259
+ /**
260
+ * 通用实体数据表格组件
261
+ *
262
+ * 基于 VTable 提供高性能表格渲染,支持:
263
+ * - 单元格编辑(文本、开关、复选框、下拉)
264
+ * - 剪贴板操作(Ctrl+C/V,TSV 格式)
265
+ * - 拖拽排序
266
+ * - 键盘导航(Enter 切换开关,Delete 清空单元格)
267
+ * - 主题系统(daisyUI CSS 变量)
268
+ * - 校验错误 tooltip
269
+ */
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>;
313
+ }
314
+
315
+ /**
316
+ * 集成查询构建器的实体表格组件
317
+ *
318
+ * 在实体表格上方提供筛选区域位置(通过内容投影),
319
+ * 将 rxdb-query-builder 的查询结果传递给底层 EntityTableComponent。
320
+ *
321
+ * 使用方式:
322
+ * ```html
323
+ * <rxdb-query-table [records]="filteredRecords()" [columns]="columns">
324
+ * <div filterBar>
325
+ * <rxdb-query-builder [fields]="fields" (queryChange)="onQueryChange($event)" />
326
+ * </div>
327
+ * <div emptyState>暂无数据</div>
328
+ * </rxdb-query-table>
329
+ * ```
330
+ */
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>;
369
+ }
370
+
371
+ /**
372
+ * UI 规则组(宽松类型)
373
+ */
374
+ interface UIRuleGroup {
375
+ id: string;
376
+ combinator: 'and' | 'or';
377
+ rules: Array<UIRule | UIRuleGroup>;
378
+ }
379
+ type QueryDropMode = 'before' | 'after' | 'into';
380
+ interface QueryDragDropState {
381
+ draggedItemId: string | null;
382
+ targetItemId: string | null;
383
+ dropMode: QueryDropMode | null;
384
+ isValidTarget: boolean;
385
+ depth?: number;
386
+ }
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;
397
+ }
398
+ /**
399
+ * 查询规则组组件(递归)
400
+ *
401
+ * @description
402
+ * 显示一组查询规则,支持:
403
+ * - AND/OR 切换(Teable 风格:行内 conjunction 前缀)
404
+ * - 添加规则/子组
405
+ * - 删除组
406
+ * - 递归嵌套显示
407
+ */
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>;
470
+ }
471
+
472
+ /**
473
+ * RxDB 查询输出格式
474
+ */
475
+ interface RxDBQueryOutput<T> {
476
+ combinator: 'and' | 'or';
477
+ rules: Array<RxDBQueryOutput<T> | {
478
+ field: keyof T & string;
479
+ operator: string;
480
+ value: unknown;
481
+ }>;
482
+ }
483
+ /**
484
+ * Angular Query Builder 主组件
485
+ *
486
+ * @description
487
+ * 提供可视化的查询条件构建界面,支持:
488
+ * - 传入 SchemaInfo 或 FieldMetadata[] 定义可用字段
489
+ * - 拖拽重排规则和分组
490
+ * - 嵌套分组(最大 5 层)
491
+ * - 实时验证
492
+ *
493
+ * @example
494
+ * ```html
495
+ * <rxdb-query-builder
496
+ * [schema]="schema"
497
+ * (queryChange)="onQueryChange($event)"
498
+ * />
499
+ * ```
500
+ */
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>;
586
+ }
587
+
588
+ /**
589
+ * 字段选择器组件
590
+ *
591
+ * @description
592
+ * 使用 Popover API 展示树形字段结构,支持过滤和嵌套关系字段的展开/折叠。
593
+ * 基于 CDK `ActiveDescendantKeyManager` 提供完整键盘导航和无障碍支持。
594
+ * 不依赖任何第三方 UI 库。
595
+ *
596
+ * 支持两种使用方式:
597
+ * 1. 直接模板使用:监听 `(fieldChange)` output 事件
598
+ * 2. 通过 NgComponentOutlet 注入:传入 `fieldChangeFn` 回调 input
599
+ */
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>;
612
+ }
613
+
614
+ /**
615
+ * 操作符选择器组件
616
+ *
617
+ * @description
618
+ * 基于 {@link PopoverSelectComponent} 提供操作符选择功能,
619
+ * 自动根据字段类型或元数据筛选可用操作符。
620
+ * 支持搜索过滤和键盘导航。
621
+ *
622
+ * 支持两种使用方式:
623
+ * 1. 直接模板使用:监听 `(operatorChange)` output 事件
624
+ * 2. 通过 NgComponentOutlet 注入:传入 `operatorChangeFn` 回调 input
625
+ */
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>;
642
+ }
643
+
644
+ /**
645
+ * 基于 Popover API 的下拉选择组件
646
+ *
647
+ * @description
648
+ * 使用浏览器原生 Popover API 渲染选项列表,在 top layer 渲染,
649
+ * 确保在 `overflow: auto/hidden` 容器内也不会被裁剪。
650
+ * 支持关键字过滤、键盘导航(↑↓ 移动、Enter 选中、Escape 关闭)。
651
+ * 打开弹框自动高亮第一项,搜索后也自动高亮第一条结果。
652
+ */
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>;
683
+ }
684
+
685
+ /**
686
+ * 带 where 子查询的规则类型
687
+ */
688
+ type UIRuleWithWhere = UIRule & {
689
+ where?: QueryBuilderRuleGroup<Record<string, unknown>>;
690
+ };
691
+ /**
692
+ * 单条查询规则组件
693
+ *
694
+ * @description
695
+ * 显示一条查询规则的编辑界面:
696
+ * - 字段选择器
697
+ * - 操作符选择器
698
+ * - 值输入框
699
+ * - 删除按钮
700
+ */
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>;
778
+ }
779
+
780
+ /**
781
+ * 子查询构建器组件
782
+ *
783
+ * @description
784
+ * 用于 EXISTS/NOT EXISTS 操作符的嵌套查询条件。
785
+ * 支持:
786
+ * - 添加子条件
787
+ * - 嵌套规则组
788
+ * - 清空子条件
789
+ */
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>;
843
+ }
844
+
845
+ /** 扁平化的可见树节点(用于渲染和键盘导航) */
846
+ interface FlatItem {
847
+ node: FieldTreeNode;
848
+ depth: number;
849
+ isExpandable: boolean;
850
+ isExpanded: boolean;
851
+ }
852
+ /**
853
+ * 树节点 Directive,实现 CDK {@link Highlightable} 接口
854
+ *
855
+ * 用于 {@link ActiveDescendantKeyManager} 管理键盘导航时的激活样式。
856
+ * `exportAs: 'rxdbTreeItem'` 允许模板中通过 `#ref="rxdbTreeItem"` 访问实例。
857
+ */
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>;
865
+ }
866
+ /**
867
+ * 树形下拉选择组件
868
+ *
869
+ * @description
870
+ * 基于 Popover API 和 `@angular/cdk/a11y` 的树形字段选择器:
871
+ * - 使用原生 Popover API,在 `overflow` 容器中不被裁剪
872
+ * - 支持关键字过滤(自动展开匹配路径)
873
+ * - 支持展开/折叠关系节点
874
+ * - 键盘导航:↑↓ 移动、→ 展开、← 折叠、Enter 选中、Escape 关闭
875
+ * - 使用 CDK `ActiveDescendantKeyManager` + `aria-activedescendant` 满足 WAI-ARIA 无障碍规范
876
+ *
877
+ * @example
878
+ * ```html
879
+ * <rxdb-tree-select
880
+ * [nodes]="fieldTree()"
881
+ * [selected]="selectedField()"
882
+ * placeholder="选择字段"
883
+ * (selectChange)="onFieldSelect($event)"
884
+ * />
885
+ * ```
886
+ */
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>;
924
+ }
925
+
926
+ /**
927
+ * 值输入组件
928
+ *
929
+ * @description
930
+ * 根据字段类型和操作符显示合适的输入控件:
931
+ * - string: 文本输入框
932
+ * - number: 数字输入框
933
+ * - boolean: 切换开关
934
+ * - date: 日期选择器
935
+ * - enum: 下拉选择器
936
+ * - array: 逗号分隔的文本输入
937
+ * - range: 范围输入(双输入框或范围选择器)
938
+ * - null/notNull 操作符: 无输入
939
+ * - exists/notExists 操作符: 子查询构建器
940
+ */
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>;
1012
+ }
1013
+
1014
+ /**
1015
+ * QueryBuilder 主题接口
1016
+ *
1017
+ * @description
1018
+ * 定义各 UI 插槽的组件类型,允许替换为不同的 UI 库实现
1019
+ *
1020
+ * 主题组件需遵循以下约定:
1021
+ * - 接受标准 signal inputs(字段、操作符、值等)
1022
+ * - 同时支持 output() 事件和可选的 onXxx 回调 input(供 NgComponentOutlet 使用)
1023
+ */
1024
+ interface QueryBuilderTheme {
1025
+ /** 字段选择器组件 */
1026
+ fieldSelector: Type<unknown>;
1027
+ /** 操作符选择器组件 */
1028
+ operatorSelector: Type<unknown>;
1029
+ /** 值输入组件 */
1030
+ valueInput: Type<unknown>;
1031
+ }
1032
+ /**
1033
+ * QueryBuilder 主题注入 Token
1034
+ *
1035
+ * @example
1036
+ * ```typescript
1037
+ * // 在应用根模块提供自定义主题
1038
+ * providers: [provideQueryBuilderTheme(QUERY_BUILDER_XXX_THEME)]
1039
+ * ```
1040
+ */
1041
+ declare const QUERY_BUILDER_THEME: InjectionToken<QueryBuilderTheme>;
1042
+ /**
1043
+ * 提供自定义主题
1044
+ */
1045
+ declare function provideQueryBuilderTheme(theme: QueryBuilderTheme): Provider;
1046
+
1047
+ /**
1048
+ * 默认主题(原生 HTML 实现)
1049
+ *
1050
+ * @description
1051
+ * 不依赖任何第三方 UI 库,使用标准 HTML 表单元素。
1052
+ * 适合轻量级场景或作为自定义主题的参考实现。
1053
+ *
1054
+ * @example
1055
+ * ```typescript
1056
+ * // 默认主题无需额外配置,开箱即用
1057
+ * imports: [QueryBuilderComponent]
1058
+ * ```
1059
+ */
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 };