@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.
- package/LICENSE +1 -1
- package/README.md +36 -23
- package/fesm2022/aiao-rxdb-model-angular-query-group.component-DphJnDon.mjs +3163 -0
- package/fesm2022/aiao-rxdb-model-angular-query-group.component-DphJnDon.mjs.map +1 -0
- package/fesm2022/aiao-rxdb-model-angular.mjs +3889 -4242
- package/fesm2022/aiao-rxdb-model-angular.mjs.map +1 -1
- package/package.json +40 -20
- package/tailwind.css +16 -0
- package/types/aiao-rxdb-model-angular.d.ts +1511 -825
- package/styles.css +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiao-rxdb-model-angular-query-group.component-DphJnDon.mjs","names":[],"sources":["../../../../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"],"sourcesContent":["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 LucideBraces as BracesIcon,\n LucideCalendar as CalendarIcon,\n LucideChevronDown as ChevronDownIcon,\n LucideChevronRight as ChevronRightIcon,\n LucideHash as HashIcon,\n LucideLink2 as Link2Icon,\n LucideListChecks as ListChecksIcon,\n LucideList as ListIcon,\n LucideDynamicIcon,\n LucideTable as TableIcon,\n LucideToggleLeft as ToggleLeftIcon,\n LucideType as TypeIcon,\n type LucideIconInput\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, LucideDynamicIcon],\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 <svg\n class=\"w-3.5 shrink-0\"\n [class]=\"typeColorMap[node.type] ?? defaultTypeColor\"\n [lucideIcon]=\"typeIconMap[node.type] ?? defaultTypeIcon\"\n size=\"14\"\n ></svg>\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 <svg\n class=\"w-3.5 shrink-0\"\n [class]=\"typeColorMap[item.node.type] ?? defaultTypeColor\"\n [lucideIcon]=\"typeIconMap[item.node.type] ?? defaultTypeIcon\"\n size=\"14\"\n ></svg>\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 <svg class=\"w-3.5 shrink-0 opacity-50\" [lucideIcon]=\"ChevronDownIcon\" size=\"14\"></svg>\n } @else {\n <svg class=\"w-3.5 shrink-0 opacity-50\" [lucideIcon]=\"ChevronRightIcon\" size=\"14\"></svg>\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, LucideIconInput>> = {\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 type OutputRefSubscription\n} from '@angular/core';\nimport { PopoverSelectComponent } from '../popover-select/popover-select.component';\nimport type { SubqueryBuilderComponent } from '../subquery-builder/subquery-builder.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]=\"$any(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]=\"$any(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]=\"$any(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]=\"$any(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]=\"$any(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]=\"$any(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<SubqueryBuilderComponent>;\n private subquerySubscription?: OutputRefSubscription;\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<unknown>('');\n readonly rangeMin = signal<unknown>(null);\n readonly rangeMax = signal<unknown>(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 */\nexport type 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\n/** 按 clientY 与目标矩形计算放置模式(组模式支持 into)。 */\nexport function 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 <!--\n ⚠️ 达到上限时保留按钮并禁用,而不是整个条件渲染掉。\n 此前用条件渲染,按钮到达上限就直接消失、页面上零解释文案,\n 用户不知道是「不支持」还是「用错了」(US-210 AC#3 要求「可达上限;超过提示」)。\n -->\n <button\n class=\"btn btn-ghost btn-xs\"\n [attr.aria-disabled]=\"!canAddGroup()\"\n [attr.title]=\"canAddGroup() ? null : nestingLimitHint()\"\n [disabled]=\"!canAddGroup()\"\n (click)=\"onAddGroup()\"\n type=\"button\"\n >\n + 分组\n </button>\n @if (!canAddGroup()) {\n <span class=\"text-base-content/50 text-xs\" role=\"status\">{{ nestingLimitHint() }}</span>\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 /** 达到嵌套上限时展示给用户的原因(AC 要求「超过提示」,不能静默) */\n readonly nestingLimitHint = computed(() => `已达最大嵌套层级(${this.maxDepth()} 层)`);\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 // 按钮的 disabled 挡不住键盘/程序化调用,这里再守一次\n if (!this.canAddGroup()) return;\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"],"mappings":"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"}
|