@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 +1 @@
1
- {"version":3,"file":"aiao-rxdb-model-angular.mjs","sources":["../../../../packages/rxdb-model-angular/src/entity-dialog/entity-dialog.component.ts","../../../../packages/rxdb-model-angular/src/entity-dialog/entity-dialog.component.html","../../../../packages/rxdb-model-angular/src/entity-form/rxdb-entity-form-angular.ts","../../../../packages/rxdb-model-angular/src/entity-table/config.ts","../../../../packages/rxdb-model-angular/src/entity-table/entity-table/entity-table.component.ts","../../../../packages/rxdb-model-angular/src/entity-table/entity-table/entity-table.component.html","../../../../packages/rxdb-model-angular/src/entity-table/query-table/query-table.component.ts","../../../../packages/rxdb-model-angular/src/entity-table/query-table/query-table.component.html","../../../../packages/rxdb-model-angular/src/query-builder/tree-select/tree-select.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/field-selector/field-selector.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/popover-select/popover-select.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/operator-selector/operator-selector.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/value-input/value-input.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/theme/default-query-builder-theme.ts","../../../../packages/rxdb-model-angular/src/query-builder/theme/query-builder-theme.token.ts","../../../../packages/rxdb-model-angular/src/query-builder/query-rule/query-rule.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/query-group/query-group.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/query-builder/query-builder.component.ts","../../../../packages/rxdb-model-angular/src/entity-list/entity-list.component.ts","../../../../packages/rxdb-model-angular/src/entity-list/entity-list.component.html","../../../../packages/rxdb-model-angular/src/entity-detail/entity-detail.ts","../../../../packages/rxdb-model-angular/src/entity-detail/entity-detail.html","../../../../packages/rxdb-model-angular/src/entity-table/index.ts","../../../../packages/rxdb-model-angular/src/query-builder/subquery-builder/subquery-builder.component.ts","../../../../packages/rxdb-model-angular/src/query-builder/index.ts","../../../../packages/rxdb-model-angular/src/index.ts","../../../../packages/rxdb-model-angular/src/aiao-rxdb-model-angular.ts"],"sourcesContent":["import { DialogRef } from '@angular/cdk/dialog';\nimport { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n output,\n signal\n} from '@angular/core';\n\n@Component({\n selector: 'rxdb-entity-dialog',\n imports: [CdkDragHandle],\n hostDirectives: [{ directive: CdkDrag, inputs: ['cdkDragBoundary'] }],\n templateUrl: './entity-dialog.component.html',\n styleUrl: './entity-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityDialogComponent implements AfterViewInit {\n readonly #dialogRef = inject(DialogRef, { optional: true });\n readonly #cdkDrag = inject(CdkDrag, { optional: true, self: true });\n readonly #el = inject(ElementRef) as ElementRef<HTMLElement>;\n readonly #doc = inject(DOCUMENT);\n\n #pane: HTMLElement | null = null;\n #resizing = false;\n #savedPaneState: { left: string; top: string; width: string; height: string } | null = null;\n\n readonly title = input.required<string>();\n readonly closeRequested = output<void>();\n\n readonly isFullscreen = signal(false);\n readonly isInDialog = !!inject(DialogRef, { optional: true });\n\n constructor() {\n if (this.#cdkDrag) {\n if (this.isInDialog) {\n this.#cdkDrag.rootElementSelector = '.cdk-overlay-pane';\n this.#cdkDrag.boundaryElement = '.cdk-overlay-container';\n } else {\n this.#cdkDrag.disabled = true;\n }\n }\n }\n\n ngAfterViewInit(): void {\n if (!this.isInDialog) return;\n requestAnimationFrame(() => this.#initFixedPane());\n }\n\n close(): void {\n this.closeRequested.emit();\n this.#dialogRef?.close();\n }\n\n toggleFullscreen(): void {\n const wasFullscreen = this.isFullscreen();\n this.isFullscreen.set(!wasFullscreen);\n const fullscreen = !wasFullscreen;\n const pane = this.#pane;\n if (!pane) return;\n\n if (fullscreen) {\n this.#savedPaneState = {\n left: pane.style.left,\n top: pane.style.top,\n width: pane.style.width,\n height: pane.style.height\n };\n pane.style.left = '0';\n pane.style.top = '0';\n pane.style.width = '100vw';\n pane.style.height = '100vh';\n if (this.#cdkDrag) {\n this.#cdkDrag.disabled = true;\n this.#cdkDrag.setFreeDragPosition({ x: 0, y: 0 });\n }\n } else {\n if (this.#savedPaneState) {\n pane.style.left = this.#savedPaneState.left;\n pane.style.top = this.#savedPaneState.top;\n pane.style.width = this.#savedPaneState.width;\n pane.style.height = this.#savedPaneState.height;\n this.#savedPaneState = null;\n }\n if (this.#cdkDrag) this.#cdkDrag.disabled = false;\n }\n }\n\n startResize(e: MouseEvent, dir: string): void {\n const pane = this.#pane;\n if (!pane || this.#resizing || this.isFullscreen()) return;\n e.preventDefault();\n e.stopPropagation();\n this.#resizing = true;\n const startX = e.clientX;\n const startY = e.clientY;\n const startW = pane.offsetWidth;\n const startH = pane.offsetHeight;\n const startL = parseFloat(pane.style.left) || 0;\n const startT = parseFloat(pane.style.top) || 0;\n const minW = 400;\n const minH = 300;\n\n const onMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n if (dir.includes('e')) pane.style.width = Math.max(minW, startW + dx) + 'px';\n if (dir.includes('w')) {\n const w = Math.max(minW, startW - dx);\n pane.style.width = w + 'px';\n pane.style.left = startL + startW - w + 'px';\n }\n if (dir.includes('s')) pane.style.height = Math.max(minH, startH + dy) + 'px';\n if (dir.includes('n')) {\n const h = Math.max(minH, startH - dy);\n pane.style.height = h + 'px';\n pane.style.top = startT + startH - h + 'px';\n }\n };\n const onUp = () => {\n this.#resizing = false;\n this.#doc.removeEventListener('mousemove', onMove);\n this.#doc.removeEventListener('mouseup', onUp);\n };\n this.#doc.addEventListener('mousemove', onMove);\n this.#doc.addEventListener('mouseup', onUp);\n }\n\n #initFixedPane(): void {\n const pane = this.#el.nativeElement.closest<HTMLElement>('.cdk-overlay-pane');\n if (!pane) return;\n this.#pane = pane;\n const rect = pane.getBoundingClientRect();\n if (this.#cdkDrag) this.#cdkDrag.setFreeDragPosition({ x: 0, y: 0 });\n pane.style.position = 'fixed';\n pane.style.left = rect.left + 'px';\n pane.style.top = rect.top + 'px';\n pane.style.margin = '0';\n pane.style.maxWidth = 'none';\n pane.style.maxHeight = 'none';\n }\n}\n","<!-- Resize handles -->\n@if (isInDialog) {\n <div class=\"resize-handle resize-n\" (mousedown)=\"startResize($event, 'n')\"></div>\n <div class=\"resize-handle resize-s\" (mousedown)=\"startResize($event, 's')\"></div>\n <div class=\"resize-handle resize-e\" (mousedown)=\"startResize($event, 'e')\"></div>\n <div class=\"resize-handle resize-w\" (mousedown)=\"startResize($event, 'w')\"></div>\n <div class=\"resize-handle resize-ne\" (mousedown)=\"startResize($event, 'ne')\"></div>\n <div class=\"resize-handle resize-nw\" (mousedown)=\"startResize($event, 'nw')\"></div>\n <div class=\"resize-handle resize-se\" (mousedown)=\"startResize($event, 'se')\"></div>\n <div class=\"resize-handle resize-sw\" (mousedown)=\"startResize($event, 'sw')\"></div>\n}\n\n<!-- Dialog Title Bar (drag handle + fullscreen toggle + close) -->\n@if (isInDialog) {\n <div class=\"border-base-300 flex shrink-0 items-center justify-between border-b px-4 py-2\">\n <span class=\"flex-1 cursor-grab text-base font-semibold select-none active:cursor-grabbing\" cdkDragHandle>\n {{ title() }}\n </span>\n <div class=\"flex items-center gap-1\">\n <!-- Fullscreen Toggle -->\n <button\n class=\"btn btn-ghost btn-xs btn-square\"\n [attr.aria-label]=\"isFullscreen() ? '退出全屏' : '全屏'\"\n (click)=\"toggleFullscreen()\"\n type=\"button\"\n >\n @if (isFullscreen()) {\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\n </svg>\n } @else {\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\" />\n </svg>\n }\n </button>\n <!-- Close -->\n <button class=\"btn btn-ghost btn-xs btn-square\" (click)=\"close()\" aria-label=\"关闭\" type=\"button\">\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n}\n\n<!-- Projected content -->\n<ng-content />\n","import {\n EntityFieldType,\n type EntityFormData,\n formatEntityFieldValue,\n type FormFieldChangeEvent,\n type FormFieldConfig,\n type FormMode,\n type FormValidationResult,\n parseEntityFieldValue,\n type RelatedEntityItem,\n type RelatedEntityProvider,\n validateForm\n} from '@aiao/rxdb-model';\nimport { DatePipe, JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, linkedSignal, output } from '@angular/core';\n\n@Component({\n selector: 'rxdb-entity-form',\n imports: [DatePipe, JsonPipe],\n template: `<form class=\"grid grid-cols-1 gap-4 md:grid-cols-2\" (submit)=\"$event.preventDefault(); onSubmit()\">\n @for (field of editableFields(); track field.field) {\n <fieldset\n class=\"fieldset\"\n [class.md:col-span-2]=\"field.span === 2 || field.type === 'json' || field.type === 'keyValue'\"\n >\n <legend class=\"fieldset-legend\">{{ field.displayName }}</legend>\n @if (isFieldReadonly(field)) {\n <div class=\"input input-ghost flex min-h-10 items-center\">{{ displayValueMap().get(field.field) ?? '' }}</div>\n } @else {\n @switch (field.type) {\n @case ('boolean') {\n <input\n class=\"toggle\"\n [checked]=\"!!formData()[field.field]\"\n (change)=\"onFieldChange(field, $any($event.target).checked)\"\n type=\"checkbox\"\n />\n }\n @case ('enum') {\n <select\n class=\"select\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n >\n @if (field.nullable) {\n <option value=\"\">(空)</option>\n }\n @for (val of field.enumValues ?? []; track val) {\n <option [value]=\"val\">{{ val }}</option>\n }\n </select>\n }\n @case ('date') {\n <input\n class=\"input\"\n [value]=\"formData()[field.field] ? ($any(formData()[field.field]) | date: 'yyyy-MM-ddTHH:mm') : ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"datetime-local\"\n />\n }\n @case ('number') {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n step=\"any\"\n type=\"number\"\n />\n }\n @case ('integer') {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n step=\"1\"\n type=\"number\"\n />\n }\n @case ('stringArray') {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? '逗号分隔'\"\n [value]=\"$any(formData()[field.field] ?? []).join(', ')\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"text\"\n />\n }\n @case ('numberArray') {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? '逗号分隔数字'\"\n [value]=\"$any(formData()[field.field] ?? []).join(', ')\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"text\"\n />\n }\n @case ('json') {\n <textarea\n class=\"textarea min-h-24\"\n [attr.placeholder]=\"field.placeholder ?? 'JSON'\"\n [value]=\"formData()[field.field] !== null ? (formData()[field.field] | json) : ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n ></textarea>\n }\n @case ('keyValue') {\n <textarea\n class=\"textarea min-h-24\"\n [attr.placeholder]=\"field.placeholder ?? 'JSON'\"\n [value]=\"formData()[field.field] !== null ? (formData()[field.field] | json) : ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n ></textarea>\n }\n @case ('oneToOne') {\n <select\n class=\"select\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n >\n <option value=\"\">(空)</option>\n @for (item of relatedItemsMap().get(field.field) ?? []; track item.id) {\n <option [value]=\"item.id\">{{ item.displayName }}</option>\n }\n </select>\n }\n @case ('manyToOne') {\n <select\n class=\"select\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n >\n <option value=\"\">(空)</option>\n @for (item of relatedItemsMap().get(field.field) ?? []; track item.id) {\n <option [value]=\"item.id\">{{ item.displayName }}</option>\n }\n </select>\n }\n @default {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"text\"\n />\n }\n }\n }\n @if (field.helpText) {\n <p class=\"label\">{{ field.helpText }}</p>\n }\n </fieldset>\n }\n @if (!isReadonly() && showActions()) {\n <div class=\"flex justify-end gap-2 pt-2 md:col-span-2\">\n <button class=\"btn\" (click)=\"onCancel()\" type=\"button\">取消</button>\n <button class=\"btn btn-primary\" type=\"submit\">保存</button>\n </div>\n }\n </form>`,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityFormComponent {\n readonly fields = input.required<FormFieldConfig[]>();\n readonly data = input.required<EntityFormData>();\n readonly mode = input<FormMode>('view');\n readonly relatedEntityProvider = input<RelatedEntityProvider>();\n readonly showActions = input(true);\n\n readonly fieldChanged = output<FormFieldChangeEvent>();\n readonly formSubmitted = output<EntityFormData>();\n readonly formCancelled = output<void>();\n readonly validationErrors = output<FormValidationResult>();\n\n readonly formData = linkedSignal(() => ({ ...this.data() }));\n\n readonly editableFields = computed(() => {\n return this.fields().filter(f => !f.hidden);\n });\n\n readonly isReadonly = computed(() => this.mode() === 'view');\n\n readonly relatedItemsMap = computed(() => {\n const provider = this.relatedEntityProvider();\n const fields = this.editableFields();\n const map = new Map<string, RelatedEntityItem[]>();\n if (!provider) return map;\n for (const field of fields) {\n if (field.relatedEntityName) {\n map.set(field.field, provider(field.relatedEntityName, field.relatedNamespace));\n }\n }\n return map;\n });\n\n readonly displayValueMap = computed(() => {\n const data = this.formData();\n const fields = this.editableFields();\n const itemsMap = this.relatedItemsMap();\n const map = new Map<string, string>();\n for (const field of fields) {\n if (!this.isReadonly() && field.readonly !== true) continue;\n const value = data[field.field];\n if ((field.type === 'oneToOne' || field.type === 'manyToOne') && field.relatedEntityName) {\n const items = itemsMap.get(field.field) ?? [];\n const item = items.find(i => i.id === value);\n map.set(field.field, item?.displayName ?? formatEntityFieldValue(field.type, value));\n } else {\n map.set(field.field, formatEntityFieldValue(field.type, value));\n }\n }\n return map;\n });\n\n onFieldChange(field: FormFieldConfig, rawValue: unknown): void {\n const current = this.formData();\n const previousValue = current[field.field];\n const parsed = parseEntityFieldValue(field.type, rawValue);\n this.formData.set({ ...current, [field.field]: parsed });\n this.fieldChanged.emit({ field: field.field, type: field.type as EntityFieldType, value: parsed, previousValue });\n }\n\n onSubmit(): void {\n const currentFields = this.fields();\n const currentData = this.formData();\n const result = validateForm(currentFields, currentData);\n if (!result.valid) {\n this.validationErrors.emit(result);\n return;\n }\n this.formSubmitted.emit(currentData);\n }\n\n onCancel(): void {\n this.formData.set({ ...this.data() });\n this.formCancelled.emit();\n }\n\n isFieldReadonly(field: FormFieldConfig): boolean {\n return this.isReadonly() || field.readonly === true;\n }\n}\n","import type { EntityTableConfig } from '@aiao/rxdb-model';\nimport { InjectionToken } from '@angular/core';\n\nexport const ENTITY_TABLE_CONFIG = new InjectionToken<EntityTableConfig>('ENTITY_TABLE_CONFIG');\n","import type { BatchChangeItem, CellChangeEvent, EntityTableRecord, PendingWrite } from '@aiao/rxdb-model';\nimport {\n CellTooltipManager,\n ROW_SERIES_COL_OFFSET,\n TableClipboardManager,\n collectDeleteWrites,\n collectReorderedIds,\n completeTableEdit,\n createListTable,\n createTheme,\n getCSSVariables,\n handleTableKeydown,\n patchDragIconForReadonlyRows,\n setCellSwitchState,\n updateTableRecords,\n changeCellValue as vtChangeCellValue\n} from '@aiao/rxdb-model';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n PLATFORM_ID,\n afterNextRender,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport type { ListTableConstructorOptions } from '@visactor/vtable';\nimport * as VTable from '@visactor/vtable';\nimport { ENTITY_TABLE_CONFIG } from '../config';\n\n/**\n * 通用实体数据表格组件\n *\n * 基于 VTable 提供高性能表格渲染,支持:\n * - 单元格编辑(文本、开关、复选框、下拉)\n * - 剪贴板操作(Ctrl+C/V,TSV 格式)\n * - 拖拽排序\n * - 键盘导航(Enter 切换开关,Delete 清空单元格)\n * - 主题系统(daisyUI CSS 变量)\n * - 校验错误 tooltip\n */\n@Component({\n selector: 'rxdb-entity-table',\n imports: [],\n templateUrl: './entity-table.component.html',\n styleUrl: './entity-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityTableComponent implements OnDestroy {\n readonly #platformId = inject(PLATFORM_ID);\n readonly #config = inject(ENTITY_TABLE_CONFIG, { optional: true });\n #tableInstance: VTable.ListTable | null = null;\n #destroyed = false;\n #tableReady = signal(false);\n #prevColumns: ListTableConstructorOptions['columns'] | null = null;\n #prevRecords: EntityTableRecord[] | null = null;\n #selectedCell: { col: number; row: number } | null = null;\n #containerKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n #resizeObserver: ResizeObserver | null = null;\n readonly #cellTooltip = signal<{ x: number; y: number; content: string } | null>(null);\n readonly #headerHeight = signal(40);\n readonly #clipboard = new TableClipboardManager();\n readonly #tooltip = new CellTooltipManager();\n #container: HTMLElement | null = null;\n\n readonly tableContainer = viewChild<ElementRef<HTMLDivElement>>('tableContainer');\n\n // ── 输入 ──────────────────────────────────────────────────────────\n readonly records = input.required<EntityTableRecord[]>();\n readonly columns = input.required<ListTableConstructorOptions['columns']>();\n readonly isDarkMode = input(false);\n readonly idField = input('id');\n readonly nonClearableFields = input<ReadonlySet<string>>(new Set());\n readonly tableOptions = input<Partial<ListTableConstructorOptions>>();\n readonly cellErrorDetector = input<(record: EntityTableRecord, field: string) => string | null>();\n readonly loading = input(false);\n /** 业务层回调判断单元格是否可清空(返回 false 跳过),替代领域特定的硬编码逻辑 */\n readonly cellClearable = input<(record: Record<string, unknown>, field: string) => boolean>();\n /** 触底时加载更多数据的回调,由表格内部在滚动到底部时调用 */\n readonly loadMore = input<() => void>();\n /** 加载更多中状态(已有数据,底部小 spinner,不拦截滚动) */\n readonly loadingMore = input(false);\n\n // ── 输出 ──────────────────────────────────────────────────────────\n readonly cellChanged = output<CellChangeEvent>();\n readonly rowDeleted = output<EntityTableRecord>();\n readonly iconClicked = output<{ name: string; record: EntityTableRecord }>();\n readonly batchUpdated = output<BatchChangeItem[]>();\n readonly rowReordered = output<string[]>();\n readonly scrollNearBottom = output<void>();\n\n readonly cellTooltip = this.#cellTooltip;\n readonly headerHeight = this.#headerHeight;\n\n get tableInstance(): VTable.ListTable | null {\n return this.#tableInstance;\n }\n\n constructor() {\n if (isPlatformBrowser(this.#platformId)) {\n afterNextRender(() => {\n if (this.#destroyed) return;\n const el = this.tableContainer()?.nativeElement;\n if (el && !this.#tableInstance && this.columns()?.length) {\n this.#initTable(el);\n this.#prevColumns = this.columns();\n this.#tableReady.set(true);\n }\n });\n\n effect(() => {\n const records = this.records();\n const columns = this.columns();\n const ready = untracked(() => this.#tableReady());\n if (!this.#tableInstance) {\n if (!ready && columns?.length) {\n const el = this.tableContainer()?.nativeElement;\n if (el) {\n this.#initTable(el);\n this.#prevColumns = columns;\n this.#tableReady.set(true);\n }\n }\n return;\n }\n const columnsChanged = columns !== this.#prevColumns;\n if (columnsChanged) {\n updateTableRecords(this.#tableInstance, records, this.#prevColumns ?? columns, columns);\n this.#prevColumns = columns;\n this.#prevRecords = records;\n } else if (records !== this.#prevRecords) {\n this.#tableInstance.setRecords(records);\n this.#prevRecords = records;\n }\n });\n\n effect(() => {\n this.isDarkMode();\n this.redrawTheme();\n });\n }\n }\n /**\n * 从业务层回滚单元格值(校验失败时恢复原值)。\n * 避免外部直接访问 tableInstance。\n */\n changeCellValue(col: number, row: number, value: unknown): void {\n if (this.#tableInstance) vtChangeCellValue(this.#tableInstance, col, row, value);\n }\n\n redrawTheme(): void {\n if (this.#tableInstance) {\n this.#tableInstance.updateTheme(createTheme(this.isDarkMode(), getCSSVariables()));\n }\n }\n\n ngOnDestroy(): void {\n this.#destroyed = true;\n this.#tooltip.cleanup();\n if (this.#containerKeydownHandler) {\n this.#container?.removeEventListener('keydown', this.#containerKeydownHandler);\n this.#containerKeydownHandler = null;\n }\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n if (this.#tableInstance) {\n completeTableEdit(this.#tableInstance);\n this.#tableInstance.release();\n }\n this.#tableInstance = null;\n this.#container = null;\n this.#tableReady.set(false);\n }\n\n #initTable(container: HTMLElement): void {\n const records = this.records();\n const table = createListTable(container, records, this.columns(), this.isDarkMode(), this.tableOptions());\n this.#tableInstance = table;\n this.#prevRecords = records;\n this.#container = container;\n const h = table.getRowHeight(0);\n if (h > 0) this.#headerHeight.set(h);\n\n this.#resizeObserver = new ResizeObserver(() => table.resize());\n this.#resizeObserver.observe(container);\n table.updateTheme(createTheme(this.isDarkMode(), getCSSVariables()));\n patchDragIconForReadonlyRows(table);\n this.#bindTableEvents(table, container);\n }\n\n #bindTableEvents(table: VTable.ListTable, container: HTMLElement): void {\n table.on('change_cell_value', (args: { col: number; row: number; changedValue: string | number }) => {\n this.#handleCellChange(args.col, args.row, args.changedValue);\n });\n table.on('switch_state_change', (args: { col: number; row: number; checked: boolean }) => {\n this.#handleCellChange(args.col, args.row, args.checked);\n });\n table.on('checkbox_state_change', (args: { col: number; row: number; checked: boolean }) => {\n this.#handleCellChange(args.col, args.row, args.checked);\n });\n table.on('icon_click', (args: { name: string; col: number; row: number }) => {\n completeTableEdit(table);\n const record = table.getRecordByCell(args.col, args.row) as EntityTableRecord | undefined;\n if (!record) return;\n if (args.name === 'delete-action') this.rowDeleted.emit(record);\n else this.iconClicked.emit({ name: args.name, record });\n });\n table.on('mouseenter_cell', (args: { col: number; row: number }) => this.#showCellError(args.col, args.row));\n table.on('mouseleave_cell', () => this.#tooltip.hide(v => this.#cellTooltip.set(v)));\n table.on('selected_cell', (args: { col: number; row: number }) => {\n this.#selectedCell = { col: args.col, row: args.row };\n });\n table.on('change_header_position', () => {\n const ids = collectReorderedIds(table, this.idField());\n if (ids.length > 0) this.rowReordered.emit(ids);\n });\n table.on('scroll', (args: { scrollDirection: string; scrollRatioY?: number; dy?: number }) => {\n if (\n args.scrollDirection === 'vertical' &&\n (args.dy ?? 0) > 0 &&\n (args.scrollRatioY ?? 0) > 0.9 &&\n !this.loadingMore()\n ) {\n const fn = this.loadMore();\n if (fn) {\n fn();\n } else {\n this.scrollNearBottom.emit();\n }\n }\n });\n\n this.#containerKeydownHandler = (e: KeyboardEvent) =>\n handleTableKeydown(\n {\n getTable: () => this.#tableInstance,\n getSelectedCell: () => this.#selectedCell,\n getColDef: col => this.#getColDef(col) as { cellType?: string; field?: string },\n onCopy: () => void this.#clipboard.copy(table, this.columns() as Record<string, unknown>[]),\n onPaste: () => void this.#pasteFromClipboard(),\n onDelete: () => this.#deleteSelectedCells(),\n onCellChange: (col, row, val) => this.#handleCellChange(col, row, val)\n },\n e\n );\n container.addEventListener('keydown', this.#containerKeydownHandler);\n }\n\n #getColDef(col: number): Record<string, unknown> | undefined {\n return (this.columns() as Record<string, unknown>[])?.[col - ROW_SERIES_COL_OFFSET];\n }\n\n #handleCellChange(col: number, row: number, changedValue: unknown): void {\n const record = this.#tableInstance?.getRecordByCell(col, row) as EntityTableRecord | undefined;\n const fieldName = (this.#getColDef(col) as { field?: string })?.field;\n if (!record || !fieldName) return;\n this.cellChanged.emit({ col, row, field: fieldName, value: changedValue, record });\n }\n\n #showCellError(col: number, row: number): void {\n const table = this.#tableInstance;\n if (!table) return;\n const detector = this.cellErrorDetector();\n if (!detector) return;\n const record = table.getRecordByCell(col, row) as EntityTableRecord | undefined;\n if (!record) return;\n const field = (this.#getColDef(col) as { field?: string })?.field;\n if (!field) return;\n const content = detector(record, field);\n if (!content) return;\n this.#tooltip.showError(table, col, row, content, v => this.#cellTooltip.set(v), this.#config?.tooltipDelay);\n }\n\n /** 将 PendingWrite[] 按 idField 归并为 BatchChangeItem[] */\n #groupWrites(writes: PendingWrite[]): BatchChangeItem[] {\n const map = new Map<string, Record<string, unknown>>();\n for (const w of writes) {\n const id = String((w.record as Record<string, unknown>)[this.idField()]);\n if (!map.has(id)) map.set(id, {});\n map.get(id)![w.field] = w.value;\n }\n return [...map.entries()].map(([recordId, changes]) => ({ recordId, changes }));\n }\n\n async #pasteFromClipboard(): Promise<void> {\n if (!this.#tableInstance) return;\n const writes = await this.#clipboard.paste(this.#tableInstance, this.columns() as Record<string, unknown>[]);\n if (writes.length > 0) {\n for (const w of writes) {\n if (typeof w.value === 'boolean') {\n setCellSwitchState(this.#tableInstance, w.col, w.row, w.value);\n }\n }\n this.batchUpdated.emit(this.#groupWrites(writes));\n }\n }\n\n #deleteSelectedCells(): void {\n const table = this.#tableInstance;\n if (!table) return;\n const columns = this.columns() as { field?: string; cellType?: string | ((...a: unknown[]) => string) }[];\n const { writes, boolCells } = collectDeleteWrites(table, columns, this.nonClearableFields(), this.cellClearable());\n for (const bc of boolCells) setCellSwitchState(table, bc.col, bc.row, false);\n if (writes.length > 0) this.batchUpdated.emit(this.#groupWrites(writes));\n }\n}\n","<div class=\"relative h-full w-full overflow-hidden\">\n <div class=\"absolute inset-0\" #tableContainer></div>\n @if (records().length === 0 && !loading()) {\n <div\n class=\"text-base-content/40 absolute inset-x-0 bottom-0 flex items-center justify-center text-sm\"\n [style.top.px]=\"headerHeight()\"\n aria-label=\"暂无数据\"\n role=\"status\"\n >\n <div class=\"empty-slot\">\n <ng-content select=\"[emptyState]\"></ng-content>\n </div>\n <div class=\"empty-default flex flex-col items-center gap-3\">\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"40\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.2\"\n viewBox=\"0 0 24 24\"\n width=\"40\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect height=\"18\" rx=\"2\" width=\"18\" x=\"3\" y=\"3\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 9v12\" />\n <path d=\"M3 15h18\" />\n </svg>\n <span>暂无数据</span>\n </div>\n </div>\n }\n @if (loading()) {\n <div class=\"bg-base-100/60 absolute inset-0 z-10 flex items-center justify-center\">\n <span class=\"loading loading-spinner loading-md text-primary\"></span>\n </div>\n }\n @if (loadingMore()) {\n <div class=\"pointer-events-none absolute right-0 bottom-0 left-0 z-10 flex justify-center py-1.5\">\n <span class=\"loading loading-dots loading-sm text-primary\"></span>\n </div>\n }\n @if (cellTooltip(); as tip) {\n <div\n class=\"bg-base-300 text-base-content border-base-300 pointer-events-none fixed z-[100] max-w-xs rounded border px-2 py-1.5 text-xs shadow-lg\"\n [style.left.px]=\"tip.x\"\n [style.top.px]=\"tip.y\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n role=\"tooltip\"\n >\n {{ tip.content }}\n </div>\n }\n</div>\n","import type { BatchChangeItem, CellChangeEvent, EntityTableRecord } from '@aiao/rxdb-model';\nimport { ChangeDetectionStrategy, Component, computed, input, output, viewChild } from '@angular/core';\nimport type { ListTable, ListTableConstructorOptions } from '@visactor/vtable';\nimport { EntityTableComponent } from '../entity-table/entity-table.component';\n\n/**\n * 集成查询构建器的实体表格组件\n *\n * 在实体表格上方提供筛选区域位置(通过内容投影),\n * 将 rxdb-query-builder 的查询结果传递给底层 EntityTableComponent。\n *\n * 使用方式:\n * ```html\n * <rxdb-query-table [records]=\"filteredRecords()\" [columns]=\"columns\">\n * <div filterBar>\n * <rxdb-query-builder [fields]=\"fields\" (queryChange)=\"onQueryChange($event)\" />\n * </div>\n * <div emptyState>暂无数据</div>\n * </rxdb-query-table>\n * ```\n */\n@Component({\n selector: 'rxdb-query-table',\n imports: [EntityTableComponent],\n templateUrl: './query-table.component.html',\n styleUrl: './query-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryTableComponent {\n readonly records = input.required<EntityTableRecord[]>();\n readonly columns = input.required<ListTableConstructorOptions['columns']>();\n readonly idField = input('id');\n readonly nonClearableFields = input<ReadonlySet<string>>(new Set());\n readonly tableOptions = input<Partial<ListTableConstructorOptions>>();\n readonly cellErrorDetector = input<(record: EntityTableRecord, field: string) => string | null>();\n readonly isDarkMode = input(false);\n /** 业务层回调判断单元格是否可清空 */\n readonly cellClearable = input<(record: Record<string, unknown>, field: string) => boolean>();\n\n /** 查询条件是否激活(显示筛选状态标签) */\n readonly queryActive = input(false);\n /** 结果总数(显示在筛选状态栏中) */\n readonly totalCount = input<number>();\n /** 筛选后结果数 */\n readonly filteredCount = input<number>();\n /** 是否显示加载状态 */\n readonly loading = input(false);\n /** 加载更多中(已有数据,底部小 spinner,不拦截滚动) */\n readonly loadingMore = input(false);\n /** 触底时加载更多数据的回调,透传给 EntityTableComponent */\n readonly loadMore = input<() => void>();\n\n readonly cellChanged = output<CellChangeEvent>();\n readonly rowDeleted = output<EntityTableRecord>();\n readonly iconClicked = output<{ name: string; record: EntityTableRecord }>();\n readonly batchUpdated = output<BatchChangeItem[]>();\n readonly rowReordered = output<string[]>();\n readonly scrollNearBottom = output<void>();\n\n readonly entityTable = viewChild(EntityTableComponent);\n\n readonly statusText = computed(() => {\n const total = this.totalCount();\n const filtered = this.filteredCount();\n if (total == null) return '';\n if (filtered != null && filtered !== total) return `${filtered} / ${total}`;\n return `${total}`;\n });\n\n get tableInstance(): ListTable | null {\n return this.entityTable()?.tableInstance ?? null;\n }\n\n changeCellValue(col: number, row: number, value: unknown): void {\n this.entityTable()?.changeCellValue(col, row, value);\n }\n\n redrawTheme(): void {\n this.entityTable()?.redrawTheme();\n }\n}\n","<div class=\"flex h-full w-full flex-col overflow-hidden\">\n <!-- 筛选栏插槽 -->\n <ng-content select=\"[filterBar]\"></ng-content>\n\n <!-- 筛选状态栏 -->\n @if (queryActive() && statusText()) {\n <div class=\"text-base-content/60 flex items-center gap-2 border-b px-3 py-1 text-xs\">\n <span>{{ statusText() }}</span>\n </div>\n }\n\n <!-- 表格主体 -->\n <div class=\"min-h-0 flex-1\">\n <rxdb-entity-table\n [cellClearable]=\"cellClearable()\"\n [cellErrorDetector]=\"cellErrorDetector()\"\n [columns]=\"columns()\"\n [idField]=\"idField()\"\n [isDarkMode]=\"isDarkMode()\"\n [loading]=\"loading()\"\n [loadingMore]=\"loadingMore()\"\n [loadMore]=\"loadMore()\"\n [nonClearableFields]=\"nonClearableFields()\"\n [records]=\"records()\"\n [tableOptions]=\"tableOptions()\"\n (batchUpdated)=\"batchUpdated.emit($event)\"\n (cellChanged)=\"cellChanged.emit($event)\"\n (iconClicked)=\"iconClicked.emit($event)\"\n (rowDeleted)=\"rowDeleted.emit($event)\"\n (rowReordered)=\"rowReordered.emit($event)\"\n (scrollNearBottom)=\"scrollNearBottom.emit()\"\n >\n <ng-content select=\"[emptyState]\"></ng-content>\n </rxdb-entity-table>\n </div>\n</div>\n","import { applyPopoverPosition, findNodeByValue, getDisplayNamePath, type FieldTreeNode } from '@aiao/rxdb-model';\nimport { ActiveDescendantKeyManager, type Highlightable } from '@angular/cdk/a11y';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n Injector,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport {\n BracesIcon,\n CalendarIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n HashIcon,\n Link2Icon,\n ListChecksIcon,\n ListIcon,\n LucideAngularModule,\n TableIcon,\n ToggleLeftIcon,\n TypeIcon\n} from 'lucide-angular';\n\nlet _uid = 0;\n\n/** 扁平化的可见树节点(用于渲染和键盘导航) */\ninterface FlatItem {\n node: FieldTreeNode;\n depth: number;\n isExpandable: boolean;\n isExpanded: boolean;\n}\n\n/**\n * 树节点 Directive,实现 CDK {@link Highlightable} 接口\n *\n * 用于 {@link ActiveDescendantKeyManager} 管理键盘导航时的激活样式。\n * `exportAs: 'rxdbTreeItem'` 允许模板中通过 `#ref=\"rxdbTreeItem\"` 访问实例。\n */\n@Directive({\n selector: '[rxdbTreeItem]',\n standalone: true,\n exportAs: 'rxdbTreeItem'\n})\nexport class TreeItemDirective implements Highlightable {\n private readonly _active = signal(false);\n readonly isActive = this._active.asReadonly();\n\n setActiveStyles(): void {\n this._active.set(true);\n }\n\n setInactiveStyles(): void {\n this._active.set(false);\n }\n}\n\n/**\n * 树形下拉选择组件\n *\n * @description\n * 基于 Popover API 和 `@angular/cdk/a11y` 的树形字段选择器:\n * - 使用原生 Popover API,在 `overflow` 容器中不被裁剪\n * - 支持关键字过滤(自动展开匹配路径)\n * - 支持展开/折叠关系节点\n * - 键盘导航:↑↓ 移动、→ 展开、← 折叠、Enter 选中、Escape 关闭\n * - 使用 CDK `ActiveDescendantKeyManager` + `aria-activedescendant` 满足 WAI-ARIA 无障碍规范\n *\n * @example\n * ```html\n * <rxdb-tree-select\n * [nodes]=\"fieldTree()\"\n * [selected]=\"selectedField()\"\n * placeholder=\"选择字段\"\n * (selectChange)=\"onFieldSelect($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'rxdb-tree-select',\n standalone: true,\n imports: [FormsModule, TreeItemDirective, LucideAngularModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- 触发按钮 -->\n <button\n class=\"select select-sm text-left\"\n #trigger\n [attr.popovertarget]=\"uid\"\n [style.min-width]=\"minWidth()\"\n aria-haspopup=\"tree\"\n type=\"button\"\n >\n @if (selectedNode(); as node) {\n <lucide-icon\n class=\"w-3.5 shrink-0\"\n [class]=\"typeColorMap[node.type] ?? defaultTypeColor\"\n [img]=\"typeIconMap[node.type] ?? defaultTypeIcon\"\n size=\"14\"\n />\n }\n <span class=\"min-w-0 grow truncate\">{{ displayValue() }}</span>\n </button>\n\n <!-- Popover 浮层 -->\n <div\n class=\"bg-base-100 text-base-content rounded-box border-base-300 border shadow-xl\"\n #popoverEl\n [id]=\"uid\"\n [style.min-width]=\"minWidth()\"\n (beforetoggle)=\"onBeforeToggle($event)\"\n (keydown)=\"onKeydown($event)\"\n (toggle)=\"onToggle($event)\"\n popover\n tabindex=\"-1\"\n >\n <!-- 过滤输入框 -->\n <div class=\"mb-1 p-1\">\n <input\n class=\"input input-sm w-full\"\n #filterInput\n [attr.aria-activedescendant]=\"activeItemId()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-owns]=\"listId\"\n [ngModel]=\"filterText()\"\n (ngModelChange)=\"filterText.set($event)\"\n aria-autocomplete=\"list\"\n placeholder=\"搜索字段...\"\n role=\"combobox\"\n type=\"text\"\n />\n </div>\n\n <!-- 树形列表 -->\n <ul\n class=\"menu menu-sm max-h-60 w-full flex-nowrap overflow-y-auto px-2\"\n [attr.aria-label]=\"placeholder()\"\n [id]=\"listId\"\n role=\"tree\"\n >\n @for (item of visibleItems(); track trackItem(item)) {\n <li [style.padding-left.rem]=\"item.depth * 0.75\" role=\"none\">\n <button\n class=\"flex w-full items-center gap-1.5 text-left text-sm\"\n #treeItemRef=\"rxdbTreeItem\"\n [attr.aria-expanded]=\"item.isExpandable ? item.isExpanded : null\"\n [attr.aria-selected]=\"!item.isExpandable ? item.node.value === selected() : null\"\n [class.bg-primary/15]=\"!item.isExpandable && item.node.value === selected()\"\n [class.font-semibold]=\"!item.isExpandable && item.node.value === selected()\"\n [class.menu-focus]=\"treeItemRef.isActive()\"\n [id]=\"uid + '-item-' + item.node.value\"\n (click)=\"onItemClick(item)\"\n role=\"treeitem\"\n rxdbTreeItem\n type=\"button\"\n >\n <lucide-icon\n class=\"w-3.5 shrink-0\"\n [class]=\"typeColorMap[item.node.type] ?? defaultTypeColor\"\n [img]=\"typeIconMap[item.node.type] ?? defaultTypeIcon\"\n size=\"14\"\n />\n <span class=\"min-w-0 grow truncate\">{{ item.node.displayName || item.node.label }}</span>\n @if (!item.isExpandable && item.node.value === selected()) {\n <svg\n class=\"text-primary h-3 w-3 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n }\n @if (item.isExpandable) {\n <span class=\"shrink-0 text-xs opacity-40\">{{ item.node.children!.length }}</span>\n @if (item.isExpanded) {\n <lucide-icon class=\"w-3.5 shrink-0 opacity-50\" [img]=\"ChevronDownIcon\" size=\"14\" />\n } @else {\n <lucide-icon class=\"w-3.5 shrink-0 opacity-50\" [img]=\"ChevronRightIcon\" size=\"14\" />\n }\n }\n </button>\n </li>\n } @empty {\n <li class=\"px-3 py-1.5 text-sm opacity-50\">无匹配字段</li>\n }\n </ul>\n </div>\n `\n})\nexport class TreeSelectComponent {\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly popoverEl = viewChild.required<ElementRef<HTMLElement>>('popoverEl');\n private readonly filterInput = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n private readonly treeItemDirs = viewChildren(TreeItemDirective);\n private readonly expandedPaths = signal(new Set<string>());\n private readonly keyManager: ActiveDescendantKeyManager<TreeItemDirective>;\n private readonly _activeIdx = signal(-1);\n\n protected readonly uid = `rxdb-ts-${++_uid}`;\n protected readonly listId = `${this.uid}-list`;\n protected readonly filterText = signal('');\n protected readonly ChevronDownIcon = ChevronDownIcon;\n protected readonly ChevronRightIcon = ChevronRightIcon;\n protected readonly typeIconMap: Partial<Record<string, typeof ChevronDownIcon>> = {\n string: TypeIcon,\n number: HashIcon,\n boolean: ToggleLeftIcon,\n date: CalendarIcon,\n array: ListIcon,\n object: BracesIcon,\n relation: Link2Icon,\n enum: ListChecksIcon,\n keyValue: TableIcon\n };\n protected readonly typeColorMap: Partial<Record<string, string>> = {\n string: 'text-success',\n number: 'text-warning',\n boolean: 'text-info',\n date: 'text-secondary',\n array: 'text-accent',\n object: 'text-base-content/60',\n relation: 'text-primary',\n enum: 'text-warning',\n keyValue: 'text-accent'\n };\n protected readonly defaultTypeIcon = TypeIcon;\n protected readonly defaultTypeColor = 'text-base-content/40';\n\n readonly nodes = input.required<FieldTreeNode[]>();\n readonly selected = input<string>('');\n readonly placeholder = input<string>('请选择');\n readonly minWidth = input<string>('14rem');\n readonly selectChange = output<string>();\n\n readonly displayValue = computed(() => {\n const sel = this.selected();\n return sel ? getDisplayNamePath(this.nodes(), sel) || sel : this.placeholder();\n });\n\n readonly selectedNode = computed(() => {\n const sel = this.selected();\n return sel ? findNodeByValue(this.nodes(), sel) : null;\n });\n\n readonly visibleItems = computed<FlatItem[]>(() => {\n const filter = this.filterText().toLowerCase().trim();\n const expanded = this.expandedPaths();\n return filter ? buildFilteredItems(this.nodes(), filter) : buildExpandedItems(this.nodes(), expanded, 0);\n });\n\n readonly activeItemId = computed(() => {\n const idx = this._activeIdx();\n if (idx < 0) return null;\n const vis = this.visibleItems();\n return idx < vis.length ? `${this.uid}-item-${vis[idx].node.value}` : null;\n });\n\n constructor() {\n const injector = inject(Injector);\n\n // Signal 初始化必须在 injection context 内(constructor)\n this.keyManager = new ActiveDescendantKeyManager(this.treeItemDirs, injector).withWrap().withHomeAndEnd();\n\n // 同步 key manager 的激活索引到本地 signal(用于 aria-activedescendant)\n this.keyManager.change.pipe(takeUntilDestroyed()).subscribe(idx => this._activeIdx.set(idx));\n\n // 过滤文本变化时,自动高亮第一项\n effect(() => {\n this.filterText();\n untracked(() => {\n setTimeout(() => {\n this.keyManager.setFirstItemActive();\n this._activeIdx.set(this.keyManager.activeItemIndex ?? -1);\n });\n });\n });\n }\n\n onBeforeToggle(event: Event): void {\n const te = event as ToggleEvent;\n if (te.newState === 'open') {\n applyPopoverPosition(this.popoverEl().nativeElement, this.trigger().nativeElement.getBoundingClientRect());\n this.filterText.set('');\n } else {\n this._activeIdx.set(-1);\n this.keyManager.setActiveItem(-1);\n }\n }\n\n onToggle(event: Event): void {\n if ((event as ToggleEvent).newState === 'open') {\n this.filterInput()?.nativeElement.focus();\n setTimeout(() => {\n this.keyManager.setFirstItemActive();\n this._activeIdx.set(this.keyManager.activeItemIndex ?? -1);\n });\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp': {\n event.preventDefault();\n this.keyManager.onKeydown(event);\n this.scrollActiveIntoView();\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n const item = this.visibleItems()[this.keyManager.activeItemIndex ?? -1];\n if (item?.isExpandable && !item.isExpanded) this.toggleExpand(item.node.value);\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n const item = this.visibleItems()[this.keyManager.activeItemIndex ?? -1];\n if (item?.isExpandable && item.isExpanded) this.toggleExpand(item.node.value);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n const item = this.visibleItems()[this.keyManager.activeItemIndex ?? -1];\n if (item) this.onItemClick(item);\n break;\n }\n case 'Escape': {\n event.preventDefault();\n this.popoverEl().nativeElement.hidePopover();\n this.trigger().nativeElement.focus();\n break;\n }\n case 'Tab': {\n this.popoverEl().nativeElement.hidePopover();\n break;\n }\n }\n }\n\n onItemClick(item: FlatItem): void {\n if (item.isExpandable) {\n this.toggleExpand(item.node.value);\n } else {\n this.selectChange.emit(item.node.value);\n this.popoverEl().nativeElement.hidePopover();\n this.trigger().nativeElement.focus();\n }\n }\n /** 追踪函数:使用 value + isExistsOption 避免重复 key */\n protected trackItem(item: FlatItem): string {\n return item.node.isExistsOption ? `${item.node.value}:exists` : item.node.value;\n }\n private scrollActiveIntoView(): void {\n const idx = this.keyManager.activeItemIndex ?? -1;\n const item = this.visibleItems()[idx];\n if (!item) return;\n document.getElementById(`${this.uid}-item-${item.node.value}`)?.scrollIntoView({ block: 'nearest' });\n }\n\n private toggleExpand(value: string): void {\n this.expandedPaths.update(prev => {\n const next = new Set(prev);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n return next;\n });\n }\n}\n\n// ─── 辅助函数 ───────────────────────────────────────────────────────────────────\n\nfunction buildExpandedItems(nodes: FieldTreeNode[], expanded: Set<string>, depth: number): FlatItem[] {\n const result: FlatItem[] = [];\n for (const node of nodes) {\n const isExpandable = !!node.children?.length;\n const isExpanded = isExpandable && expanded.has(node.value);\n result.push({ node, depth, isExpandable, isExpanded });\n if (isExpanded) {\n result.push(...buildExpandedItems(node.children!, expanded, depth + 1));\n }\n }\n return result;\n}\n\nfunction buildFilteredItems(nodes: FieldTreeNode[], filter: string, depth = 0): FlatItem[] {\n const result: FlatItem[] = [];\n for (const node of nodes) {\n const selfMatches = nodeMatchesFilter(node, filter);\n const isExpandable = !!node.children?.length;\n const childMatches = isExpandable && hasMatchingDescendant(node.children!, filter);\n\n if (selfMatches || childMatches) {\n result.push({ node, depth, isExpandable, isExpanded: isExpandable && childMatches });\n if (isExpandable && (selfMatches || childMatches)) {\n result.push(...buildFilteredItems(node.children!, filter, depth + 1));\n }\n }\n }\n return result;\n}\n\nfunction nodeMatchesFilter(node: FieldTreeNode, filter: string): boolean {\n return (\n node.label.toLowerCase().includes(filter) ||\n node.displayName.toLowerCase().includes(filter) ||\n (node.description?.toLowerCase().includes(filter) ?? false)\n );\n}\n\nfunction hasMatchingDescendant(nodes: FieldTreeNode[], filter: string): boolean {\n return nodes.some(\n n => nodeMatchesFilter(n, filter) || (n.children?.length ? hasMatchingDescendant(n.children, filter) : false)\n );\n}\n\n/** 从树中找到节点(同 rxdb-model 的 findNodeByValue,此处作为 tree-select 内部别名) */\nexport { findNodeByValue };\n","import { buildFieldTree, type FieldMetadata } from '@aiao/rxdb-model';\nimport { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { TreeSelectComponent } from '../tree-select/tree-select.component';\n\n/**\n * 字段选择器组件\n *\n * @description\n * 使用 Popover API 展示树形字段结构,支持过滤和嵌套关系字段的展开/折叠。\n * 基于 CDK `ActiveDescendantKeyManager` 提供完整键盘导航和无障碍支持。\n * 不依赖任何第三方 UI 库。\n *\n * 支持两种使用方式:\n * 1. 直接模板使用:监听 `(fieldChange)` output 事件\n * 2. 通过 NgComponentOutlet 注入:传入 `fieldChangeFn` 回调 input\n */\n@Component({\n selector: 'rxdb-field-selector',\n standalone: true,\n imports: [TreeSelectComponent],\n template: `\n <rxdb-tree-select\n [nodes]=\"fieldTree()\"\n [placeholder]=\"placeholder()\"\n [selected]=\"selectedField()\"\n (selectChange)=\"onSelect($event)\"\n minWidth=\"14rem\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FieldSelectorComponent {\n readonly fields = input.required<FieldMetadata[]>();\n readonly selectedField = input<string>('');\n readonly placeholder = input<string>('选择字段');\n\n /** 通过 NgComponentOutlet 注入时使用的回调 input */\n readonly fieldChangeFn = input<((field: string) => void) | undefined>(undefined);\n\n /** 直接模板使用时的 output 事件 */\n readonly fieldChange = output<string>();\n\n readonly fieldTree = computed(() => buildFieldTree(this.fields()));\n\n onSelect(field: string): void {\n this.fieldChange.emit(field);\n this.fieldChangeFn()?.(field);\n }\n}\n","import { applyPopoverPosition, findOptionLabel } from '@aiao/rxdb-model';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nlet _uid = 0;\n\n/**\n * 基于 Popover API 的下拉选择组件\n *\n * @description\n * 使用浏览器原生 Popover API 渲染选项列表,在 top layer 渲染,\n * 确保在 `overflow: auto/hidden` 容器内也不会被裁剪。\n * 支持关键字过滤、键盘导航(↑↓ 移动、Enter 选中、Escape 关闭)。\n * 打开弹框自动高亮第一项,搜索后也自动高亮第一条结果。\n */\n@Component({\n selector: 'rxdb-popover-select',\n standalone: true,\n imports: [FormsModule],\n template: `\n <button\n class=\"select select-sm text-left\"\n #trigger\n [attr.popovertarget]=\"uid\"\n [style.min-width]=\"minWidth()\"\n type=\"button\"\n >\n {{ currentLabel() }}\n </button>\n <div\n class=\"bg-base-100 rounded-box border-base-300 border shadow-xl\"\n #popoverEl\n [id]=\"uid\"\n [style.min-width]=\"minWidth()\"\n (beforetoggle)=\"onBeforeToggle($event)\"\n (keydown)=\"onKeydown($event)\"\n (toggle)=\"onToggle($event)\"\n popover\n tabindex=\"-1\"\n >\n <div class=\"mb-1 p-2\">\n <input\n class=\"input input-sm w-full\"\n #filterInput\n [attr.aria-activedescendant]=\"activeItemId()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-expanded]=\"true\"\n [ngModel]=\"filterText()\"\n (ngModelChange)=\"filterText.set($event)\"\n aria-autocomplete=\"list\"\n placeholder=\"搜索...\"\n role=\"combobox\"\n type=\"text\"\n />\n </div>\n <ul class=\"menu menu-sm max-h-60 w-full flex-nowrap overflow-y-auto px-2\" [id]=\"listId\" role=\"listbox\">\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li role=\"none\">\n <button\n class=\"flex w-full items-center text-left text-sm\"\n [attr.aria-selected]=\"option.value === selected()\"\n [class.bg-primary/15]=\"option.value === selected()\"\n [class.font-semibold]=\"option.value === selected()\"\n [class.menu-focus]=\"activeIndex() === i\"\n [id]=\"uid + '-opt-' + option.value\"\n (click)=\"onSelect(option.value)\"\n role=\"option\"\n type=\"button\"\n >\n <span class=\"grow\">{{ option.label }}</span>\n @if (option.value === selected()) {\n <svg\n class=\"text-primary h-3 w-3 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n }\n </button>\n </li>\n } @empty {\n <li class=\"px-3 py-1.5 text-sm opacity-50\">无匹配项</li>\n }\n </ul>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PopoverSelectComponent {\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly popoverEl = viewChild.required<ElementRef<HTMLElement>>('popoverEl');\n private readonly filterInput = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n\n protected readonly uid = `rxdb-ps-${++_uid}`;\n protected readonly listId = `${this.uid}-list`;\n protected readonly filterText = signal('');\n protected readonly activeIndex = signal(0);\n\n readonly options = input.required<ReadonlyArray<{ value: string; label: string }>>();\n readonly selected = input<string>('');\n readonly placeholder = input<string>('请选择');\n readonly minWidth = input<string>('8rem');\n\n readonly selectChange = output<string>();\n\n readonly currentLabel = computed(() => findOptionLabel(this.options(), this.selected(), this.placeholder()));\n\n readonly filteredOptions = computed(() => {\n const filter = this.filterText().toLowerCase().trim();\n if (!filter) return this.options();\n return this.options().filter(opt => opt.label.toLowerCase().includes(filter));\n });\n\n readonly activeItemId = computed(() => {\n const idx = this.activeIndex();\n const opts = this.filteredOptions();\n return idx >= 0 && idx < opts.length ? `${this.uid}-opt-${opts[idx].value}` : null;\n });\n\n constructor() {\n effect(() => {\n this.filteredOptions();\n untracked(() => this.activeIndex.set(0));\n });\n }\n\n onBeforeToggle(event: Event): void {\n const te = event as ToggleEvent;\n if (te.newState === 'open') {\n applyPopoverPosition(this.popoverEl().nativeElement, this.trigger().nativeElement.getBoundingClientRect());\n this.filterText.set('');\n }\n }\n\n onToggle(event: Event): void {\n if ((event as ToggleEvent).newState === 'open') {\n this.filterInput()?.nativeElement.focus();\n this.activeIndex.set(0);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const opts = this.filteredOptions();\n const len = opts.length;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (len > 0) {\n this.activeIndex.update(i => (i + 1) % len);\n this.scrollActiveIntoView();\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (len > 0) {\n this.activeIndex.update(i => (i - 1 + len) % len);\n this.scrollActiveIntoView();\n }\n break;\n }\n case 'Enter': {\n event.preventDefault();\n const opt = opts[this.activeIndex()];\n if (opt) this.onSelect(opt.value);\n break;\n }\n case 'Escape': {\n event.preventDefault();\n this.popoverEl().nativeElement.hidePopover();\n this.trigger().nativeElement.focus();\n break;\n }\n case 'Tab': {\n this.popoverEl().nativeElement.hidePopover();\n break;\n }\n }\n }\n\n onSelect(value: string): void {\n this.selectChange.emit(value);\n this.popoverEl().nativeElement.hidePopover();\n this.trigger().nativeElement.focus();\n }\n\n private scrollActiveIntoView(): void {\n const opts = this.filteredOptions();\n const opt = opts[this.activeIndex()];\n if (!opt) return;\n document.getElementById(`${this.uid}-opt-${opt.value}`)?.scrollIntoView({ block: 'nearest' });\n }\n}\n","import { getDefaultOperatorRegistry, type FieldMetadata, type PropertyType } from '@aiao/rxdb-model';\nimport { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { PopoverSelectComponent } from '../popover-select/popover-select.component';\n\n/**\n * 操作符选择器组件\n *\n * @description\n * 基于 {@link PopoverSelectComponent} 提供操作符选择功能,\n * 自动根据字段类型或元数据筛选可用操作符。\n * 支持搜索过滤和键盘导航。\n *\n * 支持两种使用方式:\n * 1. 直接模板使用:监听 `(operatorChange)` output 事件\n * 2. 通过 NgComponentOutlet 注入:传入 `operatorChangeFn` 回调 input\n */\n@Component({\n selector: 'rxdb-operator-selector',\n standalone: true,\n imports: [PopoverSelectComponent],\n template: `\n <rxdb-popover-select\n [options]=\"operatorOptions()\"\n [selected]=\"selectedOperator()\"\n (selectChange)=\"onOperatorChange($event)\"\n minWidth=\"8rem\"\n placeholder=\"选择操作符\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OperatorSelectorComponent {\n private readonly registry = getDefaultOperatorRegistry();\n\n readonly operatorOptions = computed(() => {\n const metadata = this.fieldMetadata();\n const operators =\n metadata ? this.registry.getForField(metadata) : this.registry.getForType(this.fieldType() as PropertyType);\n return operators.map(op => ({ value: op.key, label: op.label }));\n });\n\n readonly fieldMetadata = input<FieldMetadata | undefined>(undefined);\n readonly fieldType = input<string>('string');\n readonly selectedOperator = input<string>('=');\n\n /** 通过 NgComponentOutlet 注入时使用的回调 input */\n readonly operatorChangeFn = input<((op: string) => void) | undefined>(undefined);\n\n /** 直接模板使用时的 output 事件 */\n readonly operatorChange = output<string>();\n\n onOperatorChange(op: string): void {\n this.operatorChange.emit(op);\n this.operatorChangeFn()?.(op);\n }\n}\n","import {\n getDefaultValueForType as coreGetDefaultValue,\n getInputType as coreGetInputType,\n parseCommaSeparatedInput,\n UUID_RE,\n type FieldMetadata,\n type QueryBuilderRuleGroup\n} from '@aiao/rxdb-model';\nimport { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n computed,\n effect,\n inject,\n Injector,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { PopoverSelectComponent } from '../popover-select/popover-select.component';\n\n/**\n * 值输入组件\n *\n * @description\n * 根据字段类型和操作符显示合适的输入控件:\n * - string: 文本输入框\n * - number: 数字输入框\n * - boolean: 切换开关\n * - date: 日期选择器\n * - enum: 下拉选择器\n * - array: 逗号分隔的文本输入\n * - range: 范围输入(双输入框或范围选择器)\n * - null/notNull 操作符: 无输入\n * - exists/notExists 操作符: 子查询构建器\n */\n@Component({\n selector: 'rxdb-value-input',\n standalone: true,\n imports: [CommonModule, PopoverSelectComponent],\n template: `\n @switch (inputType()) {\n @case ('none') {\n <span class=\"text-base-content/50 px-2 text-sm italic\">无需输入值</span>\n }\n @case ('uuid') {\n <div\n [attr.data-tip]=\"uuidError() || errorMessage() || null\"\n [class.tooltip-top]=\"!!uuidError() || hasError()\"\n [class.tooltip]=\"!!uuidError() || hasError()\"\n >\n <input\n class=\"input input-sm font-mono\"\n [class.input-error]=\"hasError() || !!uuidError()\"\n [value]=\"currentValue()\"\n (input)=\"onUuidChange($any($event.target).value)\"\n placeholder=\"输入 UUID\"\n style=\"min-width: 16rem\"\n type=\"text\"\n />\n </div>\n }\n @case ('subquery') {\n <div class=\"subquery-container w-full\">\n @if (!relationFields() || relationFields().length === 0) {\n <span class=\"text-base-content/50 px-2 text-sm italic\">存在/不存在(无子条件)</span>\n } @else {\n <div #subqueryContainer></div>\n }\n </div>\n }\n @case ('boolean') {\n <input\n class=\"toggle toggle-sm\"\n [checked]=\"!!currentValue()\"\n (change)=\"onValueChange($any($event.target).checked)\"\n type=\"checkbox\"\n />\n }\n @case ('enum') {\n <rxdb-popover-select\n [options]=\"enumSelectOptions()\"\n [selected]=\"currentValue()?.toString() ?? ''\"\n (selectChange)=\"onEnumSelect($event)\"\n minWidth=\"12rem\"\n placeholder=\"选择值\"\n />\n }\n @case ('enum-array') {\n <div [attr.data-tip]=\"errorMessage() || null\" [class.tooltip-top]=\"hasError()\" [class.tooltip]=\"hasError()\">\n <select\n class=\"select select-sm\"\n [class.select-error]=\"hasError()\"\n (change)=\"onEnumArrayChange($event)\"\n multiple\n style=\"min-width: 12rem; min-height: 6rem\"\n >\n @for (opt of enumOptions(); track opt) {\n <option [selected]=\"isEnumSelected(opt)\" [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n }\n @case ('range') {\n @if (fieldType() === 'date') {\n <div\n class=\"flex items-center gap-2\"\n [attr.data-tip]=\"errorMessage() || null\"\n [class.tooltip-top]=\"hasError()\"\n [class.tooltip]=\"hasError()\"\n >\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"dateRangeStart()\"\n (change)=\"onDateRangeStartChange($any($event.target).value)\"\n style=\"width: 9rem\"\n type=\"date\"\n />\n <span class=\"text-base-content/50\">至</span>\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"dateRangeEnd()\"\n (change)=\"onDateRangeEndChange($any($event.target).value)\"\n style=\"width: 9rem\"\n type=\"date\"\n />\n </div>\n } @else {\n <div\n class=\"flex items-center gap-2\"\n [attr.data-tip]=\"errorMessage() || null\"\n [class.tooltip-top]=\"hasError()\"\n [class.tooltip]=\"hasError()\"\n >\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"rangeMin() ?? ''\"\n (input)=\"onRangeMinChange($any($event.target).value)\"\n placeholder=\"最小值\"\n style=\"width: 7rem\"\n type=\"number\"\n />\n <span class=\"text-base-content/50\">至</span>\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"rangeMax() ?? ''\"\n (input)=\"onRangeMaxChange($any($event.target).value)\"\n placeholder=\"最大值\"\n style=\"width: 7rem\"\n type=\"number\"\n />\n </div>\n }\n }\n @case ('number') {\n <div [attr.data-tip]=\"errorMessage() || null\" [class.tooltip-top]=\"hasError()\" [class.tooltip]=\"hasError()\">\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"currentValue() ?? ''\"\n (input)=\"onNumberInputChange($any($event.target).value)\"\n placeholder=\"输入数值\"\n type=\"number\"\n />\n </div>\n }\n @case ('date') {\n <div [attr.data-tip]=\"errorMessage() || null\" [class.tooltip-top]=\"hasError()\" [class.tooltip]=\"hasError()\">\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"currentDateStr()\"\n (change)=\"onNativeDateChange($any($event.target).value)\"\n style=\"width: 10rem\"\n type=\"date\"\n />\n </div>\n }\n @case ('array') {\n <div [attr.data-tip]=\"errorMessage() || null\" [class.tooltip-top]=\"hasError()\" [class.tooltip]=\"hasError()\">\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"arrayInputValue()\"\n (input)=\"onArrayInputChange($any($event.target).value)\"\n placeholder=\"输入多个值,用逗号分隔\"\n style=\"width: 100%; min-width: 12rem\"\n type=\"text\"\n />\n </div>\n }\n @default {\n <div [attr.data-tip]=\"errorMessage() || null\" [class.tooltip-top]=\"hasError()\" [class.tooltip]=\"hasError()\">\n <input\n class=\"input input-sm\"\n [class.input-error]=\"hasError()\"\n [value]=\"currentValue() ?? ''\"\n (input)=\"onValueChange($any($event.target).value)\"\n placeholder=\"输入值\"\n style=\"width: 100%; min-width: 12rem\"\n type=\"text\"\n />\n </div>\n }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ValueInputComponent implements OnInit, OnDestroy {\n private previousInputType: string | null = null;\n private subqueryComponentRef?: ComponentRef<any>;\n private subquerySubscription?: Subscription;\n private subqueryLoading = false;\n private readonly injector = inject(Injector);\n\n /** UUID 格式校验错误(基于 currentValue 派生,inputType 不是 uuid 时自动为空) */\n readonly uuidError = computed(() => {\n if (this.inputType() !== 'uuid') return '';\n const val = String(this.currentValue() ?? '').trim();\n return val && !UUID_RE.test(val) ? '请输入合法的 UUID 格式' : '';\n });\n\n @ViewChild('subqueryContainer', { read: ViewContainerRef })\n subqueryContainer?: ViewContainerRef;\n\n readonly fieldType = input<string>('string');\n readonly operator = input<string>('=');\n readonly value = input<unknown>('');\n readonly enumOptions = input<unknown[]>([]);\n readonly relationFields = input<FieldMetadata[]>([]);\n readonly where = input<QueryBuilderRuleGroup<Record<string, unknown>>>();\n\n readonly valueChange = output<unknown>();\n readonly whereChange = output<QueryBuilderRuleGroup<Record<string, unknown>> | undefined>();\n\n readonly errorMessage = input<string>('');\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly valueChangeFn = input<((value: unknown) => void) | undefined>(undefined);\n readonly whereChangeFn = input<\n ((where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined) => void) | undefined\n >(undefined);\n\n /** 信号状态 —— 替代原先的可变类属性 */\n readonly currentValue = signal<any>('');\n readonly rangeMin = signal<any>(null);\n readonly rangeMax = signal<any>(null);\n readonly arrayInputValue = signal('');\n readonly currentDateStr = signal('');\n readonly dateRangeStart = signal('');\n readonly dateRangeEnd = signal('');\n\n readonly inputType = computed(() => coreGetInputType(this.fieldType(), this.operator(), this.enumOptions()));\n readonly enumSelectOptions = computed(() =>\n this.enumOptions().map(opt => ({ value: String(opt), label: String(opt) }))\n );\n\n constructor() {\n effect(() => {\n const currentType = this.inputType();\n if (this.previousInputType !== null && this.previousInputType !== currentType) {\n const defaultVal = coreGetDefaultValue(currentType);\n this.currentValue.set(defaultVal);\n this.valueChange.emit(defaultVal);\n this.valueChangeFn()?.(defaultVal);\n }\n this.previousInputType = currentType;\n });\n\n afterNextRender(\n () => {\n effect(\n () => {\n const isSubquery = this.inputType() === 'subquery';\n const hasRelationFields = this.relationFields().length > 0;\n if (isSubquery && hasRelationFields) {\n this.loadSubqueryComponent();\n } else {\n this.destroySubqueryComponent();\n }\n },\n { injector: this.injector }\n );\n },\n { injector: this.injector }\n );\n }\n\n ngOnDestroy(): void {\n this.destroySubqueryComponent();\n }\n\n ngOnInit(): void {\n const value = this.value();\n if (this.inputType() === 'range' && Array.isArray(value)) {\n if (this.fieldType() === 'date') {\n this.dateRangeStart.set(String(value[0] ?? ''));\n this.dateRangeEnd.set(String(value[1] ?? ''));\n } else {\n this.rangeMin.set(value[0]);\n this.rangeMax.set(value[1]);\n }\n } else if (this.inputType() === 'array' && Array.isArray(value)) {\n this.arrayInputValue.set(value.join(', '));\n } else if (this.inputType() === 'enum-array') {\n this.currentValue.set(Array.isArray(value) ? value : []);\n } else if (this.inputType() === 'date') {\n this.currentDateStr.set(typeof value === 'string' ? value : '');\n } else if (this.inputType() === 'uuid') {\n this.currentValue.set(typeof value === 'string' ? value : '');\n } else {\n this.currentValue.set(this.fieldType() === 'number' && value === '' ? null : value);\n }\n }\n\n /** 通用值变更(string / boolean…) */\n onValueChange(value: unknown): void {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n this.valueChangeFn()?.(value);\n }\n\n /** UUID 值变更(带格式校验) */\n onUuidChange(value: string): void {\n this.currentValue.set(value);\n const trimmed = value.trim();\n this.valueChange.emit(trimmed.toLowerCase() || '');\n this.valueChangeFn()?.(trimmed.toLowerCase() || '');\n }\n\n /** 数字输入变更 */\n onNumberInputChange(value: string): void {\n const num = value === '' ? null : Number(value);\n this.currentValue.set(num);\n this.valueChange.emit(num);\n this.valueChangeFn()?.(num);\n }\n\n /** 枚举多选变更 */\n onEnumArrayChange(event: Event): void {\n const select = event.target as HTMLSelectElement;\n const selected = Array.from(select.selectedOptions).map(o => o.value);\n this.currentValue.set(selected);\n this.valueChange.emit(selected);\n this.valueChangeFn()?.(selected);\n }\n\n /** 枚举选项是否选中 */\n isEnumSelected(opt: unknown): boolean {\n const val = this.currentValue();\n return Array.isArray(val) && val.includes(opt);\n }\n\n /** 枚举值选中(来自 PopoverSelectComponent) */\n onEnumSelect(value: string): void {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n this.valueChangeFn()?.(value);\n }\n\n /** 原生日期输入变更 */\n onNativeDateChange(value: string): void {\n this.currentDateStr.set(value);\n this.valueChange.emit(value || '');\n this.valueChangeFn()?.(value || '');\n }\n\n /** 日期范围起始变更 */\n onDateRangeStartChange(value: string): void {\n this.dateRangeStart.set(value);\n this.onDateRangePartChange();\n }\n\n /** 日期范围结束变更 */\n onDateRangeEndChange(value: string): void {\n this.dateRangeEnd.set(value);\n this.onDateRangePartChange();\n }\n\n onDateRangePartChange(): void {\n const start = this.dateRangeStart();\n const end = this.dateRangeEnd();\n if (start && end) {\n this.valueChange.emit([start, end]);\n this.valueChangeFn()?.([start, end]);\n } else {\n this.valueChange.emit([]);\n this.valueChangeFn()?.([]);\n }\n }\n\n /** 范围最小值变更 */\n onRangeMinChange(value: string): void {\n this.rangeMin.set(value === '' ? null : Number(value));\n this.onRangeChange();\n }\n\n /** 范围最大值变更 */\n onRangeMaxChange(value: string): void {\n this.rangeMax.set(value === '' ? null : Number(value));\n this.onRangeChange();\n }\n\n onRangeChange(): void {\n const min = this.rangeMin();\n const max = this.rangeMax();\n if (min != null && max != null) {\n this.valueChange.emit([min, max]);\n this.valueChangeFn()?.([min, max]);\n } else {\n this.valueChange.emit([]);\n this.valueChangeFn()?.([]);\n }\n }\n\n /** 数组输入值变更(逗号分隔字符串) */\n onArrayInputChange(value: string): void {\n this.arrayInputValue.set(value);\n const result = parseCommaSeparatedInput(value, this.fieldType());\n this.valueChange.emit(result);\n this.valueChangeFn()?.(result);\n }\n\n handleWhereChange(where: { combinator: 'and' | 'or'; rules: unknown[] } | undefined): void {\n const typedWhere = where as QueryBuilderRuleGroup<Record<string, unknown>> | undefined;\n this.whereChange.emit(typedWhere);\n this.whereChangeFn()?.(typedWhere);\n }\n\n private async loadSubqueryComponent(): Promise<void> {\n if (!this.subqueryContainer || this.subqueryComponentRef || this.subqueryLoading) return;\n this.subqueryLoading = true;\n try {\n const { SubqueryBuilderComponent } = await import('../subquery-builder/subquery-builder.component');\n this.subqueryComponentRef = this.subqueryContainer.createComponent(SubqueryBuilderComponent);\n this.subqueryComponentRef.setInput('fields', this.relationFields());\n this.subqueryComponentRef.setInput('initialQuery', this.where());\n this.subquerySubscription = this.subqueryComponentRef.instance.queryChange.subscribe(\n (query: { combinator: 'and' | 'or'; rules: unknown[] } | undefined) => {\n this.handleWhereChange(query);\n }\n );\n } catch (error) {\n console.error('[ValueInput] Failed to load SubqueryBuilderComponent:', error);\n } finally {\n this.subqueryLoading = false;\n }\n }\n\n private destroySubqueryComponent(): void {\n this.subquerySubscription?.unsubscribe();\n this.subquerySubscription = undefined;\n if (this.subqueryComponentRef) {\n this.subqueryComponentRef.destroy();\n this.subqueryComponentRef = undefined;\n }\n }\n}\n","import { FieldSelectorComponent } from '../field-selector/field-selector.component';\nimport { OperatorSelectorComponent } from '../operator-selector/operator-selector.component';\nimport { ValueInputComponent } from '../value-input/value-input.component';\nimport type { QueryBuilderTheme } from './query-builder-theme.token';\n\n/**\n * 默认主题(原生 HTML 实现)\n *\n * @description\n * 不依赖任何第三方 UI 库,使用标准 HTML 表单元素。\n * 适合轻量级场景或作为自定义主题的参考实现。\n *\n * @example\n * ```typescript\n * // 默认主题无需额外配置,开箱即用\n * imports: [QueryBuilderComponent]\n * ```\n */\nexport const DEFAULT_QUERY_BUILDER_THEME: QueryBuilderTheme = {\n fieldSelector: FieldSelectorComponent,\n operatorSelector: OperatorSelectorComponent,\n valueInput: ValueInputComponent\n};\n","import { InjectionToken, Provider, Type } from '@angular/core';\n\n/**\n * QueryBuilder 主题接口\n *\n * @description\n * 定义各 UI 插槽的组件类型,允许替换为不同的 UI 库实现\n *\n * 主题组件需遵循以下约定:\n * - 接受标准 signal inputs(字段、操作符、值等)\n * - 同时支持 output() 事件和可选的 onXxx 回调 input(供 NgComponentOutlet 使用)\n */\nexport interface QueryBuilderTheme {\n /** 字段选择器组件 */\n fieldSelector: Type<unknown>;\n /** 操作符选择器组件 */\n operatorSelector: Type<unknown>;\n /** 值输入组件 */\n valueInput: Type<unknown>;\n}\n\n/**\n * QueryBuilder 主题注入 Token\n *\n * @example\n * ```typescript\n * // 在应用根模块提供自定义主题\n * providers: [provideQueryBuilderTheme(QUERY_BUILDER_XXX_THEME)]\n * ```\n */\nexport const QUERY_BUILDER_THEME = new InjectionToken<QueryBuilderTheme>('QUERY_BUILDER_THEME');\n\n/**\n * 提供自定义主题\n */\nexport function provideQueryBuilderTheme(theme: QueryBuilderTheme): Provider {\n return { provide: QUERY_BUILDER_THEME, useValue: theme };\n}\n","import type { FieldMetadata, QueryBuilderRuleGroup, UIRule, ValidationError } from '@aiao/rxdb-model';\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { DEFAULT_QUERY_BUILDER_THEME } from '../theme/default-query-builder-theme';\nimport { QUERY_BUILDER_THEME } from '../theme/query-builder-theme.token';\n\n/**\n * 带 where 子查询的规则类型\n */\ntype UIRuleWithWhere = UIRule & {\n where?: QueryBuilderRuleGroup<Record<string, unknown>>;\n};\n\n/**\n * 单条查询规则组件\n *\n * @description\n * 显示一条查询规则的编辑界面:\n * - 字段选择器\n * - 操作符选择器\n * - 值输入框\n * - 删除按钮\n */\n@Component({\n selector: 'rxdb-query-rule',\n standalone: true,\n imports: [CommonModule, NgComponentOutlet],\n template: `\n <div class=\"rxdb-query-rule group flex flex-col rounded p-1\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <ng-container [ngComponentOutlet]=\"theme.fieldSelector\" [ngComponentOutletInputs]=\"fieldSelectorInputs()\" />\n <ng-container\n [ngComponentOutlet]=\"theme.operatorSelector\"\n [ngComponentOutletInputs]=\"operatorSelectorInputs()\"\n />\n @if (isExistsOperator()) {\n @if (!subqueryVisible()) {\n <button class=\"btn btn-ghost btn-xs\" (click)=\"onAddSubcondition()\" title=\"添加子条件\" type=\"button\">\n + 子条件(可选)\n </button>\n }\n } @else if (!isNoValueOperator()) {\n <ng-container [ngComponentOutlet]=\"theme.valueInput\" [ngComponentOutletInputs]=\"valueInputInputs()\" />\n }\n <button\n class=\"btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-error ml-auto\"\n (click)=\"onRemove()\"\n title=\"删除条件\"\n type=\"button\"\n >\n ✕\n </button>\n </div>\n @if (isExistsOperator() && subqueryVisible()) {\n <ng-container [ngComponentOutlet]=\"theme.valueInput\" [ngComponentOutletInputs]=\"valueInputInputs()\" />\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryRuleComponent {\n private readonly existsOperators = new Set(['exists', 'notExists']);\n private readonly noValueOperators = new Set(['null', 'notNull']);\n\n /** 注入的主题(回退到默认主题) */\n protected readonly theme = inject(QUERY_BUILDER_THEME, { optional: true }) ?? DEFAULT_QUERY_BUILDER_THEME;\n\n readonly rule = input.required<UIRuleWithWhere>();\n readonly fields = input.required<FieldMetadata[]>();\n readonly errors = input<ValidationError[]>([]);\n\n readonly update = output<{ id: string; updates: Partial<UIRuleWithWhere> }>();\n readonly remove = output<void>();\n\n readonly fieldAsString = computed(() => this.rule().field);\n readonly ruleErrors = computed(() => {\n const seen = new Set<string>();\n return this.errors().filter(e => {\n if (e.field !== this.rule().field) return false;\n if (seen.has(e.message)) return false;\n seen.add(e.message);\n return true;\n });\n });\n readonly errorTooltip = computed(() =>\n this.ruleErrors()\n .map(e => e.message)\n .join(' | ')\n );\n readonly isExistsOperator = computed(() => this.existsOperators.has(this.rule().operator));\n readonly isNoValueOperator = computed(() => this.noValueOperators.has(this.rule().operator));\n\n /** 子查询面板是否展开(已有 where 规则时自动展开) */\n readonly showSubquery = signal(false);\n\n /**\n * 当规则的 where 已有内容时自动展开。\n * 使用 computed 包装监听 rule().where,在显示按钮前检查。\n */\n readonly subqueryVisible = computed(() => {\n const where = this.rule().where;\n if (where && where.rules && where.rules.length > 0) {\n return true;\n }\n return this.showSubquery();\n });\n\n readonly currentField = computed(() => {\n const fieldName = this.rule().field;\n return this.fields().find(f => f.name === fieldName);\n });\n\n readonly currentFieldType = computed(() => this.currentField()?.type ?? 'string');\n readonly currentEnumOptions = computed(() => this.currentField()?.enum ?? []);\n\n /** 当前字段的关系目标实体字段列表 */\n readonly currentRelationFields = computed(() => {\n return this.currentField()?.relationFields ?? [];\n });\n\n /** 规则的 where 子查询 */\n readonly ruleWhere = computed(() => this.rule().where);\n\n /** NgComponentOutlet inputs:字段选择器(fieldChangeCb 是 lazy 引用,声明顺序不影响运行时)*/\n readonly fieldSelectorInputs = computed(() => ({\n fields: this.fields(),\n selectedField: this.fieldAsString(),\n fieldChangeFn: this.fieldChangeCb\n }));\n\n /** NgComponentOutlet inputs:操作符选择器 */\n readonly operatorSelectorInputs = computed(() => ({\n fieldMetadata: this.currentField(),\n fieldType: this.currentFieldType(),\n selectedOperator: this.rule().operator,\n operatorChangeFn: this.operatorChangeCb\n }));\n\n /** NgComponentOutlet inputs:值输入 */\n readonly valueInputInputs = computed(() => ({\n fieldType: this.currentFieldType(),\n operator: this.rule().operator,\n value: this.rule().value,\n enumOptions: this.currentEnumOptions(),\n relationFields: this.currentRelationFields(),\n where: this.ruleWhere(),\n errorMessage: this.errorTooltip(),\n valueChangeFn: this.valueChangeCb,\n whereChangeFn: this.whereChangeCb\n }));\n\n /** 子条件清空/全部删除时自动收起面板并恢复 +子条件 按钮 */\n constructor() {\n effect(() => {\n const where = this.rule().where;\n const hasRules = where && where.rules && where.rules.length > 0;\n if (!hasRules) {\n untracked(() => this.showSubquery.set(false));\n }\n });\n }\n\n // === 公有方法 ===\n /** 字段变更 */\n onFieldChange(fieldName: string): void {\n const field = this.fields().find(f => f.name === fieldName);\n this.update.emit({\n id: this.rule().id,\n updates: {\n field: fieldName,\n operator:\n field?.isRelation ? 'exists'\n : field?.type === 'keyValue' ? 'null'\n : '=',\n value: field?.type === 'boolean' ? false : '',\n where: undefined // 重置子查询\n }\n });\n }\n\n /** 添加子条件:展开面板并创建一条默认子规则 */\n onAddSubcondition(): void {\n this.showSubquery.set(true);\n const relationFields = this.currentRelationFields();\n const firstField = relationFields[0];\n if (firstField) {\n const where: QueryBuilderRuleGroup<Record<string, unknown>> = {\n id: '',\n combinator: 'and',\n rules: [\n {\n id: '',\n field: firstField.name,\n operator:\n firstField.isRelation ? 'exists'\n : firstField.type === 'keyValue' ? 'null'\n : '=',\n value: firstField.type === 'boolean' ? false : ''\n }\n ]\n };\n this.update.emit({ id: this.rule().id, updates: { where } });\n }\n }\n\n /** 操作符变更 */\n onOperatorChange(operator: string): void {\n const updates: Partial<UIRuleWithWhere> = { operator };\n if (this.existsOperators.has(operator) || this.noValueOperators.has(operator)) {\n updates.value = null;\n }\n if (!this.existsOperators.has(operator)) {\n updates.where = undefined;\n this.showSubquery.set(false);\n }\n this.update.emit({ id: this.rule().id, updates });\n }\n\n /** 值变更 */\n onValueChange(value: unknown): void {\n this.update.emit({\n id: this.rule().id,\n updates: { value }\n });\n }\n\n /** 子查询条件变更 */\n onWhereChange(where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined): void {\n this.update.emit({\n id: this.rule().id,\n updates: { where }\n });\n }\n\n /** 删除规则 */\n onRemove(): void {\n this.remove.emit();\n }\n\n // === 私有 callback 字段(computed signal 是懒求值的,this.onXxx 在调用时已初始化)===\n private readonly fieldChangeCb = (field: string) => this.onFieldChange(field);\n private readonly operatorChangeCb = (op: string) => this.onOperatorChange(op);\n private readonly valueChangeCb = (value: unknown) => this.onValueChange(value);\n private readonly whereChangeCb = (where: QueryBuilderRuleGroup<Record<string, unknown>> | undefined) =>\n this.onWhereChange(where);\n}\n","import type { FieldMetadata, UIRule, ValidationError } from '@aiao/rxdb-model';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\nimport { QueryRuleComponent } from '../query-rule/query-rule.component';\n\n/**\n * UI 规则组(宽松类型)\n */\nexport interface UIRuleGroup {\n id: string;\n combinator: 'and' | 'or';\n rules: Array<UIRule | UIRuleGroup>;\n}\n\nexport type QueryDropMode = 'before' | 'after' | 'into';\n\nexport interface QueryDragDropState {\n draggedItemId: string | null;\n targetItemId: string | null;\n dropMode: QueryDropMode | null;\n isValidTarget: boolean;\n depth?: number;\n}\n\nexport class QueryDragDropHandler {\n readonly state = signal<QueryDragDropState>({\n draggedItemId: null,\n targetItemId: null,\n dropMode: null,\n isValidTarget: false\n });\n\n constructor(private readonly moveItemFn: (itemId: string, targetGroupId: string, targetIndex: number) => void) {}\n\n start(itemId: string): void {\n this.state.set({ draggedItemId: itemId, targetItemId: null, dropMode: null, isValidTarget: false });\n }\n\n over(targetItemId: string, dropMode: QueryDropMode, isValid: boolean, depth: number): void {\n this.state.update(current => {\n if (current.depth !== undefined && depth < current.depth) return current;\n return { ...current, targetItemId, dropMode, isValidTarget: isValid, depth };\n });\n }\n\n leave(): void {\n this.state.update(s => ({ ...s, targetItemId: null, dropMode: null, isValidTarget: false, depth: undefined }));\n }\n\n drop(itemId: string, targetGroupId: string, targetIndex: number): void {\n try {\n this.moveItemFn(itemId, targetGroupId, targetIndex);\n } catch {\n // 服务层拒绝(如循环嵌套),静默忽略\n }\n this.reset();\n }\n\n end(): void {\n this.reset();\n }\n\n private reset(): void {\n this.state.set({ draggedItemId: null, targetItemId: null, dropMode: null, isValidTarget: false });\n }\n}\n\nfunction calculateDropMode(clientY: number, rect: DOMRect, isGroup: boolean): QueryDropMode {\n const ratio = (clientY - rect.top) / rect.height;\n if (isGroup) {\n if (ratio < 0.25) return 'before';\n if (ratio > 0.75) return 'after';\n return 'into';\n }\n return ratio < 0.5 ? 'before' : 'after';\n}\n\n/**\n * 查询规则组组件(递归)\n *\n * @description\n * 显示一组查询规则,支持:\n * - AND/OR 切换(Teable 风格:行内 conjunction 前缀)\n * - 添加规则/子组\n * - 删除组\n * - 递归嵌套显示\n */\n@Component({\n selector: 'rxdb-query-group',\n standalone: true,\n imports: [CommonModule, QueryRuleComponent],\n template: `\n <div class=\"rxdb-query-group border-base-300 my-1 rounded-lg border p-2\" [class.bg-base-200]=\"depth() % 2 === 1\">\n <!-- 组合器 + 操作按钮(同一行) -->\n <div class=\"flex items-center gap-2\" [class.mb-2]=\"!collapsed()\">\n <div class=\"join\">\n <button\n class=\"btn btn-xs join-item\"\n [class.btn-ghost]=\"group().combinator !== 'and'\"\n [class.btn-primary]=\"group().combinator === 'and'\"\n (click)=\"toggleCombinator('and')\"\n type=\"button\"\n >\n AND\n </button>\n <button\n class=\"btn btn-xs join-item\"\n [class.btn-ghost]=\"group().combinator !== 'or'\"\n [class.btn-primary]=\"group().combinator === 'or'\"\n (click)=\"toggleCombinator('or')\"\n type=\"button\"\n >\n OR\n </button>\n </div>\n\n @if (allowCollapse()) {\n <button\n class=\"btn btn-ghost btn-xs btn-square\"\n [title]=\"collapsed() ? '展开' : '收起'\"\n (click)=\"toggleCollapse()\"\n type=\"button\"\n >\n <svg\n class=\"h-3 w-3 transition-transform duration-200\"\n [class.-rotate-90]=\"collapsed()\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n }\n\n <div class=\"flex-1\"></div>\n\n @if (!collapsed()) {\n <button class=\"btn btn-ghost btn-xs\" (click)=\"onAddRule()\" type=\"button\">+ 条件</button>\n\n @if (canAddGroup()) {\n <button class=\"btn btn-ghost btn-xs\" (click)=\"onAddGroup()\" type=\"button\">+ 分组</button>\n }\n\n @if (depth() > 0) {\n <button\n class=\"btn btn-ghost btn-xs btn-square text-base-content/40 hover:text-error\"\n (click)=\"onRemove()\"\n title=\"删除组\"\n type=\"button\"\n >\n ✕\n </button>\n }\n }\n </div>\n\n <!-- 规则列表 -->\n @if (!collapsed()) {\n <div class=\"space-y-1\">\n @for (item of group().rules; track trackByItem(item); let idx = $index) {\n @if (isRuleGroup(item)) {\n <div\n class=\"rxdb-drag-item\"\n [class.dragging]=\"isDragging(item.id)\"\n [class.drop-invalid]=\"isDropInvalid(item.id)\"\n [class.drop-target-after]=\"isDropTarget(item.id, 'after')\"\n [class.drop-target-before]=\"isDropTarget(item.id, 'before')\"\n [class.drop-target-into]=\"isDropTarget(item.id, 'into')\"\n (dragend)=\"onItemDragEnd()\"\n (dragleave)=\"onItemDragLeave($event)\"\n (dragover)=\"onItemDragOver($event, item, idx, true)\"\n (drop)=\"onItemDrop($event, item, idx, true)\"\n >\n <div class=\"flex items-start gap-1\">\n @if (dragDropHandler()) {\n <span\n class=\"btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-base-content/60 mt-1 cursor-grab\"\n (dragstart)=\"onItemDragStart($event, item)\"\n draggable=\"true\"\n >⠿</span\n >\n }\n <div class=\"min-w-0 flex-1\">\n <rxdb-query-group\n [allowCollapse]=\"allowCollapse()\"\n [depth]=\"depth() + 1\"\n [dragDropHandler]=\"dragDropHandler()\"\n [errors]=\"errors()\"\n [fields]=\"fields()\"\n [group]=\"asRuleGroup(item)\"\n [maxDepth]=\"maxDepth()\"\n (addGroup)=\"addGroup.emit($event)\"\n (addRule)=\"addRule.emit($event)\"\n (removeItem)=\"removeItem.emit($event)\"\n (updateCombinator)=\"updateCombinator.emit($event)\"\n (updateRule)=\"updateRule.emit($event)\"\n />\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"rxdb-drag-item\"\n [class.dragging]=\"isDragging(item.id)\"\n [class.drop-invalid]=\"isDropInvalid(item.id)\"\n [class.drop-target-after]=\"isDropTarget(item.id, 'after')\"\n [class.drop-target-before]=\"isDropTarget(item.id, 'before')\"\n (dragend)=\"onItemDragEnd()\"\n (dragleave)=\"onItemDragLeave($event)\"\n (dragover)=\"onItemDragOver($event, item, idx, false)\"\n (drop)=\"onItemDrop($event, item, idx, false)\"\n >\n <div class=\"flex items-center gap-1\">\n @if (dragDropHandler()) {\n <span\n class=\"btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-base-content/60 cursor-grab\"\n (dragstart)=\"onItemDragStart($event, item)\"\n draggable=\"true\"\n >⠿</span\n >\n }\n <div class=\"min-w-0 flex-1\">\n <rxdb-query-rule\n [errors]=\"errors()\"\n [fields]=\"fields()\"\n [rule]=\"asRule(item)\"\n (remove)=\"onRuleRemove(asRule(item).id)\"\n (update)=\"onRuleUpdate($event)\"\n />\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- 空状态 -->\n @if (group().rules.length === 0) {\n <div class=\"text-base-content/50 py-2 text-center text-sm select-none\">暂无条件</div>\n }\n }\n </div>\n `,\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: `\n .rxdb-drag-item {\n position: relative;\n }\n .rxdb-drag-item.dragging {\n opacity: 0.4;\n }\n .rxdb-drag-item.drop-target-before::before {\n content: '';\n position: absolute;\n top: -2px;\n left: 0;\n right: 0;\n height: 3px;\n background: oklch(0.6 0.2 250);\n border-radius: 2px;\n z-index: 1;\n }\n .rxdb-drag-item.drop-target-after::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 3px;\n background: oklch(0.6 0.2 250);\n border-radius: 2px;\n z-index: 1;\n }\n .rxdb-drag-item.drop-target-into {\n outline: 2px dashed oklch(0.6 0.2 250);\n outline-offset: -2px;\n border-radius: 0.5rem;\n background: oklch(0.6 0.2 250 / 10%);\n }\n .rxdb-drag-item.drop-invalid {\n outline: 2px dashed oklch(0.6 0.2 30);\n outline-offset: -2px;\n border-radius: 0.5rem;\n }\n `\n})\nexport class QueryGroupComponent {\n readonly group = input.required<UIRuleGroup>();\n readonly fields = input.required<FieldMetadata[]>();\n readonly errors = input<ValidationError[]>([]);\n readonly depth = input<number>(0);\n readonly maxDepth = input<number>(5);\n readonly dragDropHandler = input<QueryDragDropHandler>();\n /** 是否允许展开/收起组(默认开启) */\n readonly allowCollapse = input<boolean>(true);\n\n readonly addRule = output<{ parentId: string; rule: Omit<UIRule, 'id'> }>();\n readonly addGroup = output<string>();\n readonly removeItem = output<string>();\n readonly updateRule = output<{ id: string; updates: Partial<UIRule> }>();\n readonly updateCombinator = output<{ id: string; combinator: 'and' | 'or' }>();\n\n /** 当前组是否已折叠 */\n readonly collapsed = signal(false);\n\n /** 是否可以添加子组(未达到最大深度) */\n readonly canAddGroup = computed(() => this.depth() < this.maxDepth() - 1);\n\n /** 切换折叠状态 */\n toggleCollapse(): void {\n this.collapsed.update(v => !v);\n }\n\n /** 切换组合器 */\n toggleCombinator(combinator: 'and' | 'or'): void {\n if (this.group().combinator !== combinator) {\n this.updateCombinator.emit({ id: this.group().id, combinator });\n }\n }\n\n /** 添加规则 */\n onAddRule(): void {\n const firstField = this.fields()[0];\n if (firstField) {\n this.addRule.emit({\n parentId: this.group().id,\n rule: {\n field: firstField.name,\n operator:\n firstField.isRelation ? 'exists'\n : firstField.type === 'keyValue' ? 'null'\n : '=',\n value: firstField.type === 'boolean' ? false : ''\n }\n });\n }\n }\n\n /** 添加子组 */\n onAddGroup(): void {\n this.addGroup.emit(this.group().id);\n }\n\n /** 删除此组 */\n onRemove(): void {\n this.removeItem.emit(this.group().id);\n }\n\n /** 规则更新 */\n onRuleUpdate(event: { id: string; updates: Partial<UIRule> }): void {\n this.updateRule.emit(event);\n }\n\n /** 删除规则 */\n onRuleRemove(id: string): void {\n this.removeItem.emit(id);\n }\n\n /** 类型守卫:是否为规则组 */\n isRuleGroup(item: UIRuleGroup | UIRule): item is UIRuleGroup {\n return 'combinator' in item && 'rules' in item;\n }\n\n /** 类型转换:转为规则组 */\n asRuleGroup(item: UIRuleGroup | UIRule): UIRuleGroup {\n return item as UIRuleGroup;\n }\n\n /** 类型转换:转为规则 */\n asRule(item: UIRuleGroup | UIRule): UIRule {\n return item as UIRule;\n }\n\n /** 追踪函数 */\n trackByItem(item: UIRuleGroup | UIRule): string {\n return item.id;\n }\n\n isDragging(itemId: string): boolean {\n return this.dragDropHandler()?.state().draggedItemId === itemId;\n }\n\n isDropTarget(itemId: string, mode: QueryDropMode): boolean {\n const state = this.dragDropHandler()?.state();\n return !!state && state.targetItemId === itemId && state.dropMode === mode && state.isValidTarget;\n }\n\n isDropInvalid(itemId: string): boolean {\n const state = this.dragDropHandler()?.state();\n return !!state && state.targetItemId === itemId && !state.isValidTarget && !!state.draggedItemId;\n }\n\n onItemDragStart(event: DragEvent, item: UIRule | UIRuleGroup): void {\n const handler = this.dragDropHandler();\n if (!handler || !event.dataTransfer) return;\n event.stopPropagation();\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', item.id);\n const row = (event.target as HTMLElement).closest('.rxdb-drag-item') as HTMLElement | null;\n if (row) {\n const rect = row.getBoundingClientRect();\n event.dataTransfer.setDragImage(row, event.clientX - rect.left, event.clientY - rect.top);\n }\n handler.start(item.id);\n }\n\n onItemDragOver(event: DragEvent, item: UIRule | UIRuleGroup, index: number, isGroup: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n const handler = this.dragDropHandler();\n if (!handler || !event.dataTransfer) return;\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n const dropMode = calculateDropMode(event.clientY, rect, isGroup);\n const draggedId = handler.state().draggedItemId;\n const isValid = !!draggedId && draggedId !== item.id && (dropMode !== 'into' || isGroup);\n event.dataTransfer.dropEffect = isValid ? 'move' : 'none';\n handler.over(item.id, dropMode, isValid, this.depth());\n }\n\n onItemDragLeave(event: DragEvent): void {\n const target = event.currentTarget as HTMLElement;\n const related = event.relatedTarget as Node | null;\n if (!related || !target.contains(related)) {\n this.dragDropHandler()?.leave();\n }\n }\n\n onItemDrop(event: DragEvent, targetItem: UIRule | UIRuleGroup, targetIndex: number, isGroup: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n const handler = this.dragDropHandler();\n const state = handler?.state();\n if (!handler || !state?.draggedItemId || !state.isValidTarget || !state.dropMode) {\n handler?.end();\n return;\n }\n const dropMode = state.dropMode;\n let finalTargetGroupId: string;\n let finalTargetIndex: number;\n if (dropMode === 'into' && isGroup) {\n const subGroup = targetItem as UIRuleGroup;\n finalTargetGroupId = subGroup.id;\n const draggedInTarget = subGroup.rules.some(r => r.id === state.draggedItemId);\n finalTargetIndex = draggedInTarget ? subGroup.rules.length - 1 : subGroup.rules.length;\n } else {\n finalTargetGroupId = this.group().id;\n const rules = this.group().rules;\n const draggedIndex = rules.findIndex(r => r.id === state.draggedItemId);\n const isInSameGroup = draggedIndex !== -1;\n let adjustedIndex = targetIndex;\n if (isInSameGroup && draggedIndex < targetIndex) {\n adjustedIndex--;\n }\n finalTargetIndex = dropMode === 'before' ? adjustedIndex : adjustedIndex + 1;\n }\n handler.drop(state.draggedItemId, finalTargetGroupId, finalTargetIndex);\n }\n\n onItemDragEnd(): void {\n this.dragDropHandler()?.end();\n }\n}\n","import {\n createQueryBuilderService,\n type FieldMetadata,\n type QueryBuilderService,\n type SchemaInfo,\n type UIRule,\n type ValidationResult\n} from '@aiao/rxdb-model';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n OnDestroy,\n output,\n Signal,\n viewChild\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { QueryDragDropHandler, QueryGroupComponent, type UIRuleGroup } from '../query-group/query-group.component';\n\n/**\n * RxDB 查询输出格式\n */\nexport interface RxDBQueryOutput<T> {\n combinator: 'and' | 'or';\n rules: Array<RxDBQueryOutput<T> | { field: keyof T & string; operator: string; value: unknown }>;\n}\n\n/**\n * Angular Query Builder 主组件\n *\n * @description\n * 提供可视化的查询条件构建界面,支持:\n * - 传入 SchemaInfo 或 FieldMetadata[] 定义可用字段\n * - 拖拽重排规则和分组\n * - 嵌套分组(最大 5 层)\n * - 实时验证\n *\n * @example\n * ```html\n * <rxdb-query-builder\n * [schema]=\"schema\"\n * (queryChange)=\"onQueryChange($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'rxdb-query-builder',\n standalone: true,\n imports: [CommonModule, QueryGroupComponent],\n template: `\n <div\n class=\"rxdb-query-builder bg-base-100\"\n (keydown)=\"onKeyDown($event)\"\n aria-label=\"查询条件构建器\"\n role=\"search\"\n tabindex=\"0\"\n >\n <div class=\"overflow-y-auto\" #scrollContainer [style.max-height]=\"height()\">\n <!-- 标题栏 -->\n <div class=\"mb-4 flex items-center justify-between\">\n <h3 class=\"text-base\" id=\"query-builder-title\">查询条件</h3>\n <div class=\"flex gap-2\" aria-label=\"查询操作\" role=\"toolbar\">\n @if (hasRules()) {\n <button\n class=\"btn btn-ghost btn-sm\"\n (click)=\"clearAll()\"\n (keydown.enter)=\"clearAll()\"\n aria-label=\"清空所有查询条件\"\n title=\"清空所有查询条件 (Escape)\"\n type=\"button\"\n >\n 清空\n </button>\n }\n </div>\n </div>\n\n <!-- 空状态提示 -->\n @if (!hasRules()) {\n <div class=\"text-base-content/60 min-w-md py-8 text-center\" aria-live=\"polite\" role=\"status\">\n <div class=\"mb-2 flex justify-center\" aria-hidden=\"true\">\n <svg\n class=\"size-12 opacity-40\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n </div>\n <p class=\"mb-4\">还没有任何查询条件</p>\n <button class=\"btn btn-sm\" (click)=\"addFirstRule()\" aria-label=\"添加第一个条件\" type=\"button\">\n 添加第一个条件\n </button>\n </div>\n } @else {\n <!-- 根规则组 -->\n <rxdb-query-group\n [allowCollapse]=\"enableCollapse()\"\n [depth]=\"0\"\n [dragDropHandler]=\"enableDrag() ? dragDropHandler : undefined\"\n [errors]=\"validationErrors()\"\n [fields]=\"fieldsComputed()\"\n [group]=\"rootGroup()!\"\n [maxDepth]=\"maxDepth()\"\n (addGroup)=\"onAddGroup($event)\"\n (addRule)=\"onAddRule($event)\"\n (removeItem)=\"onRemoveItem($event)\"\n (updateCombinator)=\"onUpdateCombinator($event)\"\n (updateRule)=\"onUpdateRule($event)\"\n role=\"region\"\n />\n }\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryBuilderComponent<T extends object> implements OnDestroy {\n private readonly service: QueryBuilderService<T>;\n /** 上次应用的 initialQuery 引用,用于检测是否有新查询需要加载 */\n private lastAppliedInitialQuery: unknown = undefined;\n\n private readonly scrollContainer = viewChild<ElementRef<HTMLElement>>('scrollContainer');\n\n /** 根规则组 Signal */\n private readonly rootGroupSignal: Signal<unknown>;\n\n /** 验证 Signal */\n private readonly validationSignal: Signal<ValidationResult | undefined>;\n\n /**\n * Schema 信息,包含字段定义\n */\n readonly schema = input<SchemaInfo>();\n\n /**\n * 字段列表(直接传入,优先于 schema)\n */\n readonly fields = input<FieldMetadata[]>([]);\n\n /**\n * 初始查询条件(可选)\n */\n readonly initialQuery = input<RxDBQueryOutput<T>>();\n\n /**\n * 最大嵌套层级(默认 5)\n */\n readonly maxDepth = input<number>(5);\n\n /**\n * 内容区域最大高度(超出后滚动),支持任意 CSS 长度值,如 `'400px'`、`'50vh'`\n */\n readonly height = input<string>('80vh');\n\n /**\n * 是否开启拖拽排序功能(默认开启)\n */\n readonly enableDrag = input<boolean>(true);\n\n /**\n * 是否开启分组展开/收起功能(默认开启)\n */\n readonly enableCollapse = input<boolean>(true);\n\n readonly dragDropHandler: QueryDragDropHandler;\n\n /**\n * 查询条件变更事件\n */\n readonly queryChange = output<RxDBQueryOutput<T>>();\n\n /**\n * 验证状态变更事件\n */\n readonly validationChange = output<ValidationResult>();\n\n /** 计算后的字段列表 */\n readonly fieldsComputed: Signal<FieldMetadata[]> = computed(() => {\n // 优先使用直接传入的 fields\n const directFields = this.fields();\n if (directFields && directFields.length > 0) {\n return directFields;\n }\n // 否则从 schema 获取\n const schemaInfo = this.schema();\n return schemaInfo?.fields ?? [];\n });\n\n /** 根规则组 */\n readonly rootGroup: Signal<UIRuleGroup | undefined> = computed(() => {\n return this.rootGroupSignal() as UIRuleGroup | undefined;\n });\n\n /** 验证错误列表 */\n readonly validationErrors = computed(() => {\n const validation = this.validationSignal();\n return validation?.errors ?? [];\n });\n\n /** 是否有规则 */\n readonly hasRules = computed(() => {\n const group = this.rootGroup();\n return group && group.rules.length > 0;\n });\n\n constructor() {\n // 在构造函数中初始化服务(非 reactive context)\n this.service = createQueryBuilderService<T>({\n config: {\n maxNestingLevel: this.maxDepth()\n }\n });\n\n this.dragDropHandler = new QueryDragDropHandler((itemId, targetGroupId, targetIndex) =>\n this.service.moveItem(itemId, targetGroupId, targetIndex)\n );\n\n // 转换 Observable 为 Signal(必须在 reactive context 外部)\n this.rootGroupSignal = toSignal(this.service.rootGroup$, { requireSync: true });\n this.validationSignal = toSignal(this.service.validation$, { initialValue: undefined });\n\n // 监听字段变化并同步到服务\n effect(() => {\n const fields = this.fieldsComputed();\n if (fields.length > 0) {\n this.service.setFields(fields);\n }\n });\n\n // 监听初始查询并加载(引用变化时重新加载,用户修改不影响此 signal 故不会覆盖)\n effect(() => {\n const initial = this.initialQuery();\n if (initial !== undefined && initial !== this.lastAppliedInitialQuery) {\n this.lastAppliedInitialQuery = initial;\n this.service.fromRxDBQuery(initial as any);\n }\n });\n\n // 监听查询变化并发出事件\n effect(() => {\n const group = this.rootGroup();\n if (group) {\n const query = this.service.toRxDBQuery();\n this.queryChange.emit(query as RxDBQueryOutput<T>);\n }\n });\n\n // 监听验证变化并发出事件\n effect(() => {\n const validation = this.validationSignal();\n if (validation) {\n this.validationChange.emit(validation);\n }\n });\n }\n\n /** 销毁服务 */\n ngOnDestroy(): void {\n this.service.destroy();\n }\n\n /** 添加第一个规则 */\n addFirstRule(): void {\n const firstField = this.fieldsComputed()[0];\n if (firstField) {\n this.service.addRule(undefined, {\n field: firstField.name,\n operator:\n firstField.isRelation ? 'exists'\n : firstField.type === 'keyValue' ? 'null'\n : '=',\n value: firstField.type === 'boolean' ? false : ''\n } as any);\n }\n }\n\n /** 清空所有规则 */\n clearAll(): void {\n this.service.clear();\n }\n\n /** 添加规则到指定组 */\n onAddRule(event: { parentId: string; rule: Omit<UIRule, 'id'> }): void {\n this.service.addRule(event.parentId, event.rule as any);\n this.scrollToBottom();\n }\n\n /** 添加子组到指定组 */\n onAddGroup(parentId: string): void {\n this.service.addGroup(parentId);\n this.scrollToBottom();\n }\n\n /** 删除规则或组 */\n onRemoveItem(id: string): void {\n this.service.remove(id);\n }\n\n /** 更新规则 */\n onUpdateRule(event: { id: string; updates: Partial<UIRule> }): void {\n this.service.updateRule(event.id, event.updates as any);\n }\n\n /** 更新组合器 */\n onUpdateCombinator(event: { id: string; combinator: 'and' | 'or' }): void {\n this.service.updateGroupCombinator(event.id, event.combinator);\n }\n\n /** 键盘快捷键处理 */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.hasRules()) {\n event.preventDefault();\n this.clearAll();\n return;\n }\n }\n\n private scrollToBottom(): void {\n setTimeout(() => {\n const el = this.scrollContainer()?.nativeElement;\n el?.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }, 0);\n }\n}\n","import { getEntityMetadata, RelationKind, RxDB, type EntityType, type FindByCursorOptions } from '@aiao/rxdb';\nimport { InfiniteScrollingList } from '@aiao/rxdb-angular';\nimport {\n actionsColumn,\n buildEditableColumns,\n buildFormFields,\n extractFieldsFromMetadata,\n organizeFields,\n parsePropertyColumnValue,\n type BatchChangeItem,\n type CellChangeEvent,\n type EntityFormData,\n type EntityTableRecord,\n type FieldMetadata,\n type FormFieldConfig,\n type ModelInfo,\n type RelatedEntityProvider,\n type ValidationResult\n} from '@aiao/rxdb-model';\nimport { Dialog, DialogRef } from '@angular/cdk/dialog';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ErrorHandler,\n forwardRef,\n HostListener,\n inject,\n Injector,\n input,\n linkedSignal,\n output,\n PLATFORM_ID,\n runInInjectionContext,\n signal,\n TemplateRef,\n viewChild,\n type WritableSignal\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport type { ColumnsDefine } from '@visactor/vtable';\nimport { Funnel, LucideAngularModule, Redo2, Undo2 } from 'lucide-angular';\nimport type { EntityDetailDialogData } from '../entity-detail/entity-detail';\nimport { EntityDialogComponent } from '../entity-dialog/entity-dialog.component';\nimport { QueryTableComponent } from '../entity-table/query-table/query-table.component';\nimport { QueryBuilderComponent } from '../query-builder/query-builder/query-builder.component';\n\n/** RxDB 实体实例(用于 CRUD 操作) */\ntype EntityInstance = {\n [key: string]: unknown;\n readonly id: string;\n save(): Promise<void>;\n remove(): Promise<void>;\n};\n\ntype FilterQuery = { combinator: 'and' | 'or'; rules: unknown[] };\n\nconst EMPTY_FILTER: FilterQuery = { combinator: 'and', rules: [] };\n\n/**\n * 实体列表组件\n *\n * 封装了实体列表的完整 UI:工具栏(显示名称、筛选、撤销/重做、新增)+ 数据表格。\n * 通过 `namespace` 和 `name` 输入定位 RxDB 实体,实现懒加载分页和 CRUD 操作。\n *\n * @example\n * ```html\n * <rxdb-entity-list [namespace]=\"namespace()\" [name]=\"name()\" />\n * ```\n */\n@Component({\n selector: 'rxdb-entity-list',\n templateUrl: './entity-list.component.html',\n host: {\n style: 'display:flex;flex-direction:column;height:100%;overflow:hidden'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n QueryTableComponent,\n QueryBuilderComponent,\n LucideAngularModule,\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n forwardRef(() => EntityListComponent),\n forwardRef(() => EntityDialogComponent)\n ]\n})\nexport class EntityListComponent {\n #m2mDialogRef: DialogRef<unknown, unknown> | null = null;\n // ── Service injections ────────────────────────────────────────────────\n readonly #rxdb = inject(RxDB);\n readonly #injector = inject(Injector);\n readonly #dialog = inject(Dialog);\n readonly #errorHandler = inject(ErrorHandler);\n\n // ── Save coalescing ───────────────────────────────────────────────────\n readonly #pendingChanges = new Map<string, Record<string, unknown>>();\n #flushHandle = false;\n\n // ── Entity registry ───────────────────────────────────────────────────\n readonly #entityClsMap = new Map<string, EntityType>(\n this.#rxdb.config.entities.map(cls => {\n const meta = getEntityMetadata(cls);\n return [`${meta.namespace}:${meta.name}`, cls] as const;\n })\n );\n\n readonly #modelInfoMap = new Map<string, ModelInfo>(\n this.#rxdb.config.entities.map(cls => {\n const meta = getEntityMetadata(cls);\n return [\n meta.name,\n {\n name: meta.name,\n displayName: meta.displayName ?? meta.name,\n entityClass: cls as new (...args: unknown[]) => unknown,\n metadata: meta\n }\n ] as const;\n })\n );\n\n readonly #scrollListMap = new Map<string, InfiniteScrollingList<EntityType>>();\n\n readonly #columnsCache = new Map<string, ColumnsDefine>(\n this.#rxdb.config.entities.map(cls => {\n const meta = getEntityMetadata(cls);\n return [\n `${meta.namespace}:${meta.name}`,\n buildEditableColumns(meta, {\n relatedItemsProviderFactory: (fkField, relatedEntityName) => {\n const relCls = [...this.#entityClsMap.values()].find(c => {\n const m = getEntityMetadata(c);\n return m.name === relatedEntityName;\n });\n if (!relCls) return undefined;\n const relKey = (() => {\n const m = getEntityMetadata(relCls);\n return `${m.namespace}:${m.name}`;\n })();\n const list = this.#getOrCreateList(relKey, relCls);\n const strVal = (v: unknown): string | undefined => (typeof v === 'string' && v.length > 0 ? v : undefined);\n return () => {\n return (list.value() as Record<string, unknown>[]).map(inst => ({\n id: String(inst['id'] ?? ''),\n displayName: strVal(inst['displayName']) ?? strVal(inst['name']) ?? String(inst['id'] ?? '')\n }));\n };\n }\n })\n ] as const;\n })\n );\n\n readonly #vHistory = this.#rxdb.versionManager.history();\n readonly #entityKey = computed(() => `${this.namespace()}:${this.name()}`);\n readonly #currentList = signal<InfiniteScrollingList<EntityType> | undefined>(undefined);\n\n readonly #instances = computed<EntityInstance[]>(() => {\n const list = this.#currentList();\n return list ? (list.value() as EntityInstance[]) : [];\n });\n\n readonly #entityCls = computed(() => this.#entityClsMap.get(this.#entityKey()));\n\n /** 级联新增模式下本地草稿子实体(未保存到DB,由父实体级联保存) */\n readonly #localDraftItems = signal<EntityInstance[]>([]);\n\n // ── Protected view bindings ───────────────────────────────────────────\n protected readonly Undo2 = Undo2;\n protected readonly Redo2 = Redo2;\n protected readonly Funnel = Funnel;\n\n /** CDK Overlay 定位策略:优先下方右对齐,其次上方右对齐 */\n protected readonly overlayPositions = [\n {\n originX: 'end' as const,\n originY: 'bottom' as const,\n overlayX: 'end' as const,\n overlayY: 'top' as const,\n offsetY: 4\n },\n {\n originX: 'end' as const,\n originY: 'top' as const,\n overlayX: 'end' as const,\n overlayY: 'bottom' as const,\n offsetY: -4\n }\n ];\n\n protected readonly loadMore = computed(() => {\n const list = this.#currentList();\n return list ? () => list.loadMore() : undefined;\n });\n\n // ── Route inputs ──────────────────────────────────────────────────────\n readonly namespace = input.required<string>();\n readonly name = input.required<string>();\n\n /** 固定查询条件,与用户筛选条件做 AND 合并(用于关系属性过滤,如 ownerId = currentId) */\n readonly fixedQuery = input<FilterQuery | undefined>(undefined);\n\n /** 预填充的外键数据(级联新增时传递给子实体对话框) */\n readonly fixedFormData = input<EntityFormData | undefined>(undefined);\n\n /** 草稿父实体(用于级联新增场景,子实体通过关系API注册到父实体) */\n readonly draftParentEntity = input<EntityInstance | null>(null);\n\n /** 父实体上关系属性名(如 'children'),用于调用 parent.children$.add(child) */\n readonly parentRelationName = input<string | undefined>(undefined);\n\n /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */\n readonly creationChain = input<string[]>([]);\n\n /** 关系类型(MANY_TO_MANY 时启用选择模式) */\n readonly relationKind = input<RelationKind | undefined>(undefined);\n\n /** 父实体实例(用于 M2M 关系操作,包含 draft 和已保存实体) */\n readonly parentEntity = input<EntityInstance | null>(null);\n\n /** 列表模式:default=普通列表, select=选择模式(带 checkbox 列) */\n readonly mode = input<'default' | 'select'>('default');\n\n /** 已关联的实体 ID 集合(选择模式下过滤掉,不再展示) */\n readonly alreadyLinkedIds = input<Set<string>>(new Set());\n\n /** 点击「查看」按钮时触发,携带对应行记录 */\n readonly viewEntity = output<EntityTableRecord>();\n\n /** 选择模式:确认选择时触发,携带选中的实体实例 */\n readonly selectionConfirmed = output<EntityInstance[]>();\n\n /** 选择模式:取消选择时触发 */\n readonly selectionCancelled = output<void>();\n\n // ── Reactive state ────────────────────────────────────────────────────\n readonly filterQuery: WritableSignal<FilterQuery> = linkedSignal(() => {\n this.namespace();\n this.name();\n return { ...EMPTY_FILTER };\n });\n\n readonly $isFilterQuery = computed(() => this.filterQuery().rules.length > 0);\n\n readonly showFilterPopover = signal(false);\n\n readonly pendingQuery: WritableSignal<FilterQuery> = linkedSignal(() => {\n this.namespace();\n this.name();\n return { ...EMPTY_FILTER };\n });\n\n readonly pendingQueryValid = signal(true);\n\n readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n readonly displayName = computed(() => {\n const cls = this.#entityCls();\n if (!cls) return this.name();\n const meta = getEntityMetadata(cls);\n return meta.displayName ?? meta.name;\n });\n\n /** 当前实体是否存在于祖先创建链路中(循环创建检测) */\n readonly isCreateBlocked = computed(() => this.creationChain().includes(this.#entityKey()));\n\n readonly isQueryActive = computed(() => this.filterQuery().rules.length > 0);\n readonly filteredCount = computed(() => this.#instances().length + this.#localDraftItems().length);\n\n readonly isInitialLoading = computed(() => {\n const list = this.#currentList();\n return list ? list.isLoading() && list.value().length === 0 : false;\n });\n\n readonly isLoadingMore = computed(() => {\n const list = this.#currentList();\n return list ? list.isLoading() && list.value().length > 0 : false;\n });\n\n readonly undoCount = toSignal(this.#vHistory.undoCount$, { initialValue: 0 });\n readonly redoCount = toSignal(this.#vHistory.redoCount$, { initialValue: 0 });\n readonly canUndo = computed(() => this.undoCount() > 0);\n readonly canRedo = computed(() => this.redoCount() > 0);\n\n readonly queryBuilderFields = computed<FieldMetadata[]>(() => {\n const cls = this.#entityCls();\n if (!cls) return [];\n return organizeFields(extractFieldsFromMetadata(getEntityMetadata(cls), this.#modelInfoMap));\n });\n\n readonly tableRecords = computed<EntityTableRecord[]>(() => {\n const dbRecords = this.#instances().map(inst => ({ ...(inst as Record<string, unknown>) }));\n const draftRecords = this.#localDraftItems().map(inst => ({ ...(inst as Record<string, unknown>) }));\n let records: EntityTableRecord[] = [...draftRecords, ...dbRecords];\n if (this.isSelectMode()) {\n const linkedIds = this.alreadyLinkedIds();\n const selIds = this.selectedIds();\n records = records\n .filter(r => !linkedIds.has(r['id'] as string))\n .map(r => ({ ...r, __selected: selIds.has(r['id'] as string) }));\n }\n return records;\n });\n\n readonly tableColumns = computed<ColumnsDefine>(() => {\n const base = this.#columnsCache.get(this.#entityKey()) ?? [actionsColumn('操作', '删除', '查看')];\n if (this.isSelectMode()) {\n const withoutActions = base.filter(c => (c as Record<string, unknown>)['field'] !== 'actions');\n return [{ field: '__selected', title: '', cellType: 'checkbox', width: 50 }, ...withoutActions];\n }\n return base;\n });\n\n readonly createFormFieldConfigs = computed<FormFieldConfig[]>(() => {\n const cls = this.#entityCls();\n if (!cls) return [];\n const meta = getEntityMetadata(cls);\n return buildFormFields(meta, 'create');\n });\n\n // ── Select mode ───────────────────────────────────────────────────────\n readonly isSelectMode = computed(() => this.mode() === 'select');\n readonly isM2m = computed(() => this.relationKind() === RelationKind.MANY_TO_MANY);\n\n readonly m2mSelectTpl = viewChild<TemplateRef<void>>('m2mSelectTpl');\n\n readonly selectedIds = signal<Set<string>>(new Set());\n readonly selectedCount = computed(() => this.selectedIds().size);\n\n readonly m2mAlreadyLinkedIds = computed<Set<string>>(() => {\n const dbIds = this.#instances().map(e => e.id);\n const draftIds = this.#localDraftItems().map(e => e.id);\n return new Set([...dbIds, ...draftIds]);\n });\n\n // ── Constructor ───────────────────────────────────────────────────────\n\n constructor() {\n toObservable(this.#entityKey)\n .pipe(takeUntilDestroyed())\n .subscribe(key => {\n const cls = this.#entityClsMap.get(key);\n if (!cls) {\n this.#currentList.set(undefined);\n return;\n }\n this.#currentList.set(this.#getOrCreateList(key, cls));\n });\n }\n\n // ── Event handlers ────────────────────────────────────────────────────\n\n toggleFilterPopover(): void {\n this.showFilterPopover.update(v => !v);\n }\n\n applyFilter(): void {\n this.filterQuery.set({ ...this.pendingQuery() });\n this.showFilterPopover.set(false);\n }\n\n resetFilter(): void {\n this.pendingQuery.set({ ...EMPTY_FILTER });\n this.filterQuery.set({ ...EMPTY_FILTER });\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(e: KeyboardEvent): void {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n if ((e.ctrlKey || e.metaKey) && e.key === 'z') {\n if (e.shiftKey) {\n if (this.canRedo()) {\n e.preventDefault();\n void this.redo();\n }\n } else {\n if (this.canUndo()) {\n e.preventDefault();\n void this.undo();\n }\n }\n }\n }\n\n onQueryChange(query: { combinator: 'and' | 'or'; rules: unknown[] } | undefined): void {\n this.pendingQuery.set(query ?? { ...EMPTY_FILTER });\n }\n\n onValidationChange(result: ValidationResult): void {\n this.pendingQueryValid.set(result.valid);\n }\n\n onCellChanged(event: CellChangeEvent): void {\n if (!event.field || event.field === 'actions') return;\n if (event.field === '__selected') {\n const id = event.record['id'] as string;\n this.selectedIds.update(set => {\n const next = new Set(set);\n if (event.value) next.add(id);\n else next.delete(id);\n return next;\n });\n return;\n }\n const id = event.record['id'] as string;\n const entityCls = this.#entityCls();\n let value = event.value;\n if (entityCls) {\n const prop = getEntityMetadata(entityCls).propertyMap.get(event.field);\n if (prop) value = parsePropertyColumnValue(prop.type, event.value);\n }\n this.#enqueue(id, { [event.field]: value });\n }\n\n undo(): void {\n this.#vHistory.undo();\n }\n\n redo(): void {\n this.#vHistory.redo();\n }\n\n async onIconClicked(event: { name: string; record: EntityTableRecord }): Promise<void> {\n if (event.name === 'view-action') {\n this.viewEntity.emit(event.record);\n return;\n }\n if (event.name !== 'delete-action') return;\n const id = event.record['id'] as string;\n\n const draftInst = this.#localDraftItems().find(i => i.id === id);\n if (draftInst) {\n this.#localDraftItems.update(items => items.filter(i => i.id !== id));\n return;\n }\n\n const inst = this.#instances().find(i => i.id === id);\n if (!inst) return;\n try {\n await inst.remove();\n } catch (e) {\n this.#errorHandler.handleError(e);\n }\n }\n\n async onRowDeleted(event: EntityTableRecord): Promise<void> {\n await this.onIconClicked({ name: 'delete-action', record: event });\n }\n\n onBatchUpdated(mutations: BatchChangeItem[]): void {\n for (const { recordId, changes } of mutations) {\n const filtered = Object.fromEntries(Object.entries(changes).filter(([k]) => k && k !== 'actions'));\n if (Object.keys(filtered).length) this.#enqueue(recordId, filtered);\n }\n }\n\n openCreateDialog(): void {\n if (this.isCreateBlocked()) return;\n\n const fields = this.createFormFieldConfigs();\n const cls = this.#entityCls();\n if (!cls || fields.length === 0) return;\n\n const meta = getEntityMetadata(cls);\n const strVal = (v: unknown): string | undefined => (typeof v === 'string' && v.length > 0 ? v : undefined);\n const draftParent = this.draftParentEntity();\n const relatedEntityProvider: RelatedEntityProvider = (entityName, namespace) => {\n const relCls = [...this.#entityClsMap.values()].find(c => {\n const m = getEntityMetadata(c);\n return m.name === entityName && (!namespace || m.namespace === namespace);\n });\n if (!relCls) return [];\n const relMeta = getEntityMetadata(relCls);\n const list = this.#getOrCreateList(`${relMeta.namespace}:${relMeta.name}`, relCls);\n const items = (list.value() as Record<string, unknown>[]).map(inst => ({\n id: String(inst['id'] ?? ''),\n displayName: strVal(inst['displayName']) ?? strVal(inst['name']) ?? String(inst['id'] ?? '')\n }));\n if (draftParent) {\n const parentMeta = getEntityMetadata((draftParent as any).constructor as EntityType);\n if (parentMeta.name === entityName && (!namespace || parentMeta.namespace === namespace)) {\n const parentId = String(draftParent.id);\n if (!items.some(i => i.id === parentId)) {\n items.push({\n id: parentId,\n displayName: strVal(draftParent['displayName']) ?? strVal(draftParent['name']) ?? parentId\n });\n }\n }\n }\n return items;\n };\n\n void import('../entity-detail/entity-detail').then(({ EntityDetailComponent }) => {\n const dialogRef = this.#dialog.open(EntityDetailComponent, {\n width: '720px',\n minWidth: '400px',\n height: '80vh',\n minHeight: '300px',\n panelClass: 'entity-detail-dialog',\n data: {\n metadata: meta,\n formFields: fields,\n formData: {},\n formMode: 'create' as const,\n relatedEntityProvider,\n fixedFormData: this.fixedFormData(),\n delegateSave: !!this.draftParentEntity(),\n creationChain: this.creationChain()\n } satisfies EntityDetailDialogData\n });\n\n dialogRef.componentInstance!.formSubmitted.subscribe((result: EntityFormData) => {\n this.#handleCreateSubmit(result);\n dialogRef.close();\n });\n\n dialogRef.closed.subscribe(result => {\n if (result === 'saved') this.#currentList()?.refresh();\n });\n });\n }\n\n // ── M2M / Select mode methods ─────────────────────────────────────────\n\n openM2mSelectDialog(): void {\n if (this.#m2mDialogRef) return;\n const tpl = this.m2mSelectTpl();\n if (!tpl) return;\n\n const ref = this.#dialog.open(tpl, {\n width: '720px',\n minWidth: '400px',\n height: '70vh',\n minHeight: '300px',\n panelClass: 'entity-m2m-select-dialog'\n });\n this.#m2mDialogRef = ref as any;\n\n ref.closed.subscribe(() => {\n this.#m2mDialogRef = null;\n });\n }\n\n onM2mSelectionConfirmed(entities: EntityInstance[]): void {\n const parent = this.parentEntity();\n const relName = this.parentRelationName();\n\n if (parent && relName) {\n const relation = (parent as Record<string, unknown>)[relName + '$'];\n if (relation && typeof (relation as Record<string, unknown>)['add'] === 'function') {\n (relation as { add(...args: unknown[]): void }).add(...entities);\n }\n\n if (!this.draftParentEntity()) {\n parent\n .save()\n .then(() => this.#currentList()?.refresh())\n .catch(e => this.#errorHandler.handleError(e));\n } else {\n this.#localDraftItems.update(items => [...items, ...entities]);\n }\n }\n\n this.#m2mDialogRef?.close();\n }\n\n m2mCancelSelection(): void {\n this.#m2mDialogRef?.close();\n }\n\n confirmSelection(): void {\n const ids = this.selectedIds();\n if (ids.size === 0) {\n this.selectionCancelled.emit();\n return;\n }\n const entities = this.#instances().filter(e => ids.has(e.id));\n this.selectionConfirmed.emit(entities);\n }\n\n cancelSelection(): void {\n this.selectionCancelled.emit();\n }\n\n // ── Private helpers ───────────────────────────────────────────────────\n\n async #handleCreateSubmit(data: EntityFormData): Promise<void> {\n const cls = this.#entityCls();\n if (!cls) return;\n\n const parent = this.draftParentEntity();\n const relName = this.parentRelationName();\n\n if (parent && relName) {\n const child = new (cls as any)(data) as EntityInstance;\n const relation = (parent as any)[relName + '$'];\n if (relation && typeof relation.add === 'function') {\n relation.add(child);\n }\n this.#localDraftItems.update(items => [...items, child]);\n return;\n }\n\n try {\n const inst = new (cls as any)(data) as EntityInstance;\n await inst.save();\n this.#currentList()?.refresh();\n } catch (e) {\n this.#errorHandler.handleError(e);\n }\n }\n\n #getOrCreateList(key: string, cls: EntityType): InfiniteScrollingList<EntityType> {\n const cached = this.#scrollListMap.get(key);\n if (cached) return cached;\n const options = computed<FindByCursorOptions<EntityType>>(() => {\n const userFilter = this.filterQuery();\n const fixed = this.fixedQuery();\n let where: FilterQuery;\n if (!fixed || fixed.rules.length === 0) {\n where = userFilter;\n } else if (userFilter.rules.length === 0) {\n where = fixed;\n } else {\n where = { combinator: 'and', rules: [...fixed.rules, ...userFilter.rules] };\n }\n return {\n where: where as never,\n orderBy: [{ field: 'id' as const, sort: 'desc' as const }]\n };\n });\n const list = runInInjectionContext(this.#injector, () => new InfiniteScrollingList(this.#rxdb, cls, options));\n this.#scrollListMap.set(key, list);\n return list;\n }\n\n #enqueue(recordId: string, changes: Record<string, unknown>): void {\n const cur = this.#pendingChanges.get(recordId) ?? {};\n this.#pendingChanges.set(recordId, { ...cur, ...changes });\n if (this.#flushHandle) return;\n this.#flushHandle = true;\n queueMicrotask(() => {\n this.#flushHandle = false;\n const snapshot = [...this.#pendingChanges.entries()];\n this.#pendingChanges.clear();\n void this.#flushPending(snapshot);\n });\n }\n\n async #flushPending(pending: [string, Record<string, unknown>][]): Promise<void> {\n if (!pending.length) return;\n const EntityClass = this.#entityCls();\n if (!EntityClass) return;\n const toUpdate = new Set<EntityInstance>();\n const prevMap = new Map<EntityInstance, Record<string, unknown>>();\n const draftUpdated = new Set<EntityInstance>();\n for (const [id, changes] of pending) {\n let inst = this.#instances().find(i => i.id === id);\n const isDraft = !inst;\n if (!inst) {\n inst = this.#localDraftItems().find(i => i.id === id);\n }\n if (!inst) continue;\n const prev: Record<string, unknown> = {};\n const actual: Record<string, unknown> = {};\n let hasChange = false;\n for (const k of Object.keys(changes)) {\n if (inst[k] !== changes[k]) {\n prev[k] = inst[k];\n actual[k] = changes[k];\n hasChange = true;\n }\n }\n if (!hasChange) continue;\n prevMap.set(inst, prev);\n Object.assign(inst as Record<string, unknown>, actual);\n if (isDraft) {\n draftUpdated.add(inst);\n } else {\n toUpdate.add(inst);\n }\n }\n\n // 草稿实体直接更新 signal 触发重渲染(不写DB)\n if (draftUpdated.size) {\n this.#localDraftItems.update(items => [...items]);\n }\n\n if (!toUpdate.size) return;\n\n const updateMap = new Map([[EntityClass, toUpdate as unknown as Set<unknown>]]);\n try {\n await this.#rxdb.entityManager.mutations({ create: new Map(), update: updateMap, remove: new Map() });\n } catch (e) {\n this.#errorHandler.handleError(e);\n for (const [inst, prev] of prevMap) Object.assign(inst as Record<string, unknown>, prev);\n }\n }\n}\n","<!-- 顶栏:实体名称 + 计数 + 筛选按钮 + 新增按钮 -->\n<div class=\"border-base-300 flex shrink-0 items-center justify-between border-b px-4 py-2\">\n <div class=\"flex items-center gap-2 text-sm\">\n <span class=\"font-medium\">{{ displayName() }}</span>\n @if ($isFilterQuery()) {\n <span class=\"badge badge-ghost badge-sm\">{{ filteredCount() }} 条记录</span>\n }\n </div>\n <div class=\"flex items-center gap-2\">\n @if (!isSelectMode()) {\n <!-- Undo / Redo -->\n <button\n class=\"btn btn-xs btn-ghost\"\n [disabled]=\"!canUndo()\"\n (click)=\"undo()\"\n aria-label=\"撤销 (Ctrl+Z)\"\n type=\"button\"\n >\n <lucide-icon class=\"h-3.5 w-3.5\" [img]=\"Undo2\" />\n @if (undoCount(); as c) {\n <span class=\"badge badge-xs\">{{ c }}</span>\n }\n </button>\n <button\n class=\"btn btn-xs btn-ghost\"\n [disabled]=\"!canRedo()\"\n (click)=\"redo()\"\n aria-label=\"重做 (Ctrl+Shift+Z)\"\n type=\"button\"\n >\n <lucide-icon class=\"h-3.5 w-3.5\" [img]=\"Redo2\" />\n @if (redoCount(); as c) {\n <span class=\"badge badge-xs\">{{ c }}</span>\n }\n </button>\n <div class=\"divider divider-horizontal mx-0.5 h-5 self-center\"></div>\n }\n <!-- 筛选 popover 触发器 -->\n <div>\n <button\n class=\"btn btn-ghost btn-sm gap-1\"\n #filterTrigger=\"cdkOverlayOrigin\"\n [class.btn-active]=\"isQueryActive()\"\n (click)=\"toggleFilterPopover()\"\n cdkOverlayOrigin\n type=\"button\"\n >\n <lucide-icon class=\"h-4 w-4\" [img]=\"Funnel\" />\n 筛选\n @if (isQueryActive()) {\n <span class=\"badge badge-primary badge-xs\">{{ filterQuery().rules.length }}</span>\n }\n </button>\n <ng-template\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOpen]=\"showFilterPopover()\"\n [cdkConnectedOverlayOrigin]=\"filterTrigger\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n (backdropClick)=\"showFilterPopover.set(false)\"\n cdkConnectedOverlay\n >\n @if (queryBuilderFields().length > 0) {\n <div\n class=\"border-base-300 bg-base-100 rounded-lg border p-3 shadow-lg\"\n (click)=\"$event.stopPropagation()\"\n aria-hidden=\"true\"\n >\n <rxdb-query-builder\n [fields]=\"queryBuilderFields()\"\n [initialQuery]=\"$any(filterQuery())\"\n (queryChange)=\"onQueryChange($event)\"\n (validationChange)=\"onValidationChange($event)\"\n />\n <div class=\"mt-3 flex justify-end gap-2\">\n <button class=\"btn btn-ghost btn-sm\" (click)=\"resetFilter()\" type=\"button\">重置</button>\n <button\n class=\"btn btn-primary btn-sm\"\n [disabled]=\"!pendingQueryValid()\"\n (click)=\"applyFilter()\"\n type=\"button\"\n >\n 确定\n </button>\n </div>\n </div>\n }\n </ng-template>\n </div>\n @if (!isCreateBlocked()) {\n @if (isSelectMode()) {\n <button class=\"btn btn-sm btn-outline\" (click)=\"openCreateDialog()\" type=\"button\">+ 新建</button>\n } @else if (isM2m()) {\n <button class=\"btn btn-primary btn-sm\" (click)=\"openM2mSelectDialog()\" type=\"button\">+ 添加</button>\n } @else {\n <button class=\"btn btn-primary btn-sm\" (click)=\"openCreateDialog()\" type=\"button\">+ 新增</button>\n }\n }\n </div>\n</div>\n\n<!-- 表格主体 -->\n<div class=\"min-h-0 flex-1\">\n @if (isBrowser) {\n @for (key of [namespace() + ':' + name()]; track key) {\n <rxdb-query-table\n [columns]=\"tableColumns()\"\n [filteredCount]=\"filteredCount()\"\n [loading]=\"isInitialLoading()\"\n [loadingMore]=\"isLoadingMore()\"\n [loadMore]=\"loadMore()\"\n [queryActive]=\"isQueryActive()\"\n [records]=\"tableRecords()\"\n (batchUpdated)=\"onBatchUpdated($event)\"\n (cellChanged)=\"onCellChanged($event)\"\n (iconClicked)=\"onIconClicked($event)\"\n (rowDeleted)=\"onRowDeleted($event)\"\n />\n }\n }\n</div>\n\n<!-- Select mode footer -->\n@if (isSelectMode()) {\n <div class=\"border-base-300 flex shrink-0 items-center justify-between border-t px-4 py-3\">\n @if (selectedCount() > 0) {\n <span class=\"text-base-content/70 text-sm\">已选 {{ selectedCount() }} 项</span>\n } @else {\n <span class=\"text-base-content/40 text-sm\">请选择要关联的{{ displayName() }}</span>\n }\n <div class=\"flex gap-2\">\n <button class=\"btn btn-sm\" (click)=\"cancelSelection()\" type=\"button\">取消</button>\n <button\n class=\"btn btn-primary btn-sm\"\n [disabled]=\"selectedCount() === 0\"\n (click)=\"confirmSelection()\"\n type=\"button\"\n >\n 确认添加\n </button>\n </div>\n </div>\n}\n\n<!-- M2M Selection Dialog Template -->\n<ng-template #m2mSelectTpl>\n <rxdb-entity-dialog [title]=\"'添加' + displayName()\" (closeRequested)=\"m2mCancelSelection()\">\n <rxdb-entity-list\n [alreadyLinkedIds]=\"m2mAlreadyLinkedIds()\"\n [mode]=\"'select'\"\n [name]=\"name()\"\n [namespace]=\"namespace()\"\n (selectionCancelled)=\"m2mCancelSelection()\"\n (selectionConfirmed)=\"onM2mSelectionConfirmed($event)\"\n />\n </rxdb-entity-dialog>\n</ng-template>\n","import { getEntityMetadata, RelationKind, RxDB, type EntityMetadata, type EntityType } from '@aiao/rxdb';\nimport type {\n DetailTab,\n DetailTableTab,\n EntityFormData,\n FormFieldChangeEvent,\n FormFieldConfig,\n FormMode,\n FormValidationResult,\n RelatedEntityProvider\n} from '@aiao/rxdb-model';\nimport { buildDetailTabs, buildFormFields, entityToFormData, validateForm } from '@aiao/rxdb-model';\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ErrorHandler,\n inject,\n input,\n linkedSignal,\n output,\n signal\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { of, switchMap } from 'rxjs';\nimport { EntityDialogComponent } from '../entity-dialog/entity-dialog.component';\nimport { EntityFormComponent } from '../entity-form/rxdb-entity-form-angular';\nimport { EntityListComponent } from '../entity-list/entity-list.component';\n\ntype EntityInstance = { [key: string]: unknown; readonly id: string; save(): Promise<void>; remove(): Promise<void> };\n\n/** CDK Dialog 传入的数据结构 */\nexport interface EntityDetailDialogData {\n metadata: EntityMetadata;\n formFields: FormFieldConfig[];\n formData: EntityFormData;\n formMode: FormMode;\n relatedEntityProvider?: RelatedEntityProvider;\n /** 预填充的外键数据(不可编辑),用于级联新增场景 */\n fixedFormData?: EntityFormData;\n /** 委托保存:不创建草稿实体,仅 emit formSubmitted 让调用方处理 */\n delegateSave?: boolean;\n /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */\n creationChain?: string[];\n}\n\nlet nextDetailId = 0;\n\n@Component({\n selector: 'rxdb-entity-detail',\n imports: [EntityFormComponent, EntityListComponent, EntityDialogComponent],\n templateUrl: './entity-detail.html',\n styleUrl: './entity-detail.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityDetailComponent {\n readonly #dialogRef = inject(DialogRef, { optional: true });\n readonly #dialogData = inject(DIALOG_DATA, { optional: true }) as EntityDetailDialogData | null;\n readonly #rxdb = inject(RxDB, { optional: true }) as RxDB | null;\n readonly #errorHandler = inject(ErrorHandler);\n\n /** 创建模式下的草稿实体实例(立即创建,不保存) */\n #draftEntity: EntityInstance | null = null;\n\n // 根据 namespace + name 查找对应实体类\n readonly #entityCls = computed<EntityType | null>(() => {\n const rxdb = this.#rxdb;\n if (!rxdb) return null;\n const ns = this.namespace();\n const nm = this.name();\n if (!ns || !nm) return null;\n return (\n rxdb.config.entities.find(cls => {\n const meta = getEntityMetadata(cls);\n return meta.namespace === ns && meta.name === nm;\n }) ?? null\n );\n });\n\n /** Dialog 传入的实体类(根据 metadata 查找) */\n readonly #entityClsFromDialog = computed<EntityType | null>(() => {\n const rxdb = this.#rxdb;\n const meta = this.#dialogData?.metadata;\n if (!rxdb || !meta) return null;\n return (\n rxdb.config.entities.find(cls => {\n const m = getEntityMetadata(cls);\n return m.namespace === meta.namespace && m.name === meta.name;\n }) ?? null\n );\n });\n\n readonly #metadataFromRouteInputs = computed<EntityMetadata | null>(() => {\n const cls = this.#entityCls();\n return cls ? getEntityMetadata(cls) : null;\n });\n\n readonly #formFieldsFromRouteInputs = computed<FormFieldConfig[] | null>(() => {\n const meta = this.#metadataFromRouteInputs();\n if (!meta) return null;\n return buildFormFields(meta, this.formModeValue);\n });\n\n readonly #entityInstance = toSignal(\n toObservable(computed(() => ({ cls: this.#entityCls(), id: this.entityId() }))).pipe(\n switchMap(({ cls, id }) => {\n if (!cls || !id || !this.#rxdb) return of(null);\n return this.#rxdb.entityManager.getRepository(cls).get(id);\n })\n ),\n { initialValue: null }\n );\n\n // 路由参数输入(与 namespace/name/entityId 路由参数绑定)\n readonly namespace = input<string>();\n readonly name = input<string>();\n readonly entityId = input<string>();\n\n /** 唯一的 radio group name,避免多个 EntityDetailComponent 实例之间的 radio 冲突 */\n readonly tabGroupName = `detail-tabs-${nextDetailId++}`;\n\n // 直接绑定输入\n readonly metadata = input<EntityMetadata | undefined>(undefined);\n readonly formFields = input<FormFieldConfig[]>();\n readonly formData = input<EntityFormData>();\n readonly formMode = input<FormMode | undefined>(undefined);\n readonly relatedEntityProvider = input<RelatedEntityProvider>();\n\n readonly formSubmitted = output<EntityFormData>();\n readonly formCancelled = output<void>();\n readonly fieldChanged = output<FormFieldChangeEvent>();\n readonly validationErrors = output<FormValidationResult>();\n\n /** 是否使用外部保存模式(create 模式下,保存/取消按钮在 tabs 下面,而非 form 内) */\n readonly isCreateMode = computed(() => this.formModeValue === 'create');\n\n /** 当前表单编辑数据(create 模式下跟踪用户输入) */\n readonly draftFormData = signal<EntityFormData>({});\n\n /** 暴露草稿实体给模板(关系 tab 的 entity-list 需要) */\n readonly draftEntitySignal = signal<EntityInstance | null>(null);\n\n /** 父实体(草稿或已保存实例),用于关系 tab 的 entity-list */\n readonly parentEntityForRelation = computed<EntityInstance | null>(() => {\n return this.draftEntitySignal() ?? (this.#entityInstance() as EntityInstance | null) ?? null;\n });\n\n /** 弹框标题 */\n readonly dialogTitle = computed(() => {\n const meta = this.metadataValue;\n const mode = this.formModeValue;\n const name = meta?.displayName ?? meta?.name ?? '';\n return mode === 'create' ? `新建${name}` : name;\n });\n\n /** 创建链路:当前实体 + 祖先链路,传递给子 entity-list 以阻断循环创建 */\n readonly creationChain = computed<string[]>(() => {\n const parentChain = this.#dialogData?.creationChain ?? [];\n if (!this.isCreateMode()) return parentChain;\n const meta = this.metadataValue;\n if (!meta) return parentChain;\n const key = `${meta.namespace}:${meta.name}`;\n return parentChain.includes(key) ? parentChain : [...parentChain, key];\n });\n\n /** 当前活动关系 tab 的 relationName(用于子实体注册关系) */\n readonly activeRelationName = computed<string | undefined>(() => {\n const tab = this.activeTab();\n return tab?.type === 'table' ? (tab as DetailTableTab).relationName : undefined;\n });\n\n readonly tabs = computed(() => {\n const meta = this.metadataValue;\n if (!meta) return [];\n const chain = this.creationChain();\n return buildDetailTabs(meta).filter(tab => {\n if (tab.type !== 'table') return true;\n const t = tab as DetailTableTab;\n const key = `${t.relatedNamespace}:${t.relatedEntityName}`;\n return !chain.includes(key);\n });\n });\n readonly activeTabKey = linkedSignal<DetailTab[], string>({\n source: this.tabs,\n computation: tabs => tabs[0]?.key ?? 'basic'\n });\n\n readonly activeTab = computed(() => this.tabs().find(t => t.key === this.activeTabKey()));\n\n // 公开访问器 - 优先级:直接 input > 路由推导 > dialog data\n get metadataValue(): EntityMetadata {\n return this.metadata() ?? this.#metadataFromRouteInputs() ?? this.#dialogData!.metadata;\n }\n\n get formFieldsValue(): FormFieldConfig[] {\n const fields = this.formFields() ?? this.#formFieldsFromRouteInputs() ?? this.#dialogData!.formFields;\n const fixed = this.#dialogData?.fixedFormData;\n if (!fixed) return fields;\n return fields.map(f => (f.field in fixed ? { ...f, readonly: true } : f));\n }\n\n get formDataValue(): EntityFormData {\n if (this.isCreateMode()) {\n const draft = this.draftFormData();\n const fixed = this.#dialogData?.fixedFormData;\n return fixed ? { ...draft, ...fixed } : draft;\n }\n const inst = this.#entityInstance();\n if (inst) return entityToFormData(inst as Record<string, unknown>, this.formFieldsValue ?? []);\n const base = this.formData() ?? this.#dialogData?.formData ?? {};\n const fixed = this.#dialogData?.fixedFormData;\n return fixed ? { ...base, ...fixed } : base;\n }\n\n get formModeValue(): FormMode {\n return this.formMode() ?? this.#dialogData?.formMode ?? 'edit';\n }\n\n get relatedEntityProviderValue(): RelatedEntityProvider | undefined {\n return this.relatedEntityProvider() ?? this.#dialogData?.relatedEntityProvider;\n }\n\n constructor() {\n if (this.#dialogData?.formMode === 'create' && !this.#dialogData.delegateSave) {\n const cls = this.#entityClsFromDialog();\n if (cls) {\n const fixed = this.#dialogData.fixedFormData;\n const merged = { ...(this.#dialogData.formData || {}), ...fixed };\n this.#draftEntity = new (cls as any)(merged) as EntityInstance;\n this.draftEntitySignal.set(this.#draftEntity);\n this.draftFormData.set(\n entityToFormData(this.#draftEntity as Record<string, unknown>, this.#dialogData.formFields)\n );\n }\n }\n }\n\n selectTab(key: string): void {\n const targetTab = this.tabs().find(t => t.key === key);\n if (this.isCreateMode() && targetTab?.type === 'table') {\n const fields = this.formFieldsValue;\n const data = this.draftFormData();\n const fixed = this.#dialogData?.fixedFormData;\n const merged = fixed ? { ...data, ...fixed } : data;\n const result = validateForm(fields, merged);\n if (!result.valid) {\n this.validationErrors.emit(result);\n return;\n }\n this.#syncDraftEntity();\n }\n this.activeTabKey.set(key);\n }\n\n onFormDataChanged(data: EntityFormData): void {\n this.draftFormData.set(data);\n }\n\n onFormSubmitted(data: EntityFormData): void {\n this.formSubmitted.emit(data);\n }\n\n onFormCancelled(): void {\n this.#cleanupDraftEntity();\n this.formCancelled.emit();\n this.#dialogRef?.close();\n }\n\n onFieldChanged(event: FormFieldChangeEvent): void {\n if (this.isCreateMode()) {\n this.draftFormData.update(d => ({ ...d, [event.field]: event.value }));\n }\n this.fieldChanged.emit(event);\n }\n\n onValidationErrors(result: FormValidationResult): void {\n this.validationErrors.emit(result);\n }\n\n /** 外部保存按钮(create 模式) */\n onSave(): void {\n const fields = this.formFieldsValue;\n const data = this.draftFormData();\n const fixed = this.#dialogData?.fixedFormData;\n const merged = fixed ? { ...data, ...fixed } : data;\n const result = validateForm(fields, merged);\n if (!result.valid) {\n this.validationErrors.emit(result);\n return;\n }\n if (this.#draftEntity) {\n this.#syncDraftEntity();\n this.#draftEntity\n .save()\n .then(() => {\n this.#draftEntity = null;\n this.draftEntitySignal.set(null);\n this.#dialogRef?.close('saved');\n })\n .catch(e => this.#errorHandler.handleError(e));\n } else {\n this.formSubmitted.emit(merged);\n this.#dialogRef?.close();\n }\n }\n\n onCancel(): void {\n this.onFormCancelled();\n }\n\n buildFixedQuery(tab: DetailTableTab): { combinator: 'and'; rules: unknown[] } | undefined {\n const entityId = this.#draftEntity?.id ?? (this.formDataValue as Record<string, unknown>)['id'];\n if (!entityId) return undefined;\n\n if (tab.relationKind === RelationKind.ONE_TO_MANY && tab.foreignKeyField) {\n return { combinator: 'and', rules: [{ field: tab.foreignKeyField, operator: '=', value: entityId }] };\n }\n\n if (tab.relationKind === RelationKind.MANY_TO_MANY && tab.mappedProperty) {\n return { combinator: 'and', rules: [{ field: `${tab.mappedProperty}.id`, operator: '=', value: entityId }] };\n }\n\n return undefined;\n }\n\n buildFixedFormData(tab: DetailTableTab): EntityFormData | undefined {\n const entityId = this.#draftEntity?.id ?? (this.formDataValue as Record<string, unknown>)['id'];\n if (!entityId) return undefined;\n\n if (tab.relationKind === RelationKind.ONE_TO_MANY && tab.foreignKeyField) {\n return { [tab.foreignKeyField]: entityId };\n }\n\n return undefined;\n }\n\n /** 将表单数据同步到草稿实体 */\n #syncDraftEntity(): void {\n if (!this.#draftEntity) return;\n const data = this.draftFormData();\n const fixed = this.#dialogData?.fixedFormData;\n const merged = fixed ? { ...data, ...fixed } : data;\n Object.assign(this.#draftEntity, merged);\n }\n\n /** 清理草稿实体缓存 */\n #cleanupDraftEntity(): void {\n if (!this.#draftEntity || !this.#rxdb) return;\n this.#rxdb.entityManager.removeEntityCache(this.#draftEntity as any);\n this.#draftEntity = null;\n this.draftEntitySignal.set(null);\n }\n}\n","<rxdb-entity-dialog [title]=\"dialogTitle()\" (closeRequested)=\"onCancel()\">\n <!-- Tab Bar -->\n <div class=\"tabs tabs-border min-h-0 flex-1\" role=\"tablist\">\n @for (tab of tabs(); track tab.key) {\n <input\n class=\"tab\"\n [attr.aria-label]=\"tab.label\"\n [checked]=\"tab.key === activeTabKey()\"\n [name]=\"tabGroupName\"\n (change)=\"selectTab(tab.key)\"\n role=\"tab\"\n type=\"radio\"\n />\n <div\n class=\"tab-content border-base-300 bg-base-100 order-1 flex w-full flex-col\"\n [class.overflow-auto]=\"tab.type === 'form'\"\n [class.overflow-hidden]=\"tab.type === 'table'\"\n [class.p-4]=\"tab.type === 'form'\"\n [hidden]=\"tab.key !== activeTabKey()\"\n >\n @if (tab.type === 'form') {\n <rxdb-entity-form\n [data]=\"formDataValue\"\n [fields]=\"formFieldsValue\"\n [mode]=\"formModeValue\"\n [relatedEntityProvider]=\"relatedEntityProviderValue\"\n [showActions]=\"!isCreateMode()\"\n (fieldChanged)=\"onFieldChanged($event)\"\n (formCancelled)=\"onFormCancelled()\"\n (formSubmitted)=\"onFormSubmitted($event)\"\n (validationErrors)=\"onValidationErrors($event)\"\n />\n }\n @if (tab.type === 'table') {\n <rxdb-entity-list\n [creationChain]=\"creationChain()\"\n [draftParentEntity]=\"draftEntitySignal()\"\n [fixedFormData]=\"buildFixedFormData($any(tab))\"\n [fixedQuery]=\"buildFixedQuery($any(tab))\"\n [name]=\"$any(tab).relatedEntityName\"\n [namespace]=\"$any(tab).relatedNamespace\"\n [parentEntity]=\"parentEntityForRelation()\"\n [parentRelationName]=\"$any(tab).relationName\"\n [relationKind]=\"$any(tab).relationKind\"\n />\n }\n </div>\n }\n </div>\n\n <!-- Save/Cancel buttons for create mode (below tabs) -->\n @if (isCreateMode()) {\n <div class=\"border-base-300 flex shrink-0 justify-end gap-2 border-t px-4 py-3\">\n <button class=\"btn\" (click)=\"onCancel()\" type=\"button\">取消</button>\n <button class=\"btn btn-primary\" (click)=\"onSave()\" type=\"button\">保存</button>\n </div>\n }\n</rxdb-entity-dialog>\n","/**\n * @aiao/rxdb-model-angular\n *\n * RxDB 模型 Angular 组件库。\n * VTable 基础设施请从 `@aiao/rxdb-model` 导入。\n */\n\n// Angular 配置\nexport { ENTITY_TABLE_CONFIG } from './config';\n\n// Angular 组件\nexport { EntityTableComponent } from './entity-table/entity-table.component';\nexport { QueryTableComponent } from './query-table/query-table.component';\n\nexport * from '@aiao/rxdb-model';\n","import {\n createQueryBuilderService,\n type FieldMetadata,\n type QueryBuilderRuleGroup,\n type QueryBuilderService,\n type UIRule,\n type ValidationResult\n} from '@aiao/rxdb-model';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, OnDestroy, output, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { QueryGroupComponent, type UIRuleGroup } from '../query-group/query-group.component';\n\n/**\n * 子查询构建器组件\n *\n * @description\n * 用于 EXISTS/NOT EXISTS 操作符的嵌套查询条件。\n * 支持:\n * - 添加子条件\n * - 嵌套规则组\n * - 清空子条件\n */\n@Component({\n selector: 'rxdb-subquery-builder',\n standalone: true,\n imports: [CommonModule, QueryGroupComponent],\n template: `\n <div class=\"subquery-builder border-base-300 bg-base-200/50 p-2\">\n @if (!hasRules()) {\n <div class=\"text-base-content/60 flex items-center gap-2\">\n <button class=\"btn btn-ghost btn-xs\" (click)=\"handleAddFirstRule()\" type=\"button\">+ 添加子条件</button>\n <span class=\"text-xs opacity-50\">(可选)</span>\n </div>\n } @else {\n <rxdb-query-group\n [depth]=\"0\"\n [fields]=\"fields()\"\n [group]=\"rootGroup()!\"\n [maxDepth]=\"maxDepth()\"\n (addGroup)=\"onAddGroup($event)\"\n (addRule)=\"onAddRule($event)\"\n (removeItem)=\"onRemoveItem($event)\"\n (updateCombinator)=\"onUpdateCombinator($event)\"\n (updateRule)=\"onUpdateRule($event)\"\n />\n <div class=\"mt-2 flex justify-end\">\n <button class=\"btn btn-ghost btn-xs text-error\" (click)=\"handleClear()\" type=\"button\">清空</button>\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n `\n rxdb-query-group ::ng-deep > .rxdb-query-group {\n border: 0;\n padding: 0;\n }\n `\n ]\n})\nexport class SubqueryBuilderComponent implements OnDestroy {\n private readonly service: QueryBuilderService<Record<string, unknown>>;\n /** initialQuery 是否已应用(只应用一次) */\n private initialQueryApplied = false;\n\n /** 根规则组 Signal */\n private readonly rootGroupSignal: Signal<unknown>;\n\n /** 验证 Signal */\n private readonly validationSignal: Signal<ValidationResult | undefined>;\n\n /** 字段列表 */\n readonly fields = input.required<FieldMetadata[]>();\n\n /** 初始查询 */\n readonly initialQuery = input<QueryBuilderRuleGroup<Record<string, unknown>>>();\n\n /** 最大嵌套层级 */\n readonly maxDepth = input<number>(3);\n\n /** 查询变更事件 */\n readonly queryChange = output<{ combinator: 'and' | 'or'; rules: unknown[] } | undefined>();\n\n /** 验证变更事件 */\n readonly validationChange = output<ValidationResult>();\n\n /** 根规则组 */\n readonly rootGroup: Signal<UIRuleGroup | undefined> = computed(() => {\n return this.rootGroupSignal() as UIRuleGroup | undefined;\n });\n\n /** 是否有规则 */\n readonly hasRules = computed(() => {\n const group = this.rootGroup();\n return group && group.rules.length > 0;\n });\n\n constructor() {\n // 在构造函数中初始化服务\n this.service = createQueryBuilderService<Record<string, unknown>>({\n config: {\n maxNestingLevel: this.maxDepth()\n }\n });\n\n // 转换 Observable 为 Signal\n this.rootGroupSignal = toSignal(this.service.rootGroup$, { requireSync: true });\n this.validationSignal = toSignal(this.service.validation$, { initialValue: undefined });\n\n // 监听字段变化并同步到服务\n effect(() => {\n const fields = this.fields();\n if (fields.length > 0) {\n this.service.setFields(fields);\n }\n });\n\n // 监听初始查询并加载(只应用一次,避免用户修改后被重置)\n effect(() => {\n if (!this.initialQueryApplied) {\n const initial = this.initialQuery();\n if (initial) {\n this.initialQueryApplied = true;\n this.service.fromRxDBQuery(initial as any);\n }\n }\n });\n\n // 监听查询变化并发出事件\n effect(() => {\n const group = this.rootGroup();\n if (group) {\n const query = this.service.toRxDBQuery();\n // 如果没有规则,返回 undefined 而不是空的 RuleGroup\n if (!query.rules || query.rules.length === 0) {\n this.queryChange.emit(undefined);\n } else {\n this.queryChange.emit(query);\n }\n }\n });\n\n // 监听验证变化并发出事件\n effect(() => {\n const validation = this.validationSignal();\n if (validation) {\n this.validationChange.emit(validation);\n }\n });\n\n // 同步 maxDepth 到 service\n effect(() => {\n this.service.setMaxNestingLevel(this.maxDepth());\n });\n }\n\n /** 销毁服务 */\n ngOnDestroy(): void {\n this.service.destroy();\n }\n\n /** 添加第一条规则 */\n handleAddFirstRule(): void {\n const firstField = this.fields()[0];\n if (firstField) {\n this.service.addRule(undefined, {\n field: firstField.name,\n operator:\n firstField.isRelation ? 'exists'\n : firstField.type === 'keyValue' ? 'null'\n : '=',\n value: firstField.type === 'boolean' ? false : ''\n } as any);\n }\n }\n\n /** 清空所有规则 */\n handleClear(): void {\n this.service.clear();\n }\n\n /** 添加规则到指定组 */\n onAddRule(event: { parentId: string; rule: Omit<UIRule, 'id'> }): void {\n this.service.addRule(event.parentId, event.rule as any);\n }\n\n /** 添加子组到指定组 */\n onAddGroup(parentId: string): void {\n this.service.addGroup(parentId);\n }\n\n /** 删除规则或组 */\n onRemoveItem(id: string): void {\n this.service.remove(id);\n }\n\n /** 更新规则 */\n onUpdateRule(event: { id: string; updates: Partial<UIRule> }): void {\n this.service.updateRule(event.id, event.updates as any);\n }\n\n /** 更新组合器 */\n onUpdateCombinator(event: { id: string; combinator: 'and' | 'or' }): void {\n this.service.updateGroupCombinator(event.id, event.combinator);\n }\n}\n","/**\n * @aiao/rxdb-model-angular\n *\n * Angular 查询构建器组件库\n *\n * @description\n * 提供可视化的 RxDB 查询条件构建组件,支持:\n * - 从 EntityMetadata 自动解析字段\n * - 支持多种数据类型和操作符\n * - AND/OR 条件组合\n * - 最大 5 层嵌套\n * - 实时验证\n *\n * @example\n * ```typescript\n * import { QueryBuilderComponent } from '@aiao/rxdb-model-angular';\n *\n * @Component({\n * imports: [QueryBuilderComponent],\n * template: `\n * <rxdb-query-builder\n * [entity]=\"userEntity\"\n * (queryChange)=\"onQueryChange($event)\"\n * />\n * `\n * })\n * export class MyComponent {\n * userEntity = inject(UserEntity);\n *\n * onQueryChange(query: RuleGroup<User>) {\n * console.log('Query changed:', query);\n * }\n * }\n * ```\n */\n\n// 主组件\nexport { QueryBuilderComponent } from './query-builder/query-builder.component';\n\n// 子组件(可单独使用)\nexport { FieldSelectorComponent } from './field-selector/field-selector.component';\nexport { OperatorSelectorComponent } from './operator-selector/operator-selector.component';\nexport { PopoverSelectComponent } from './popover-select/popover-select.component';\nexport { QueryGroupComponent } from './query-group/query-group.component';\nexport { QueryRuleComponent } from './query-rule/query-rule.component';\nexport { SubqueryBuilderComponent } from './subquery-builder/subquery-builder.component';\nexport { TreeItemDirective, TreeSelectComponent } from './tree-select/tree-select.component';\nexport { ValueInputComponent } from './value-input/value-input.component';\n\n// 主题注入\nexport { DEFAULT_QUERY_BUILDER_THEME } from './theme/default-query-builder-theme';\nexport { QUERY_BUILDER_THEME, provideQueryBuilderTheme } from './theme/query-builder-theme.token';\n\n// Core exports\nexport * from '@aiao/rxdb-model';\nexport type { QueryBuilderTheme } from './theme/query-builder-theme.token';\n","// Entity Detail Angular\nexport * from './entity-detail/entity-detail';\n\n// Entity Dialog Angular\nexport * from './entity-dialog/index';\n\n// Entity Form Angular\nexport * from './entity-form/rxdb-entity-form-angular';\n\n// Entity List Angular\nexport { EntityListComponent } from './entity-list/entity-list.component';\n\n// Entity Table Angular\nexport * from './entity-table/index';\n\n// Query Builder Angular\nexport * from './query-builder/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["vtChangeCellValue","_uid","i1","coreGetInputType","coreGetDefaultValue"],"mappings":"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"}
1
+ {"version":3,"file":"aiao-rxdb-model-angular.mjs","names":[],"sources":["../../../../packages/rxdb-model-angular/src/entity-dialog/entity-dialog.component.ts","../../../../packages/rxdb-model-angular/src/entity-dialog/entity-dialog.component.html","../../../../packages/rxdb-model-angular/src/entity-form/rxdb-entity-form-angular.ts","../../../../packages/rxdb-model-angular/src/entity-table/config.ts","../../../../packages/rxdb-model-angular/src/entity-table/entity-table/entity-table.component.ts","../../../../packages/rxdb-model-angular/src/entity-table/entity-table/entity-table.component.html","../../../../packages/rxdb-model-angular/src/entity-table/query-table/query-table.component.ts","../../../../packages/rxdb-model-angular/src/entity-table/query-table/query-table.component.html","../../../../packages/rxdb-model-angular/src/query-builder/query-builder/query-builder.component.ts","../../../../packages/rxdb-model-angular/src/entity-list/entity-list.component.ts","../../../../packages/rxdb-model-angular/src/entity-list/entity-list.component.html","../../../../packages/rxdb-model-angular/src/entity-detail/entity-detail.ts","../../../../packages/rxdb-model-angular/src/entity-detail/entity-detail.html","../../../../packages/rxdb-model-angular/src/query-builder/subquery-builder/subquery-builder.component.ts"],"sourcesContent":["import { DialogRef } from '@angular/cdk/dialog';\nimport { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n output,\n signal\n} from '@angular/core';\n\n/**\n * 对话框外壳组件(CDK Dialog 内使用):支持拖拽(CdkDrag)、8 向缩放与全屏切换。\n */\n@Component({\n selector: 'rxdb-entity-dialog',\n imports: [CdkDragHandle],\n hostDirectives: [{ directive: CdkDrag, inputs: ['cdkDragBoundary'] }],\n templateUrl: './entity-dialog.component.html',\n styleUrl: './entity-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityDialogComponent implements AfterViewInit {\n readonly #dialogRef = inject(DialogRef, { optional: true });\n readonly #cdkDrag = inject(CdkDrag, { optional: true, self: true });\n readonly #el = inject(ElementRef) as ElementRef<HTMLElement>;\n readonly #doc = inject(DOCUMENT);\n\n #pane: HTMLElement | null = null;\n #resizing = false;\n #savedPaneState: { left: string; top: string; width: string; height: string } | null = null;\n\n readonly title = input.required<string>();\n readonly closeRequested = output<void>();\n\n readonly isFullscreen = signal(false);\n readonly isInDialog = !!inject(DialogRef, { optional: true });\n\n constructor() {\n if (this.#cdkDrag) {\n if (this.isInDialog) {\n this.#cdkDrag.rootElementSelector = '.cdk-overlay-pane';\n this.#cdkDrag.boundaryElement = '.cdk-overlay-container';\n } else {\n this.#cdkDrag.disabled = true;\n }\n }\n }\n\n ngAfterViewInit(): void {\n if (!this.isInDialog) return;\n requestAnimationFrame(() => this.#initFixedPane());\n }\n\n close(): void {\n this.closeRequested.emit();\n this.#dialogRef?.close();\n }\n\n toggleFullscreen(): void {\n const wasFullscreen = this.isFullscreen();\n this.isFullscreen.set(!wasFullscreen);\n const fullscreen = !wasFullscreen;\n const pane = this.#pane;\n if (!pane) return;\n\n if (fullscreen) {\n this.#savedPaneState = {\n left: pane.style.left,\n top: pane.style.top,\n width: pane.style.width,\n height: pane.style.height\n };\n pane.style.left = '0';\n pane.style.top = '0';\n pane.style.width = '100vw';\n pane.style.height = '100vh';\n if (this.#cdkDrag) {\n this.#cdkDrag.disabled = true;\n this.#cdkDrag.setFreeDragPosition({ x: 0, y: 0 });\n }\n } else {\n if (this.#savedPaneState) {\n pane.style.left = this.#savedPaneState.left;\n pane.style.top = this.#savedPaneState.top;\n pane.style.width = this.#savedPaneState.width;\n pane.style.height = this.#savedPaneState.height;\n this.#savedPaneState = null;\n }\n if (this.#cdkDrag) this.#cdkDrag.disabled = false;\n }\n }\n\n startResize(e: MouseEvent, dir: string): void {\n const pane = this.#pane;\n if (!pane || this.#resizing || this.isFullscreen()) return;\n e.preventDefault();\n e.stopPropagation();\n this.#resizing = true;\n const startX = e.clientX;\n const startY = e.clientY;\n const startW = pane.offsetWidth;\n const startH = pane.offsetHeight;\n const startL = parseFloat(pane.style.left) || 0;\n const startT = parseFloat(pane.style.top) || 0;\n const minW = 400;\n const minH = 300;\n\n const onMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n if (dir.includes('e')) pane.style.width = Math.max(minW, startW + dx) + 'px';\n if (dir.includes('w')) {\n const w = Math.max(minW, startW - dx);\n pane.style.width = w + 'px';\n pane.style.left = startL + startW - w + 'px';\n }\n if (dir.includes('s')) pane.style.height = Math.max(minH, startH + dy) + 'px';\n if (dir.includes('n')) {\n const h = Math.max(minH, startH - dy);\n pane.style.height = h + 'px';\n pane.style.top = startT + startH - h + 'px';\n }\n };\n const onUp = () => {\n this.#resizing = false;\n this.#doc.removeEventListener('mousemove', onMove);\n this.#doc.removeEventListener('mouseup', onUp);\n };\n this.#doc.addEventListener('mousemove', onMove);\n this.#doc.addEventListener('mouseup', onUp);\n }\n\n #initFixedPane(): void {\n const pane = this.#el.nativeElement.closest<HTMLElement>('.cdk-overlay-pane');\n if (!pane) return;\n this.#pane = pane;\n const rect = pane.getBoundingClientRect();\n if (this.#cdkDrag) this.#cdkDrag.setFreeDragPosition({ x: 0, y: 0 });\n pane.style.position = 'fixed';\n pane.style.left = rect.left + 'px';\n pane.style.top = rect.top + 'px';\n pane.style.margin = '0';\n pane.style.maxWidth = 'none';\n pane.style.maxHeight = 'none';\n }\n}\n","<!-- Resize handles -->\n@if (isInDialog) {\n <div class=\"resize-handle resize-n\" (mousedown)=\"startResize($event, 'n')\"></div>\n <div class=\"resize-handle resize-s\" (mousedown)=\"startResize($event, 's')\"></div>\n <div class=\"resize-handle resize-e\" (mousedown)=\"startResize($event, 'e')\"></div>\n <div class=\"resize-handle resize-w\" (mousedown)=\"startResize($event, 'w')\"></div>\n <div class=\"resize-handle resize-ne\" (mousedown)=\"startResize($event, 'ne')\"></div>\n <div class=\"resize-handle resize-nw\" (mousedown)=\"startResize($event, 'nw')\"></div>\n <div class=\"resize-handle resize-se\" (mousedown)=\"startResize($event, 'se')\"></div>\n <div class=\"resize-handle resize-sw\" (mousedown)=\"startResize($event, 'sw')\"></div>\n}\n\n<!-- Dialog Title Bar (drag handle + fullscreen toggle + close) -->\n@if (isInDialog) {\n <div class=\"border-base-300 flex shrink-0 items-center justify-between border-b px-4 py-2\">\n <span class=\"flex-1 cursor-grab text-base font-semibold select-none active:cursor-grabbing\" cdkDragHandle>\n {{ title() }}\n </span>\n <div class=\"flex items-center gap-1\">\n <!-- Fullscreen Toggle -->\n <button\n class=\"btn btn-ghost btn-xs btn-square\"\n [attr.aria-label]=\"isFullscreen() ? '退出全屏' : '全屏'\"\n (click)=\"toggleFullscreen()\"\n type=\"button\"\n >\n @if (isFullscreen()) {\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\n </svg>\n } @else {\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\" />\n </svg>\n }\n </button>\n <!-- Close -->\n <button class=\"btn btn-ghost btn-xs btn-square\" (click)=\"close()\" aria-label=\"关闭\" type=\"button\">\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n}\n\n<!-- Projected content -->\n<ng-content />\n","import {\n EntityFieldType,\n type EntityFormData,\n formatEntityFieldValue,\n type FormFieldChangeEvent,\n type FormFieldConfig,\n type FormMode,\n type FormValidationResult,\n parseEntityFieldValueStrict,\n type RelatedEntityItem,\n type RelatedEntityProvider,\n validateForm\n} from '@aiao/rxdb-model';\nimport { DatePipe, JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, linkedSignal, output } from '@angular/core';\n\n/**\n * 元数据驱动表单组件:按字段类型渲染对应输入控件,支持 create / edit / view 三模式;\n * 解析、格式化与校验全部委托 @aiao/rxdb-model。\n */\n@Component({\n selector: 'rxdb-entity-form',\n imports: [DatePipe, JsonPipe],\n template: `<form class=\"grid grid-cols-1 gap-4 md:grid-cols-2\" (submit)=\"$event.preventDefault(); onSubmit()\">\n @for (field of editableFields(); track field.field) {\n <fieldset class=\"fieldset\" [class.md:col-span-2]=\"isWideField(field)\">\n <legend class=\"fieldset-legend\">{{ field.displayName }}</legend>\n @if (isFieldReadonly(field)) {\n <div class=\"input input-ghost flex min-h-10 items-center\">{{ displayValueMap().get(field.field) ?? '' }}</div>\n } @else {\n @switch (field.type) {\n @case ('boolean') {\n <input\n class=\"toggle\"\n [checked]=\"!!formData()[field.field]\"\n (change)=\"onFieldChange(field, $any($event.target).checked)\"\n type=\"checkbox\"\n />\n }\n @case ('enum') {\n <select\n class=\"select\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n >\n @if (field.nullable) {\n <option value=\"\">(空)</option>\n }\n @for (val of field.enumValues ?? []; track val) {\n <option [disabled]=\"enumOptionDisabled(field, val)\" [value]=\"val\">\n {{ enumOptionLabel(field, val) }}\n </option>\n }\n </select>\n }\n @case ('date') {\n <input\n class=\"input\"\n [type]=\"dateInputType(field)\"\n [value]=\"formData()[field.field] ? ($any(formData()[field.field]) | date: datePipeFormat(field)) : ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n />\n }\n @case ('number') {\n <div class=\"flex items-center gap-2\">\n <input\n class=\"input flex-1\"\n [attr.max]=\"numericBounds(field).max\"\n [attr.min]=\"numericBounds(field).min\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [attr.step]=\"numericBounds(field).step ?? 'any'\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"number\"\n />\n @if (numericUnitLabel(field); as unit) {\n <span class=\"label w-10 shrink-0\">{{ unit }}</span>\n }\n </div>\n }\n @case ('integer') {\n <div class=\"flex items-center gap-2\">\n <input\n class=\"input flex-1\"\n [attr.max]=\"numericBounds(field).max\"\n [attr.min]=\"numericBounds(field).min\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [attr.step]=\"numericBounds(field).step ?? '1'\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"number\"\n />\n @if (numericUnitLabel(field); as unit) {\n <span class=\"label w-10 shrink-0\">{{ unit }}</span>\n }\n </div>\n }\n @case ('bigint') {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n inputmode=\"numeric\"\n type=\"text\"\n />\n }\n @case ('binary') {\n <textarea\n class=\"textarea min-h-16 font-mono\"\n [attr.placeholder]=\"field.placeholder ?? '十六进制字节序列(如 0a0b)'\"\n [value]=\"binaryToHex(formData()[field.field])\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n ></textarea>\n }\n @case ('stringArray') {\n @if (field.enumValues && field.enumValues.length > 0) {\n <div class=\"flex flex-col gap-1\">\n @for (val of field.enumValues; track val) {\n <label class=\"flex items-center gap-2\">\n <input\n class=\"checkbox\"\n [checked]=\"multiSelected(field, val)\"\n [disabled]=\"enumOptionDisabled(field, val)\"\n (change)=\"onMultiSelectChange(field, val, $any($event.target).checked)\"\n type=\"checkbox\"\n />\n @if (field.options?.[val]?.color; as color) {\n <span class=\"inline-block h-2 w-2 rounded-full\" [style.background]=\"color\"></span>\n }\n <span>{{ enumOptionLabel(field, val) }}</span>\n </label>\n }\n </div>\n } @else {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? '逗号分隔'\"\n [value]=\"$any(formData()[field.field] ?? []).join(', ')\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"text\"\n />\n }\n }\n @case ('numberArray') {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? '逗号分隔数字'\"\n [value]=\"$any(formData()[field.field] ?? []).join(', ')\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"text\"\n />\n }\n @case ('json') {\n <textarea\n class=\"textarea min-h-24\"\n [attr.placeholder]=\"field.placeholder ?? 'JSON'\"\n [value]=\"formData()[field.field] !== null ? (formData()[field.field] | json) : ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n ></textarea>\n }\n @case ('keyValue') {\n <textarea\n class=\"textarea min-h-24\"\n [attr.placeholder]=\"field.placeholder ?? 'JSON'\"\n [value]=\"formData()[field.field] !== null ? (formData()[field.field] | json) : ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n ></textarea>\n }\n @case ('oneToOne') {\n <select\n class=\"select\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n >\n <option value=\"\">(空)</option>\n @for (item of relatedItemsMap().get(field.field) ?? []; track item.id) {\n <option [value]=\"item.id\">{{ item.displayName }}</option>\n }\n </select>\n }\n @case ('manyToOne') {\n <select\n class=\"select\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n >\n <option value=\"\">(空)</option>\n @for (item of relatedItemsMap().get(field.field) ?? []; track item.id) {\n <option [value]=\"item.id\">{{ item.displayName }}</option>\n }\n </select>\n }\n @default {\n @if (field.format?.kind === 'color') {\n <div class=\"flex items-center gap-2\">\n <input\n class=\"h-9 w-12 cursor-pointer border-0 bg-transparent\"\n [value]=\"colorValue(field)\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"color\"\n />\n <input\n class=\"input flex-1\"\n [attr.placeholder]=\"field.placeholder ?? '#rrggbb'\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n type=\"text\"\n />\n </div>\n } @else if (isTextareaFormat(field)) {\n <textarea\n class=\"textarea min-h-16\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n ></textarea>\n } @else {\n <input\n class=\"input\"\n [attr.placeholder]=\"field.placeholder ?? ''\"\n [type]=\"textInputType(field)\"\n [value]=\"formData()[field.field] ?? ''\"\n (change)=\"onFieldChange(field, $any($event.target).value)\"\n />\n }\n }\n }\n }\n @if (field.helpText) {\n <p class=\"label\">{{ field.helpText }}</p>\n }\n </fieldset>\n }\n @if (!isReadonly() && showActions()) {\n <div class=\"flex justify-end gap-2 pt-2 md:col-span-2\">\n <button class=\"btn\" (click)=\"onCancel()\" type=\"button\">取消</button>\n <button class=\"btn btn-primary\" type=\"submit\">保存</button>\n </div>\n }\n </form>`,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityFormComponent {\n readonly fields = input.required<FormFieldConfig[]>();\n readonly data = input.required<EntityFormData>();\n readonly mode = input<FormMode>('view');\n readonly relatedEntityProvider = input<RelatedEntityProvider>();\n readonly showActions = input(true);\n\n readonly fieldChanged = output<FormFieldChangeEvent>();\n readonly formSubmitted = output<EntityFormData>();\n readonly formCancelled = output<void>();\n readonly validationErrors = output<FormValidationResult>();\n\n readonly initialData = linkedSignal(() => ({ ...this.data() }));\n readonly formData = linkedSignal(() => ({ ...this.initialData() }));\n\n readonly editableFields = computed(() => {\n return this.fields().filter(f => !f.hidden);\n });\n\n readonly isReadonly = computed(() => this.mode() === 'view');\n\n readonly relatedItemsMap = computed(() => {\n const provider = this.relatedEntityProvider();\n const fields = this.editableFields();\n const map = new Map<string, RelatedEntityItem[]>();\n if (!provider) return map;\n for (const field of fields) {\n if (field.relatedEntityName) {\n map.set(field.field, provider(field.relatedEntityName, field.relatedNamespace));\n }\n }\n return map;\n });\n\n readonly displayValueMap = computed(() => {\n const data = this.formData();\n const fields = this.editableFields();\n const itemsMap = this.relatedItemsMap();\n const map = new Map<string, string>();\n for (const field of fields) {\n if (!this.isReadonly() && field.readonly !== true) continue;\n const value = data[field.field];\n if ((field.type === 'oneToOne' || field.type === 'manyToOne') && field.relatedEntityName) {\n const items = itemsMap.get(field.field) ?? [];\n const item = items.find(i => i.id === value);\n map.set(field.field, item?.displayName ?? formatEntityFieldValue(field.type, value, field.format));\n } else if (field.type === 'enum' && field.options) {\n const label = field.options[String(value)]?.label;\n map.set(field.field, label ?? formatEntityFieldValue(field.type, value, field.format));\n } else if (field.type === 'stringArray' && field.options) {\n const items =\n Array.isArray(value) ? value\n : typeof value === 'string' ? value.split(',')\n : [];\n map.set(field.field, items.map(v => field.options![String(v).trim()]?.label ?? String(v).trim()).join(', '));\n } else {\n map.set(field.field, formatEntityFieldValue(field.type, value, field.format));\n }\n }\n return map;\n });\n\n onFieldChange(field: FormFieldConfig, rawValue: unknown): void {\n const current = this.formData();\n const previousValue = current[field.field];\n const result = parseEntityFieldValueStrict(field.type, rawValue);\n if (!result.ok) {\n this.validationErrors.emit({\n valid: false,\n errors: [{ field: field.field, message: `${field.displayName} ${result.message}` }]\n });\n return;\n }\n const parsed = result.value;\n this.formData.set({ ...current, [field.field]: parsed });\n this.fieldChanged.emit({ field: field.field, type: field.type as EntityFieldType, value: parsed, previousValue });\n }\n\n onSubmit(): void {\n const currentFields = this.fields();\n const currentData = this.formData();\n const result = validateForm(currentFields, currentData);\n if (!result.valid) {\n this.validationErrors.emit(result);\n return;\n }\n this.formSubmitted.emit(currentData);\n }\n\n onCancel(): void {\n this.formData.set({ ...this.initialData() });\n this.formCancelled.emit();\n }\n\n isFieldReadonly(field: FormFieldConfig): boolean {\n return this.isReadonly() || field.readonly === true;\n }\n\n /** 占据两列栅格的字段:json / keyValue / binary / 多行文本类 format / 显式 span */\n isWideField(field: FormFieldConfig): boolean {\n return (\n field.span === 2 ||\n field.type === 'json' ||\n field.type === 'keyValue' ||\n field.type === 'binary' ||\n this.isTextareaFormat(field)\n );\n }\n\n /** 多行文本类 format:渲染 textarea */\n isTextareaFormat(field: FormFieldConfig): boolean {\n const kind = field.format?.kind;\n return kind === 'multilineText' || kind === 'richText' || kind === 'code';\n }\n\n /** dateTime format 的显示模式映射到原生输入类型 */\n dateInputType(field: FormFieldConfig): 'date' | 'datetime-local' | 'time' {\n const format = field.format;\n if (format?.kind === 'dateTime') {\n if (format.display === 'date') return 'date';\n if (format.display === 'time') return 'time';\n }\n return 'datetime-local';\n }\n\n /** dateTime format 的显示模式映射到 DatePipe 格式 */\n datePipeFormat(field: FormFieldConfig): string {\n const format = field.format;\n if (format?.kind === 'dateTime') {\n if (format.display === 'date') return 'yyyy-MM-dd';\n if (format.display === 'time') return 'HH:mm';\n }\n return 'yyyy-MM-ddTHH:mm';\n }\n\n /** 数字类 format 的值域约束(min / max / step) */\n numericBounds(field: FormFieldConfig): { min?: number; max?: number; step?: number } {\n const format = field.format;\n if (\n format &&\n (format.kind === 'number' ||\n format.kind === 'currency' ||\n format.kind === 'percentage' ||\n format.kind === 'duration' ||\n format.kind === 'rating')\n ) {\n return {\n ...(format.min === undefined ? {} : { min: format.min }),\n ...(format.max === undefined ? {} : { max: format.max }),\n ...(format.step === undefined ? {} : { step: format.step })\n };\n }\n return {};\n }\n\n /** 数字类 format 的单位标注(currency 代码 / 百分号 / 时长单位) */\n numericUnitLabel(field: FormFieldConfig): string {\n switch (field.format?.kind) {\n case 'currency':\n return field.format.currency;\n case 'percentage':\n return '%';\n case 'duration':\n return field.format.unit;\n default:\n return '';\n }\n }\n\n /** enum / 多选值的展示 label(无 options 时退回原值) */\n enumOptionLabel(field: FormFieldConfig, value: string): string {\n return field.options?.[value]?.label ?? value;\n }\n\n /** options 中声明 disabled 的值不可选 */\n enumOptionDisabled(field: FormFieldConfig, value: string): boolean {\n return field.options?.[value]?.disabled === true;\n }\n\n /** 字符串 format 映射到原生输入类型 */\n textInputType(field: FormFieldConfig): string {\n switch (field.format?.kind) {\n case 'url':\n return 'url';\n case 'email':\n return 'email';\n case 'phone':\n return 'tel';\n default:\n return 'text';\n }\n }\n\n /** 取色器回显值:非法或空值退回黑色 */\n colorValue(field: FormFieldConfig): string {\n const value = this.formData()[field.field];\n return (\n typeof value === 'string' && /^#?[0-9a-fA-F]{6}$/.test(value) ?\n value.startsWith('#') ?\n value\n : `#${value}`\n : '#000000'\n );\n }\n\n /** 字节序列回显为 hex 字符串 */\n binaryToHex(value: unknown): string {\n return value instanceof Uint8Array ? Array.from(value, byte => byte.toString(16).padStart(2, '0')).join('') : '';\n }\n\n /** 复选组的当前选中状态(支持数组与逗号字符串两种存储形态) */\n multiSelected(field: FormFieldConfig, value: string): boolean {\n const current = this.formData()[field.field];\n if (Array.isArray(current)) return current.includes(value);\n if (typeof current === 'string')\n return current\n .split(',')\n .map(s => s.trim())\n .includes(value);\n return false;\n }\n\n /** 复选组切换:合并出新数组后走统一解析链路 */\n onMultiSelectChange(field: FormFieldConfig, value: string, checked: boolean): void {\n const current = this.formData()[field.field];\n const list =\n Array.isArray(current) ? [...(current as string[])]\n : typeof current === 'string' ?\n current\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n : [];\n const next = checked ? [...list, value] : list.filter(v => v !== value);\n this.onFieldChange(field, next);\n }\n}\n","import type { EntityTableConfig } from '@aiao/rxdb-model';\nimport { InjectionToken } from '@angular/core';\n\n/**\n * 实体表格配置注入令牌\n * 用于在 Angular 应用中注入全局实体表格配置\n */\nexport const ENTITY_TABLE_CONFIG = new InjectionToken<EntityTableConfig>('ENTITY_TABLE_CONFIG');\n","import type {\n BatchChangeItem,\n CellChangeEvent,\n EntityTableHandle,\n EntityTableRecord,\n HeaderPositionChange,\n PendingWrite,\n RowMoveEvent\n} from '@aiao/rxdb-model';\nimport {\n CellTooltipManager,\n ROW_SERIES_COL_OFFSET,\n TableClipboardManager,\n collectDeleteWrites,\n collectReorderedIds,\n completeTableEdit,\n createListTable,\n createTheme,\n getCSSVariables,\n handleTableKeydown,\n isDocumentDarkMode,\n patchDragIconForReadonlyRows,\n readRowMove,\n restoreTableRecords,\n setCellSwitchState,\n setRowDragEnabled,\n syncHeaderSortIcon,\n updateTableRecords,\n changeCellValue as vtChangeCellValue\n} from '@aiao/rxdb-model';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n OnDestroy,\n PLATFORM_ID,\n afterNextRender,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport type { ListTableConstructorOptions } from '@visactor/vtable';\nimport * as VTable from '@visactor/vtable';\nimport { ENTITY_TABLE_CONFIG } from '../config';\n\n/**\n * 通用实体数据表格组件\n *\n * 基于 VTable 提供高性能表格渲染,支持:\n * - 单元格编辑(文本、开关、复选框、下拉)\n * - 剪贴板操作(Ctrl+C/V,TSV 格式)\n * - 拖拽排序\n * - 键盘导航(Enter 切换开关,Delete 清空单元格)\n * - 主题系统(daisyUI CSS 变量)\n * - 校验错误 tooltip\n */\n@Component({\n selector: 'rxdb-entity-table',\n imports: [],\n templateUrl: './entity-table.component.html',\n styleUrl: './entity-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n/**\n * VTable 表格宿主组件:负责表格实例生命周期、事件桥接、暗色主题探测与销毁释放;\n * 全部表格基础设施(列构建、编辑器、剪贴板、键盘、主题)来自 @aiao/rxdb-model。\n * 组件实例即三端共用的命令面 {@link EntityTableHandle}。\n */\nexport class EntityTableComponent implements OnDestroy, EntityTableHandle {\n readonly #document = inject(DOCUMENT);\n readonly #platformId = inject(PLATFORM_ID);\n readonly #config = inject(ENTITY_TABLE_CONFIG, { optional: true });\n #tableInstance: VTable.ListTable | null = null;\n #destroyed = false;\n #tableReady = signal(false);\n #prevColumns: ListTableConstructorOptions['columns'] | null = null;\n #prevRecords: EntityTableRecord[] | null = null;\n /** 最近一次交给表格的行顺序副本:VTable 拖放会原地改写传入数组 */\n #committedRecords: EntityTableRecord[] = [];\n #selectedCell: { col: number; row: number } | null = null;\n #containerKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n #resizeObserver: ResizeObserver | null = null;\n readonly #cellTooltip = signal<{ x: number; y: number; content: string } | null>(null);\n readonly #headerHeight = signal(40);\n readonly #clipboard = new TableClipboardManager();\n readonly #tooltip = new CellTooltipManager();\n readonly #detectedDarkMode = signal(false);\n #themeObserver: MutationObserver | null = null;\n #prefersDarkQuery: MediaQueryList | null = null;\n #prefersDarkListener: (() => void) | null = null;\n #container: HTMLElement | null = null;\n\n readonly tableContainer = viewChild<ElementRef<HTMLDivElement>>('tableContainer');\n\n // ── 输入 ──────────────────────────────────────────────────────────\n readonly records = input.required<EntityTableRecord[]>();\n readonly columns = input.required<ListTableConstructorOptions['columns']>();\n readonly isDarkMode = input<boolean | undefined>(undefined);\n readonly idField = input('id');\n readonly nonClearableFields = input<ReadonlySet<string>>(new Set());\n readonly tableOptions = input<Partial<ListTableConstructorOptions>>();\n readonly cellErrorDetector = input<(record: EntityTableRecord, field: string) => string | null>();\n readonly loading = input(false);\n /** 业务层回调判断单元格是否可清空(返回 false 跳过),替代领域特定的硬编码逻辑 */\n readonly cellClearable = input<(record: Record<string, unknown>, field: string) => boolean>();\n /** 触底时加载更多数据的回调,由表格内部在滚动到底部时调用 */\n readonly loadMore = input<() => void>();\n /** 加载更多中状态(已有数据,底部小 spinner,不拦截滚动) */\n readonly loadingMore = input(false);\n /** 是否显示行拖动手柄,缺省 `true`;运行时切换即时生效(建表需开启 `rowSeriesNumber.dragOrder`) */\n readonly rowDragEnabled = input(true);\n\n // ── 输出 ──────────────────────────────────────────────────────────\n readonly cellChanged = output<CellChangeEvent>();\n readonly rowDeleted = output<EntityTableRecord>();\n readonly iconClicked = output<{ name: string; record: EntityTableRecord }>();\n readonly batchUpdated = output<BatchChangeItem[]>();\n readonly rowReordered = output<string[]>();\n /** 单行拖放:被拖行与落点前后邻居(US-028) */\n readonly rowMoved = output<RowMoveEvent>();\n readonly scrollNearBottom = output<void>();\n /** 列头排序点击;业务层接管查询排序,表格不执行客户端排序 */\n readonly sortClicked = output<{ field: unknown; order: unknown }>();\n\n readonly cellTooltip = this.#cellTooltip;\n readonly headerHeight = this.#headerHeight;\n\n get tableInstance(): VTable.ListTable | null {\n return this.#tableInstance;\n }\n\n constructor() {\n if (isPlatformBrowser(this.#platformId)) {\n this.#syncDetectedDarkMode();\n this.#observeThemeChanges();\n\n afterNextRender(() => {\n if (this.#destroyed) return;\n const el = this.tableContainer()?.nativeElement;\n if (el && !this.#tableInstance && this.columns()?.length) {\n this.#initTable(el);\n this.#prevColumns = this.columns();\n this.#tableReady.set(true);\n }\n });\n\n effect(() => {\n const records = this.records();\n const columns = this.columns();\n const ready = untracked(() => this.#tableReady());\n if (!this.#tableInstance) {\n if (!ready && columns?.length) {\n const el = this.tableContainer()?.nativeElement;\n if (el) {\n this.#initTable(el);\n this.#prevColumns = columns;\n this.#tableReady.set(true);\n }\n }\n return;\n }\n const columnsChanged = columns !== this.#prevColumns;\n if (columnsChanged) {\n updateTableRecords(this.#tableInstance, records, this.#prevColumns ?? columns, columns);\n this.#prevColumns = columns;\n this.#prevRecords = records;\n this.#committedRecords = [...records];\n } else if (records !== this.#prevRecords) {\n this.#tableInstance.setRecords(records);\n this.#prevRecords = records;\n this.#committedRecords = [...records];\n }\n });\n\n // 行拖动手柄开关(VTable 只在建表时读 dragOrder,运行时经补丁过的 getIcons 收起)\n effect(() => {\n const enabled = this.rowDragEnabled();\n if (this.#tableReady() && this.#tableInstance) setRowDragEnabled(this.#tableInstance, enabled);\n });\n\n effect(() => {\n this.isDarkMode();\n this.#detectedDarkMode();\n this.redrawTheme();\n });\n }\n }\n /**\n * 从业务层回滚单元格值(校验失败时恢复原值)。\n * 避免外部直接访问 tableInstance。\n */\n changeCellValue(col: number, row: number, value: unknown): void {\n if (this.#tableInstance) vtChangeCellValue(this.#tableInstance, col, row, value);\n }\n\n redrawTheme(): void {\n if (this.#tableInstance) {\n this.#tableInstance.updateTheme(createTheme(this.#resolvedDarkMode(), getCSSVariables()));\n }\n }\n\n /** 把行恢复成最近一次交给表格的顺序(拖放被拒或落库失败时调用)。 */\n restoreRecords(): void {\n if (this.#tableInstance && this.#prevRecords) {\n restoreTableRecords(this.#tableInstance, this.#prevRecords, this.#committedRecords);\n }\n }\n\n ngOnDestroy(): void {\n this.#destroyed = true;\n this.#tooltip.cleanup();\n this.#themeObserver?.disconnect();\n this.#themeObserver = null;\n if (this.#prefersDarkQuery && this.#prefersDarkListener) {\n this.#prefersDarkQuery.removeEventListener('change', this.#prefersDarkListener);\n }\n this.#prefersDarkQuery = null;\n this.#prefersDarkListener = null;\n if (this.#containerKeydownHandler) {\n this.#container?.removeEventListener('keydown', this.#containerKeydownHandler);\n this.#containerKeydownHandler = null;\n }\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n if (this.#tableInstance) {\n completeTableEdit(this.#tableInstance);\n this.#tableInstance.release();\n }\n this.#tableInstance = null;\n this.#container = null;\n this.#tableReady.set(false);\n }\n\n #initTable(container: HTMLElement): void {\n const records = this.records();\n const table = createListTable(container, records, this.columns(), this.#resolvedDarkMode(), this.tableOptions());\n this.#tableInstance = table;\n this.#prevRecords = records;\n this.#committedRecords = [...records];\n this.#container = container;\n const h = table.getRowHeight(0);\n if (h > 0) this.#headerHeight.set(h);\n\n this.#resizeObserver = new ResizeObserver(() => table.resize());\n this.#resizeObserver.observe(container);\n table.updateTheme(createTheme(this.#resolvedDarkMode(), getCSSVariables()));\n patchDragIconForReadonlyRows(table);\n setRowDragEnabled(\n table,\n untracked(() => this.rowDragEnabled())\n );\n this.#bindTableEvents(table, container);\n }\n\n #resolvedDarkMode(): boolean {\n return this.isDarkMode() ?? this.#detectedDarkMode();\n }\n\n #syncDetectedDarkMode(): void {\n this.#detectedDarkMode.set(isDocumentDarkMode());\n }\n\n #observeThemeChanges(): void {\n if (typeof MutationObserver !== 'undefined') {\n this.#themeObserver = new MutationObserver(() => this.#syncDetectedDarkMode());\n this.#themeObserver.observe(this.#document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme']\n });\n }\n\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return;\n }\n\n this.#prefersDarkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n this.#prefersDarkListener = () => {\n if (!this.#document.documentElement.hasAttribute('data-theme')) {\n this.#syncDetectedDarkMode();\n }\n };\n this.#prefersDarkQuery.addEventListener('change', this.#prefersDarkListener);\n }\n\n #bindTableEvents(table: VTable.ListTable, container: HTMLElement): void {\n table.on('change_cell_value', (args: { col: number; row: number; changedValue: string | number }) => {\n this.#handleCellChange(args.col, args.row, args.changedValue);\n });\n table.on('switch_state_change', (args: { col: number; row: number; checked: boolean }) => {\n this.#handleCellChange(args.col, args.row, args.checked);\n });\n table.on('checkbox_state_change', (args: { col: number; row: number; checked: boolean }) => {\n this.#handleCellChange(args.col, args.row, args.checked);\n });\n table.on('icon_click', (args: { name: string; col: number; row: number }) => {\n completeTableEdit(table);\n const record = table.getRecordByCell(args.col, args.row) as EntityTableRecord | undefined;\n if (!record) return;\n if (args.name === 'delete-action') this.rowDeleted.emit(record);\n else this.iconClicked.emit({ name: args.name, record });\n });\n table.on('mouseenter_cell', (args: { col: number; row: number }) => this.#showCellError(args.col, args.row));\n table.on('mouseleave_cell', () => this.#tooltip.hide(v => this.#cellTooltip.set(v)));\n table.on('selected_cell', (args: { col: number; row: number }) => {\n this.#selectedCell = { col: args.col, row: args.row };\n });\n table.on('change_header_position', (args: HeaderPositionChange) => {\n const ids = collectReorderedIds(table, this.idField());\n if (ids.length > 0) this.rowReordered.emit(ids);\n const move = readRowMove(table, this.idField(), args);\n if (move) this.rowMoved.emit(move);\n });\n // 返回 false 阻止 VTable executeSort,由业务层 cursor orderBy 重查;排序图标另行同步\n table.on('sort_click', (args: { field: unknown; order: unknown }) => {\n this.sortClicked.emit({ field: args.field, order: args.order });\n syncHeaderSortIcon(table, args);\n return false;\n });\n table.on('scroll', (args: { scrollDirection: string; scrollRatioY?: number; dy?: number }) => {\n if (\n args.scrollDirection === 'vertical' &&\n (args.dy ?? 0) > 0 &&\n (args.scrollRatioY ?? 0) > 0.9 &&\n !this.loadingMore()\n ) {\n const fn = this.loadMore();\n if (fn) {\n fn();\n } else {\n this.scrollNearBottom.emit();\n }\n }\n });\n\n this.#containerKeydownHandler = (e: KeyboardEvent) =>\n handleTableKeydown(\n {\n getTable: () => this.#tableInstance,\n getSelectedCell: () => this.#selectedCell,\n getColDef: col => this.#getColDef(col) as { cellType?: string; field?: string },\n onCopy: () => void this.#clipboard.copy(table, this.columns() as Record<string, unknown>[]),\n onPaste: () => void this.#pasteFromClipboard(),\n onDelete: () => this.#deleteSelectedCells(),\n onCellChange: (col, row, val) => this.#handleCellChange(col, row, val)\n },\n e\n );\n container.addEventListener('keydown', this.#containerKeydownHandler);\n }\n\n #getColDef(col: number): Record<string, unknown> | undefined {\n return (this.columns() as Record<string, unknown>[])?.[col - ROW_SERIES_COL_OFFSET];\n }\n\n #handleCellChange(col: number, row: number, changedValue: unknown): void {\n const record = this.#tableInstance?.getRecordByCell(col, row) as EntityTableRecord | undefined;\n const fieldName = (this.#getColDef(col) as { field?: string })?.field;\n if (!record || !fieldName) return;\n this.cellChanged.emit({ col, row, field: fieldName, value: changedValue, record });\n }\n\n #showCellError(col: number, row: number): void {\n const table = this.#tableInstance;\n if (!table) return;\n const detector = this.cellErrorDetector();\n if (!detector) return;\n const record = table.getRecordByCell(col, row) as EntityTableRecord | undefined;\n if (!record) return;\n const field = (this.#getColDef(col) as { field?: string })?.field;\n if (!field) return;\n const content = detector(record, field);\n if (!content) return;\n this.#tooltip.showError(table, col, row, content, v => this.#cellTooltip.set(v), this.#config?.tooltipDelay);\n }\n\n /** 将 PendingWrite[] 按 idField 归并为 BatchChangeItem[] */\n #groupWrites(writes: PendingWrite[]): BatchChangeItem[] {\n const map = new Map<string, Record<string, unknown>>();\n for (const w of writes) {\n const id = String((w.record as Record<string, unknown>)[this.idField()]);\n if (!map.has(id)) map.set(id, {});\n map.get(id)![w.field] = w.value;\n }\n return [...map.entries()].map(([recordId, changes]) => ({ recordId, changes }));\n }\n\n async #pasteFromClipboard(): Promise<void> {\n if (!this.#tableInstance) return;\n const writes = await this.#clipboard.paste(this.#tableInstance, this.columns() as Record<string, unknown>[]);\n if (writes.length > 0) {\n for (const w of writes) {\n if (typeof w.value === 'boolean') {\n setCellSwitchState(this.#tableInstance, w.col, w.row, w.value);\n }\n }\n this.batchUpdated.emit(this.#groupWrites(writes));\n }\n }\n\n #deleteSelectedCells(): void {\n const table = this.#tableInstance;\n if (!table) return;\n const columns = this.columns() as { field?: string; cellType?: string | ((...a: unknown[]) => string) }[];\n const { writes, boolCells } = collectDeleteWrites(table, columns, this.nonClearableFields(), this.cellClearable());\n for (const bc of boolCells) setCellSwitchState(table, bc.col, bc.row, false);\n if (writes.length > 0) this.batchUpdated.emit(this.#groupWrites(writes));\n }\n}\n","<div class=\"relative h-full w-full overflow-hidden\">\n <div class=\"absolute inset-0\" #tableContainer></div>\n @if (records().length === 0 && !loading()) {\n <div\n class=\"text-base-content/40 absolute inset-x-0 bottom-0 flex items-center justify-center text-sm\"\n [style.top.px]=\"headerHeight()\"\n aria-label=\"暂无数据\"\n role=\"status\"\n >\n <div class=\"empty-slot\">\n <ng-content select=\"[emptyState]\"></ng-content>\n </div>\n <div class=\"empty-default flex flex-col items-center gap-3\">\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"40\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.2\"\n viewBox=\"0 0 24 24\"\n width=\"40\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect height=\"18\" rx=\"2\" width=\"18\" x=\"3\" y=\"3\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 9v12\" />\n <path d=\"M3 15h18\" />\n </svg>\n <span>暂无数据</span>\n </div>\n </div>\n }\n @if (loading()) {\n <div class=\"bg-base-100/60 absolute inset-0 z-10 flex items-center justify-center\">\n <span class=\"loading loading-spinner loading-md text-primary\"></span>\n </div>\n }\n @if (loadingMore()) {\n <div class=\"pointer-events-none absolute right-0 bottom-0 left-0 z-10 flex justify-center py-1.5\">\n <span class=\"loading loading-dots loading-sm text-primary\"></span>\n </div>\n }\n @if (cellTooltip(); as tip) {\n <div\n class=\"bg-base-300 text-base-content border-base-300 pointer-events-none fixed z-[100] max-w-xs rounded border px-2 py-1.5 text-xs shadow-lg\"\n [style.left.px]=\"tip.x\"\n [style.top.px]=\"tip.y\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n role=\"tooltip\"\n >\n {{ tip.content }}\n </div>\n }\n</div>\n","import type {\n BatchChangeItem,\n CellChangeEvent,\n EntityTableRecord,\n QueryTableHandle,\n RowMoveEvent\n} from '@aiao/rxdb-model';\nimport { ChangeDetectionStrategy, Component, computed, input, output, viewChild } from '@angular/core';\nimport type { ListTable, ListTableConstructorOptions } from '@visactor/vtable';\nimport { EntityTableComponent } from '../entity-table/entity-table.component';\n\n/**\n * 集成查询构建器的实体表格组件\n *\n * 在实体表格上方提供筛选区域位置(通过内容投影),\n * 将 rxdb-query-builder 的查询结果传递给底层 EntityTableComponent。\n *\n * 使用方式:\n * ```html\n * <rxdb-query-table [records]=\"filteredRecords()\" [columns]=\"columns\">\n * <div filterBar>\n * <rxdb-query-builder [fields]=\"fields\" (queryChange)=\"onQueryChange($event)\" />\n * </div>\n * <div emptyState>暂无数据</div>\n * </rxdb-query-table>\n * ```\n */\n@Component({\n selector: 'rxdb-query-table',\n imports: [EntityTableComponent],\n templateUrl: './query-table.component.html',\n styleUrl: './query-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n/**\n * 查询表格组件:EntityTableComponent + `filterBar` / `emptyState` 插槽与筛选状态栏\n * (filtered / total 计数)。组件实例即三端共用的命令面 {@link QueryTableHandle}。\n */\nexport class QueryTableComponent implements QueryTableHandle {\n readonly records = input.required<EntityTableRecord[]>();\n readonly columns = input.required<ListTableConstructorOptions['columns']>();\n readonly idField = input('id');\n readonly nonClearableFields = input<ReadonlySet<string>>(new Set());\n readonly tableOptions = input<Partial<ListTableConstructorOptions>>();\n readonly cellErrorDetector = input<(record: EntityTableRecord, field: string) => string | null>();\n readonly isDarkMode = input<boolean | undefined>(undefined);\n /** 业务层回调判断单元格是否可清空 */\n readonly cellClearable = input<(record: Record<string, unknown>, field: string) => boolean>();\n\n /** 查询条件是否激活(显示筛选状态标签) */\n readonly queryActive = input(false);\n /** 结果总数(显示在筛选状态栏中) */\n readonly totalCount = input<number>();\n /** 筛选后结果数 */\n readonly filteredCount = input<number>();\n /** 是否显示加载状态 */\n readonly loading = input(false);\n /** 加载更多中(已有数据,底部小 spinner,不拦截滚动) */\n readonly loadingMore = input(false);\n /** 触底时加载更多数据的回调,透传给 EntityTableComponent */\n readonly loadMore = input<() => void>();\n /** 是否显示行拖动手柄,缺省 `true`,透传给 EntityTableComponent */\n readonly rowDragEnabled = input(true);\n\n readonly cellChanged = output<CellChangeEvent>();\n readonly rowDeleted = output<EntityTableRecord>();\n readonly iconClicked = output<{ name: string; record: EntityTableRecord }>();\n readonly batchUpdated = output<BatchChangeItem[]>();\n readonly rowReordered = output<string[]>();\n /** 单行拖放:被拖行与落点前后邻居 */\n readonly rowMoved = output<RowMoveEvent>();\n readonly scrollNearBottom = output<void>();\n readonly sortClicked = output<{ field: unknown; order: unknown }>();\n\n readonly entityTable = viewChild(EntityTableComponent);\n\n readonly statusText = computed(() => {\n const total = this.totalCount();\n const filtered = this.filteredCount();\n if (total == null) return '';\n if (filtered != null && filtered !== total) return `${filtered} / ${total}`;\n return `${total}`;\n });\n\n get tableInstance(): ListTable | null {\n return this.entityTable()?.tableInstance ?? null;\n }\n\n changeCellValue(col: number, row: number, value: unknown): void {\n this.entityTable()?.changeCellValue(col, row, value);\n }\n\n redrawTheme(): void {\n this.entityTable()?.redrawTheme();\n }\n\n /** 把行恢复成最近一次交给表格的顺序(委托给内部实体表格) */\n restoreRecords(): void {\n this.entityTable()?.restoreRecords();\n }\n}\n","<div class=\"flex h-full w-full flex-col overflow-hidden\">\n <!-- 筛选栏插槽 -->\n <ng-content select=\"[filterBar]\"></ng-content>\n\n <!-- 筛选状态栏 -->\n @if (queryActive() && statusText()) {\n <div class=\"text-base-content/60 flex items-center gap-2 border-b px-3 py-1 text-xs\">\n <span>{{ statusText() }}</span>\n </div>\n }\n\n <!-- 表格主体 -->\n <div class=\"min-h-0 flex-1\">\n <rxdb-entity-table\n [cellClearable]=\"cellClearable()\"\n [cellErrorDetector]=\"cellErrorDetector()\"\n [columns]=\"columns()\"\n [idField]=\"idField()\"\n [isDarkMode]=\"isDarkMode()\"\n [loading]=\"loading()\"\n [loadingMore]=\"loadingMore()\"\n [loadMore]=\"loadMore()\"\n [nonClearableFields]=\"nonClearableFields()\"\n [records]=\"records()\"\n [rowDragEnabled]=\"rowDragEnabled()\"\n [tableOptions]=\"tableOptions()\"\n (batchUpdated)=\"batchUpdated.emit($event)\"\n (cellChanged)=\"cellChanged.emit($event)\"\n (iconClicked)=\"iconClicked.emit($event)\"\n (rowDeleted)=\"rowDeleted.emit($event)\"\n (rowMoved)=\"rowMoved.emit($event)\"\n (rowReordered)=\"rowReordered.emit($event)\"\n (scrollNearBottom)=\"scrollNearBottom.emit()\"\n (sortClicked)=\"sortClicked.emit($event)\"\n >\n <ng-content ngProjectAs=\"[emptyState]\" select=\"[emptyState]\"></ng-content>\n </rxdb-entity-table>\n </div>\n</div>\n","import {\n createQueryBuilderService,\n type FieldMetadata,\n type QueryBuilderService,\n type RuleGroup,\n type SchemaInfo,\n type UIRule,\n type ValidationResult\n} from '@aiao/rxdb-model';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n OnDestroy,\n output,\n Signal,\n viewChild\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { QueryDragDropHandler, QueryGroupComponent, type UIRuleGroup } from '../query-group/query-group.component';\n\n/**\n * RxDB 查询输出格式\n */\nexport interface RxDBQueryOutput<T> {\n combinator: 'and' | 'or';\n rules: Array<RxDBQueryOutput<T> | { field: keyof T & string; operator: string; value: unknown }>;\n}\n\n/**\n * Angular Query Builder 主组件\n *\n * @description\n * 提供可视化的查询条件构建界面,支持:\n * - 传入 SchemaInfo 或 FieldMetadata[] 定义可用字段\n * - 拖拽重排规则和分组\n * - 嵌套分组(最大 5 层)\n * - 实时验证\n *\n * @example\n * ```html\n * <rxdb-query-builder\n * [schema]=\"schema\"\n * (queryChange)=\"onQueryChange($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'rxdb-query-builder',\n standalone: true,\n imports: [CommonModule, QueryGroupComponent],\n template: `\n <div\n class=\"rxdb-query-builder bg-base-100\"\n (keydown)=\"onKeyDown($event)\"\n aria-label=\"查询条件构建器\"\n role=\"search\"\n tabindex=\"0\"\n >\n <div class=\"overflow-y-auto\" #scrollContainer [style.max-height]=\"height()\">\n <!-- 标题栏 -->\n <div class=\"mb-4 flex items-center justify-between\">\n <h3 class=\"text-base\" id=\"query-builder-title\">查询条件</h3>\n <div class=\"flex gap-2\" aria-label=\"查询操作\" role=\"toolbar\">\n @if (hasRules()) {\n <button\n class=\"btn btn-ghost btn-sm\"\n (click)=\"clearAll()\"\n (keydown.enter)=\"clearAll()\"\n aria-label=\"清空所有查询条件\"\n title=\"清空所有查询条件 (Escape)\"\n type=\"button\"\n >\n 清空\n </button>\n }\n </div>\n </div>\n\n <!-- 空状态提示 -->\n @if (!hasRules()) {\n <div class=\"text-base-content/60 min-w-md py-8 text-center\" aria-live=\"polite\" role=\"status\">\n <div class=\"mb-2 flex justify-center\" aria-hidden=\"true\">\n <svg\n class=\"size-12 opacity-40\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n </div>\n <p class=\"mb-4\">还没有任何查询条件</p>\n <button class=\"btn btn-sm\" (click)=\"addFirstRule()\" aria-label=\"添加第一个条件\" type=\"button\">\n 添加第一个条件\n </button>\n </div>\n } @else {\n <!-- 根规则组 -->\n <rxdb-query-group\n [allowCollapse]=\"enableCollapse()\"\n [depth]=\"0\"\n [dragDropHandler]=\"enableDrag() ? dragDropHandler : undefined\"\n [errors]=\"validationErrors()\"\n [fields]=\"fieldsComputed()\"\n [group]=\"rootGroup()!\"\n [maxDepth]=\"maxDepth()\"\n (addGroup)=\"onAddGroup($event)\"\n (addRule)=\"onAddRule($event)\"\n (removeItem)=\"onRemoveItem($event)\"\n (updateCombinator)=\"onUpdateCombinator($event)\"\n (updateRule)=\"onUpdateRule($event)\"\n role=\"region\"\n />\n }\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryBuilderComponent<T extends object> implements OnDestroy {\n private readonly service: QueryBuilderService<T>;\n /** 上次应用的 initialQuery 引用,用于检测是否有新查询需要加载 */\n private lastAppliedInitialQuery: unknown = undefined;\n\n private readonly scrollContainer = viewChild<ElementRef<HTMLElement>>('scrollContainer');\n\n /** 根规则组 Signal */\n private readonly rootGroupSignal: Signal<unknown>;\n\n /** 验证 Signal */\n private readonly validationSignal: Signal<ValidationResult | undefined>;\n\n /**\n * Schema 信息,包含字段定义\n */\n readonly schema = input<SchemaInfo>();\n\n /**\n * 字段列表(直接传入,优先于 schema)\n */\n readonly fields = input<FieldMetadata[]>([]);\n\n /**\n * 初始查询条件(可选)\n */\n readonly initialQuery = input<RxDBQueryOutput<T>>();\n\n /**\n * 最大嵌套层级(默认 5)\n */\n readonly maxDepth = input<number>(5);\n\n /**\n * 内容区域最大高度(超出后滚动),支持任意 CSS 长度值,如 `'400px'`、`'50vh'`\n */\n readonly height = input<string>('80vh');\n\n /**\n * 是否开启拖拽排序功能(默认开启)\n */\n readonly enableDrag = input<boolean>(true);\n\n /**\n * 是否开启分组展开/收起功能(默认开启)\n */\n readonly enableCollapse = input<boolean>(true);\n\n readonly dragDropHandler: QueryDragDropHandler;\n\n /**\n * 查询条件变更事件\n */\n readonly queryChange = output<RxDBQueryOutput<T>>();\n\n /**\n * 验证状态变更事件\n */\n readonly validationChange = output<ValidationResult>();\n\n /** 计算后的字段列表 */\n readonly fieldsComputed: Signal<FieldMetadata[]> = computed(() => {\n // 优先使用直接传入的 fields\n const directFields = this.fields();\n if (directFields && directFields.length > 0) {\n return directFields;\n }\n // 否则从 schema 获取\n const schemaInfo = this.schema();\n return schemaInfo?.fields ?? [];\n });\n\n /** 根规则组 */\n readonly rootGroup: Signal<UIRuleGroup | undefined> = computed(() => {\n return this.rootGroupSignal() as UIRuleGroup | undefined;\n });\n\n /** 验证错误列表 */\n readonly validationErrors = computed(() => {\n const validation = this.validationSignal();\n return validation?.errors ?? [];\n });\n\n /** 是否有规则 */\n readonly hasRules = computed(() => {\n const group = this.rootGroup();\n return group && group.rules.length > 0;\n });\n\n constructor() {\n // 在构造函数中初始化服务(非 reactive context)\n this.service = createQueryBuilderService<T>({\n config: {\n maxNestingLevel: this.maxDepth()\n }\n });\n\n this.dragDropHandler = new QueryDragDropHandler((itemId, targetGroupId, targetIndex) =>\n this.service.moveItem(itemId, targetGroupId, targetIndex)\n );\n\n // 转换 Observable 为 Signal(必须在 reactive context 外部)\n this.rootGroupSignal = toSignal(this.service.rootGroup$, { requireSync: true });\n this.validationSignal = toSignal(this.service.validation$, { initialValue: undefined });\n\n // 监听字段变化并同步到服务\n effect(() => {\n const fields = this.fieldsComputed();\n if (fields.length > 0) {\n this.service.setFields(fields);\n }\n });\n\n // 监听初始查询并加载(引用变化时重新加载,用户修改不影响此 signal 故不会覆盖)\n effect(() => {\n const initial = this.initialQuery();\n if (initial !== undefined && initial !== this.lastAppliedInitialQuery) {\n this.lastAppliedInitialQuery = initial;\n this.service.fromRxDBQuery(initial as unknown as RuleGroup<T>);\n }\n });\n\n // 监听查询变化并发出事件\n effect(() => {\n const group = this.rootGroup();\n if (group) {\n const query = this.service.toRxDBQuery();\n this.queryChange.emit(query as RxDBQueryOutput<T>);\n }\n });\n\n // 监听验证变化并发出事件\n effect(() => {\n const validation = this.validationSignal();\n if (validation) {\n this.validationChange.emit(validation);\n }\n });\n }\n\n /** 销毁服务 */\n ngOnDestroy(): void {\n this.service.destroy();\n }\n\n /** 添加第一个规则 */\n addFirstRule(): void {\n const firstField = this.fieldsComputed()[0];\n if (firstField) {\n this.service.addRule(undefined, {\n field: firstField.name,\n operator:\n firstField.isRelation ? 'exists'\n : firstField.type === 'keyValue' ? 'null'\n : '=',\n value: firstField.type === 'boolean' ? false : ''\n });\n }\n }\n\n /** 清空所有规则 */\n clearAll(): void {\n this.service.clear();\n }\n\n /** 添加规则到指定组 */\n onAddRule(event: { parentId: string; rule: Omit<UIRule, 'id'> }): void {\n this.service.addRule(event.parentId, event.rule);\n this.scrollToBottom();\n }\n\n /** 添加子组到指定组 */\n onAddGroup(parentId: string): void {\n this.service.addGroup(parentId);\n this.scrollToBottom();\n }\n\n /** 删除规则或组 */\n onRemoveItem(id: string): void {\n this.service.remove(id);\n }\n\n /** 更新规则 */\n onUpdateRule(event: { id: string; updates: Partial<UIRule> }): void {\n this.service.updateRule(event.id, event.updates);\n }\n\n /** 更新组合器 */\n onUpdateCombinator(event: { id: string; combinator: 'and' | 'or' }): void {\n this.service.updateGroupCombinator(event.id, event.combinator);\n }\n\n /** 键盘快捷键处理 */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.hasRules()) {\n event.preventDefault();\n this.clearAll();\n return;\n }\n }\n\n private scrollToBottom(): void {\n setTimeout(() => {\n const el = this.scrollContainer()?.nativeElement;\n el?.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }, 0);\n }\n}\n","import {\n getEntityMetadata,\n RelationKind,\n RxDB,\n type EntityMetadata,\n type EntityType,\n type FindByCursorOptions,\n type OrderBy\n} from '@aiao/rxdb';\nimport { InfiniteScrollingList } from '@aiao/rxdb-angular';\nimport {\n actionsColumn,\n buildEditableColumns,\n buildFormFields,\n canReorderEntityList,\n commitRowMove,\n defaultListOrderBy,\n deriveEntityCapabilities,\n extractFieldsFromMetadata,\n organizeFields,\n parsePropertyColumnValue,\n type BatchChangeItem,\n type CellChangeEvent,\n type EntityFormData,\n type EntityInstance,\n type EntityTableRecord,\n type FieldMetadata,\n type FilterQuery,\n type FormFieldConfig,\n type ModelInfo,\n type RelatedEntityProvider,\n type RowMoveEvent,\n type ValidationResult\n} from '@aiao/rxdb-model';\nimport type { VersionManager } from '@aiao/rxdb-plugin-history';\nimport { Dialog, DialogRef } from '@angular/cdk/dialog';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ErrorHandler,\n forwardRef,\n HostListener,\n inject,\n Injector,\n input,\n linkedSignal,\n output,\n PLATFORM_ID,\n runInInjectionContext,\n signal,\n TemplateRef,\n viewChild,\n type WritableSignal\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { LucideFunnel as Funnel, LucideDynamicIcon, LucideRedo2 as Redo2, LucideUndo2 as Undo2 } from '@lucide/angular';\nimport type { ColumnsDefine, ListTableConstructorOptions } from '@visactor/vtable';\nimport { of } from 'rxjs';\nimport type { EntityDetailDialogData } from '../entity-detail/entity-detail';\nimport { EntityDialogComponent } from '../entity-dialog/entity-dialog.component';\nimport { QueryTableComponent } from '../entity-table/query-table/query-table.component';\nimport { QueryBuilderComponent } from '../query-builder/query-builder/query-builder.component';\n\n// 历史 / 撤销重做子系统在开源核心中被拆为 rxdb-plugin-history 插件(US-025):\n// 其装配期在 RxDB 实例上挂载 `versionManager` 槽位,此处声明合并恢复该类型的可见性。\ndeclare module '@aiao/rxdb' {\n interface RxDB {\n versionManager: VersionManager;\n }\n}\n\nconst EMPTY_FILTER: FilterQuery = { combinator: 'and', rules: [] };\n\n/** 列表列头排序状态(normal = 默认 id desc) */\ntype ListSortState = { field: string; order: 'asc' | 'desc' | 'normal' };\n\nconst DEFAULT_SORT_STATE: ListSortState = { field: 'id', order: 'normal' };\n\n/**\n * 实体列表的表格选项:建表时打开行序号列的拖拽\n *\n * @remarks\n * VTable 只在建表时读 `dragOrder`,所以统一打开,手柄是否出现由 `rowDragEnabled` 按\n * {@link canReorderEntityList} 运行时开关(US-028 阶段 B)。`buildTableOptions()` 对 `rowSeriesNumber`\n * 整体覆盖,`title` / `width` 要照默认值一并带上。\n */\nconst LIST_TABLE_OPTIONS: Partial<ListTableConstructorOptions> = {\n rowSeriesNumber: { title: '', width: 40, dragOrder: true }\n};\n\n/** 规范化 VTable sort_click 的 field,拒绝 actions / 空字段 */\nfunction normalizeSortField(field: unknown): string | undefined {\n if (typeof field !== 'string') return undefined;\n const trimmed = field.trim();\n if (!trimmed || trimmed === 'actions') return undefined;\n return trimmed;\n}\n\n/** 将 VTable order 规范为 asc | desc | normal */\nfunction normalizeSortOrder(order: unknown): ListSortState['order'] {\n if (typeof order !== 'string') return 'normal';\n const lower = order.toLowerCase();\n if (lower === 'asc' || lower === 'desc' || lower === 'normal') return lower;\n return 'normal';\n}\n\n/**\n * 构造 FindByCursor 所需 orderBy。\n * normal → 实体默认排序(手动排序实体按手动顺序);用户字段 → [field, id] 同向(末尾唯一键满足游标定位)。\n */\nfunction buildCursorOrderBy(state: ListSortState, metadata: EntityMetadata | undefined): OrderBy[] {\n if (state.order === 'normal' || !state.field) {\n return defaultListOrderBy(metadata);\n }\n if (state.field === 'id') {\n return [{ field: 'id', sort: state.order }];\n }\n return [\n { field: state.field, sort: state.order },\n { field: 'id', sort: state.order }\n ];\n}\n\n/** 落库错误转为提示文案 */\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** 解析外部导航传入的筛选条件 JSON 字符串,格式非法时静默忽略 */\nfunction parseInitialFilter(raw: string | undefined): FilterQuery | undefined {\n if (!raw) return undefined;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && Array.isArray((parsed as FilterQuery).rules)) {\n return parsed as FilterQuery;\n }\n } catch {\n // 忽略非法 JSON,保持空筛选\n }\n return undefined;\n}\n\n/**\n * 实体列表组件\n *\n * 封装了实体列表的完整 UI:工具栏(显示名称、筛选、撤销/重做、新增)+ 数据表格。\n * 通过 `namespace` 和 `name` 输入定位 RxDB 实体,实现懒加载分页和 CRUD 操作。\n *\n * @example\n * ```html\n * <rxdb-entity-list [namespace]=\"namespace()\" [name]=\"name()\" />\n * ```\n */\n@Component({\n selector: 'rxdb-entity-list',\n templateUrl: './entity-list.component.html',\n host: {\n style: 'display:flex;flex-direction:column;height:100%;overflow:hidden'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n QueryTableComponent,\n QueryBuilderComponent,\n LucideDynamicIcon,\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n forwardRef(() => EntityListComponent),\n forwardRef(() => EntityDialogComponent)\n ]\n})\n/**\n * 实体列表组件:以 namespace + name 定位实体元数据,提供无限滚动表格、行内编辑、\n * 撤销/重做(依赖 @aiao/rxdb-plugin-history)、筛选弹层(内嵌查询构建器)、\n * 级联新增与多对多选择模式。\n */\nexport class EntityListComponent {\n #m2mDialogRef: DialogRef<unknown, void> | null = null;\n // ── Service injections ────────────────────────────────────────────────\n readonly #rxdb = inject(RxDB);\n readonly #injector = inject(Injector);\n readonly #dialog = inject(Dialog);\n readonly #errorHandler = inject(ErrorHandler);\n readonly #destroyRef = inject(DestroyRef);\n\n // ── Save coalescing ───────────────────────────────────────────────────\n readonly #pendingChanges = new Map<string, Record<string, unknown>>();\n #flushHandle = false;\n /** 已排队或正在落库的行内编辑批次数;不为 0 时拒绝拖放排序 */\n readonly #pendingEditBatches = signal(0);\n /** 上一次拖放的重排还没落定 */\n readonly #reorderPending = signal(false);\n\n // ── Entity registry ───────────────────────────────────────────────────\n readonly #entityClsMap = new Map<string, EntityType>(\n this.#rxdb.config.entities.map(cls => {\n const meta = getEntityMetadata(cls);\n return [`${meta.namespace}:${meta.name}`, cls] as const;\n })\n );\n\n readonly #modelInfoMap = new Map<string, ModelInfo>(\n this.#rxdb.config.entities.map(cls => {\n const meta = getEntityMetadata(cls);\n return [\n meta.name,\n {\n name: meta.name,\n displayName: meta.displayName ?? meta.name,\n entityClass: cls as new (...args: unknown[]) => unknown,\n metadata: meta\n }\n ] as const;\n })\n );\n\n readonly #scrollListMap = new Map<string, InfiniteScrollingList<EntityType>>();\n\n readonly #columnsCache = new Map<string, ColumnsDefine>(\n this.#rxdb.config.entities.map(cls => {\n const meta = getEntityMetadata(cls);\n return [\n `${meta.namespace}:${meta.name}`,\n buildEditableColumns(meta, {\n relatedItemsProviderFactory: (fkField, relatedEntityName) => {\n const relCls = [...this.#entityClsMap.values()].find(c => {\n const m = getEntityMetadata(c);\n return m.name === relatedEntityName;\n });\n if (!relCls) return undefined;\n const relKey = (() => {\n const m = getEntityMetadata(relCls);\n return `${m.namespace}:${m.name}`;\n })();\n const list = this.#getOrCreateList(relKey, relCls);\n const strVal = (v: unknown): string | undefined => (typeof v === 'string' && v.length > 0 ? v : undefined);\n return () => {\n return (list.value() as Record<string, unknown>[]).map(inst => ({\n id: String(inst['id'] ?? ''),\n displayName: strVal(inst['displayName']) ?? strVal(inst['name']) ?? String(inst['id'] ?? '')\n }));\n };\n }\n })\n ] as const;\n })\n );\n\n readonly #vHistory = (this.#rxdb as unknown as { versionManager?: VersionManager }).versionManager?.history() ?? {\n undoCount$: of(0),\n redoCount$: of(0),\n undo: async () => undefined,\n redo: async () => undefined\n };\n readonly #entityKey = computed(() => `${this.namespace()}:${this.name()}`);\n readonly #currentList = signal<InfiniteScrollingList<EntityType> | undefined>(undefined);\n\n readonly #instances = computed<EntityInstance[]>(() => {\n const list = this.#currentList();\n return list ? (list.value() as EntityInstance[]) : [];\n });\n\n readonly #entityCls = computed(() => this.#entityClsMap.get(this.#entityKey()));\n\n /** 当前实体的界面能力,由 `permissions` 派生(US-027);未注册实体无元数据可派生,为 `undefined` */\n readonly #capabilities = computed(() => {\n const cls = this.#entityCls();\n return cls ? deriveEntityCapabilities(getEntityMetadata(cls)) : undefined;\n });\n\n /** 级联新增模式下本地草稿子实体(未保存到DB,由父实体级联保存) */\n readonly #localDraftItems = signal<EntityInstance[]>([]);\n\n /** 列头排序;切实体时重置为默认 id desc */\n readonly #sortState: WritableSignal<ListSortState> = linkedSignal(() => {\n this.namespace();\n this.name();\n return { ...DEFAULT_SORT_STATE };\n });\n\n /** 内部查询表格:拖放被拒或落库失败时恢复行序 */\n private readonly queryTable = viewChild(QueryTableComponent);\n\n // ── Protected view bindings ───────────────────────────────────────────\n protected readonly Undo2 = Undo2;\n protected readonly Redo2 = Redo2;\n protected readonly Funnel = Funnel;\n protected readonly listTableOptions = LIST_TABLE_OPTIONS;\n\n /** CDK Overlay 定位策略:优先下方右对齐,其次上方右对齐 */\n protected readonly overlayPositions = [\n {\n originX: 'end' as const,\n originY: 'bottom' as const,\n overlayX: 'end' as const,\n overlayY: 'top' as const,\n offsetY: 4\n },\n {\n originX: 'end' as const,\n originY: 'top' as const,\n overlayX: 'end' as const,\n overlayY: 'bottom' as const,\n offsetY: -4\n }\n ];\n\n protected readonly loadMore = computed(() => {\n const list = this.#currentList();\n return list ? () => list.loadMore() : undefined;\n });\n\n // ── Route inputs ──────────────────────────────────────────────────────\n readonly namespace = input.required<string>();\n readonly name = input.required<string>();\n\n /** 固定查询条件,与用户筛选条件做 AND 合并(用于关系属性过滤,如 ownerId = currentId) */\n readonly fixedQuery = input<FilterQuery | undefined>(undefined);\n\n /** 外部导航传入的初始筛选条件(JSON 字符串),如 Query Builder「应用到实体浏览」 */\n readonly initialFilter = input<string | undefined>(undefined);\n\n /** 预填充的外键数据(级联新增时传递给子实体对话框) */\n readonly fixedFormData = input<EntityFormData | undefined>(undefined);\n\n /** 草稿父实体(用于级联新增场景,子实体通过关系API注册到父实体) */\n readonly draftParentEntity = input<EntityInstance | null>(null);\n\n /** 父实体上关系属性名(如 'children'),用于调用 parent.children$.add(child) */\n readonly parentRelationName = input<string | undefined>(undefined);\n\n /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */\n readonly creationChain = input<string[]>([]);\n\n /** 已打开详情对话框的记录 id 栈(含祖先记录),「查看」前检查以防无限套娃 */\n readonly editChain = input<string[]>([]);\n\n /** 关系类型(MANY_TO_MANY 时启用选择模式) */\n readonly relationKind = input<RelationKind | undefined>(undefined);\n\n /** 父实体实例(用于 M2M 关系操作,包含 draft 和已保存实体) */\n readonly parentEntity = input<EntityInstance | null>(null);\n\n /** 列表模式:default=普通列表, select=选择模式(带 checkbox 列) */\n readonly mode = input<'default' | 'select'>('default');\n\n /** 已关联的实体 ID 集合(选择模式下过滤掉,不再展示) */\n readonly alreadyLinkedIds = input<Set<string>>(new Set());\n\n /** 点击「查看」按钮时触发,携带对应行记录;组件同时打开内置编辑对话框(记录已在 editChain 中或为未保存草稿时仅 emit) */\n readonly viewEntity = output<EntityTableRecord>();\n\n /** 选择模式:确认选择时触发,携带选中的实体实例 */\n readonly selectionConfirmed = output<EntityInstance[]>();\n\n /** 选择模式:取消选择时触发 */\n readonly selectionCancelled = output<void>();\n\n // ── Reactive state ────────────────────────────────────────────────────\n readonly filterQuery: WritableSignal<FilterQuery> = linkedSignal(() => {\n this.namespace();\n this.name();\n return { ...EMPTY_FILTER };\n });\n\n readonly $isFilterQuery = computed(() => this.filterQuery().rules.length > 0);\n\n readonly showFilterPopover = signal(false);\n\n readonly pendingQuery: WritableSignal<FilterQuery> = linkedSignal(() => {\n this.namespace();\n this.name();\n return { ...EMPTY_FILTER };\n });\n\n readonly pendingQueryValid = signal(true);\n\n readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n readonly displayName = computed(() => {\n const cls = this.#entityCls();\n if (!cls) return this.name();\n const meta = getEntityMetadata(cls);\n return meta.displayName ?? meta.name;\n });\n\n /** 当前实体不接受从列表新增:`create` 只许系统写,或已在祖先创建链路中(循环创建检测) */\n readonly isCreateBlocked = computed(\n () => this.#capabilities()?.canCreate === false || this.creationChain().includes(this.#entityKey())\n );\n\n readonly isQueryActive = computed(() => this.filterQuery().rules.length > 0);\n readonly filteredCount = computed(() => this.#instances().length + this.#localDraftItems().length);\n\n readonly isInitialLoading = computed(() => {\n const list = this.#currentList();\n return list ? list.isLoading() && list.value().length === 0 : false;\n });\n\n readonly isLoadingMore = computed(() => {\n const list = this.#currentList();\n return list ? list.isLoading() && list.value().length > 0 : false;\n });\n\n readonly undoCount = toSignal(this.#vHistory.undoCount$, { initialValue: 0 });\n readonly redoCount = toSignal(this.#vHistory.redoCount$, { initialValue: 0 });\n readonly canUndo = computed(() => this.undoCount() > 0);\n readonly canRedo = computed(() => this.redoCount() > 0);\n\n readonly queryBuilderFields = computed<FieldMetadata[]>(() => {\n const cls = this.#entityCls();\n if (!cls) return [];\n return organizeFields(extractFieldsFromMetadata(getEntityMetadata(cls), this.#modelInfoMap));\n });\n\n readonly tableRecords = computed<EntityTableRecord[]>(() => {\n // `update` 只许系统写:已落库的行交给现成的 `_readonly` 行守卫挡住编辑与粘贴,详情走 view 模式;\n // 删除另由操作列按 `delete` 权限判定。草稿尚未落库,仍可编辑\n const isRowReadonly = this.#capabilities()?.canEdit === false;\n const dbRecords = this.#instances().map(inst => ({\n ...(inst as Record<string, unknown>),\n ...(isRowReadonly ? { _readonly: true } : {})\n }));\n const draftRecords = this.#localDraftItems().map(inst => ({ ...(inst as Record<string, unknown>) }));\n let records: EntityTableRecord[] = [...draftRecords, ...dbRecords];\n if (this.isSelectMode()) {\n const linkedIds = this.alreadyLinkedIds();\n const selIds = this.selectedIds();\n records = records\n .filter(r => !linkedIds.has(r['id'] as string))\n .map(r => ({ ...r, __selected: selIds.has(r['id'] as string) }));\n }\n return records;\n });\n\n readonly tableColumns = computed<ColumnsDefine>(() => {\n // 未注册实体无元数据可派生,不给删除\n const base = this.#columnsCache.get(this.#entityKey()) ?? [actionsColumn('操作', '删除', () => false, '查看')];\n if (this.isSelectMode()) {\n const withoutActions = base.filter(c => (c as Record<string, unknown>)['field'] !== 'actions');\n return [{ field: '__selected', title: '', cellType: 'checkbox', width: 50 }, ...withoutActions];\n }\n return base;\n });\n\n readonly createFormFieldConfigs = computed<FormFieldConfig[]>(() => {\n const cls = this.#entityCls();\n if (!cls) return [];\n const meta = getEntityMetadata(cls);\n return buildFormFields(meta, 'create');\n });\n\n // ── Select mode ───────────────────────────────────────────────────────\n readonly isSelectMode = computed(() => this.mode() === 'select');\n readonly isM2m = computed(() => this.relationKind() === RelationKind.MANY_TO_MANY);\n\n readonly m2mSelectTpl = viewChild<TemplateRef<void>>('m2mSelectTpl');\n\n // ── Manual order (US-028) ─────────────────────────────────────────────\n /** 最近一次拖放排序落库失败的提示;`null` 为无错误 */\n readonly reorderError = signal<string | null>(null);\n\n /** 当前列表是否允许拖放排序(行拖动手柄是否显示) */\n readonly rowDragEnabled = computed(() => {\n const cls = this.#entityCls();\n const list = this.#currentList();\n return canReorderEntityList({\n metadata: cls ? getEntityMetadata(cls) : undefined,\n sortOrder: this.#sortState().order,\n hasUserFilter: this.filterQuery().rules.length > 0,\n selectMode: this.isSelectMode(),\n fixedQuery: this.fixedQuery(),\n fullyLoaded: !!list && !list.hasMore() && !list.isLoading(),\n hasReadonlyRows: this.#capabilities()?.canEdit === false,\n hasDrafts: this.#localDraftItems().length > 0,\n hasPendingEdits: this.#pendingEditBatches() > 0,\n reorderPending: this.#reorderPending()\n });\n });\n\n readonly selectedIds = signal<Set<string>>(new Set());\n readonly selectedCount = computed(() => this.selectedIds().size);\n\n readonly m2mAlreadyLinkedIds = computed<Set<string>>(() => {\n const dbIds = this.#instances().map(e => e.id);\n const draftIds = this.#localDraftItems().map(e => e.id);\n return new Set([...dbIds, ...draftIds]);\n });\n\n // ── Constructor ───────────────────────────────────────────────────────\n\n constructor() {\n toObservable(this.#entityKey)\n .pipe(takeUntilDestroyed())\n .subscribe(key => {\n const cls = this.#entityClsMap.get(key);\n if (!cls) {\n this.#currentList.set(undefined);\n return;\n }\n this.#currentList.set(this.#getOrCreateList(key, cls));\n });\n\n effect(() => {\n const parsed = parseInitialFilter(this.initialFilter());\n if (!parsed) return;\n this.pendingQuery.set(parsed);\n this.filterQuery.set(parsed);\n });\n }\n\n // ── Event handlers ────────────────────────────────────────────────────\n\n toggleFilterPopover(): void {\n this.showFilterPopover.update(v => !v);\n }\n\n applyFilter(): void {\n this.filterQuery.set({ ...this.pendingQuery() });\n this.showFilterPopover.set(false);\n }\n\n resetFilter(): void {\n this.pendingQuery.set({ ...EMPTY_FILTER });\n this.filterQuery.set({ ...EMPTY_FILTER });\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(e: KeyboardEvent): void {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n if ((e.ctrlKey || e.metaKey) && e.key === 'z') {\n if (e.shiftKey) {\n if (this.canRedo()) {\n e.preventDefault();\n void this.redo();\n }\n } else {\n if (this.canUndo()) {\n e.preventDefault();\n void this.undo();\n }\n }\n }\n }\n\n onQueryChange(query: { combinator: 'and' | 'or'; rules: unknown[] } | undefined): void {\n this.pendingQuery.set(query ?? { ...EMPTY_FILTER });\n }\n\n onValidationChange(result: ValidationResult): void {\n this.pendingQueryValid.set(result.valid);\n }\n\n onCellChanged(event: CellChangeEvent): void {\n if (!event.field || event.field === 'actions') return;\n if (event.field === '__selected') {\n const id = event.record['id'] as string;\n this.selectedIds.update(set => {\n const next = new Set(set);\n if (event.value) next.add(id);\n else next.delete(id);\n return next;\n });\n return;\n }\n const id = event.record['id'] as string;\n const entityCls = this.#entityCls();\n let value = event.value;\n if (entityCls) {\n const prop = getEntityMetadata(entityCls).propertyMap.get(event.field);\n if (prop) value = parsePropertyColumnValue(prop.type, event.value);\n }\n this.#enqueue(id, { [event.field]: value });\n }\n\n undo(): void {\n this.#vHistory.undo();\n }\n\n redo(): void {\n this.#vHistory.redo();\n }\n\n async onIconClicked(event: { name: string; record: EntityTableRecord }): Promise<void> {\n if (event.name === 'view-action') {\n this.viewEntity.emit(event.record);\n await this.#openViewDialog(event.record);\n return;\n }\n if (event.name !== 'delete-action') return;\n const id = event.record['id'] as string;\n\n const draftInst = this.#localDraftItems().find(i => i.id === id);\n if (draftInst) {\n this.#localDraftItems.update(items => items.filter(i => i.id !== id));\n return;\n }\n\n const inst = this.#instances().find(i => i.id === id);\n if (!inst) return;\n try {\n await inst.remove();\n } catch (e) {\n this.#errorHandler.handleError(e);\n }\n }\n\n async onRowDeleted(event: EntityTableRecord): Promise<void> {\n await this.onIconClicked({ name: 'delete-action', record: event });\n }\n\n onBatchUpdated(mutations: BatchChangeItem[]): void {\n for (const { recordId, changes } of mutations) {\n const filtered = Object.fromEntries(Object.entries(changes).filter(([k]) => k && k !== 'actions'));\n if (Object.keys(filtered).length) this.#enqueue(recordId, filtered);\n }\n }\n\n async openCreateDialog(): Promise<void> {\n if (this.isCreateBlocked()) return;\n\n const fields = this.createFormFieldConfigs();\n const cls = this.#entityCls();\n if (!cls || fields.length === 0) return;\n\n const meta = getEntityMetadata(cls);\n const relatedEntityProvider = this.#makeRelatedEntityProvider(this.draftParentEntity());\n\n const { EntityDetailComponent } = await import('../entity-detail/entity-detail');\n // 懒加载 chunk 期间组件可能已被销毁(如测试 teardown),销毁后不再打开对话框\n if (this.#destroyRef.destroyed) return;\n\n const dialogRef = this.#dialog.open(EntityDetailComponent, {\n width: 'min(720px, calc(100vw - 1rem))',\n minWidth: 'min(400px, calc(100vw - 1rem))',\n height: '80vh',\n minHeight: '300px',\n panelClass: 'entity-detail-dialog',\n data: {\n metadata: meta,\n formFields: fields,\n formData: {},\n formMode: 'create' as const,\n relatedEntityProvider,\n fixedFormData: this.fixedFormData(),\n delegateSave: !!this.draftParentEntity(),\n creationChain: this.creationChain()\n } satisfies EntityDetailDialogData\n });\n\n dialogRef.componentInstance!.formSubmitted.subscribe((result: EntityFormData) => {\n this.#handleCreateSubmit(result);\n dialogRef.close();\n });\n\n dialogRef.closed.subscribe(result => {\n if (result === 'saved') this.#currentList()?.refresh();\n });\n }\n\n // ── M2M / Select mode methods ─────────────────────────────────────────\n\n openM2mSelectDialog(): void {\n if (this.#m2mDialogRef) return;\n const tpl = this.m2mSelectTpl();\n if (!tpl) return;\n\n const ref = this.#dialog.open(tpl, {\n width: 'min(720px, calc(100vw - 1rem))',\n minWidth: 'min(400px, calc(100vw - 1rem))',\n height: '70vh',\n minHeight: '300px',\n panelClass: 'entity-m2m-select-dialog'\n });\n this.#m2mDialogRef = ref;\n\n ref.closed.subscribe(() => {\n this.#m2mDialogRef = null;\n });\n }\n\n onM2mSelectionConfirmed(entities: EntityInstance[]): void {\n const parent = this.parentEntity();\n const relName = this.parentRelationName();\n\n if (parent && relName) {\n const relation = (parent as Record<string, unknown>)[relName + '$'];\n if (relation && typeof (relation as Record<string, unknown>)['add'] === 'function') {\n (relation as { add(...args: unknown[]): void }).add(...entities);\n }\n\n if (!this.draftParentEntity()) {\n parent\n .save()\n .then(() => this.#currentList()?.refresh())\n .catch(e => this.#errorHandler.handleError(e));\n } else {\n this.#localDraftItems.update(items => [...items, ...entities]);\n }\n }\n\n this.#m2mDialogRef?.close();\n }\n\n m2mCancelSelection(): void {\n this.#m2mDialogRef?.close();\n }\n\n confirmSelection(): void {\n const ids = this.selectedIds();\n if (ids.size === 0) {\n this.selectionCancelled.emit();\n return;\n }\n const entities = this.#instances().filter(e => ids.has(e.id));\n this.selectionConfirmed.emit(entities);\n }\n\n cancelSelection(): void {\n this.selectionCancelled.emit();\n }\n\n /**\n * 单行拖放:允许时按界面上的邻居落库重排,不允许或失败时把表格恢复原顺序(US-028)。\n */\n onRowMoved(move: RowMoveEvent): void {\n const cls = this.#entityCls();\n void commitRowMove(move, {\n enabled: this.rowDragEnabled() && !!cls,\n reorder: ({ id, prevId, nextId }) =>\n this.#rxdb.entityManager.getRepository(cls as EntityType).reorder(id as never, { prevId, nextId } as never),\n restore: () => this.queryTable()?.restoreRecords(),\n setPending: pending => this.#reorderPending.set(pending),\n setError: error => this.reorderError.set(error === null ? null : errorMessage(error))\n });\n }\n\n /**\n * 列头排序点击:驱动 cursor orderBy 重查(VTable 客户端排序已禁用)。\n */\n onSortClicked(event: { field: unknown; order: unknown }): void {\n const field = normalizeSortField(event.field);\n if (!field) return;\n this.#sortState.set({ field, order: normalizeSortOrder(event.order) });\n }\n\n // ── Private helpers ───────────────────────────────────────────────────\n\n /**\n * 「查看」行 → 打开详情对话框:可写行走 edit 模式(内置弹窗修改),`_readonly` 行走 view 模式(无保存入口)。\n * 关系 Tab 内嵌的列表同样走这里,套娃下钻;`editChain` 命中或未落库草稿时只 emit 不打开。\n */\n async #openViewDialog(record: EntityTableRecord): Promise<void> {\n const id = record['id'];\n if (typeof id !== 'string' || !id) return;\n if (this.editChain().includes(id)) return;\n if (this.#localDraftItems().some(i => i.id === id)) return;\n const cls = this.#entityCls();\n if (!cls) return;\n\n const meta = getEntityMetadata(cls);\n const formMode = record['_readonly'] === true ? 'view' : 'edit';\n const fields = buildFormFields(meta, formMode);\n\n const { EntityDetailComponent } = await import('../entity-detail/entity-detail');\n // 懒加载 chunk 期间组件可能已被销毁(如测试 teardown),销毁后不再打开对话框\n if (this.#destroyRef.destroyed) return;\n\n const dialogRef = this.#dialog.open(EntityDetailComponent, {\n width: 'min(720px, calc(100vw - 1rem))',\n minWidth: 'min(400px, calc(100vw - 1rem))',\n height: '80vh',\n minHeight: '300px',\n panelClass: 'entity-detail-dialog',\n data: {\n metadata: meta,\n formFields: fields,\n formData: {},\n formMode,\n entityId: id,\n editChain: [...this.editChain(), id],\n relatedEntityProvider: this.#makeRelatedEntityProvider(null)\n } satisfies EntityDetailDialogData\n });\n\n dialogRef.closed.subscribe(result => {\n if (result === 'saved') this.#currentList()?.refresh();\n });\n }\n\n /**\n * 关系字段下拉的数据源:按关联实体名(+可选 namespace)解析实体类并读出当前列表。\n * `draftParent` 存在时把草稿父实体并入候选(级联新增自引用场景)。\n */\n #makeRelatedEntityProvider(draftParent: EntityInstance | null): RelatedEntityProvider {\n const strVal = (v: unknown): string | undefined => (typeof v === 'string' && v.length > 0 ? v : undefined);\n return (entityName, namespace) => {\n const relCls = [...this.#entityClsMap.values()].find(c => {\n const m = getEntityMetadata(c);\n return m.name === entityName && (!namespace || m.namespace === namespace);\n });\n if (!relCls) return [];\n const relMeta = getEntityMetadata(relCls);\n const list = this.#getOrCreateList(`${relMeta.namespace}:${relMeta.name}`, relCls);\n const items = (list.value() as Record<string, unknown>[]).map(inst => ({\n id: String(inst['id'] ?? ''),\n displayName: strVal(inst['displayName']) ?? strVal(inst['name']) ?? String(inst['id'] ?? '')\n }));\n if (draftParent) {\n const parentMeta = getEntityMetadata(draftParent['constructor'] as EntityType);\n if (parentMeta.name === entityName && (!namespace || parentMeta.namespace === namespace)) {\n const parentId = String(draftParent.id);\n if (!items.some(i => i.id === parentId)) {\n items.push({\n id: parentId,\n displayName: strVal(draftParent['displayName']) ?? strVal(draftParent['name']) ?? parentId\n });\n }\n }\n }\n return items;\n };\n }\n\n async #handleCreateSubmit(data: EntityFormData): Promise<void> {\n const cls = this.#entityCls();\n if (!cls) return;\n\n const parent = this.draftParentEntity();\n const relName = this.parentRelationName();\n\n if (parent && relName) {\n const child = new (cls as new (...args: unknown[]) => unknown)(data) as EntityInstance;\n const relation = parent[relName + '$'] as { add(child: EntityInstance): void } | undefined;\n if (relation && typeof relation.add === 'function') {\n relation.add(child);\n }\n this.#localDraftItems.update(items => [...items, child]);\n return;\n }\n\n try {\n const inst = new (cls as new (...args: unknown[]) => unknown)(data) as EntityInstance;\n await inst.save();\n this.#currentList()?.refresh();\n } catch (e) {\n this.#errorHandler.handleError(e);\n }\n }\n\n #getOrCreateList(key: string, cls: EntityType): InfiniteScrollingList<EntityType> {\n const cached = this.#scrollListMap.get(key);\n if (cached) return cached;\n const options = computed<FindByCursorOptions<EntityType>>(() => {\n const userFilter = this.filterQuery();\n const fixed = this.fixedQuery();\n let where: FilterQuery;\n if (!fixed || fixed.rules.length === 0) {\n where = userFilter;\n } else if (userFilter.rules.length === 0) {\n where = fixed;\n } else {\n where = { combinator: 'and', rules: [...fixed.rules, ...userFilter.rules] };\n }\n // 关联实体下拉的 list 不跟主表列头排序,避免外键侧字段缺失\n const sortState = key === this.#entityKey() ? this.#sortState() : DEFAULT_SORT_STATE;\n return {\n where: where as never,\n orderBy: buildCursorOrderBy(sortState, getEntityMetadata(cls)) as FindByCursorOptions<EntityType>['orderBy']\n };\n });\n const list = runInInjectionContext(this.#injector, () => new InfiniteScrollingList(this.#rxdb, cls, options));\n this.#scrollListMap.set(key, list);\n return list;\n }\n\n #enqueue(recordId: string, changes: Record<string, unknown>): void {\n const cur = this.#pendingChanges.get(recordId) ?? {};\n this.#pendingChanges.set(recordId, { ...cur, ...changes });\n if (this.#flushHandle) return;\n this.#flushHandle = true;\n this.#pendingEditBatches.update(count => count + 1);\n queueMicrotask(() => {\n this.#flushHandle = false;\n const snapshot = [...this.#pendingChanges.entries()];\n this.#pendingChanges.clear();\n void this.#flushPending(snapshot).finally(() => this.#pendingEditBatches.update(count => count - 1));\n });\n }\n\n async #flushPending(pending: [string, Record<string, unknown>][]): Promise<void> {\n if (!pending.length) return;\n const EntityClass = this.#entityCls();\n if (!EntityClass) return;\n const toUpdate = new Set<EntityInstance>();\n const prevMap = new Map<EntityInstance, Record<string, unknown>>();\n const draftUpdated = new Set<EntityInstance>();\n for (const [id, changes] of pending) {\n let inst = this.#instances().find(i => i.id === id);\n const isDraft = !inst;\n if (!inst) {\n inst = this.#localDraftItems().find(i => i.id === id);\n }\n if (!inst) continue;\n const prev: Record<string, unknown> = {};\n const actual: Record<string, unknown> = {};\n let hasChange = false;\n for (const k of Object.keys(changes)) {\n if (inst[k] !== changes[k]) {\n prev[k] = inst[k];\n actual[k] = changes[k];\n hasChange = true;\n }\n }\n if (!hasChange) continue;\n prevMap.set(inst, prev);\n Object.assign(inst as Record<string, unknown>, actual);\n if (isDraft) {\n draftUpdated.add(inst);\n } else {\n toUpdate.add(inst);\n }\n }\n\n // 草稿实体直接更新 signal 触发重渲染(不写DB)\n if (draftUpdated.size) {\n this.#localDraftItems.update(items => [...items]);\n }\n\n if (!toUpdate.size) return;\n\n const updateMap = new Map([[EntityClass, toUpdate as unknown as Set<unknown>]]);\n try {\n await this.#rxdb.entityManager.mutations({ create: new Map(), update: updateMap, remove: new Map() });\n } catch (e) {\n this.#errorHandler.handleError(e);\n for (const [inst, prev] of prevMap) Object.assign(inst as Record<string, unknown>, prev);\n }\n }\n}\n","<!-- 顶栏:实体名称 + 计数 + 筛选按钮 + 新增按钮 -->\n<div class=\"border-base-300 flex h-10 min-h-10 shrink-0 items-center justify-between border-b px-4\">\n <div class=\"flex items-center gap-2 text-sm\">\n <span class=\"font-medium\">{{ displayName() }}</span>\n @if ($isFilterQuery()) {\n <span class=\"badge badge-ghost badge-sm\">{{ filteredCount() }} 条记录</span>\n }\n </div>\n <div class=\"flex items-center gap-2\">\n @if (!isSelectMode()) {\n <!-- Undo / Redo -->\n <button\n class=\"btn btn-xs btn-ghost\"\n [disabled]=\"!canUndo()\"\n (click)=\"undo()\"\n aria-label=\"撤销 (Ctrl+Z)\"\n type=\"button\"\n >\n <svg class=\"h-3.5 w-3.5\" [lucideIcon]=\"Undo2\"></svg>\n @if (undoCount(); as c) {\n <span class=\"badge badge-xs\">{{ c }}</span>\n }\n </button>\n <button\n class=\"btn btn-xs btn-ghost\"\n [disabled]=\"!canRedo()\"\n (click)=\"redo()\"\n aria-label=\"重做 (Ctrl+Shift+Z)\"\n type=\"button\"\n >\n <svg class=\"h-3.5 w-3.5\" [lucideIcon]=\"Redo2\"></svg>\n @if (redoCount(); as c) {\n <span class=\"badge badge-xs\">{{ c }}</span>\n }\n </button>\n <div class=\"divider divider-horizontal mx-0.5 h-5 self-center\"></div>\n }\n <!-- 筛选 popover 触发器 -->\n <div>\n <button\n class=\"btn btn-ghost btn-sm gap-1\"\n #filterTrigger=\"cdkOverlayOrigin\"\n [class.btn-active]=\"isQueryActive()\"\n (click)=\"toggleFilterPopover()\"\n cdkOverlayOrigin\n type=\"button\"\n >\n <svg class=\"h-4 w-4\" [lucideIcon]=\"Funnel\"></svg>\n 筛选\n @if (isQueryActive()) {\n <span class=\"badge badge-primary badge-xs\">{{ filterQuery().rules.length }}</span>\n }\n </button>\n <ng-template\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOpen]=\"showFilterPopover()\"\n [cdkConnectedOverlayOrigin]=\"filterTrigger\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n (backdropClick)=\"showFilterPopover.set(false)\"\n cdkConnectedOverlay\n >\n @if (queryBuilderFields().length > 0) {\n <!--\n 面板**不能**带 aria-hidden:里面全是可聚焦控件(字段树选择、操作符、值输入、\n 重置 / 确定),aria-hidden 会把它们整片从无障碍树里摘掉 —— 屏幕阅读器读不到、\n axe 的 aria-hidden-focus 判违规,基于 role 的定位(含 e2e 的 getByRole)也全部落空。\n CDK 的 backdrop 是 overlay pane 的**兄弟节点**而非祖先,面板内的点击根本到不了\n backdropClick,所以这里也不需要 stopPropagation(Vue 同为兄弟结构;只有 React\n 把面板套在 backdrop 里,那端的 stopPropagation 才是必需的)。\n -->\n <div\n class=\"border-base-300 bg-base-100 max-h-[70dvh] max-w-[calc(100vw-1rem)] overflow-auto rounded-lg border p-3 shadow-lg\"\n >\n <rxdb-query-builder\n [fields]=\"queryBuilderFields()\"\n [initialQuery]=\"$any(filterQuery())\"\n (queryChange)=\"onQueryChange($event)\"\n (validationChange)=\"onValidationChange($event)\"\n />\n <div class=\"mt-3 flex justify-end gap-2\">\n <button class=\"btn btn-ghost btn-sm\" (click)=\"resetFilter()\" type=\"button\">重置</button>\n <button\n class=\"btn btn-primary btn-sm\"\n [disabled]=\"!pendingQueryValid()\"\n (click)=\"applyFilter()\"\n type=\"button\"\n >\n 确定\n </button>\n </div>\n </div>\n }\n </ng-template>\n </div>\n @if (!isCreateBlocked()) {\n @if (isSelectMode()) {\n <button class=\"btn btn-sm btn-outline\" (click)=\"openCreateDialog()\" type=\"button\">+ 新建</button>\n } @else if (isM2m()) {\n <button class=\"btn btn-primary btn-sm\" (click)=\"openM2mSelectDialog()\" type=\"button\">+ 添加</button>\n } @else {\n <button class=\"btn btn-primary btn-sm\" (click)=\"openCreateDialog()\" type=\"button\">+ 新增</button>\n }\n }\n </div>\n</div>\n\n@if (reorderError(); as error) {\n <div class=\"alert alert-error alert-soft mx-4 mt-2 py-2 text-sm\" role=\"alert\">排序保存失败:{{ error }}</div>\n}\n\n<!-- 表格主体 -->\n<div class=\"min-h-0 flex-1\">\n @if (isBrowser) {\n @for (key of [namespace() + ':' + name()]; track key) {\n <rxdb-query-table\n [columns]=\"tableColumns()\"\n [filteredCount]=\"filteredCount()\"\n [loading]=\"isInitialLoading()\"\n [loadingMore]=\"isLoadingMore()\"\n [loadMore]=\"loadMore()\"\n [queryActive]=\"isQueryActive()\"\n [records]=\"tableRecords()\"\n [rowDragEnabled]=\"rowDragEnabled()\"\n [tableOptions]=\"listTableOptions\"\n (batchUpdated)=\"onBatchUpdated($event)\"\n (cellChanged)=\"onCellChanged($event)\"\n (iconClicked)=\"onIconClicked($event)\"\n (rowDeleted)=\"onRowDeleted($event)\"\n (rowMoved)=\"onRowMoved($event)\"\n (sortClicked)=\"onSortClicked($event)\"\n />\n }\n }\n</div>\n\n<!-- Select mode footer -->\n@if (isSelectMode()) {\n <div class=\"border-base-300 flex shrink-0 items-center justify-between border-t px-4 py-3\">\n @if (selectedCount() > 0) {\n <span class=\"text-base-content/70 text-sm\">已选 {{ selectedCount() }} 项</span>\n } @else {\n <span class=\"text-base-content/40 text-sm\">请选择要关联的{{ displayName() }}</span>\n }\n <div class=\"flex gap-2\">\n <button class=\"btn btn-sm\" (click)=\"cancelSelection()\" type=\"button\">取消</button>\n <button\n class=\"btn btn-primary btn-sm\"\n [disabled]=\"selectedCount() === 0\"\n (click)=\"confirmSelection()\"\n type=\"button\"\n >\n 确认添加\n </button>\n </div>\n </div>\n}\n\n<!-- M2M Selection Dialog Template -->\n<ng-template #m2mSelectTpl>\n <rxdb-entity-dialog [title]=\"'添加' + displayName()\" (closeRequested)=\"m2mCancelSelection()\">\n <rxdb-entity-list\n [alreadyLinkedIds]=\"m2mAlreadyLinkedIds()\"\n [mode]=\"'select'\"\n [name]=\"name()\"\n [namespace]=\"namespace()\"\n (selectionCancelled)=\"m2mCancelSelection()\"\n (selectionConfirmed)=\"onM2mSelectionConfirmed($event)\"\n />\n </rxdb-entity-dialog>\n</ng-template>\n","import { getEntityMetadata, RelationKind, RxDB, type EntityMetadata, type EntityType } from '@aiao/rxdb';\nimport type {\n DetailTab,\n DetailTableTab,\n EntityFormData,\n EntityInstance,\n FormFieldChangeEvent,\n FormFieldConfig,\n FormMode,\n FormValidationResult,\n RelatedEntityProvider\n} from '@aiao/rxdb-model';\nimport {\n buildDetailTabs,\n buildFormFields,\n entityToFormData,\n formDataToEntityChanges,\n validateForm\n} from '@aiao/rxdb-model';\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ErrorHandler,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n untracked,\n type InputSignal\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { of, switchMap } from 'rxjs';\nimport { EntityDialogComponent } from '../entity-dialog/entity-dialog.component';\nimport { EntityFormComponent } from '../entity-form/rxdb-entity-form-angular';\nimport { EntityListComponent } from '../entity-list/entity-list.component';\n\n/** CDK Dialog 传入的数据结构 */\nexport interface EntityDetailDialogData {\n metadata: EntityMetadata;\n formFields: FormFieldConfig[];\n formData: EntityFormData;\n formMode: FormMode;\n /** 编辑模式:按 id 从 Repository 加载实体实例;缺省时表单数据为纯透传 */\n entityId?: string;\n /** 已打开详情对话框的记录 id 栈(含当前记录),关系 tab 列表据此阻断无限套娃 */\n editChain?: string[];\n relatedEntityProvider?: RelatedEntityProvider;\n /** 预填充的外键数据(不可编辑),用于级联新增场景 */\n fixedFormData?: EntityFormData;\n /** 委托保存:不创建草稿实体,仅 emit formSubmitted 让调用方处理 */\n delegateSave?: boolean;\n /** 创建链路中的实体类型(namespace:name),用于阻断循环创建 */\n creationChain?: string[];\n}\n\nlet nextDetailId = 0;\n\n/**\n * Tab 式实体详情组件:基础表单 Tab + 每个一对多/多对多关系一个表格 Tab;\n * create 模式先生成内存草稿实体,校验通过并保存时才落库;\n * edit 模式按 `entityId`(路由输入或 DIALOG_DATA)从 Repository 加载实例,保存时内部落库。\n * 关系 Tab 内嵌的实体列表可继续打开子实体详情对话框(套娃),由 `editChain` 阻断环。\n */\n@Component({\n selector: 'rxdb-entity-detail',\n imports: [EntityFormComponent, EntityListComponent, EntityDialogComponent],\n templateUrl: './entity-detail.html',\n styleUrl: './entity-detail.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityDetailComponent {\n readonly #dialogRef = inject(DialogRef, { optional: true });\n readonly #dialogData = inject(DIALOG_DATA, { optional: true }) as EntityDetailDialogData | null;\n readonly #rxdb = inject(RxDB, { optional: true }) as RxDB | null;\n readonly #errorHandler = inject(ErrorHandler);\n\n /** 创建模式下的草稿实体实例(立即创建,不保存) */\n #draftEntity: EntityInstance | null = null;\n\n // 根据 namespace + name 查找对应实体类\n readonly #entityCls = computed<EntityType | null>(() => {\n const rxdb = this.#rxdb;\n if (!rxdb) return null;\n const ns = this.namespace();\n const nm = this.name();\n if (!ns || !nm) return null;\n return (\n rxdb.config.entities.find(cls => {\n const meta = getEntityMetadata(cls);\n return meta.namespace === ns && meta.name === nm;\n }) ?? null\n );\n });\n\n /** Dialog / metadata input 传入的实体类(根据 metadata 查找) */\n readonly #entityClsFromDialog = computed<EntityType | null>(() => {\n const rxdb = this.#rxdb;\n const meta = this.metadata() ?? this.#dialogData?.metadata;\n if (!rxdb || !meta) return null;\n return (\n rxdb.config.entities.find(cls => {\n const m = getEntityMetadata(cls);\n return m.namespace === meta.namespace && m.name === meta.name;\n }) ?? null\n );\n });\n\n readonly #metadataFromRouteInputs = computed<EntityMetadata | null>(() => {\n const cls = this.#entityCls();\n return cls ? getEntityMetadata(cls) : null;\n });\n\n readonly #formFieldsFromRouteInputs = computed<FormFieldConfig[] | null>(() => {\n const meta = this.#metadataFromRouteInputs();\n if (!meta) return null;\n return buildFormFields(meta, this.formModeValue);\n });\n\n readonly #entityInstance = toSignal(\n toObservable(\n computed(() => ({\n cls: this.#entityCls() ?? this.#entityClsFromDialog(),\n id: this.entityId() ?? this.#dialogData?.entityId\n }))\n ).pipe(\n switchMap(({ cls, id }) => {\n if (!cls || !id || !this.#rxdb) return of(null);\n return this.#rxdb.entityManager.getRepository(cls).get(id);\n })\n ),\n { initialValue: null }\n );\n\n // 路由参数输入(与 namespace/name/entityId 路由参数绑定)\n readonly namespace = input<string>();\n readonly name = input<string>();\n readonly entityId = input<string>();\n\n /** 唯一的 radio group name,避免多个 EntityDetailComponent 实例之间的 radio 冲突 */\n readonly tabGroupName = `detail-tabs-${nextDetailId++}`;\n\n // 直接绑定输入\n readonly metadata: InputSignal<EntityMetadata | undefined> = input<EntityMetadata | undefined>(undefined);\n readonly formFields = input<FormFieldConfig[]>();\n readonly formData = input<EntityFormData>();\n readonly formMode = input<FormMode | undefined>(undefined);\n readonly relatedEntityProvider = input<RelatedEntityProvider>();\n\n /**\n * 已打开详情对话框的记录 id 栈(含当前记录)的 input。\n *\n * @remarks 绑定名是 `editChain`,与 React / Vue 的同名 prop 对齐;同名类成员 `editChain`\n * 是 input 与 DIALOG_DATA 合并后的有效值(main 起就公开),所以 input 以别名声明。\n */\n readonly editChainInput = input<string[] | undefined>(undefined, { alias: 'editChain' });\n\n /** 预填充的外键数据(不可编辑),用于级联新增场景 */\n readonly fixedFormData = input<EntityFormData>();\n\n /** 委托保存:不创建草稿实体,仅 emit formSubmitted 让调用方处理 */\n readonly delegateSave = input<boolean>();\n\n /**\n * 祖先创建链路(实体类型 `namespace:name`)的 input,用于阻断循环创建。\n *\n * @remarks 绑定名是 `creationChain`,与 React / Vue 的同名 prop 对齐;同名类成员 `creationChain`\n * 是追加了当前实体之后的有效链路(main 起就公开),所以 input 以别名声明。\n */\n readonly creationChainInput = input<string[] | undefined>(undefined, { alias: 'creationChain' });\n\n readonly formSubmitted = output<EntityFormData>();\n readonly formCancelled = output<void>();\n readonly fieldChanged = output<FormFieldChangeEvent>();\n readonly validationErrors = output<FormValidationResult>();\n\n /** 是否使用外部保存模式(create 模式下,保存/取消按钮在 tabs 下面,而非 form 内) */\n readonly isCreateMode = computed(() => this.formModeValue === 'create');\n\n /** 当前表单编辑数据(create 模式下跟踪用户输入) */\n readonly draftFormData = signal<EntityFormData>({});\n\n /** 暴露草稿实体给模板(关系 tab 的 entity-list 需要) */\n readonly draftEntitySignal = signal<EntityInstance | null>(null);\n\n /** 父实体(草稿或已保存实例),用于关系 tab 的 entity-list */\n readonly parentEntityForRelation = computed<EntityInstance | null>(() => {\n return this.draftEntitySignal() ?? (this.#entityInstance() as EntityInstance | null) ?? null;\n });\n\n /** 弹框标题 */\n readonly dialogTitle = computed(() => {\n const meta = this.metadataValue;\n const mode = this.formModeValue;\n const name = meta?.displayName ?? meta?.name ?? '';\n return mode === 'create' ? `新建${name}` : name;\n });\n\n /** 创建链路:当前实体 + 祖先链路,传递给子 entity-list 以阻断循环创建(祖先链路 input 优先,缺省回退 DIALOG_DATA) */\n readonly creationChain = computed<string[]>(() => {\n const parentChain = this.creationChainInput() ?? this.#dialogData?.creationChain ?? [];\n if (!this.isCreateMode()) return parentChain;\n const meta = this.metadataValue;\n if (!meta) return parentChain;\n const key = `${meta.namespace}:${meta.name}`;\n return parentChain.includes(key) ? parentChain : [...parentChain, key];\n });\n\n /** 已打开详情对话框的记录 id 栈(input 优先,缺省回退 DIALOG_DATA,含当前记录),关系 tab 列表据此阻断无限套娃 */\n readonly editChain = computed<string[]>(() => this.editChainInput() ?? this.#dialogData?.editChain ?? []);\n\n /** 当前活动关系 tab 的 relationName(用于子实体注册关系) */\n readonly activeRelationName = computed<string | undefined>(() => {\n const tab = this.activeTab();\n return tab?.type === 'table' ? (tab as DetailTableTab).relationName : undefined;\n });\n\n readonly tabs = computed(() => {\n const meta = this.metadataValue;\n if (!meta) return [];\n const chain = this.creationChain();\n return buildDetailTabs(meta).filter(tab => {\n if (tab.type !== 'table') return true;\n const t = tab as DetailTableTab;\n const key = `${t.relatedNamespace}:${t.relatedEntityName}`;\n return !chain.includes(key);\n });\n });\n readonly activeTabKey = linkedSignal<DetailTab[], string>({\n source: this.tabs,\n computation: tabs => tabs[0]?.key ?? 'basic'\n });\n\n readonly activeTab = computed(() => this.tabs().find(t => t.key === this.activeTabKey()));\n\n // 公开访问器 - 优先级:直接 input > 路由推导 > dialog data\n get metadataValue(): EntityMetadata {\n return this.metadata() ?? this.#metadataFromRouteInputs() ?? this.#dialogData!.metadata;\n }\n\n get formFieldsValue(): FormFieldConfig[] {\n const fields = this.formFields() ?? this.#formFieldsFromRouteInputs() ?? this.#dialogData!.formFields;\n const fixed = this.fixedFormDataValue;\n if (!fixed) return fields;\n return fields.map(f => (f.field in fixed ? { ...f, readonly: true } : f));\n }\n\n get formDataValue(): EntityFormData {\n if (this.isCreateMode()) {\n const draft = this.draftFormData();\n const fixed = this.fixedFormDataValue;\n return fixed ? { ...draft, ...fixed } : draft;\n }\n const inst = this.#entityInstance();\n if (inst) return entityToFormData(inst as Record<string, unknown>, this.formFieldsValue ?? []);\n const base = this.formData() ?? this.#dialogData?.formData ?? {};\n const fixed = this.fixedFormDataValue;\n return fixed ? { ...base, ...fixed } : base;\n }\n\n get formModeValue(): FormMode {\n return this.formMode() ?? this.#dialogData?.formMode ?? 'edit';\n }\n\n get relatedEntityProviderValue(): RelatedEntityProvider | undefined {\n return this.relatedEntityProvider() ?? this.#dialogData?.relatedEntityProvider;\n }\n\n /** 预填充外键数据(input 优先,缺省回退 DIALOG_DATA) */\n get fixedFormDataValue(): EntityFormData | undefined {\n return this.fixedFormData() ?? this.#dialogData?.fixedFormData;\n }\n\n /** 是否委托保存(input 优先,缺省回退 DIALOG_DATA) */\n get delegateSaveValue(): boolean {\n return this.delegateSave() ?? this.#dialogData?.delegateSave ?? false;\n }\n\n constructor() {\n // create 模式草稿实体生命周期。DIALOG_DATA 在构造期就齐了:同步建草稿,\n // Dialog.open() 返回时调用方即可读到(React 端 useState 初始化同一时机)。\n this.#ensureDraftEntity(this.formModeValue, this.delegateSaveValue, this.#entityClsFromDialog());\n // 独立使用语境的 inputs 要到首次变更检测才写入,由 effect 补建。只追踪与 Vue 端 watch 相同的\n // 触发源(metadata 及其实体类 / formMode / delegateSave),且先读触发源再进 untracked:\n // 草稿存续期间的重跑不会丢依赖;formData / fixedFormData / formFields 只在建草稿那一刻取值,\n // 改动它们不会再建草稿。保存或取消后,触发源再变(换实体、切模式)才开始新一轮创建。\n effect(() => {\n const mode = this.formModeValue;\n const delegateSave = this.delegateSaveValue;\n const cls = this.#entityClsFromDialog();\n untracked(() => this.#ensureDraftEntity(mode, delegateSave, cls));\n });\n }\n\n selectTab(key: string): void {\n const targetTab = this.tabs().find(t => t.key === key);\n if (this.isCreateMode() && targetTab?.type === 'table') {\n const fields = this.formFieldsValue;\n const data = this.draftFormData();\n const fixed = this.fixedFormDataValue;\n const merged = fixed ? { ...data, ...fixed } : data;\n const result = validateForm(fields, merged);\n if (!result.valid) {\n this.validationErrors.emit(result);\n return;\n }\n this.#syncDraftEntity();\n }\n this.activeTabKey.set(key);\n }\n\n onFormDataChanged(data: EntityFormData): void {\n this.draftFormData.set(data);\n }\n\n onFormSubmitted(data: EntityFormData): void {\n // create 模式与无实例(纯表单数据透传)保持 delegate 语义:只 emit 由宿主处理\n if (this.isCreateMode()) {\n this.formSubmitted.emit(data);\n return;\n }\n const inst = this.#entityInstance() as EntityInstance | null;\n if (!inst) {\n this.formSubmitted.emit(data);\n return;\n }\n // edit 模式内部保存:变更应用到已加载实例并落库,成功后关闭对话框并通知宿主\n const changes = formDataToEntityChanges(inst as Record<string, unknown>, data, this.formFieldsValue);\n Object.assign(inst as Record<string, unknown>, changes);\n inst\n .save()\n .then(() => {\n this.#dialogRef?.close('saved');\n this.formSubmitted.emit(data);\n })\n .catch(e => this.#errorHandler.handleError(e));\n }\n\n onFormCancelled(): void {\n this.#cleanupDraftEntity();\n this.formCancelled.emit();\n this.#dialogRef?.close();\n }\n\n onFieldChanged(event: FormFieldChangeEvent): void {\n if (this.isCreateMode()) {\n this.draftFormData.update(d => ({ ...d, [event.field]: event.value }));\n }\n this.fieldChanged.emit(event);\n }\n\n onValidationErrors(result: FormValidationResult): void {\n this.validationErrors.emit(result);\n }\n\n /** 外部保存按钮(create 模式) */\n onSave(): void {\n const fields = this.formFieldsValue;\n const data = this.draftFormData();\n const fixed = this.fixedFormDataValue;\n const merged = fixed ? { ...data, ...fixed } : data;\n const result = validateForm(fields, merged);\n if (!result.valid) {\n this.validationErrors.emit(result);\n return;\n }\n if (this.#draftEntity) {\n this.#syncDraftEntity();\n this.#draftEntity\n .save()\n .then(() => {\n this.#draftEntity = null;\n this.draftEntitySignal.set(null);\n this.#dialogRef?.close('saved');\n })\n .catch(e => this.#errorHandler.handleError(e));\n } else {\n this.formSubmitted.emit(merged);\n this.#dialogRef?.close();\n }\n }\n\n onCancel(): void {\n this.onFormCancelled();\n }\n\n buildFixedQuery(tab: DetailTableTab): { combinator: 'and'; rules: unknown[] } | undefined {\n const entityId = this.#draftEntity?.id ?? (this.formDataValue as Record<string, unknown>)['id'];\n if (!entityId) return undefined;\n\n if (tab.relationKind === RelationKind.ONE_TO_MANY && tab.foreignKeyField) {\n return { combinator: 'and', rules: [{ field: tab.foreignKeyField, operator: '=', value: entityId }] };\n }\n\n if (tab.relationKind === RelationKind.MANY_TO_MANY && tab.mappedProperty) {\n return { combinator: 'and', rules: [{ field: `${tab.mappedProperty}.id`, operator: '=', value: entityId }] };\n }\n\n return undefined;\n }\n\n buildFixedFormData(tab: DetailTableTab): EntityFormData | undefined {\n const entityId = this.#draftEntity?.id ?? (this.formDataValue as Record<string, unknown>)['id'];\n if (!entityId) return undefined;\n\n if (tab.relationKind === RelationKind.ONE_TO_MANY && tab.foreignKeyField) {\n return { [tab.foreignKeyField]: entityId };\n }\n\n return undefined;\n }\n\n /**\n * create 模式按需建内存草稿实体(不落库)。\n *\n * @remarks 草稿只认 metadata(input 或 DIALOG_DATA)对应的实体类,与 React / Vue 一致:\n * 只给 namespace + name 的路由输入用法不建草稿,保存走 formSubmitted。字段配置先于实例化\n * 求值,它抛错时不会留下半初始化、又因已有草稿而永不重建的状态。\n */\n #ensureDraftEntity(mode: FormMode, delegateSave: boolean, cls: EntityType | null): void {\n if (this.#draftEntity || mode !== 'create' || delegateSave || !cls) return;\n const fields = this.formFieldsValue;\n const merged = { ...(this.formData() ?? this.#dialogData?.formData ?? {}), ...this.fixedFormDataValue };\n const draft = new (cls as new (...args: unknown[]) => unknown)(merged) as EntityInstance;\n this.#draftEntity = draft;\n this.draftEntitySignal.set(draft);\n this.draftFormData.set(entityToFormData(draft as Record<string, unknown>, fields));\n }\n\n /** 将表单数据同步到草稿实体 */\n #syncDraftEntity(): void {\n if (!this.#draftEntity) return;\n const data = this.draftFormData();\n const fixed = this.fixedFormDataValue;\n const merged = fixed ? { ...data, ...fixed } : data;\n Object.assign(this.#draftEntity, merged);\n }\n\n /** 清理草稿实体缓存 */\n #cleanupDraftEntity(): void {\n if (!this.#draftEntity || !this.#rxdb) return;\n this.#rxdb.entityManager.removeEntityCache(this.#draftEntity);\n this.#draftEntity = null;\n this.draftEntitySignal.set(null);\n }\n}\n","<rxdb-entity-dialog [title]=\"dialogTitle()\" (closeRequested)=\"onCancel()\">\n <!-- Tab Bar -->\n <div class=\"tabs tabs-border min-h-0 flex-1 overflow-x-auto\" role=\"tablist\">\n @for (tab of tabs(); track tab.key) {\n <input\n class=\"tab\"\n [attr.aria-label]=\"tab.label\"\n [checked]=\"tab.key === activeTabKey()\"\n [name]=\"tabGroupName\"\n (change)=\"selectTab(tab.key)\"\n role=\"tab\"\n type=\"radio\"\n />\n <div\n class=\"tab-content border-base-300 bg-base-100 order-1 flex w-full flex-col\"\n [class.overflow-auto]=\"tab.type === 'form'\"\n [class.overflow-hidden]=\"tab.type === 'table'\"\n [class.p-4]=\"tab.type === 'form'\"\n [hidden]=\"tab.key !== activeTabKey()\"\n >\n @if (tab.type === 'form') {\n <rxdb-entity-form\n [data]=\"formDataValue\"\n [fields]=\"formFieldsValue\"\n [mode]=\"formModeValue\"\n [relatedEntityProvider]=\"relatedEntityProviderValue\"\n [showActions]=\"!isCreateMode()\"\n (fieldChanged)=\"onFieldChanged($event)\"\n (formCancelled)=\"onFormCancelled()\"\n (formSubmitted)=\"onFormSubmitted($event)\"\n (validationErrors)=\"onValidationErrors($event)\"\n />\n }\n @if (tab.type === 'table') {\n <rxdb-entity-list\n [creationChain]=\"creationChain()\"\n [draftParentEntity]=\"draftEntitySignal()\"\n [editChain]=\"editChain()\"\n [fixedFormData]=\"buildFixedFormData($any(tab))\"\n [fixedQuery]=\"buildFixedQuery($any(tab))\"\n [name]=\"$any(tab).relatedEntityName\"\n [namespace]=\"$any(tab).relatedNamespace\"\n [parentEntity]=\"parentEntityForRelation()\"\n [parentRelationName]=\"$any(tab).relationName\"\n [relationKind]=\"$any(tab).relationKind\"\n />\n }\n </div>\n }\n </div>\n\n <!-- Save/Cancel buttons for create mode (below tabs) -->\n @if (isCreateMode()) {\n <div class=\"border-base-300 flex shrink-0 justify-end gap-2 border-t px-4 py-3\">\n <button class=\"btn\" (click)=\"onCancel()\" type=\"button\">取消</button>\n <button class=\"btn btn-primary\" (click)=\"onSave()\" type=\"button\">保存</button>\n </div>\n }\n</rxdb-entity-dialog>\n","import {\n createQueryBuilderService,\n type FieldMetadata,\n type QueryBuilderRuleGroup,\n type QueryBuilderService,\n type UIRule,\n type ValidationResult\n} from '@aiao/rxdb-model';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, OnDestroy, output, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { QueryGroupComponent, type UIRuleGroup } from '../query-group/query-group.component';\n\n/**\n * 子查询构建器组件\n *\n * @description\n * 用于 EXISTS/NOT EXISTS 操作符的嵌套查询条件。\n * 支持:\n * - 添加子条件\n * - 嵌套规则组\n * - 清空子条件\n */\n@Component({\n selector: 'rxdb-subquery-builder',\n standalone: true,\n imports: [CommonModule, QueryGroupComponent],\n template: `\n <div class=\"subquery-builder border-base-300 bg-base-200/50 p-2\">\n @if (!hasRules()) {\n <div class=\"text-base-content/60 flex items-center gap-2\">\n <button class=\"btn btn-ghost btn-xs\" (click)=\"handleAddFirstRule()\" type=\"button\">+ 添加子条件</button>\n <span class=\"text-xs opacity-50\">(可选)</span>\n </div>\n } @else {\n <rxdb-query-group\n [depth]=\"0\"\n [fields]=\"fields()\"\n [group]=\"rootGroup()!\"\n [maxDepth]=\"maxDepth()\"\n (addGroup)=\"onAddGroup($event)\"\n (addRule)=\"onAddRule($event)\"\n (removeItem)=\"onRemoveItem($event)\"\n (updateCombinator)=\"onUpdateCombinator($event)\"\n (updateRule)=\"onUpdateRule($event)\"\n />\n <div class=\"mt-2 flex justify-end\">\n <button class=\"btn btn-ghost btn-xs text-error\" (click)=\"handleClear()\" type=\"button\">清空</button>\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n `\n rxdb-query-group ::ng-deep > .rxdb-query-group {\n border: 0;\n padding: 0;\n }\n `\n ]\n})\nexport class SubqueryBuilderComponent implements OnDestroy {\n private readonly service: QueryBuilderService<Record<string, unknown>>;\n /** initialQuery 是否已应用(只应用一次) */\n private initialQueryApplied = false;\n\n /** 根规则组 Signal */\n private readonly rootGroupSignal: Signal<unknown>;\n\n /** 验证 Signal */\n private readonly validationSignal: Signal<ValidationResult | undefined>;\n\n /** 字段列表 */\n readonly fields = input.required<FieldMetadata[]>();\n\n /** 初始查询 */\n readonly initialQuery = input<QueryBuilderRuleGroup<Record<string, unknown>>>();\n\n /** 最大嵌套层级 */\n readonly maxDepth = input<number>(3);\n\n /** 查询变更事件 */\n readonly queryChange = output<{ combinator: 'and' | 'or'; rules: unknown[] } | undefined>();\n\n /** 验证变更事件 */\n readonly validationChange = output<ValidationResult>();\n\n /** 根规则组 */\n readonly rootGroup: Signal<UIRuleGroup | undefined> = computed(() => {\n return this.rootGroupSignal() as UIRuleGroup | undefined;\n });\n\n /** 是否有规则 */\n readonly hasRules = computed(() => {\n const group = this.rootGroup();\n return group && group.rules.length > 0;\n });\n\n constructor() {\n // 在构造函数中初始化服务\n this.service = createQueryBuilderService<Record<string, unknown>>({\n config: {\n maxNestingLevel: this.maxDepth()\n }\n });\n\n // 转换 Observable 为 Signal\n this.rootGroupSignal = toSignal(this.service.rootGroup$, { requireSync: true });\n this.validationSignal = toSignal(this.service.validation$, { initialValue: undefined });\n\n // 监听字段变化并同步到服务\n effect(() => {\n const fields = this.fields();\n if (fields.length > 0) {\n this.service.setFields(fields);\n }\n });\n\n // 监听初始查询并加载(只应用一次,避免用户修改后被重置)\n effect(() => {\n if (!this.initialQueryApplied) {\n const initial = this.initialQuery();\n if (initial) {\n this.initialQueryApplied = true;\n this.service.fromRxDBQuery(initial);\n }\n }\n });\n\n // 监听查询变化并发出事件\n effect(() => {\n const group = this.rootGroup();\n if (group) {\n const query = this.service.toRxDBQuery();\n // 如果没有规则,返回 undefined 而不是空的 RuleGroup\n if (!query.rules || query.rules.length === 0) {\n this.queryChange.emit(undefined);\n } else {\n this.queryChange.emit(query);\n }\n }\n });\n\n // 监听验证变化并发出事件\n effect(() => {\n const validation = this.validationSignal();\n if (validation) {\n this.validationChange.emit(validation);\n }\n });\n\n // 同步 maxDepth 到 service\n effect(() => {\n this.service.setMaxNestingLevel(this.maxDepth());\n });\n }\n\n /** 销毁服务 */\n ngOnDestroy(): void {\n this.service.destroy();\n }\n\n /** 添加第一条规则 */\n handleAddFirstRule(): void {\n const firstField = this.fields()[0];\n if (firstField) {\n this.service.addRule(undefined, {\n field: firstField.name,\n operator:\n firstField.isRelation ? 'exists'\n : firstField.type === 'keyValue' ? 'null'\n : '=',\n value: firstField.type === 'boolean' ? false : ''\n });\n }\n }\n\n /** 清空所有规则 */\n handleClear(): void {\n this.service.clear();\n }\n\n /** 添加规则到指定组 */\n onAddRule(event: { parentId: string; rule: Omit<UIRule, 'id'> }): void {\n this.service.addRule(event.parentId, event.rule);\n }\n\n /** 添加子组到指定组 */\n onAddGroup(parentId: string): void {\n this.service.addGroup(parentId);\n }\n\n /** 删除规则或组 */\n onRemoveItem(id: string): void {\n this.service.remove(id);\n }\n\n /** 更新规则 */\n onUpdateRule(event: { id: string; updates: Partial<UIRule> }): void {\n this.service.updateRule(event.id, event.updates);\n }\n\n /** 更新组合器 */\n onUpdateCombinator(event: { id: string; combinator: 'and' | 'or' }): void {\n this.service.updateGroupCombinator(event.id, event.combinator);\n }\n}\n"],"mappings":"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"}