@sd-angular/core 19.0.0-beta.100 → 19.0.0-beta.101

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.
Files changed (105) hide show
  1. package/assets/images/coming-soon.svg +23 -0
  2. package/assets/images/data-empty.svg +21 -0
  3. package/assets/images/expired.svg +22 -0
  4. package/assets/images/file-error.svg +28 -0
  5. package/assets/images/filter-empty.svg +20 -0
  6. package/assets/images/filter-required.svg +21 -0
  7. package/assets/images/forbidden.svg +15 -0
  8. package/assets/images/image-error.svg +27 -0
  9. package/assets/images/maintenance.svg +23 -0
  10. package/assets/images/not-found.svg +20 -0
  11. package/assets/images/offline.svg +20 -0
  12. package/assets/images/submitted.svg +18 -0
  13. package/assets/images/success.svg +18 -0
  14. package/assets/images/unauthorized.svg +22 -0
  15. package/assets/images/unknown-error.svg +18 -0
  16. package/assets/scss/core/image.scss +35 -0
  17. package/assets/scss/sd-core.scss +1 -0
  18. package/components/index.d.ts +1 -0
  19. package/components/operator/index.d.ts +1 -0
  20. package/components/operator/src/operator.component.d.ts +38 -0
  21. package/components/query-bar/index.d.ts +2 -0
  22. package/components/query-bar/src/inline-value-chip.component.d.ts +71 -0
  23. package/components/query-bar/src/query-bar.component.d.ts +180 -0
  24. package/components/query-bar/src/query-bar.model.d.ts +121 -0
  25. package/components/table/src/components/column-title/column-title.component.d.ts +1 -1
  26. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +3 -3
  27. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +3 -7
  28. package/components/table/src/directives/sd-table-cell-def.directive.d.ts +12 -4
  29. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +12 -4
  30. package/components/table/src/directives/sd-table-expand-def.directive.d.ts +10 -4
  31. package/components/table/src/directives/sd-table-filter-def.directive.d.ts +3 -3
  32. package/components/table/src/directives/sd-table-footer-def.directive.d.ts +12 -4
  33. package/components/table/src/directives/sd-table-title-def.directive.d.ts +10 -4
  34. package/components/table/src/table.component.d.ts +7 -7
  35. package/directives/src/sd-desktop.directive.d.ts +2 -4
  36. package/directives/src/sd-mobile.directive.d.ts +2 -4
  37. package/fesm2022/sd-angular-core-components-form-generic.mjs +11 -11
  38. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-components-operator.mjs +88 -0
  40. package/fesm2022/sd-angular-core-components-operator.mjs.map +1 -0
  41. package/fesm2022/sd-angular-core-components-query-bar.mjs +998 -0
  42. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -0
  43. package/fesm2022/sd-angular-core-components-quick-action.mjs +2 -2
  44. package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-components-table.mjs +59 -26
  46. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  47. package/fesm2022/sd-angular-core-components-upload-file.mjs +4 -4
  48. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  49. package/fesm2022/sd-angular-core-components.mjs +1 -0
  50. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  51. package/fesm2022/sd-angular-core-directives.mjs +15 -17
  52. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  53. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +2 -5
  54. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  55. package/fesm2022/sd-angular-core-forms-checkbox.mjs +80 -87
  56. package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
  57. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +74 -55
  58. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  59. package/fesm2022/sd-angular-core-forms-chip.mjs +71 -46
  60. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  61. package/fesm2022/sd-angular-core-forms-date.mjs +14 -9
  62. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  63. package/fesm2022/sd-angular-core-forms-datetime.mjs +8 -9
  64. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  65. package/fesm2022/sd-angular-core-forms-directives.mjs +18 -24
  66. package/fesm2022/sd-angular-core-forms-directives.mjs.map +1 -1
  67. package/fesm2022/sd-angular-core-forms-input-number.mjs +2 -5
  68. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  69. package/fesm2022/sd-angular-core-forms-input.mjs +2 -5
  70. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  71. package/fesm2022/sd-angular-core-forms-models.mjs +13 -1
  72. package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
  73. package/fesm2022/sd-angular-core-forms-radio.mjs +108 -176
  74. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  75. package/fesm2022/sd-angular-core-forms-select.mjs +13 -8
  76. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  77. package/fesm2022/sd-angular-core-forms-switch.mjs +78 -99
  78. package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
  79. package/fesm2022/sd-angular-core-forms-textarea.mjs +2 -5
  80. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  81. package/fesm2022/sd-angular-core-modules-layout.mjs +8 -8
  82. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  83. package/fesm2022/sd-angular-core-modules-permission.mjs.map +1 -1
  84. package/fesm2022/sd-angular-core-services-confirm.mjs +1 -1
  85. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  86. package/forms/autocomplete/src/autocomplete.component.d.ts +3 -4
  87. package/forms/checkbox/src/checkbox.component.d.ts +15 -20
  88. package/forms/chip/src/chip.component.d.ts +17 -17
  89. package/forms/chip-calendar/src/chip-calendar.component.d.ts +19 -19
  90. package/forms/date/src/date.component.d.ts +7 -4
  91. package/forms/datetime/src/datetime.component.d.ts +5 -4
  92. package/forms/directives/src/item-def.directive.d.ts +10 -5
  93. package/forms/directives/src/label-def.directive.d.ts +3 -2
  94. package/forms/directives/src/suffix-def.directive.d.ts +3 -2
  95. package/forms/directives/src/view-def.directive.d.ts +9 -9
  96. package/forms/input/src/input.component.d.ts +2 -3
  97. package/forms/input-number/src/input-number.component.d.ts +2 -3
  98. package/forms/models/src/sd-custom-validator.model.d.ts +13 -1
  99. package/forms/radio/src/radio.component.d.ts +30 -37
  100. package/forms/select/src/select.component.d.ts +8 -5
  101. package/forms/switch/src/switch.component.d.ts +16 -22
  102. package/forms/textarea/src/textarea.component.d.ts +2 -3
  103. package/package.json +72 -64
  104. package/sd-angular-core-19.0.0-beta.101.tgz +0 -0
  105. package/sd-angular-core-19.0.0-beta.100.tgz +0 -0
@@ -0,0 +1,180 @@
1
+ import { MatMenuTrigger } from '@angular/material/menu';
2
+ import { SdSearch } from '@sd-angular/core/forms/models';
3
+ import { Filter, Operator } from '@sd-angular/core/utilities/models';
4
+ import { SdQuery, SdQueryField, SdQueryLogic, sdQueryFieldIcon } from './query-bar.model';
5
+ import * as i0 from "@angular/core";
6
+ type Density = 'compact' | 'comfortable';
7
+ interface BuildingChip {
8
+ field: SdQueryField;
9
+ operator?: Operator;
10
+ step: 'operator' | 'value';
11
+ value?: unknown;
12
+ }
13
+ export declare class SdQueryBar {
14
+ #private;
15
+ /** All chip menu triggers (one per chip button). Used to auto-open the popover after addFilter. */
16
+ readonly chipTriggers: import("@angular/core").Signal<readonly MatMenuTrigger[]>;
17
+ /** The build chip's operator dropdown — auto-opened when entering the operator step. */
18
+ private readonly buildOperator;
19
+ /** The build chip's value picker (bare sd-select / sd-date / sd-datetime) — auto-opened at the value step. */
20
+ private readonly buildPicker;
21
+ /** Prefix for auto-generated `data-autoid` on inner controls (chips, operator/value editors, buttons). */
22
+ readonly autoIdInput: import("@angular/core").InputSignalWithTransform<string | undefined, string | null | undefined>;
23
+ /** Available fields the user can filter by. Required for the field picker. */
24
+ readonly fields: import("@angular/core").InputSignalWithTransform<SdQueryField[], SdQueryField[] | null | undefined>;
25
+ /**
26
+ * Active filter chips. Two-way bindable via `[(filters)]`.
27
+ * Use this when you only need a flat `Filter[]` (no global logic / search box).
28
+ */
29
+ readonly filters: import("@angular/core").ModelSignal<Filter[]>;
30
+ /**
31
+ * Global connector between filters. Two-way bindable via `[(logic)]`.
32
+ * Only meaningful when `showLogicToggle=true` and there are ≥2 filters.
33
+ */
34
+ readonly logic: import("@angular/core").ModelSignal<SdQueryLogic>;
35
+ /** Free-text search string. Two-way bindable via `[(search)]`. Only shown when `showSearch=true`. */
36
+ readonly search: import("@angular/core").ModelSignal<string>;
37
+ /**
38
+ * Editing mode:
39
+ * - `'popover'` (default) → compact chips; click a chip to edit operator + value in a
40
+ * mat-menu popover, commit with "Áp dụng".
41
+ * - `'inline'` → GitLab-style. Each filter's operator + value controls render directly
42
+ * on the bar (no popup, no per-filter apply). Edits update `filters` live; the user
43
+ * presses the search button (or Enter) once to fire `(apply)`.
44
+ */
45
+ readonly mode: import("@angular/core").InputSignalWithTransform<"popover" | "inline", "popover" | "inline" | null | undefined>;
46
+ /** Density preset — chip / control height. */
47
+ readonly density: import("@angular/core").InputSignalWithTransform<Density, Density | null | undefined>;
48
+ /** Show free-text search input on the left. */
49
+ readonly showSearch: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
50
+ /** Show saved-views dropdown on the right. */
51
+ readonly showSavedViews: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
52
+ /** Show AND/OR segmented toggle (renders only when there are ≥2 filters). */
53
+ readonly showLogicToggle: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
54
+ /** Show "Clear all" button when at least one filter is active. */
55
+ readonly showClearAll: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
56
+ /** Render the operator label on the chip face (default: hidden — operator only visible in popover). */
57
+ readonly showOperatorOnChip: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
58
+ /** Composite payload — emitted whenever filters / logic / search change. */
59
+ readonly queryChange: import("@angular/core").OutputEmitterRef<SdQuery<any>>;
60
+ /** Fires when the user presses "Áp dụng" inside a chip popover — host should reload data. */
61
+ readonly apply: import("@angular/core").OutputEmitterRef<SdQuery<any>>;
62
+ /** Map of `field.key` → `SdQueryField` for fast lookup from filters[]. */
63
+ readonly fieldByKey: import("@angular/core").Signal<Record<string, SdQueryField>>;
64
+ /** Field keys already chained on a chip — the picker greys these out. */
65
+ readonly usedFieldKeys: import("@angular/core").Signal<Set<string>>;
66
+ /** Render the global AND/OR connector text between chips when `logic === 'OR'`. */
67
+ readonly showOrConnector: import("@angular/core").Signal<boolean>;
68
+ /** Search button is actionable only when there is something to apply. */
69
+ readonly canSearch: import("@angular/core").Signal<boolean>;
70
+ /** Index of the chip whose popover is open. Reset to null after Apply / close. */
71
+ readonly editingIndex: import("@angular/core").WritableSignal<number | null>;
72
+ /** Staged operator (uncommitted). */
73
+ readonly editingOperator: import("@angular/core").WritableSignal<Operator>;
74
+ /** Staged value (uncommitted) — type varies by kind. */
75
+ readonly editingValue: import("@angular/core").WritableSignal<unknown>;
76
+ /** Resolved option list for the currently editing values / lazy-values field. */
77
+ readonly editingOptions: import("@angular/core").WritableSignal<any[]>;
78
+ /** Loading state for async option fetch. */
79
+ readonly editingOptionsLoading: import("@angular/core").WritableSignal<boolean>;
80
+ readonly editingField: import("@angular/core").Signal<SdQueryField | null>;
81
+ readonly editingAllowedOperators: import("@angular/core").Signal<Operator[]>;
82
+ /** Show the operator dropdown only when the field exposes >1 operator (else simple mode). */
83
+ readonly editingShowOperatorSelector: import("@angular/core").Signal<boolean>;
84
+ /** Multi-select is derived from the operator (IN / NOT_IN), not a field flag. */
85
+ readonly editingIsMulti: import("@angular/core").Signal<boolean>;
86
+ /** Compose a deterministic autoId for an inner control inside a chip's editor. */
87
+ chipAutoId(role: string): string;
88
+ readonly iconFor: typeof sdQueryFieldIcon;
89
+ /** Chip is "active" when it has a non-empty value OR a no-data operator (NULL/NOT_NULL). */
90
+ isFilterActive(filter: Filter): boolean;
91
+ /** Rendered value text on a chip. */
92
+ chipValueText(filter: Filter): string;
93
+ isNoDataOperator(op: Operator | string): boolean;
94
+ isMultiOperator(op: Operator | string): boolean;
95
+ lazyItemsFor(field: SdQueryField): SdSearch;
96
+ readonly building: import("@angular/core").Signal<BuildingChip | null>;
97
+ readonly editingValueIndex: import("@angular/core").Signal<number | null>;
98
+ /** True when chip `i` is in inline value-edit mode. */
99
+ isEditingValue(i: number): boolean;
100
+ allowedOperatorsFor(field: SdQueryField): Operator[];
101
+ inlineAutoId(index: number, role: string): string;
102
+ /** Entry point from the field picker — start building a chip for `field`. */
103
+ beginBuild(field: SdQueryField): void;
104
+ /** Operator chosen during build — finish (no-data) or advance to the value step. */
105
+ pickBuildOperator(op: Operator): void;
106
+ /** Value committed during build — push the completed chip, clear building. No emit. */
107
+ commitBuildValue(value: unknown): void;
108
+ /**
109
+ * Commit from the seamless build chip (string / number). An empty value (blur with no
110
+ * input) cancels the build instead of pushing a blank chip.
111
+ */
112
+ onBuildSeamlessCommit(value: unknown): void;
113
+ /** Abandon the in-progress chip. */
114
+ cancelBuild(): void;
115
+ /** Live-commit an inline edit for a completed chip (bare control path). */
116
+ editValueFn(i: number): (v: unknown) => void;
117
+ /** Single-value commit from a completed chip in edit mode — write data + exit edit. */
118
+ onChipSingleCommit(i: number, v: unknown): void;
119
+ /**
120
+ * Multi-value chips exit edit when focus actually leaves the wrapper subtree.
121
+ * why: focusout fires on every internal blur (option click, search input, …) — only
122
+ * exit when the new focus target is NOT a descendant of the chip's value wrapper.
123
+ */
124
+ onChipValueFocusOut(i: number, ev: FocusEvent): void;
125
+ /**
126
+ * Cập nhật đầu `from` của BETWEEN cho 1 chip đã commit (inline edit).
127
+ * why: dual picker BETWEEN trên chip hoàn tất cần ghi từng đầu vào filter mà không reset đầu kia.
128
+ */
129
+ setFilterRangeFrom(i: number, v: unknown): void;
130
+ /**
131
+ * Cập nhật đầu `to` của BETWEEN cho 1 chip đã commit (inline edit).
132
+ */
133
+ setFilterRangeTo(i: number, v: unknown): void;
134
+ noop: () => void;
135
+ setEditDraftFn(): (v: unknown) => void;
136
+ commitEditDraftFn(i: number): () => void;
137
+ setBuildDraftFn(): (v: unknown) => void;
138
+ /** Update the `from` end of the build chip's BETWEEN range without committing. */
139
+ setBuildRangeFrom(v: unknown): void;
140
+ /**
141
+ * Update the `to` end of the build chip's BETWEEN range. Once both ends are set, commit
142
+ * the chip so the user does not need an extra blur / apply press.
143
+ */
144
+ setBuildRangeTo(v: unknown): void;
145
+ commitBuildDraftFn(): () => void;
146
+ /** Start inline value edit on a completed chip (operator + field stay locked). */
147
+ beginEditValue(i: number): void;
148
+ /** Commit an inline value edit — change only `data`, no emit. */
149
+ commitEditValue(i: number, value: unknown): void;
150
+ addFilter(field: SdQueryField): void;
151
+ /** Swap the field of an existing chip — reset operator + value to the new field's defaults. */
152
+ changeFilterField(index: number, field: SdQueryField): void;
153
+ updateFilter(index: number, patch: Partial<Filter>): void;
154
+ removeFilter(index: number): void;
155
+ clearAll(): void;
156
+ setLogic(value: SdQueryLogic): void;
157
+ setSearch(value: string): void;
158
+ triggerApply(): void;
159
+ /** Called when a chip is clicked — copy current operator + value into the staging signals. */
160
+ openChipPopover(index: number): void;
161
+ /** Called on operator <select> change in the popover. */
162
+ onEditingOperatorChange(next: Operator): void;
163
+ /** Two-way bind for primitive value control. */
164
+ onEditingValueInput(value: unknown): void;
165
+ /** BETWEEN range mutators. */
166
+ onEditingRangeFrom(value: string | number | null): void;
167
+ onEditingRangeTo(value: string | number | null): void;
168
+ /** Toggle a value inside the staged multi-select array. */
169
+ toggleEditingMultiValue(value: unknown): void;
170
+ isEditingMultiSelected(value: unknown): boolean;
171
+ /**
172
+ * Commit the staged operator + value into the chip when the popover closes.
173
+ * why: nút Áp dụng đã bị bỏ — đóng popover (out-focus) tự động áp dụng phần
174
+ * chỉnh sửa đang staging. Không emit: nút Search toàn cục vẫn là trigger query duy nhất.
175
+ */
176
+ commitChipEditOnClose(): void;
177
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdQueryBar, never>;
178
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdQueryBar, "sd-query-bar", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "logic": { "alias": "logic"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "showSavedViews": { "alias": "showSavedViews"; "required": false; "isSignal": true; }; "showLogicToggle": { "alias": "showLogicToggle"; "required": false; "isSignal": true; }; "showClearAll": { "alias": "showClearAll"; "required": false; "isSignal": true; }; "showOperatorOnChip": { "alias": "showOperatorOnChip"; "required": false; "isSignal": true; }; }, { "filters": "filtersChange"; "logic": "logicChange"; "search": "searchChange"; "queryChange": "queryChange"; "apply": "apply"; }, never, never, true, never>;
179
+ }
180
+ export {};
@@ -0,0 +1,121 @@
1
+ import { Signal } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { Filter, NestedKeyOf, Operator } from '@sd-angular/core/utilities/models';
4
+ export type SdQueryFieldKind = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values' | 'lazy-values';
5
+ interface SdQueryFieldBase<T = any> {
6
+ /** Dot-notation field path (matches `Filter.field`). */
7
+ key: NestedKeyOf<T>;
8
+ /** Human-readable label shown on chip + field picker. */
9
+ label: string;
10
+ /** Material icon name; falls back to `SD_QUERY_KIND_ICON[kind]` then `'tune'`. */
11
+ icon?: string;
12
+ /**
13
+ * Controls the operator selector in the chip popover:
14
+ * - omitted / `false` → **simple mode**: no operator dropdown; the chip always uses
15
+ * `defaultOperator` (or the per-kind default). Use this for screens that don't need
16
+ * operator choice.
17
+ * - `true` → show the full operator set for the field's `kind`
18
+ * (`SD_QUERY_OPERATORS_BY_KIND[kind]`).
19
+ * - `Operator[]` → show exactly these operators.
20
+ */
21
+ operators?: boolean | Operator[];
22
+ /**
23
+ * Operator the chip starts with. Falls back to `SD_QUERY_DEFAULT_OPERATOR_BY_KIND[kind]`:
24
+ * string→CONTAIN, number→EQUAL, values/lazy-values→IN, boolean→EQUAL, date/datetime→BETWEEN.
25
+ */
26
+ defaultOperator?: Operator;
27
+ /** Field is offered in picker but not interactive (read-only badge in chip). */
28
+ disabled?: boolean;
29
+ }
30
+ export interface SdQueryFieldString<T = any> extends SdQueryFieldBase<T> {
31
+ kind: 'string';
32
+ }
33
+ export interface SdQueryFieldNumber<T = any> extends SdQueryFieldBase<T> {
34
+ kind: 'number';
35
+ /** Bounds for the input control inside the chip popover. */
36
+ min?: number;
37
+ max?: number;
38
+ /** Step for the number input. */
39
+ step?: number;
40
+ }
41
+ export interface SdQueryFieldBoolean<T = any> extends SdQueryFieldBase<T> {
42
+ kind: 'boolean';
43
+ /** Labels rendered for the true/false buttons. Default: "Có" / "Không". */
44
+ trueLabel?: string;
45
+ falseLabel?: string;
46
+ }
47
+ export interface SdQueryFieldDate<T = any> extends SdQueryFieldBase<T> {
48
+ kind: 'date' | 'datetime';
49
+ /** Restrict the picker calendar to this range. */
50
+ min?: Date | string;
51
+ max?: Date | string;
52
+ }
53
+ /**
54
+ * Statically-known options (sync array, signal, or one-shot promise).
55
+ * Mirrors `SdTableColumnValues.option`.
56
+ */
57
+ export interface SdQueryFieldValues<T = any, K = Record<string, any>> extends SdQueryFieldBase<T> {
58
+ kind: 'values';
59
+ option: {
60
+ items: K[] | Signal<K[]> | (() => Promise<K[]>);
61
+ valueField: NestedKeyOf<K>;
62
+ displayField: NestedKeyOf<K>;
63
+ };
64
+ }
65
+ /**
66
+ * Server-backed options — searchable, paginated. Mirrors `SdTableColumnLazyValues.option`.
67
+ * `search(req)` runs the live picker query; `views(values)` resolves chip-display labels for selected IDs.
68
+ */
69
+ export interface SdQueryFieldLazyValues<T = any, K = Record<string, any>> extends SdQueryFieldBase<T> {
70
+ kind: 'lazy-values';
71
+ option: {
72
+ search: (req: {
73
+ search?: string;
74
+ size?: number;
75
+ }) => Observable<K[]> | Promise<K[]>;
76
+ views?: (values: any[]) => Promise<K[]>;
77
+ valueField: NestedKeyOf<K>;
78
+ displayField: NestedKeyOf<K>;
79
+ };
80
+ }
81
+ export type SdQueryField<T = any> = SdQueryFieldString<T> | SdQueryFieldNumber<T> | SdQueryFieldBoolean<T> | SdQueryFieldDate<T> | SdQueryFieldValues<T> | SdQueryFieldLazyValues<T>;
82
+ export type SdQueryLogic = 'AND' | 'OR';
83
+ export interface SdQuery<T = any> {
84
+ filters: Filter<T>[];
85
+ /** Global connector between filters. Defaults to `'AND'`. */
86
+ logic?: SdQueryLogic;
87
+ /** Free-text search box (only present when `showSearch=true`). */
88
+ search?: string;
89
+ }
90
+ /** Full operator set per field kind — used when `operators: true`. */
91
+ export declare const SD_QUERY_OPERATORS_BY_KIND: Record<SdQueryFieldKind, Operator[]>;
92
+ /** Default operator when a chip is created and `field.defaultOperator` is not set. */
93
+ export declare const SD_QUERY_DEFAULT_OPERATOR_BY_KIND: Record<SdQueryFieldKind, Operator>;
94
+ /** Vietnamese operator labels. Replace via i18n in the consuming template if needed. */
95
+ export declare const SD_QUERY_OPERATOR_LABEL: Record<Operator, string>;
96
+ /** Icon fallback per field kind when `SdQueryField.icon` is not set. */
97
+ export declare const SD_QUERY_KIND_ICON: Record<SdQueryFieldKind, string>;
98
+ /**
99
+ * Resolves the icon shown on chips and in the field picker.
100
+ * Priority: `field.icon` → `SD_QUERY_KIND_ICON[field.kind]` → `'tune'`.
101
+ */
102
+ export declare function sdQueryFieldIcon(field: SdQueryField): string;
103
+ /** Operators that carry no data — value section is hidden in chip popover. */
104
+ export declare const SD_QUERY_NO_DATA_OPERATORS: Operator[];
105
+ /** Operators that carry an array payload — UI offers multi-select. */
106
+ export declare const SD_QUERY_MULTI_OPERATORS: Operator[];
107
+ /** Picks the initial operator when a new chip is created for `field`. */
108
+ export declare function sdQueryDefaultOperator(field: SdQueryField): Operator;
109
+ /**
110
+ * Operators offered in the chip popover for `field`:
111
+ * - `operators === true` → full set for the kind
112
+ * - `operators` is an array → that array (deduped against the kind set is the caller's job)
113
+ * - otherwise (simple mode) → just the single default operator (no real choice)
114
+ */
115
+ export declare function sdQueryAllowedOperators(field: SdQueryField): Operator[];
116
+ /**
117
+ * Whether the operator selector should be visible. Simple mode (operators omitted/false,
118
+ * or an array with a single entry) hides the dropdown — the chip uses one fixed operator.
119
+ */
120
+ export declare function sdQueryShowOperatorSelector(field: SdQueryField): boolean;
121
+ export {};
@@ -3,7 +3,7 @@ import { SdTableColumn } from '../../models/table-column.model';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class ColumnTitleComponent {
5
5
  column: import("@angular/core").InputSignal<SdTableColumn>;
6
- titleDef: import("@angular/core").InputSignal<SdTableTitleDefDirective | undefined>;
6
+ titleDef: import("@angular/core").InputSignal<SdTableTitleDefDirective<any> | undefined>;
7
7
  templateRef: import("@angular/core").Signal<import("@angular/core").TemplateRef<any> | undefined>;
8
8
  static ɵfac: i0.ɵɵFactoryDeclaration<ColumnTitleComponent, never>;
9
9
  static ɵcmp: i0.ɵɵComponentDeclaration<ColumnTitleComponent, "column-title", never, { "column": { "alias": "column"; "required": true; "isSignal": true; }; "titleDef": { "alias": "titleDef"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1,4 +1,4 @@
1
- import { ElementRef } from '@angular/core';
1
+ import { ElementRef, TemplateRef } from '@angular/core';
2
2
  import { SdTableCellDefDirective } from '../../directives/sd-table-cell-def.directive';
3
3
  import { SdTableColumn } from '../../models/table-column.model';
4
4
  import { SdTableItem } from '../../models/table-item.model';
@@ -8,13 +8,13 @@ export declare class DesktopCellComponent {
8
8
  contentContainer: import("@angular/core").Signal<ElementRef<HTMLElement> | undefined>;
9
9
  column: import("@angular/core").InputSignal<SdTableColumn>;
10
10
  item: import("@angular/core").InputSignal<SdTableItem<any>>;
11
- cellDef: import("@angular/core").InputSignal<Record<string, SdTableCellDefDirective>>;
11
+ cellDef: import("@angular/core").InputSignal<Record<string, SdTableCellDefDirective<any>>>;
12
12
  value: import("@angular/core").Signal<any>;
13
13
  key: import("@angular/core").Signal<any>;
14
14
  autoId: import("@angular/core").Signal<string>;
15
15
  truncateEnable: import("@angular/core").Signal<boolean | undefined>;
16
16
  truncateWidth: import("@angular/core").Signal<string | undefined>;
17
- templateRef: import("@angular/core").Signal<import("@angular/core").TemplateRef<any>>;
17
+ templateRef: import("@angular/core").Signal<TemplateRef<any> | undefined>;
18
18
  isCollapsed: import("@angular/core").WritableSignal<boolean>;
19
19
  isOverflowing: import("@angular/core").WritableSignal<boolean>;
20
20
  constructor();
@@ -18,19 +18,15 @@ export declare class ColumnFilterComponent {
18
18
  label: Signal<string | undefined>;
19
19
  operators: Signal<{
20
20
  value: Operator;
21
- symbol?: string;
21
+ icon: string;
22
22
  display: string;
23
23
  }[]>;
24
- inlineSymbol: Signal<string>;
24
+ operatorValues: Signal<Operator[]>;
25
+ operatorWrapperClass: Signal<"mb-4 mr-2" | "mr-2">;
25
26
  items: Signal<any[] | SdSearch | Signal<any[]>>;
26
27
  constructor();
27
28
  onFilterChange: () => void;
28
29
  onFilterCommit: () => void;
29
- onChangeOperator: (operator: {
30
- value: Operator;
31
- symbol?: string;
32
- display: string;
33
- } | undefined) => void;
34
30
  static ɵfac: i0.ɵɵFactoryDeclaration<ColumnFilterComponent, never>;
35
31
  static ɵcmp: i0.ɵɵComponentDeclaration<ColumnFilterComponent, "column-filter", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "column": { "alias": "column"; "required": true; "isSignal": true; }; "columnFilter": { "alias": "columnFilter"; "required": false; "isSignal": true; }; "cacheValues": { "alias": "cacheValues"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "operator": { "alias": "operator"; "required": false; "isSignal": true; }; "isMobile": { "alias": "isMobile"; "required": false; "isSignal": true; }; }, { "operator": "operatorChange"; "filterChange": "filterChange"; "filterCommit": "filterCommit"; }, never, never, true, never>;
36
32
  }
@@ -1,8 +1,16 @@
1
1
  import { TemplateRef } from '@angular/core';
2
+ import { SdTableColumn } from '../models/table-column.model';
2
3
  import * as i0 from "@angular/core";
3
- export declare class SdTableCellDefDirective {
4
+ interface Context<T = any> {
5
+ item: T;
6
+ column: SdTableColumn<T>;
7
+ autoId: string;
8
+ }
9
+ export declare class SdTableCellDefDirective<T = any> {
10
+ static ngTemplateContextGuard<T>(_dir: SdTableCellDefDirective<T>, _ctx: unknown): _ctx is Context<T>;
4
11
  sdTableCellDef: import("@angular/core").InputSignal<string>;
5
- templateRef: TemplateRef<any>;
6
- static ɵfac: i0.ɵɵFactoryDeclaration<SdTableCellDefDirective, never>;
7
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableCellDefDirective, "[sdTableCellDef]", never, { "sdTableCellDef": { "alias": "sdTableCellDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
12
+ templateRef: TemplateRef<Context<T>>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTableCellDefDirective<any>, never>;
14
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableCellDefDirective<any>, "[sdTableCellDef]", never, { "sdTableCellDef": { "alias": "sdTableCellDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8
15
  }
16
+ export {};
@@ -1,8 +1,16 @@
1
1
  import { TemplateRef } from '@angular/core';
2
+ import { SdTableColumn } from '../models/table-column.model';
2
3
  import * as i0 from "@angular/core";
3
- export declare class SdTableColumnFilterDefDirective {
4
+ interface Context<T = any> {
5
+ column: SdTableColumn<T>;
6
+ field: string;
7
+ disabled?: boolean;
8
+ }
9
+ export declare class SdTableColumnFilterDefDirective<T = any> {
10
+ static ngTemplateContextGuard<T>(_dir: SdTableColumnFilterDefDirective<T>, _ctx: unknown): _ctx is Context<T>;
4
11
  sdTableColumnFilterDef: import("@angular/core").InputSignal<string>;
5
- templateRef: TemplateRef<any>;
6
- static ɵfac: i0.ɵɵFactoryDeclaration<SdTableColumnFilterDefDirective, never>;
7
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableColumnFilterDefDirective, "[sdTableColumnFilterDef]", never, { "sdTableColumnFilterDef": { "alias": "sdTableColumnFilterDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
12
+ templateRef: TemplateRef<Context<T>>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTableColumnFilterDefDirective<any>, never>;
14
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableColumnFilterDefDirective<any>, "[sdTableColumnFilterDef]", never, { "sdTableColumnFilterDef": { "alias": "sdTableColumnFilterDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8
15
  }
16
+ export {};
@@ -1,7 +1,13 @@
1
1
  import { TemplateRef } from '@angular/core';
2
+ import { SdTableItem } from '../models/table-item.model';
2
3
  import * as i0 from "@angular/core";
3
- export declare class SdTableExpandDefDirective {
4
- templateRef: TemplateRef<any>;
5
- static ɵfac: i0.ɵɵFactoryDeclaration<SdTableExpandDefDirective, never>;
6
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableExpandDefDirective, "[sdTableExpandDef]", never, {}, {}, never, never, true, never>;
4
+ interface Context<T = any> {
5
+ item: SdTableItem<T>;
7
6
  }
7
+ export declare class SdTableExpandDefDirective<T = any> {
8
+ static ngTemplateContextGuard<T>(_dir: SdTableExpandDefDirective<T>, _ctx: unknown): _ctx is Context<T>;
9
+ templateRef: TemplateRef<Context<T>>;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTableExpandDefDirective<any>, never>;
11
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableExpandDefDirective<any>, "[sdTableExpandDef]", never, {}, {}, never, never, true, never>;
12
+ }
13
+ export {};
@@ -1,13 +1,13 @@
1
1
  import { TemplateRef } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  interface Context {
4
- externalFilter?: Record<string, any>;
4
+ externalFilter?: Record<string, unknown>;
5
5
  }
6
6
  export declare class SdTableFilterDefDirective {
7
- static ngTemplateContextGuard(dir: Context, ctx: unknown): ctx is Context;
7
+ static ngTemplateContextGuard(_dir: SdTableFilterDefDirective, _ctx: unknown): _ctx is Context;
8
8
  sdTableFilterDef: import("@angular/core").InputSignal<string>;
9
9
  defaultShowing: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
10
- templateRef: TemplateRef<any> | null;
10
+ templateRef: TemplateRef<Context> | null;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<SdTableFilterDefDirective, never>;
12
12
  static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableFilterDefDirective, "[sdTableFilterDef]", never, { "sdTableFilterDef": { "alias": "sdTableFilterDef"; "required": true; "isSignal": true; }; "defaultShowing": { "alias": "defaultShowing"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13
13
  }
@@ -1,8 +1,16 @@
1
1
  import { TemplateRef } from '@angular/core';
2
+ import { SdTableColumn } from '../models/table-column.model';
3
+ import { SdTableItem } from '../models/table-item.model';
2
4
  import * as i0 from "@angular/core";
3
- export declare class SdMaterialFooterDefDirective {
5
+ interface Context<T = any> {
6
+ items: SdTableItem<T>[];
7
+ column: SdTableColumn<T>;
8
+ }
9
+ export declare class SdMaterialFooterDefDirective<T = any> {
10
+ static ngTemplateContextGuard<T>(_dir: SdMaterialFooterDefDirective<T>, _ctx: unknown): _ctx is Context<T>;
4
11
  sdTableFooterDef: import("@angular/core").InputSignal<string>;
5
- templateRef: TemplateRef<any>;
6
- static ɵfac: i0.ɵɵFactoryDeclaration<SdMaterialFooterDefDirective, never>;
7
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdMaterialFooterDefDirective, "[sdTableFooterDef]", never, { "sdTableFooterDef": { "alias": "sdTableFooterDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
12
+ templateRef: TemplateRef<Context<T>>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdMaterialFooterDefDirective<any>, never>;
14
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdMaterialFooterDefDirective<any>, "[sdTableFooterDef]", never, { "sdTableFooterDef": { "alias": "sdTableFooterDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8
15
  }
16
+ export {};
@@ -1,8 +1,14 @@
1
1
  import { TemplateRef } from '@angular/core';
2
+ import { SdTableColumn } from '../models/table-column.model';
2
3
  import * as i0 from "@angular/core";
3
- export declare class SdTableTitleDefDirective {
4
+ interface Context<T = any> {
5
+ column: SdTableColumn<T>;
6
+ }
7
+ export declare class SdTableTitleDefDirective<T = any> {
8
+ static ngTemplateContextGuard<T>(_dir: SdTableTitleDefDirective<T>, _ctx: unknown): _ctx is Context<T>;
4
9
  sdTableTitleDef: import("@angular/core").InputSignal<string>;
5
- templateRef: TemplateRef<any>;
6
- static ɵfac: i0.ɵɵFactoryDeclaration<SdTableTitleDefDirective, never>;
7
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableTitleDefDirective, "[sdTableTitleDef]", never, { "sdTableTitleDef": { "alias": "sdTableTitleDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
10
+ templateRef: TemplateRef<Context<T>>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTableTitleDefDirective<any>, never>;
12
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdTableTitleDefDirective<any>, "[sdTableTitleDef]", never, { "sdTableTitleDef": { "alias": "sdTableTitleDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8
13
  }
14
+ export {};
@@ -48,15 +48,15 @@ export declare class SdTable<T = unknown> extends SdBaseSecureComponent implemen
48
48
  mobileFilter: import("@angular/core").Signal<MobileFilterComponent | undefined>;
49
49
  paginator: import("@angular/core").Signal<MatPaginator | undefined>;
50
50
  sort: import("@angular/core").Signal<MatSort | undefined>;
51
- sdSubInformation: import("@angular/core").Signal<SdTableExpandDefDirective | undefined>;
52
- sdCellDefs: import("@angular/core").Signal<readonly SdTableCellDefDirective[]>;
53
- sdFooterDefs: import("@angular/core").Signal<readonly SdMaterialFooterDefDirective[]>;
51
+ sdSubInformation: import("@angular/core").Signal<SdTableExpandDefDirective<any> | undefined>;
52
+ sdCellDefs: import("@angular/core").Signal<readonly SdTableCellDefDirective<any>[]>;
53
+ sdFooterDefs: import("@angular/core").Signal<readonly SdMaterialFooterDefDirective<any>[]>;
54
54
  sdFilterDefs: import("@angular/core").Signal<readonly SdTableFilterDefDirective[]>;
55
- sdTitleDefs: import("@angular/core").Signal<readonly SdTableTitleDefDirective[]>;
56
- cellDef: import("@angular/core").Signal<Record<string, SdTableCellDefDirective>>;
57
- footerDef: import("@angular/core").Signal<Record<string, SdMaterialFooterDefDirective>>;
55
+ sdTitleDefs: import("@angular/core").Signal<readonly SdTableTitleDefDirective<any>[]>;
56
+ cellDef: import("@angular/core").Signal<Record<string, SdTableCellDefDirective<any>>>;
57
+ footerDef: import("@angular/core").Signal<Record<string, SdMaterialFooterDefDirective<any>>>;
58
58
  hasFooter: import("@angular/core").Signal<boolean>;
59
- titleDef: import("@angular/core").Signal<Record<string, SdTableTitleDefDirective>>;
59
+ titleDef: import("@angular/core").Signal<Record<string, SdTableTitleDefDirective<any>>>;
60
60
  tableOption: import("@angular/core").WritableSignal<SdTableOption<T> | undefined>;
61
61
  configuration: import("@angular/core").WritableSignal<ConfiguredTableResult | undefined>;
62
62
  items: import("@angular/core").WritableSignal<SdTableItem<T>[]>;
@@ -1,9 +1,7 @@
1
- import { ViewContainerRef, TemplateRef } from '@angular/core';
2
1
  import * as i0 from "@angular/core";
3
2
  export declare class SdDesktopDirective {
4
- private templateRef;
5
- private viewContainerRef;
6
- constructor(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef);
3
+ #private;
4
+ constructor();
7
5
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDesktopDirective, never>;
8
6
  static ɵdir: i0.ɵɵDirectiveDeclaration<SdDesktopDirective, "[sdDesktop]", never, {}, {}, never, never, true, never>;
9
7
  }
@@ -1,9 +1,7 @@
1
- import { TemplateRef, ViewContainerRef } from '@angular/core';
2
1
  import * as i0 from "@angular/core";
3
2
  export declare class SdMobileDirective {
4
- private templateRef;
5
- private viewContainerRef;
6
- constructor(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef);
3
+ #private;
4
+ constructor();
7
5
  static ɵfac: i0.ɵɵFactoryDeclaration<SdMobileDirective, never>;
8
6
  static ɵdir: i0.ɵɵDirectiveDeclaration<SdMobileDirective, "[sdMobile]", never, {}, {}, never, never, true, never>;
9
7
  }