{"version":3,"file":"sdcorejs-angular-components-query-builder.mjs","sources":["../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.model.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.serializer.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.component.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.component.html","../../../projects/sdcorejs-angular/components/query-builder/sdcorejs-angular-components-query-builder.ts"],"sourcesContent":["import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport { FilterUtilities } from '@sdcorejs/utils/fns';\n\n// ---------------------------------------------------------------------------\n// Field metadata — the public config a consumer declares so the builder knows\n// each filterable field's type (→ which operators make sense) and how to render\n// its value editor + view-mode label. Self-contained: query-builder does NOT\n// reuse query-bar's SdQueryField; it only borrows `Operator`/`Filter` from utils.\n// ---------------------------------------------------------------------------\n\n/** Field kinds the builder understands. Drives the operator set + value editor. */\nexport type SdQueryBuilderFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values';\n\n/** One option for a `values`-type field (enum / lookup). */\nexport interface SdQueryBuilderFieldOption {\n  /** Stored value (sent inside the `Filter`). */\n  value: any;\n  /** Human-readable label shown in the select + view-mode string. */\n  display: string;\n}\n\n/**\n * One filterable field. `key` matches `Filter.field` (dot-notation allowed);\n * `label` is what the view-mode raw string renders (field token = label).\n */\nexport interface SdQueryBuilderField {\n  /** Dot-notation field path — written to `Filter.field`. */\n  key: string;\n  /** Human label — shown in the field picker AND as the view-mode field token. */\n  label: string;\n  /** Field type — picks the default operator set + value editor control. */\n  type: SdQueryBuilderFieldType;\n  /** Material icon shown before the label in the field picker; falls back to `QB_TYPE_ICON[type]` then `'tune'`. */\n  icon?: string;\n  /** Override the allowed operator set (otherwise `QB_OPERATORS_BY_TYPE[type]`). */\n  operators?: Operator[];\n  /** Override the starting operator (otherwise `QB_DEFAULT_OPERATOR_BY_TYPE[type]`). */\n  defaultOperator?: Operator;\n  /** Options for `type: 'values'` — the select list + display-label lookup. */\n  values?: SdQueryBuilderFieldOption[];\n  /** Label for the `true` branch of a boolean field (default `'Có'`). */\n  trueLabel?: string;\n  /** Label for the `false` branch of a boolean field (default `'Không'`). */\n  falseLabel?: string;\n  /** Lower bound for number / date value editors. */\n  min?: number | string;\n  /** Upper bound for number / date value editors. */\n  max?: number | string;\n  /** Optional domain guard for field-to-field comparison candidates. */\n  compareGroup?: string;\n  /** Set false to hide this field from field-to-field comparison. */\n  allowFieldCompare?: boolean;\n}\n\nexport interface SdQueryBuilderOption {\n  autoId?: string;\n  fields: SdQueryBuilderField[];\n  mode?: 'edit' | 'view';\n  comparisonMode?: QbComparisonMode;\n  disabled?: boolean;\n  value?: Filter | null;\n  filters?: Filter[];\n  rootLogic?: 'AND' | 'OR';\n  onValueChange?: (value: Filter | null) => void;\n  onFiltersChange?: (filters: Filter[]) => void;\n  onRootLogicChange?: (logic: 'AND' | 'OR') => void;\n}\n\n// ---------------------------------------------------------------------------\n// Internal tree — carries UI state (stable `id` for @for + dropdown `open`).\n// NEVER emitted; mapped to/from the public `Filter` by the serializer.\n// ---------------------------------------------------------------------------\n\nexport type QbNode = QbGroup | QbRule;\n\n/** Component-level capability for right-hand operands. */\nexport type QbComparisonMode = 'value-only' | 'value-or-field';\n\n/** Per-rule right-hand operand source. */\nexport type QbValueSource = 'literal' | 'field';\n\n/** A logical group of nodes joined by AND / OR. Maps to `FilterAndOr`. */\nexport interface QbGroup {\n  id: string;\n  kind: 'group';\n  logic: 'AND' | 'OR';\n  children: QbNode[];\n  /** UI-only: whether this group's \"+\" dropdown is open. */\n  open?: boolean;\n}\n\n/** A single `field operator value` condition. Maps to a leaf `Filter`. */\nexport interface QbRule {\n  id: string;\n  kind: 'rule';\n  field?: string;\n  operator?: Operator;\n  /** Single value, `{ from, to }` for BETWEEN, or an array for IN / NOT_IN. */\n  value?: any;\n  /** Internal UI state: literal input or a same-type field reference. */\n  valueSource?: QbValueSource;\n  /** Right-hand field key when `valueSource` is `'field'`. */\n  compareField?: string;\n}\n\n/** Type guard — narrows a `QbNode` to a `QbGroup`. */\nexport function isQbGroup(node: QbNode): node is QbGroup {\n  return node.kind === 'group';\n}\n\n// ---------------------------------------------------------------------------\n// View-mode tokens — the serializer turns a `Filter` into a token stream so the\n// template can wrap each piece in a highlight `<span>` (operator / value / etc).\n// ---------------------------------------------------------------------------\n\nexport type QbTokenKind = 'field' | 'op' | 'value' | 'logic' | 'paren' | 'plain';\n\n/** One piece of the rendered raw query string, tagged for highlight styling. */\nexport interface QbToken {\n  text: string;\n  kind: QbTokenKind;\n}\n\n// ---------------------------------------------------------------------------\n// Operator vocabulary per field type. Mirrors query-bar's\n// SD_QUERY_OPERATORS_BY_TYPE so the two components stay consistent, but is kept\n// local so query-builder has no dependency on the query-bar package.\n// ---------------------------------------------------------------------------\n\n/** Allowed operators per field type — used when `field.operators` is not set. */\nexport const QB_OPERATORS_BY_TYPE: Record<SdQueryBuilderFieldType, Operator[]> = {\n  string: ['CONTAIN', 'NOT_CONTAIN', 'EQUAL', 'NOT_EQUAL', 'START_WITH', 'END_WITH', 'NULL', 'NOT_NULL'],\n  number: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'GREATER_OR_EQUAL', 'LESS_THAN', 'LESS_OR_EQUAL', 'BETWEEN', 'NULL', 'NOT_NULL'],\n  boolean: ['EQUAL', 'NOT_EQUAL'],\n  date: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'LESS_THAN', 'BETWEEN', 'NULL', 'NOT_NULL'],\n  datetime: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'LESS_THAN', 'BETWEEN', 'NULL', 'NOT_NULL'],\n  values: ['IN', 'NOT_IN', 'EQUAL', 'NOT_EQUAL', 'NULL', 'NOT_NULL'],\n};\n\n/** Default operator when a rule is first created for a field. */\nexport const QB_DEFAULT_OPERATOR_BY_TYPE: Record<SdQueryBuilderFieldType, Operator> = {\n  string: 'CONTAIN',\n  number: 'EQUAL',\n  boolean: 'EQUAL',\n  date: 'BETWEEN',\n  datetime: 'BETWEEN',\n  values: 'IN',\n};\n\n/** Operators with no value payload — the value editor is hidden for these. */\nexport const QB_NO_DATA_OPERATORS: Operator[] = ['NULL', 'NOT_NULL'];\n\n/** Operators whose value is an array — the value editor offers multi-select. */\nexport const QB_MULTI_OPERATORS: Operator[] = ['IN', 'NOT_IN'];\n\n/** Operators allowed for `field` — explicit override wins, else the per-type set. */\nexport function qbAllowedOperators(field: SdQueryBuilderField | undefined): Operator[] {\n  if (!field) return [];\n  if (field.operators?.length) return field.operators;\n  return QB_OPERATORS_BY_TYPE[field.type] ?? [];\n}\n\n/** Starting operator for a new rule on `field` — falls back to the per-type default. */\nexport function qbDefaultOperator(field: SdQueryBuilderField | undefined): Operator | undefined {\n  if (!field) return undefined;\n  const allowed = qbAllowedOperators(field);\n  if (field.defaultOperator && allowed.includes(field.defaultOperator)) return field.defaultOperator;\n  const byType = QB_DEFAULT_OPERATOR_BY_TYPE[field.type];\n  return allowed.includes(byType) ? byType : allowed[0];\n}\n\n/** True when `op` is NULL / NOT_NULL (no value editor). */\nexport function qbIsNoDataOperator(op: Operator | undefined): boolean {\n  return !!op && QB_NO_DATA_OPERATORS.includes(op);\n}\n\n/** True when `op` is IN / NOT_IN (array value). */\nexport function qbIsMultiOperator(op: Operator | undefined): boolean {\n  return !!op && QB_MULTI_OPERATORS.includes(op);\n}\n\n/** True when the operator accepts one right-hand operand, including a field reference. */\nexport function qbSupportsFieldCompareOperator(op: Operator | undefined): boolean {\n  return !!op && !qbIsNoDataOperator(op) && !qbIsMultiOperator(op) && op !== 'BETWEEN';\n}\n\n/**\n * Icon fallback per field type when `SdQueryBuilderField.icon` is not set.\n * Mirrors query-bar's `SD_QUERY_TYPE_ICON` so the two components read consistently,\n * but kept local so query-builder has no dependency on the query-bar package.\n */\nexport const QB_TYPE_ICON: Record<SdQueryBuilderFieldType, string> = {\n  string: 'text_fields',\n  number: 'tag',\n  boolean: 'toggle_on',\n  date: 'event',\n  datetime: 'schedule',\n  values: 'list',\n};\n\n/**\n * Icon shown before a field in the field picker / selected trigger.\n * Priority: `field.icon` → `QB_TYPE_ICON[field.type]` → `'tune'` (default, like query-bar).\n */\nexport function qbFieldIcon(field: SdQueryBuilderField | undefined): string {\n  if (!field) return 'tune';\n  return field.icon ?? QB_TYPE_ICON[field.type] ?? 'tune';\n}\n\n// ---------------------------------------------------------------------------\n// Node factories — monotonic counter for stable, render-safe ids (no Math.random\n// / Date.now so SSR + tests stay deterministic).\n// ---------------------------------------------------------------------------\n\nlet qbSeq = 0;\n\n/** Next stable node id with the given prefix. */\nexport function qbId(prefix = 'qb'): string {\n  return `${prefix}-${++qbSeq}`;\n}\n\n/** Build a fresh rule node (optionally pre-filled). */\nexport function qbNewRule(field?: string, operator?: Operator, value?: any, valueSource?: QbValueSource, compareField?: string): QbRule {\n  return { id: qbId('r'), kind: 'rule', field, operator, value, valueSource, compareField };\n}\n\n/** Build a fresh group node. */\nexport function qbNewGroup(logic: 'AND' | 'OR' = 'AND', children: QbNode[] = []): QbGroup {\n  return { id: qbId('g'), kind: 'group', logic, children };\n}\n\n// ---------------------------------------------------------------------------\n// Relative dates — a date/datetime rule's value may be a relative spec resolved\n// at query time, instead of an absolute picked date. The model is REUSED from\n// `@sdcorejs/utils`: an offset is a `DateRelative` ({ amount, direction, unit });\n// \"today\" is the `'TODAY'` sentinel. The serializer maps these to the Filter\n// `dataType` discriminator (`'date-relative'` / `'date-today'`). The builder UI\n// only offers day/week/month even though `DateRelative` also allows `'hour'`.\n// Single-value operators only (not BETWEEN).\n// ---------------------------------------------------------------------------\n\n/** Offset unit for a relative date — re-exported from the utils `DateRelative` model. */\nexport type SdQbRelativeUnit = DateRelative['unit'];\n\n/** Offset direction for a relative date — re-exported from the utils `DateRelative` model. */\nexport type SdQbRelativeDirection = DateRelative['direction'];\n\n/** Sentinel held as a rule value (and emitted as `data`) for the \"today\" date mode. */\nexport const QB_TODAY = 'TODAY';\n/** The `'TODAY'` sentinel type (matches the utils `date-today` data literal). */\nexport type QbToday = typeof QB_TODAY;\n\n/** Date value editor mode for a date/datetime rule (derived from the rule value). */\nexport type QbDateMode = 'absolute' | 'now' | 'relative';\n\n/** Type guard — narrows a rule value to a utils `DateRelative` (offset spec). */\nexport const qbIsRelativeDate = FilterUtilities.isDateRelative;\n\n/** Type guard — narrows a rule value to the `'TODAY'` sentinel (\"now\"/today mode). */\nexport function qbIsToday(v: any): v is QbToday {\n  return v === QB_TODAY;\n}\n\n/** Starting relative value when a rule first switches to \"relative\" mode. */\nexport function qbDefaultRelative(): DateRelative {\n  return { amount: 1, direction: 'previous', unit: 'day' };\n}\n\n/** One date-mode option — carries a Material icon shown in the dropdown + selected trigger. */\nexport interface QbDateModeOption {\n  value: QbDateMode;\n  display: string;\n  /** Material icon name (outlined set). */\n  icon: string;\n}\n\n/** Stable option list for the date-mode select (module ref — never reallocated). */\nexport const QB_DATE_MODES: QbDateModeOption[] = [\n  { value: 'absolute', display: 'Ngày cụ thể', icon: 'event' },\n  { value: 'now', display: 'Hôm nay', icon: 'today' },\n  { value: 'relative', display: 'Tương đối', icon: 'history' },\n];\n\n/** One value-source option for field-to-field comparison UI. */\nexport interface QbValueSourceOption {\n  value: QbValueSource;\n  display: string;\n  /** Material icon name (outlined set). */\n  icon: string;\n}\n\n/** Stable option list for choosing between a literal value and another field. */\nexport const QB_VALUE_SOURCE_OPTIONS: QbValueSourceOption[] = [\n  { value: 'literal', display: 'Nhập giá trị', icon: 'edit_note' },\n  { value: 'field', display: 'Chọn trường', icon: 'view_column' },\n];\n\n/** Stable combined direction×unit option list (token `'unit:direction'`). */\nexport const QB_RELATIVE_UNIT_OPTIONS: { value: string; display: string }[] = [\n  { value: 'day:previous', display: 'ngày trước' },\n  { value: 'day:next', display: 'ngày tới' },\n  { value: 'week:previous', display: 'tuần trước' },\n  { value: 'week:next', display: 'tuần tới' },\n  { value: 'month:previous', display: 'tháng trước' },\n  { value: 'month:next', display: 'tháng tới' },\n];\n\n/** Shared empty option array — stable ref for fallbacks (avoids per-call allocation). */\nexport const QB_EMPTY_OPTIONS: SdQueryBuilderFieldOption[] = [];\n","import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport {\n  isQbGroup,\n  QB_MULTI_OPERATORS,\n  QB_NO_DATA_OPERATORS,\n  QB_TODAY,\n  qbIsRelativeDate,\n  qbIsToday,\n  qbSupportsFieldCompareOperator,\n  QbGroup,\n  QbNode,\n  QbRule,\n  QbToday,\n  QbToken,\n  qbNewGroup,\n  qbNewRule,\n  SdQueryBuilderField,\n} from './query-builder.model';\n\n// SQL symbol for each single-value comparison operator.\nconst SYMBOL: Partial<Record<Operator, string>> = {\n  EQUAL: '=',\n  NOT_EQUAL: '!=',\n  GREATER_THAN: '>',\n  LESS_THAN: '<',\n  GREATER_OR_EQUAL: '>=',\n  LESS_OR_EQUAL: '<=',\n};\n\nconst LIKE_OPERATORS: Operator[] = ['CONTAIN', 'NOT_CONTAIN', 'START_WITH', 'NOT_START_WITH', 'END_WITH', 'NOT_END_WITH'];\n\n/** A `Filter` is a logical group when its operator is AND / OR and it carries a `data[]`. */\nfunction isAndOr(filter: any): filter is { operator: 'AND' | 'OR'; data: Filter[] } {\n  return !!filter && (filter.operator === 'AND' || filter.operator === 'OR') && Array.isArray(filter.data);\n}\n\nfunction isEmptyValue(v: any): boolean {\n  return v === null || v === undefined || v === '';\n}\n\n// ---------------------------------------------------------------------------\n// Internal tree → public Filter\n// ---------------------------------------------------------------------------\n\nfunction ruleToFilter(rule: QbRule): Filter | null {\n  if (!rule.field || !rule.operator) return null;\n  const operator = rule.operator;\n\n  if (QB_NO_DATA_OPERATORS.includes(operator)) {\n    return { field: rule.field as any, operator } as Filter;\n  }\n\n  if (rule.valueSource === 'field') {\n    if (!qbSupportsFieldCompareOperator(operator) || isEmptyValue(rule.compareField)) return null;\n    return { field: rule.field as any, operator, dataType: 'field', data: rule.compareField } as Filter;\n  }\n\n  if (operator === 'BETWEEN') {\n    const v = rule.value;\n    if (!v || typeof v !== 'object') return null;\n    if (isEmptyValue(v.from) || isEmptyValue(v.to)) return null;\n    return { field: rule.field as any, operator: 'BETWEEN', data: { from: v.from, to: v.to } } as Filter;\n  }\n\n  if (QB_MULTI_OPERATORS.includes(operator)) {\n    const arr = Array.isArray(rule.value) ? rule.value : isEmptyValue(rule.value) ? [] : [rule.value];\n    if (!arr.length) return null;\n    return { field: rule.field as any, operator, data: arr } as Filter;\n  }\n\n  if (qbIsToday(rule.value)) {\n    return { field: rule.field as any, operator, dataType: 'date-today', data: QB_TODAY } as Filter;\n  }\n\n  if (qbIsRelativeDate(rule.value)) {\n    const v = rule.value;\n    // emit only when fully specified, else drop the incomplete rule\n    if (v.unit && v.direction && typeof v.amount === 'number' && v.amount >= 1) {\n      return {\n        field: rule.field as any,\n        operator,\n        dataType: 'date-relative',\n        data: { amount: v.amount, direction: v.direction, unit: v.unit },\n      } as Filter;\n    }\n    return null;\n  }\n\n  // A non-relative plain object is an incomplete/stray shape (e.g. a partial offset) — drop it.\n  if (rule.value !== null && typeof rule.value === 'object' && !Array.isArray(rule.value)) return null;\n  if (isEmptyValue(rule.value)) return null;\n  return { field: rule.field as any, operator, data: rule.value } as Filter;\n}\n\nfunction nodeToFilter(node: QbNode): Filter | null {\n  if (isQbGroup(node)) {\n    const data = node.children.map(nodeToFilter).filter((f): f is Filter => f != null);\n    if (!data.length) return null;\n    return { operator: node.logic, data } as Filter;\n  }\n  return ruleToFilter(node);\n}\n\n/**\n * Map the internal builder tree to the public `Filter` (the root is always a\n * `FilterAndOr`). Rules missing field / operator / value — and empty nested\n * groups — are dropped so the result is always a valid `Filter`.\n *\n * @param group - the editable tree's root group.\n * @returns the canonical nested `Filter`, or `null` when no complete rule survives.\n */\nexport function treeToFilter(group: QbGroup): Filter | null {\n  return nodeToFilter(group);\n}\n\n// ---------------------------------------------------------------------------\n// Public Filter → internal tree (for seeding [value])\n// ---------------------------------------------------------------------------\n\nfunction ruleFromFilter(filter: any): QbRule {\n  const operator = filter.operator as Operator;\n  if (QB_NO_DATA_OPERATORS.includes(operator)) {\n    return qbNewRule(filter.field, operator);\n  }\n  if (filter.dataType === 'field') {\n    return qbNewRule(filter.field, operator, undefined, 'field', filter.data);\n  }\n  // Relative dates: read the utils `dataType` discriminator back into the internal value.\n  if (filter.dataType === 'date-today') {\n    return qbNewRule(filter.field, operator, QB_TODAY);\n  }\n  if (filter.dataType === 'date-relative') {\n    return qbNewRule(filter.field, operator, filter.data);\n  }\n  // Back-compat: legacy `{ rel: 'now' | 'offset' }` payloads (pre-dataType migration)\n  // still seed the editor correctly.\n  const legacy = readLegacyRelative(filter.data);\n  if (legacy !== undefined) {\n    return qbNewRule(filter.field, operator, legacy);\n  }\n  return qbNewRule(filter.field, operator, filter.data);\n}\n\n/** Map a pre-migration `{ rel }` payload to the new internal value, or `undefined` if not legacy. */\nfunction readLegacyRelative(data: any): QbToday | DateRelative | undefined {\n  if (!data || typeof data !== 'object') return undefined;\n  if (data.rel === 'now') return QB_TODAY;\n  if (data.rel === 'offset' && data.unit && data.direction && typeof data.amount === 'number') {\n    return { amount: data.amount, direction: data.direction, unit: data.unit };\n  }\n  return undefined;\n}\n\nfunction nodeFromFilter(filter: Filter): QbNode {\n  return isAndOr(filter) ? groupFromFilter(filter) : ruleFromFilter(filter);\n}\n\nfunction groupFromFilter(filter: { operator: 'AND' | 'OR'; data: Filter[] }): QbGroup {\n  return qbNewGroup(filter.operator, filter.data.map(nodeFromFilter));\n}\n\n/**\n * Inverse of {@link treeToFilter} — rebuild the editable tree from a `Filter` so a\n * consumer can seed `[value]`. A non-group (bare) filter is wrapped in an AND root;\n * `null` yields an empty AND root.\n *\n * @param filter - a `Filter` (group or leaf), or `null` / `undefined` for an empty tree.\n * @returns a fresh root `QbGroup` mirroring the filter's structure.\n */\nexport function filterToTree(filter: Filter | null | undefined): QbGroup {\n  if (!filter) return qbNewGroup('AND', []);\n  if (isAndOr(filter)) return groupFromFilter(filter);\n  return qbNewGroup('AND', [ruleFromFilter(filter)]);\n}\n\n// ---------------------------------------------------------------------------\n// Public Filter → SQL-ish highlight tokens (view mode)\n// ---------------------------------------------------------------------------\n\nfunction escapeStr(s: string): string {\n  return s.replace(/'/g, \"''\");\n}\n\nconst REL_UNIT_VI: Record<DateRelative['unit'], string> = { hour: 'giờ', day: 'ngày', week: 'tuần', month: 'tháng' };\n\n/** Render a relative-date offset as readable Vietnamese for the view string. */\nfunction formatRelative(v: DateRelative): string {\n  const unit = REL_UNIT_VI[v.unit] ?? REL_UNIT_VI.day;\n  const dir = v.direction === 'next' ? 'tới' : 'trước';\n  return `${v.amount} ${unit} ${dir}`;\n}\n\n/** Format one scalar value for the view string — quoted/labelled per field type. */\nfunction formatScalar(field: SdQueryBuilderField | undefined, raw: any): string {\n  if (qbIsToday(raw)) return 'hôm nay';\n  if (qbIsRelativeDate(raw)) return formatRelative(raw);\n  if (raw === null || raw === undefined) return '';\n  if (field?.type === 'boolean') {\n    return raw ? (field.trueLabel ?? 'Có') : (field.falseLabel ?? 'Không');\n  }\n  if (field?.type === 'values') {\n    const opt = field.values?.find(o => o.value === raw);\n    return `'${escapeStr(opt ? opt.display : String(raw))}'`;\n  }\n  if (field?.type === 'number' || typeof raw === 'number' || typeof raw === 'boolean') {\n    return String(raw);\n  }\n  // string / date / datetime / unknown → quoted\n  return `'${escapeStr(String(raw))}'`;\n}\n\nfunction likePattern(operator: Operator, raw: string): string {\n  const esc = escapeStr(raw);\n  if (operator === 'CONTAIN' || operator === 'NOT_CONTAIN') return `'%${esc}%'`;\n  if (operator === 'START_WITH' || operator === 'NOT_START_WITH') return `'${esc}%'`;\n  return `'%${esc}'`; // END_WITH / NOT_END_WITH\n}\n\nfunction operatorToken(operator: Operator): string {\n  if (LIKE_OPERATORS.includes(operator)) return operator.startsWith('NOT_') ? 'not like' : 'like';\n  return SYMBOL[operator] ?? operator;\n}\n\nfunction ruleTokens(filter: any, fields: SdQueryBuilderField[]): QbToken[] {\n  const field = fields.find(f => f.key === filter.field);\n  const out: QbToken[] = [{ kind: 'field', text: field?.label ?? String(filter.field) }];\n  const sp = () => out.push({ kind: 'plain', text: ' ' });\n  const operator = filter.operator as Operator;\n\n  if (QB_NO_DATA_OPERATORS.includes(operator)) {\n    sp();\n    out.push({ kind: 'op', text: operator === 'NULL' ? 'is null' : 'is not null' });\n    return out;\n  }\n\n  if (operator === 'BETWEEN') {\n    sp();\n    out.push({ kind: 'op', text: 'between' });\n    sp();\n    out.push({ kind: 'value', text: formatScalar(field, filter.data?.from) });\n    out.push({ kind: 'plain', text: ' and ' });\n    out.push({ kind: 'value', text: formatScalar(field, filter.data?.to) });\n    return out;\n  }\n\n  if (QB_MULTI_OPERATORS.includes(operator)) {\n    sp();\n    out.push({ kind: 'op', text: operator === 'IN' ? 'in' : 'not in' });\n    sp();\n    const arr: any[] = Array.isArray(filter.data) ? filter.data : [];\n    out.push({ kind: 'value', text: `(${arr.map((v: any) => formatScalar(field, v)).join(', ')})` });\n    return out;\n  }\n\n  if (filter.dataType === 'field') {\n    const compareField = fields.find(f => f.key === filter.data);\n    sp();\n    out.push({ kind: 'op', text: operatorToken(operator) });\n    sp();\n    out.push({ kind: 'field', text: compareField?.label ?? String(filter.data) });\n    return out;\n  }\n\n  if (LIKE_OPERATORS.includes(operator)) {\n    sp();\n    out.push({ kind: 'op', text: operatorToken(operator) });\n    sp();\n    out.push({ kind: 'value', text: likePattern(operator, String(filter.data ?? '')) });\n    return out;\n  }\n\n  sp();\n  out.push({ kind: 'op', text: operatorToken(operator) });\n  sp();\n  out.push({ kind: 'value', text: formatScalar(field, filter.data) });\n  return out;\n}\n\nfunction tokensFor(filter: Filter, fields: SdQueryBuilderField[]): QbToken[] {\n  if (isAndOr(filter)) {\n    const out: QbToken[] = [];\n    filter.data.forEach((child, i) => {\n      if (i > 0) out.push({ kind: 'logic', text: ` ${filter.operator.toLowerCase()} ` });\n      const childTokens = tokensFor(child, fields);\n      // Wrap a nested multi-child group in parentheses; a single-child group needs none.\n      if (isAndOr(child) && child.data.length > 1) {\n        out.push({ kind: 'paren', text: '(' }, ...childTokens, { kind: 'paren', text: ')' });\n      } else {\n        out.push(...childTokens);\n      }\n    });\n    return out;\n  }\n  return ruleTokens(filter, fields);\n}\n\n/**\n * Render a `Filter` to a SQL-ish token stream for view mode. Field tokens use the\n * matching field's `label`; operators map to SQL syntax (`= != like between is null …`);\n * `and` / `or` are lowercase; nested multi-child groups are wrapped in parentheses.\n * Returns a token stream (not a string) so the template can wrap each piece in a\n * highlight `<span>` keyed by `QbToken.kind`.\n *\n * @param filter - the `Filter` to render, or `null` / `undefined`.\n * @param fields - field metadata, used to resolve each field key to its display label + value formatting.\n * @returns the ordered tokens, or `[]` when `filter` is empty.\n */\nexport function filterToTokens(filter: Filter | null | undefined, fields: SdQueryBuilderField[]): QbToken[] {\n  if (!filter) return [];\n  return tokensFor(filter, fields);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, booleanAttribute, computed, effect, input, model, signal, untracked } from '@angular/core';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdItemDefDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport {\n  isQbGroup,\n  QB_DATE_MODES,\n  QB_EMPTY_OPTIONS,\n  QB_RELATIVE_UNIT_OPTIONS,\n  QB_TODAY,\n  QB_VALUE_SOURCE_OPTIONS,\n  QbComparisonMode,\n  QbDateMode,\n  QbGroup,\n  QbNode,\n  QbRule,\n  QbToken,\n  QbValueSource,\n  qbAllowedOperators,\n  qbDefaultOperator,\n  qbDefaultRelative,\n  qbSupportsFieldCompareOperator,\n  qbIsMultiOperator,\n  qbIsNoDataOperator,\n  qbIsRelativeDate,\n  qbIsToday,\n  qbFieldIcon,\n  qbNewGroup,\n  qbNewRule,\n  SdQueryBuilderField,\n  SdQueryBuilderFieldOption,\n  SdQueryBuilderOption,\n} from './query-builder.model';\nimport { filterToTokens, filterToTree, treeToFilter } from './query-builder.serializer';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/** A logical `Filter` (AND / OR group) carries a `data[]` array. */\nfunction isAndOr(filter: any): boolean {\n  return !!filter && (filter.operator === 'AND' || filter.operator === 'OR') && Array.isArray(filter.data);\n}\n\nconst QB_EMPTY_FIELDS: SdQueryBuilderField[] = [];\n\n/**\n * Visual filter / rule builder. Compose nested AND / OR groups of\n * `field operator value` conditions; emits the canonical `Filter` (root is a\n * `FilterAndOr` tree) via `[(value)]`, plus a flat `[(filters)]` mirror of the\n * root group's direct children. `mode=\"view\"` renders a read-only SQL-ish raw\n * string with highlighted operators + values.\n */\n@Component({\n  selector: 'sd-query-builder',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SdIcon, NgTemplateOutlet, SdOperator, SdSelect, SdInput, SdInputNumber, SdDate, SdDatetime, SdItemDefDefDirective],\n  templateUrl: './query-builder.component.html',\n  styleUrl: './query-builder.component.scss',\n})\nexport class SdQueryBuilder {\n  // -------------------------------------------------------------------------\n  // Inputs\n  // -------------------------------------------------------------------------\n\n  /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */\n  readonly option = input<SdQueryBuilderOption | undefined>(undefined);\n\n  /** Filterable fields — each declares a `type` that drives the operator set + value editor. */\n  readonly fields = input<SdQueryBuilderField[]>([]);\n\n  /** `'edit'` (default) = interactive tree · `'view'` = read-only raw-query string. */\n  readonly mode = input<'edit' | 'view'>('edit');\n\n  /** `value-only` = literal operands only · `value-or-field` = each rule may compare against another field. */\n  readonly comparisonMode = input<QbComparisonMode>('value-only');\n\n  /** Disable all editing controls. */\n  readonly disabled = input(false, { transform: booleanAttribute });\n\n  /** Prefix for `data-autoid` on inner controls (E2E selectors). */\n  readonly autoId = input<string>();\n\n  // -------------------------------------------------------------------------\n  // Two-way models (output contract)\n  // -------------------------------------------------------------------------\n\n  /** Canonical output — the root `FilterAndOr` tree, or `null` when empty. `[(value)]`. */\n  readonly value = model<Filter | null>(null);\n\n  /** Convenience mirror — the root group's direct children. `[(filters)]`. */\n  readonly filters = model<Filter[]>([]);\n\n  /** Root group's logical connector. `[(rootLogic)]`. */\n  readonly rootLogic = model<'AND' | 'OR'>('AND');\n\n  // -------------------------------------------------------------------------\n  // Internal source of truth — the editable tree (carries UI state).\n  // -------------------------------------------------------------------------\n\n  readonly #tree = signal<QbGroup>(qbNewGroup('AND'));\n  readonly tree = this.#tree.asReadonly();\n\n  /** Last filter WE emitted — used to recognise (and ignore) our own echo in the inbound effect. */\n  #lastEmitted: Filter | null | undefined = undefined;\n\n  // -------------------------------------------------------------------------\n  // Derived state\n  // -------------------------------------------------------------------------\n\n  /** `field.key` → field, for fast lookup from a rule. */\n  readonly resolvedFields = computed(() => this.option()?.fields ?? this.fields());\n  readonly resolvedMode = computed(() => this.option()?.mode ?? this.mode());\n  readonly resolvedComparisonMode = computed(() => this.option()?.comparisonMode ?? this.comparisonMode());\n  readonly resolvedDisabled = computed(() => this.option()?.disabled ?? this.disabled());\n  readonly resolvedAutoId = computed(() => this.option()?.autoId ?? this.autoId());\n\n  readonly fieldByKey = computed<Record<string, SdQueryBuilderField>>(() => {\n    const map: Record<string, SdQueryBuilderField> = {};\n    for (const f of this.resolvedFields()) map[f.key] = f;\n    return map;\n  });\n\n  /** Boolean fields → their stable `[true,false]` option list. Memoized so the template\n   *  binding hands `sd-select` the SAME array ref each CD (else its `toObservable(items)`\n   *  → `markForCheck()` loops → OOM). Recomputes only when `fields()` changes. */\n  readonly #booleanOptionsByKey = computed<Map<string, SdQueryBuilderFieldOption[]>>(() => {\n    const map = new Map<string, SdQueryBuilderFieldOption[]>();\n    for (const f of this.resolvedFields()) {\n      if (f.type === 'boolean') {\n        map.set(f.key, [\n          { value: true, display: f.trueLabel ?? 'Có' },\n          { value: false, display: f.falseLabel ?? 'Không' },\n        ]);\n      }\n    }\n    return map;\n  });\n\n  /** Stable option list for the date-mode select. */\n  readonly dateModes = QB_DATE_MODES;\n  /** Stable option list for the literal-vs-field operand select. */\n  readonly valueSourceOptions = QB_VALUE_SOURCE_OPTIONS;\n  /** Stable combined unit×direction option list for the relative select. */\n  readonly relativeUnitOptions = QB_RELATIVE_UNIT_OPTIONS;\n\n  readonly #compareFieldsByKey = computed<Map<string, SdQueryBuilderField[]>>(() => {\n    const fields = this.resolvedFields();\n    const map = new Map<string, SdQueryBuilderField[]>();\n\n    for (const left of fields) {\n      if (left.allowFieldCompare === false) {\n        map.set(left.key, QB_EMPTY_FIELDS);\n        continue;\n      }\n\n      map.set(\n        left.key,\n        fields.filter(right => {\n          if (right.key === left.key) return false;\n          if (right.allowFieldCompare === false) return false;\n          if (right.type !== left.type) return false;\n          if ((left.compareGroup ?? right.compareGroup) !== undefined && left.compareGroup !== right.compareGroup) return false;\n          return true;\n        })\n      );\n    }\n\n    return map;\n  });\n\n  /** View-mode token stream — recomputed from the emitted value. */\n  readonly tokens = computed<QbToken[]>(() => filterToTokens(this.option()?.value ?? this.value(), this.resolvedFields()));\n\n  readonly isView = computed(() => this.resolvedMode() === 'view');\n\n  /** Expose the type-guard to the template. */\n  readonly isGroup = isQbGroup;\n\n  /** Resolve the leading icon for a field (own `icon` → per-type → `'tune'`) — used by the field picker. */\n  readonly fieldIcon = qbFieldIcon;\n\n  constructor() {\n    // Inbound seeding: an EXTERNAL write to value / filters rebuilds the tree.\n    // Our own emits are recognised via #lastEmitted and skipped (no echo loop).\n    effect(() => {\n      const option = this.option();\n      const v = option?.value ?? this.value();\n      const fl = option?.filters ?? this.filters();\n      const incoming = this.#coalesce(v, fl, option?.rootLogic);\n      if (this.#filterEq(incoming, this.#lastEmitted)) return;\n      this.#tree.set(filterToTree(incoming));\n      this.#commit();\n    });\n  }\n\n  #coalesce(v: Filter | null, fl: Filter[], logic?: 'AND' | 'OR'): Filter | null {\n    if (v) return v;\n    if (fl && fl.length) return { operator: logic ?? untracked(() => this.rootLogic()), data: fl } as Filter;\n    return null;\n  }\n\n  #filterEq(a: Filter | null | undefined, b: Filter | null | undefined): boolean {\n    return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n  }\n\n  // -------------------------------------------------------------------------\n  // Tree mutation → emit\n  // -------------------------------------------------------------------------\n\n  /** New root ref so the template (which reads `tree()`) re-renders. */\n  #bumpTree(): void {\n    this.#tree.set({ ...this.#tree() });\n  }\n\n  /** Recompute the output `Filter` from the tree and push it to value / filters / rootLogic. */\n  #commit(): void {\n    const filter = treeToFilter(this.#tree());\n    this.#lastEmitted = filter;\n    this.value.set(filter);\n    const filters = isAndOr(filter) ? (filter as any).data : filter ? [filter] : [];\n    this.filters.set(filters);\n    const logic = this.#tree().logic;\n    if (this.rootLogic() !== logic) this.rootLogic.set(logic);\n    this.option()?.onValueChange?.(filter);\n    this.option()?.onFiltersChange?.(filters);\n    this.option()?.onRootLogicChange?.(logic);\n  }\n\n  /** Mutate-in-place + re-render + emit. */\n  #apply(): void {\n    this.#bumpTree();\n    this.#commit();\n  }\n\n  // -------------------------------------------------------------------------\n  // Group / rule structural mutations\n  // -------------------------------------------------------------------------\n\n  /** Switch a group's AND/OR connector and re-emit. No-op when disabled or unchanged. */\n  setGroupLogic(group: QbGroup, logic: 'AND' | 'OR'): void {\n    if (this.resolvedDisabled() || group.logic === logic) return;\n    group.logic = logic;\n    this.#apply();\n  }\n\n  /** Open this group's \"+\" menu (closing any other open one). UI-only — does not emit. */\n  toggleDropdown(group: QbGroup, event: Event): void {\n    if (this.resolvedDisabled()) return;\n    event.stopPropagation();\n    const willOpen = !group.open;\n    this.#closeAllDropdowns(this.#tree());\n    group.open = willOpen;\n    this.#bumpTree(); // UI-only — no emit\n  }\n\n  closeAllDropdowns(): void {\n    if (!this.#hasOpenDropdown(this.#tree())) return; // avoid a re-render on every container click\n    this.#closeAllDropdowns(this.#tree());\n    this.#bumpTree();\n  }\n\n  #hasOpenDropdown(node: QbNode): boolean {\n    if (!isQbGroup(node)) return false;\n    return node.open === true || node.children.some(c => this.#hasOpenDropdown(c));\n  }\n\n  #closeAllDropdowns(node: QbNode): void {\n    if (isQbGroup(node)) {\n      node.open = false;\n      node.children.forEach(c => this.#closeAllDropdowns(c));\n    }\n  }\n\n  /** Append a blank rule to `group`. */\n  addRule(group: QbGroup): void {\n    if (this.resolvedDisabled()) return;\n    group.children.push(qbNewRule());\n    group.open = false;\n    this.#apply();\n  }\n\n  /** Append a nested sub-group (seeded with one blank rule) to `group`. */\n  addGroup(group: QbGroup): void {\n    if (this.resolvedDisabled()) return;\n    group.children.push(qbNewGroup('AND', [qbNewRule()]));\n    group.open = false;\n    this.#apply();\n  }\n\n  /** Remove the child at `index` from `parent` (a rule or a whole sub-group). */\n  removeNode(parent: QbGroup, index: number): void {\n    if (this.resolvedDisabled()) return;\n    parent.children.splice(index, 1);\n    this.#apply();\n  }\n\n  // -------------------------------------------------------------------------\n  // Rule field / operator / value mutations\n  // -------------------------------------------------------------------------\n\n  /**\n   * Point `rule` at a new field. Resets operator to the field's default and the value\n   * to that operator's empty shape — the old operator/value rarely fit the new type.\n   *\n   * @param rule - the rule being edited.\n   * @param key - the chosen field key (from the field picker). Swap-only: a null / undefined\n   *   key is a no-op — the field can be changed but never cleared (issue #2).\n   */\n  setField(rule: QbRule, key: any): void {\n    if (this.resolvedDisabled()) return;\n    if (key == null) return; // swap-only: never clear the field (issue #2)\n    rule.field = key;\n    const field = this.fieldByKey()[rule.field as string];\n    const op = qbDefaultOperator(field);\n    rule.operator = op;\n    rule.value = this.#defaultValueFor(op);\n    this.#useLiteralSource(rule);\n    this.#apply();\n  }\n\n  /** Change `rule`'s operator and reshape its value to fit the new operator (array / range / none). */\n  setOperator(rule: QbRule, op: Operator | undefined): void {\n    if (this.resolvedDisabled()) return;\n    rule.operator = op;\n    if (rule.valueSource === 'field' && this.canCompareWithField(rule)) {\n      rule.value = null;\n      if (!this.#isCompareFieldAllowed(rule, rule.compareField)) rule.compareField = undefined;\n    } else {\n      rule.value = this.#reshapeValue(op, rule.value);\n      this.#useLiteralSource(rule);\n    }\n    this.#apply();\n  }\n\n  /** Set a single-value rule's value (coercing numeric fields to `number`). */\n  setScalar(rule: QbRule, raw: any): void {\n    if (this.resolvedDisabled()) return;\n    this.#useLiteralSource(rule);\n    rule.value = this.#coerce(rule, raw);\n    this.#apply();\n  }\n\n  /** Set the lower bound of a BETWEEN rule's `{ from, to }` value. */\n  setBetweenFrom(rule: QbRule, raw: any): void {\n    if (this.resolvedDisabled()) return;\n    this.#useLiteralSource(rule);\n    rule.value = { ...(rule.value ?? {}), from: this.#coerce(rule, raw) };\n    this.#apply();\n  }\n\n  /** Set the upper bound of a BETWEEN rule's `{ from, to }` value. */\n  setBetweenTo(rule: QbRule, raw: any): void {\n    if (this.resolvedDisabled()) return;\n    this.#useLiteralSource(rule);\n    rule.value = { ...(rule.value ?? {}), to: this.#coerce(rule, raw) };\n    this.#apply();\n  }\n\n  setValueSource(rule: QbRule, source: unknown): void {\n    if (this.resolvedDisabled()) return;\n    if (source === 'field' && this.resolvedComparisonMode() === 'value-or-field' && this.canCompareWithField(rule)) {\n      rule.valueSource = 'field';\n      rule.value = null;\n      if (!this.#isCompareFieldAllowed(rule, rule.compareField)) rule.compareField = undefined;\n    } else {\n      this.#useLiteralSource(rule);\n      rule.value = this.#defaultValueFor(rule.operator);\n    }\n    this.#apply();\n  }\n\n  setCompareField(rule: QbRule, key: any): void {\n    if (this.resolvedDisabled()) return;\n    if (!this.#isCompareFieldAllowed(rule, key)) return;\n    rule.valueSource = 'field';\n    rule.compareField = key;\n    rule.value = null;\n    this.#apply();\n  }\n\n  /** Coerce numeric fields to `number` so the emitted Filter carries a real number. */\n  #coerce(rule: QbRule, raw: any): any {\n    const field = this.fieldByKey()[rule.field as string];\n    if (field?.type === 'number' && raw !== null && raw !== undefined && raw !== '') {\n      const n = Number(raw);\n      return Number.isNaN(n) ? raw : n;\n    }\n    return raw;\n  }\n\n  #defaultValueFor(op: Operator | undefined): any {\n    if (qbIsMultiOperator(op)) return [];\n    if (op === 'BETWEEN') return { from: null, to: null };\n    return null;\n  }\n\n  #reshapeValue(op: Operator | undefined, current: any): any {\n    if (qbIsNoDataOperator(op)) return null;\n    if (qbIsMultiOperator(op)) return Array.isArray(current) ? current : current == null ? [] : [current];\n    if (op === 'BETWEEN') {\n      // a relative spec / 'TODAY' can't be a BETWEEN endpoint — reset to a fresh range\n      return current && typeof current === 'object' && !Array.isArray(current) && !qbIsRelativeDate(current)\n        ? current\n        : { from: null, to: null };\n    }\n    // single value — keep a relative spec or the 'TODAY' sentinel; else drop array/range remnants\n    if (qbIsToday(current) || qbIsRelativeDate(current)) return current;\n    return Array.isArray(current) || (current && typeof current === 'object') ? null : current;\n  }\n\n  #useLiteralSource(rule: QbRule): void {\n    rule.valueSource = 'literal';\n    rule.compareField = undefined;\n  }\n\n  #isCompareFieldAllowed(rule: QbRule, key: any): boolean {\n    return !!key && this.compareFields(rule).some(f => f.key === key);\n  }\n\n  // -------------------------------------------------------------------------\n  // Template helpers\n  // -------------------------------------------------------------------------\n\n  /** The field metadata for a rule's current `field` key (or undefined if unset). */\n  fieldOf(rule: QbRule): SdQueryBuilderField | undefined {\n    return rule.field ? this.fieldByKey()[rule.field] : undefined;\n  }\n\n  /** Operators allowed for a rule, derived from its field's type / override. */\n  allowedOperators(rule: QbRule): Operator[] {\n    return qbAllowedOperators(this.fieldOf(rule));\n  }\n\n  /** Whether to render the operator picker — hidden when only one operator is allowed. */\n  showOperatorSelector(rule: QbRule): boolean {\n    return this.allowedOperators(rule).length > 1;\n  }\n\n  compareFields(rule: QbRule): SdQueryBuilderField[] {\n    const field = this.fieldOf(rule);\n    if (!field) return QB_EMPTY_FIELDS;\n    return this.#compareFieldsByKey().get(field.key) ?? QB_EMPTY_FIELDS;\n  }\n\n  canCompareWithField(rule: QbRule): boolean {\n    return qbSupportsFieldCompareOperator(rule.operator) && this.compareFields(rule).length > 0;\n  }\n\n  showValueSourceSelector(rule: QbRule): boolean {\n    return this.canCompareWithField(rule) && (this.resolvedComparisonMode() === 'value-or-field' || rule.valueSource === 'field');\n  }\n\n  valueSourceOf(rule: QbRule): QbValueSource {\n    return rule.valueSource === 'field' && this.canCompareWithField(rule) ? 'field' : 'literal';\n  }\n\n  isFieldSource(rule: QbRule): boolean {\n    return this.valueSourceOf(rule) === 'field';\n  }\n\n  /** True for NULL / NOT_NULL — the template then renders no value editor. */\n  isNoData(op: Operator | undefined): boolean {\n    return qbIsNoDataOperator(op);\n  }\n\n  /** True for IN / NOT_IN — the template then renders a multi-select value editor. */\n  isMulti(op: Operator | undefined): boolean {\n    return qbIsMultiOperator(op);\n  }\n\n  /** `[true/false]` option list for a boolean field's value select (stable reference). */\n  booleanItems(field: SdQueryBuilderField): SdQueryBuilderFieldOption[] {\n    return this.#booleanOptionsByKey().get(field.key) ?? QB_EMPTY_OPTIONS;\n  }\n\n  /** Current date-value mode of a rule, derived from its value (no separate state). */\n  dateMode(rule: QbRule): QbDateMode {\n    const v = rule.value;\n    if (qbIsToday(v)) return 'now';\n    if (qbIsRelativeDate(v)) return 'relative';\n    return 'absolute';\n  }\n\n  /** Switch a date/datetime rule's value mode, reseeding the value for the new mode. */\n  setDateMode(rule: QbRule, mode: unknown): void {\n    if (this.resolvedDisabled()) return;\n    this.#useLiteralSource(rule);\n    if (mode === 'now') rule.value = QB_TODAY;\n    else if (mode === 'relative') rule.value = qbDefaultRelative();\n    else rule.value = null; // absolute — pick a concrete date\n    this.#apply();\n  }\n\n  /** Read the offset amount of a relative rule (default 1). */\n  relativeAmount(rule: QbRule): number {\n    const v = rule.value;\n    return qbIsRelativeDate(v) ? (v.amount ?? 1) : 1;\n  }\n\n  /** Set the offset amount (clamped to an integer >= 1). */\n  setRelativeAmount(rule: QbRule, raw: any): void {\n    if (this.resolvedDisabled()) return;\n    this.#useLiteralSource(rule);\n    const n = Math.floor(Number(raw));\n    const amount = Number.isNaN(n) || n < 1 ? 1 : n;\n    const cur = qbIsRelativeDate(rule.value) ? rule.value : qbDefaultRelative();\n    rule.value = { amount, direction: cur.direction, unit: cur.unit } satisfies DateRelative;\n    this.#apply();\n  }\n\n  /** Read the `'unit:direction'` token of a relative rule (default `'day:previous'`). */\n  relativeUnitDirValue(rule: QbRule): string {\n    const v = rule.value;\n    if (qbIsRelativeDate(v)) return `${v.unit}:${v.direction}`;\n    return 'day:previous';\n  }\n\n  /** Set the offset unit + direction from a `'unit:direction'` token. */\n  setRelativeUnitDir(rule: QbRule, token: unknown): void {\n    if (this.resolvedDisabled()) return;\n    this.#useLiteralSource(rule);\n    const normalizedToken = typeof token === 'string' ? token : 'day:previous';\n    const [unit, direction] = normalizedToken.split(':') as [DateRelative['unit'], DateRelative['direction']];\n    const cur = qbIsRelativeDate(rule.value) ? rule.value : qbDefaultRelative();\n    rule.value = { amount: cur.amount, direction, unit } satisfies DateRelative;\n    this.#apply();\n  }\n\n  /** Build a `data-autoid` for an inner control under this builder's `autoId` prefix. */\n  autoIdFor(suffix: string): string {\n    return `${this.resolvedAutoId() ?? 'qb'}-${suffix}`;\n  }\n}\n","@if (isView()) {\n  <div class=\"qb-view\" [attr.data-autoid]=\"autoIdFor('view')\" aria-readonly=\"true\">\n    @if (tokens().length) {\n      @for (t of tokens(); track $index) {\n        <span class=\"qb-tok qb-tok-{{ t.kind }}\">{{ t.text }}</span>\n      }\n    } @else {\n      <span class=\"qb-view-empty\">—</span>\n    }\n  </div>\n} @else {\n  <div class=\"qb-container\" [class.is-disabled]=\"resolvedDisabled()\" (click)=\"closeAllDropdowns()\">\n    <ng-container [ngTemplateOutlet]=\"groupTpl\" [ngTemplateOutletContext]=\"{ $implicit: tree(), isRoot: true }\"></ng-container>\n  </div>\n}\n\n<!-- Recursive group node -->\n<ng-template #groupTpl let-group let-isRoot=\"isRoot\" let-parent=\"parent\" let-index=\"index\">\n  <div class=\"qb-group\" [class.is-root]=\"isRoot\">\n    <div class=\"qb-header\" [class.is-open]=\"group.open\">\n      <div class=\"qb-logic-switch\">\n        <button type=\"button\" [class.active]=\"group.logic === 'AND'\" [disabled]=\"resolvedDisabled()\" (click)=\"setGroupLogic(group, 'AND')\">AND</button>\n        <button type=\"button\" [class.active]=\"group.logic === 'OR'\" [disabled]=\"resolvedDisabled()\" (click)=\"setGroupLogic(group, 'OR')\">OR</button>\n      </div>\n\n      <div class=\"qb-actions\">\n        <button type=\"button\" class=\"qb-btn qb-btn-add\" title=\"Thêm\" aria-label=\"Thêm điều kiện hoặc nhóm\" [disabled]=\"resolvedDisabled()\" (click)=\"toggleDropdown(group, $event)\">+</button>\n        @if (group.open) {\n          <div class=\"qb-dropdown\" (click)=\"$event.stopPropagation()\">\n            <button type=\"button\" (click)=\"addRule(group)\">+ Điều kiện</button>\n            <button type=\"button\" (click)=\"addGroup(group)\">+ Nhóm</button>\n          </div>\n        }\n        @if (!isRoot) {\n          <button type=\"button\" class=\"qb-btn qb-btn-remove\" title=\"Xoá nhóm\" aria-label=\"Xoá nhóm\" [disabled]=\"resolvedDisabled()\" (click)=\"removeNode(parent, index)\">✕</button>\n        }\n      </div>\n    </div>\n\n    <div class=\"qb-body\">\n      @for (node of group.children; track node.id; let i = $index) {\n        <div class=\"qb-treenode\" [class.is-group]=\"isGroup(node)\" [class.is-rule]=\"!isGroup(node)\">\n          @if (isGroup(node)) {\n            <ng-container\n              [ngTemplateOutlet]=\"groupTpl\"\n              [ngTemplateOutletContext]=\"{ $implicit: node, isRoot: false, parent: group, index: i }\"\n            ></ng-container>\n          } @else {\n            <ng-container [ngTemplateOutlet]=\"ruleTpl\" [ngTemplateOutletContext]=\"{ $implicit: node, parent: group, index: i }\"></ng-container>\n          }\n        </div>\n      } @empty {\n        <div class=\"qb-empty\">Chưa có điều kiện</div>\n      }\n    </div>\n  </div>\n</ng-template>\n\n<!-- Single rule node: field → operator → value -->\n<ng-template #ruleTpl let-rule let-parent=\"parent\" let-index=\"index\">\n  <div class=\"qb-rule\">\n    <sd-select\n      class=\"qb-field\"\n      [items]=\"resolvedFields()\"\n      valueField=\"key\"\n      displayField=\"label\"\n      placeholder=\"Chọn trường\"\n      size=\"sm\"\n      [model]=\"rule.field\"\n      (modelChange)=\"setField(rule, $event)\"\n      [disabled]=\"resolvedDisabled()\"\n      [clearable]=\"false\"\n      hideInlineError\n      [autoId]=\"autoIdFor('field-' + index)\"\n    >\n      <!-- Option trong dropdown: icon thể hiện type + label. -->\n      <ng-template sdItemDef let-item=\"item\">\n        <span class=\"qb-opt\">\n          <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n          <span class=\"qb-opt-label\">{{ $any(item).label }}</span>\n        </span>\n      </ng-template>\n      <!-- Giá trị đã chọn ở trigger: icon mặc định theo type khi field chưa có icon riêng. -->\n      <ng-template #sdSelected let-item=\"item\">\n        <span class=\"qb-opt\">\n          <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n          <span class=\"qb-opt-label\">{{ $any(item)?.label }}</span>\n        </span>\n      </ng-template>\n    </sd-select>\n\n    @if (rule.field) {\n      <div class=\"qb-divider\"></div>\n\n      @if (showOperatorSelector(rule)) {\n        <sd-operator\n          class=\"qb-op\"\n          [operators]=\"allowedOperators(rule)\"\n          [model]=\"rule.operator\"\n          (modelChange)=\"setOperator(rule, $event)\"\n          [disabled]=\"resolvedDisabled()\"\n          [autoId]=\"autoIdFor('op-' + index)\"\n        ></sd-operator>\n      }\n\n      @if (rule.operator && !isNoData(rule.operator)) {\n        <div class=\"qb-divider\"></div>\n\n        @if (showValueSourceSelector(rule)) {\n          <sd-select\n            class=\"qb-value-source\"\n            [items]=\"valueSourceOptions\"\n            valueField=\"value\"\n            displayField=\"display\"\n            size=\"sm\"\n            [model]=\"valueSourceOf(rule)\"\n            (modelChange)=\"setValueSource(rule, $event)\"\n            [disabled]=\"resolvedDisabled()\"\n            [clearable]=\"false\"\n            hideInlineError\n            [autoId]=\"autoIdFor('valuesource-' + index)\"\n          >\n            <ng-template sdItemDef let-item=\"item\">\n              <span class=\"qb-opt\">\n                <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n                <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n              </span>\n            </ng-template>\n            <ng-template #sdSelected let-item=\"item\">\n              <span class=\"qb-opt\">\n                <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n                <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n              </span>\n            </ng-template>\n          </sd-select>\n          <div class=\"qb-divider\"></div>\n        }\n\n        @if (isFieldSource(rule)) {\n          <sd-select\n            class=\"qb-val qb-compare-field\"\n            [items]=\"compareFields(rule)\"\n            valueField=\"key\"\n            displayField=\"label\"\n            placeholder=\"Chọn trường\"\n            size=\"sm\"\n            [model]=\"rule.compareField\"\n            (modelChange)=\"setCompareField(rule, $event)\"\n            [disabled]=\"resolvedDisabled()\"\n            [clearable]=\"false\"\n            hideInlineError\n            [autoId]=\"autoIdFor('compare-field-' + index)\"\n          >\n            <ng-template sdItemDef let-item=\"item\">\n              <span class=\"qb-opt\">\n                <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n                <span class=\"qb-opt-label\">{{ $any(item).label }}</span>\n              </span>\n            </ng-template>\n            <ng-template #sdSelected let-item=\"item\">\n              <span class=\"qb-opt\">\n                <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n                <span class=\"qb-opt-label\">{{ $any(item)?.label }}</span>\n              </span>\n            </ng-template>\n          </sd-select>\n        } @else if (rule.operator === 'BETWEEN') {\n          <div class=\"qb-between\">\n            @switch (fieldOf(rule)?.type) {\n              @case ('number') {\n                <sd-input-number class=\"qb-val\" placeholder=\"Từ\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-input-number>\n                <span class=\"qb-dash\">—</span>\n                <sd-input-number class=\"qb-val\" placeholder=\"Đến\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-input-number>\n              }\n              @case ('date') {\n                <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-date>\n                <span class=\"qb-dash\">—</span>\n                <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-date>\n              }\n              @case ('datetime') {\n                <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-datetime>\n                <span class=\"qb-dash\">—</span>\n                <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-datetime>\n              }\n            }\n          </div>\n        } @else {\n          @switch (fieldOf(rule)?.type) {\n            @case ('string') {\n              <sd-input class=\"qb-val\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-input>\n            }\n            @case ('number') {\n              <sd-input-number class=\"qb-val\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-input-number>\n            }\n            @case ('boolean') {\n              <sd-select class=\"qb-val\" [items]=\"booleanItems(fieldOf(rule)!)\" valueField=\"value\" displayField=\"display\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-select>\n            }\n            @case ('date') {\n              @let _dateMode = dateMode(rule);\n              <sd-select class=\"qb-date-mode\" [items]=\"dateModes\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"_dateMode\" (modelChange)=\"setDateMode(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('datemode-' + index)\">\n                <ng-template sdItemDef let-item=\"item\">\n                  <span class=\"qb-opt\">\n                    <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n                    <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n                  </span>\n                </ng-template>\n                <ng-template #sdSelected let-item=\"item\">\n                  <span class=\"qb-opt\">\n                    <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n                    <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n                  </span>\n                </ng-template>\n              </sd-select>\n              @switch (_dateMode) {\n                @case ('absolute') {\n                  <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-date>\n                }\n                @case ('relative') {\n                  <sd-input-number class=\"qb-rel-amount\" type=\"positive\" [precision]=\"0\" size=\"sm\" [model]=\"relativeAmount(rule)\" (modelChange)=\"setRelativeAmount(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('rel-amount-' + index)\"></sd-input-number>\n                  <sd-select class=\"qb-rel-unit\" [items]=\"relativeUnitOptions\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"relativeUnitDirValue(rule)\" (modelChange)=\"setRelativeUnitDir(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('rel-unit-' + index)\"></sd-select>\n                }\n              }\n            }\n            @case ('datetime') {\n              @let _dtMode = dateMode(rule);\n              <sd-select class=\"qb-date-mode\" [items]=\"dateModes\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"_dtMode\" (modelChange)=\"setDateMode(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('datemode-' + index)\">\n                <ng-template sdItemDef let-item=\"item\">\n                  <span class=\"qb-opt\">\n                    <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n                    <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n                  </span>\n                </ng-template>\n                <ng-template #sdSelected let-item=\"item\">\n                  <span class=\"qb-opt\">\n                    <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n                    <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n                  </span>\n                </ng-template>\n              </sd-select>\n              @switch (_dtMode) {\n                @case ('absolute') {\n                  <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-datetime>\n                }\n                @case ('relative') {\n                  <sd-input-number class=\"qb-rel-amount\" type=\"positive\" [precision]=\"0\" size=\"sm\" [model]=\"relativeAmount(rule)\" (modelChange)=\"setRelativeAmount(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('rel-amount-' + index)\"></sd-input-number>\n                  <sd-select class=\"qb-rel-unit\" [items]=\"relativeUnitOptions\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"relativeUnitDirValue(rule)\" (modelChange)=\"setRelativeUnitDir(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('rel-unit-' + index)\"></sd-select>\n                }\n              }\n            }\n            @case ('values') {\n              <sd-select class=\"qb-val\" [items]=\"fieldOf(rule)!.values || []\" valueField=\"value\" displayField=\"display\" [multiple]=\"isMulti(rule.operator)\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-select>\n            }\n          }\n        }\n      }\n    }\n\n    <button type=\"button\" class=\"qb-btn qb-btn-remove-rule\" title=\"Xoá điều kiện\" aria-label=\"Xoá điều kiện\" [disabled]=\"resolvedDisabled()\" (click)=\"removeNode(parent, index)\">✕</button>\n  </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isAndOr"],"mappings":"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"}