@sdcorejs/angular 19.0.4 → 19.0.6

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 (44) hide show
  1. package/assets/{scss/README.md → STYLE-GUIDE.md} +3 -0
  2. package/components/index.d.ts +2 -0
  3. package/components/org-chart/index.d.ts +3 -0
  4. package/components/org-chart/src/org-chart-item-def.directive.d.ts +9 -0
  5. package/components/org-chart/src/org-chart.component.d.ts +26 -0
  6. package/components/org-chart/src/org-chart.model.d.ts +32 -0
  7. package/components/query-bar/src/query-bar.component.d.ts +15 -2
  8. package/components/query-bar/src/query-bar.model.d.ts +22 -0
  9. package/components/query-builder/src/query-builder.component.d.ts +23 -6
  10. package/components/query-builder/src/query-builder.model.d.ts +71 -23
  11. package/components/section/src/section.component.d.ts +4 -1
  12. package/components/splitter/src/splitter.component.d.ts +8 -2
  13. package/components/splitter/src/splitter.models.d.ts +13 -0
  14. package/components/table/src/services/table-filter/table-filter.model.d.ts +2 -0
  15. package/components/tree/index.d.ts +3 -0
  16. package/components/tree/src/tree-item-def.directive.d.ts +9 -0
  17. package/components/tree/src/tree.component.d.ts +102 -0
  18. package/components/tree/src/tree.model.d.ts +142 -0
  19. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +2 -2
  20. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  21. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +110 -0
  22. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -0
  23. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +37 -8
  24. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  25. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +257 -59
  26. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  27. package/fesm2022/sdcorejs-angular-components-section.mjs +7 -4
  28. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  29. package/fesm2022/sdcorejs-angular-components-splitter.mjs +23 -12
  30. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  31. package/fesm2022/sdcorejs-angular-components-table.mjs +6 -2
  32. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  33. package/fesm2022/sdcorejs-angular-components-tree.mjs +526 -0
  34. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -0
  35. package/fesm2022/sdcorejs-angular-components.mjs +2 -0
  36. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +2 -2
  38. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-forms-select.mjs +65 -6
  40. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  41. package/forms/select/index.d.ts +1 -0
  42. package/forms/select/src/select-footer-action.directive.d.ts +11 -0
  43. package/forms/select/src/select.component.d.ts +17 -1
  44. package/package.json +10 -2
@@ -46,6 +46,7 @@
46
46
 
47
47
  ```
48
48
  projects/sdcorejs-angular/assets/
49
+ ├── STYLE-GUIDE.md # Tài liệu này (assets + SCSS reference cho người + AI agent)
49
50
  ├── fonts/
50
51
  │ ├── fonts.scss # @font-face khai báo cho Roboto + Material Icons + Material Symbols
51
52
  │ ├── material-icons/ # 2 file .woff2 (icons-v145 + outlined-v110)
@@ -321,6 +322,8 @@ p-{n} pt-{n} pr-{n} pb-{n} pl-{n} px-{n} py-{n}
321
322
 
322
323
  Ví dụ: `m-0`, `mt-8`, `px-16`, `py-24`, `mb-4`.
323
324
 
325
+ **Spacing scale rule:** với spacing dùng cho layout element, chỉ dùng giá trị là **bội số của 4px**: `m-4`, `m-8`, `m-12`, `m-16`, `p-4`, `p-8`, `px-16`, `py-24`, `gap-8`, `gap-16`... Tránh sinh các class lẻ như `m-3`, `p-5`, `gap-7` trừ khi đang xử lý pixel-perfect exception đã được review rõ ràng.
326
+
324
327
  **Auto margin:** `m-auto`, `mt-auto`, `mr-auto`, `mb-auto`, `ml-auto`, `mx-auto`, `my-auto`.
325
328
 
326
329
  ### 7.2 Gap (px-based, 0–200)
@@ -12,6 +12,8 @@ export * from '@sdcorejs/angular/components/upload-file';
12
12
  export * from '@sdcorejs/angular/components/section';
13
13
  export * from '@sdcorejs/angular/components/anchor';
14
14
  export * from '@sdcorejs/angular/components/query-builder';
15
+ export * from '@sdcorejs/angular/components/org-chart';
16
+ export * from '@sdcorejs/angular/components/tree';
15
17
  export * from '@sdcorejs/angular/components/import-excel';
16
18
  export * from '@sdcorejs/angular/components/document-builder';
17
19
  export * from '@sdcorejs/angular/components/mini-editor';
@@ -0,0 +1,3 @@
1
+ export * from './src/org-chart.component';
2
+ export * from './src/org-chart-item-def.directive';
3
+ export * from './src/org-chart.model';
@@ -0,0 +1,9 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import { SdOrgChartItem, SdOrgChartItemContext } from './org-chart.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SdOrgChartItemDefDirective<T extends SdOrgChartItem = SdOrgChartItem> {
5
+ static ngTemplateContextGuard<T extends SdOrgChartItem>(_dir: SdOrgChartItemDefDirective<T>, _ctx: unknown): _ctx is SdOrgChartItemContext<T>;
6
+ readonly templateRef: TemplateRef<SdOrgChartItemContext<T>>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdOrgChartItemDefDirective<any>, never>;
8
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdOrgChartItemDefDirective<any>, "[sdOrgChartItemDef]", never, {}, {}, never, never, true, never>;
9
+ }
@@ -0,0 +1,26 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import { SdOrgChartItemDefDirective } from './org-chart-item-def.directive';
3
+ import { SdOrgChartItem, SdOrgChartItemContext, SdOrgChartOption } from './org-chart.model';
4
+ import * as i0 from "@angular/core";
5
+ export declare class SdOrgChart {
6
+ #private;
7
+ readonly autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
8
+ readonly option: import("@angular/core").InputSignal<SdOrgChartOption<SdOrgChartItem> | undefined>;
9
+ readonly autoId: import("@angular/core").Signal<string | undefined>;
10
+ readonly items: import("@angular/core").InputSignal<SdOrgChartItem[] | undefined>;
11
+ readonly itemTemplate: import("@angular/core").InputSignal<TemplateRef<SdOrgChartItemContext<SdOrgChartItem>> | null | undefined>;
12
+ readonly collapsible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
13
+ readonly itemDef: import("@angular/core").Signal<SdOrgChartItemDefDirective<any> | undefined>;
14
+ readonly resolvedItems: import("@angular/core").Signal<SdOrgChartItem[]>;
15
+ readonly resolvedCollapsible: import("@angular/core").Signal<boolean>;
16
+ readonly resolvedItemTemplate: import("@angular/core").Signal<TemplateRef<SdOrgChartItemContext<SdOrgChartItem>> | undefined>;
17
+ readonly trackByItem: (_index: number, item: SdOrgChartItem) => string | number;
18
+ hasChildren: (item: SdOrgChartItem) => boolean;
19
+ childrenOf: (item: SdOrgChartItem) => SdOrgChartItem[];
20
+ isExpanded: (item: SdOrgChartItem) => boolean;
21
+ toggle: (item: SdOrgChartItem, event?: Event) => void;
22
+ createContext: (item: SdOrgChartItem, depth: number, parent: SdOrgChartItem | null) => SdOrgChartItemContext;
23
+ nodeAutoId: (item: SdOrgChartItem, part: "node" | "image" | "title" | "description" | "toggle") => string | undefined;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdOrgChart, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdOrgChart, "sd-org-chart", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "option": { "alias": "option"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; }, {}, ["itemDef"], never, true, never>;
26
+ }
@@ -0,0 +1,32 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ export interface SdOrgChartItem {
3
+ id: string | number;
4
+ image?: string | null;
5
+ title: string;
6
+ description?: string | null;
7
+ color?: string | null;
8
+ expanded?: boolean;
9
+ children?: SdOrgChartItem[];
10
+ }
11
+ export interface SdOrgChartItemContext<T extends SdOrgChartItem = SdOrgChartItem> {
12
+ $implicit: T;
13
+ item: T;
14
+ depth: number;
15
+ parent: T | null;
16
+ expanded: boolean;
17
+ hasChildren: boolean;
18
+ isLeaf: boolean;
19
+ toggle: () => void;
20
+ }
21
+ export type SdOrgChartItemTemplate<T extends SdOrgChartItem = SdOrgChartItem> = TemplateRef<SdOrgChartItemContext<T>>;
22
+ export interface SdOrgChartToggleEvent<T extends SdOrgChartItem = SdOrgChartItem> {
23
+ item: T;
24
+ expanded: boolean;
25
+ }
26
+ export interface SdOrgChartOption<T extends SdOrgChartItem = SdOrgChartItem> {
27
+ autoId?: string | null;
28
+ items: T[];
29
+ itemTemplate?: TemplateRef<SdOrgChartItemContext<T>> | null;
30
+ collapsible?: boolean;
31
+ onToggle?: (event: SdOrgChartToggleEvent<T>) => void;
32
+ }
@@ -1,7 +1,7 @@
1
1
  import { Filter, Operator } from '@sdcorejs/utils/models';
2
2
  import { SdQueryChipPopover } from './components/chip-popover/chip-popover.component';
3
3
  import { SdQueryPopoverChip } from './components/popover-chip/popover-chip.component';
4
- import { BuildingChip, SdQuery, SdQueryField, SdQueryLogic, SdSavedFilter, sdQueryFieldIcon } from './query-bar.model';
4
+ import { BuildingChip, SdQuery, SdQueryBarOption, SdQueryField, SdQueryLogic, SdSavedFilter, sdQueryFieldIcon } from './query-bar.model';
5
5
  import * as i0 from "@angular/core";
6
6
  type Density = 'compact' | 'comfortable';
7
7
  export declare class SdQueryBar {
@@ -12,6 +12,8 @@ export declare class SdQueryBar {
12
12
  private readonly buildChip;
13
13
  /** The extracted chip popover — owns operator+value staging + commit-on-close. */
14
14
  readonly chipPopover: import("@angular/core").Signal<SdQueryChipPopover | undefined>;
15
+ /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */
16
+ readonly option: import("@angular/core").InputSignal<SdQueryBarOption<any> | undefined>;
15
17
  /** Prefix for auto-generated `data-autoid` on inner controls (chips, operator/value editors, buttons). */
16
18
  readonly autoIdInput: import("@angular/core").InputSignalWithTransform<string | undefined, string | null | undefined>;
17
19
  /** Available fields the user can filter by. Required for the field picker. */
@@ -66,6 +68,17 @@ export declare class SdQueryBar {
66
68
  /** Fires when the user presses "Áp dụng" inside a chip popover — host should reload data. */
67
69
  readonly apply: import("@angular/core").OutputEmitterRef<SdQuery<any>>;
68
70
  /** Map of `field.key` → `SdQueryField` for fast lookup from filters[]. */
71
+ readonly resolvedAutoId: import("@angular/core").Signal<string | undefined>;
72
+ readonly resolvedFields: import("@angular/core").Signal<SdQueryField[]>;
73
+ readonly resolvedMode: import("@angular/core").Signal<"popover" | "inline">;
74
+ readonly resolvedDensity: import("@angular/core").Signal<Density>;
75
+ readonly resolvedShowSearch: import("@angular/core").Signal<boolean>;
76
+ readonly resolvedShowSavedFilters: import("@angular/core").Signal<boolean>;
77
+ readonly resolvedSavedFiltersKey: import("@angular/core").Signal<string | undefined>;
78
+ readonly resolvedShowLogicToggle: import("@angular/core").Signal<boolean>;
79
+ readonly resolvedShowClearAll: import("@angular/core").Signal<boolean>;
80
+ readonly resolvedShowOperatorOnChip: import("@angular/core").Signal<boolean>;
81
+ constructor();
69
82
  readonly fieldByKey: import("@angular/core").Signal<Record<string, SdQueryField>>;
70
83
  /** Field keys already chained on a chip — the picker greys these out. */
71
84
  readonly usedFieldKeys: import("@angular/core").Signal<Set<string>>;
@@ -132,6 +145,6 @@ export declare class SdQueryBar {
132
145
  /** Receive `(commit)` from the child popover — splice into filters, null the index. */
133
146
  onChipPopoverCommit(next: Filter): void;
134
147
  static ɵfac: i0.ɵɵFactoryDeclaration<SdQueryBar, never>;
135
- 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; }; "showSavedFilters": { "alias": "showSavedFilters"; "required": false; "isSignal": true; }; "savedFiltersKey": { "alias": "savedFiltersKey"; "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>;
148
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdQueryBar, "sd-query-bar", never, { "option": { "alias": "option"; "required": false; "isSignal": true; }; "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; }; "showSavedFilters": { "alias": "showSavedFilters"; "required": false; "isSignal": true; }; "savedFiltersKey": { "alias": "savedFiltersKey"; "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>;
136
149
  }
137
150
  export {};
@@ -85,6 +85,28 @@ export interface SdQuery<T = any> {
85
85
  /** Free-text search box (only present when `showSearch=true`). */
86
86
  search?: string;
87
87
  }
88
+ export interface SdQueryBarOption<T = any> {
89
+ /** Prefix for auto-generated `data-autoid` on inner controls. */
90
+ autoId?: string;
91
+ /** Available fields the user can filter by. */
92
+ fields: SdQueryField<T>[];
93
+ /** Initial active filter chips. */
94
+ filters?: Filter<T>[];
95
+ /** Initial global connector between filters. */
96
+ logic?: SdQueryLogic;
97
+ /** Initial free-text search string. */
98
+ search?: string;
99
+ mode?: 'popover' | 'inline';
100
+ density?: 'compact' | 'comfortable';
101
+ showSearch?: boolean;
102
+ showSavedFilters?: boolean;
103
+ savedFiltersKey?: string;
104
+ showLogicToggle?: boolean;
105
+ showClearAll?: boolean;
106
+ showOperatorOnChip?: boolean;
107
+ onQueryChange?: (query: SdQuery<T>) => void;
108
+ onApply?: (query: SdQuery<T>) => void;
109
+ }
88
110
  /** Persisted bookmark of a query (filters + logic + search) — managed by `[savedFiltersKey]`. */
89
111
  export interface SdSavedFilter<T = any> {
90
112
  id: string;
@@ -1,5 +1,5 @@
1
1
  import { Filter, Operator } from '@sdcorejs/utils/models';
2
- import { isQbGroup, QbDateMode, QbGroup, QbRule, QbToken, SdQueryBuilderField, SdQueryBuilderFieldOption } from './query-builder.model';
2
+ import { isQbGroup, QbComparisonMode, QbDateMode, QbGroup, QbRule, QbToken, QbValueSource, qbFieldIcon, SdQueryBuilderField, SdQueryBuilderFieldOption, SdQueryBuilderOption } from './query-builder.model';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * Visual filter / rule builder. Compose nested AND / OR groups of
@@ -10,10 +10,14 @@ import * as i0 from "@angular/core";
10
10
  */
11
11
  export declare class SdQueryBuilder {
12
12
  #private;
13
+ /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */
14
+ readonly option: import("@angular/core").InputSignal<SdQueryBuilderOption | undefined>;
13
15
  /** Filterable fields — each declares a `type` that drives the operator set + value editor. */
14
16
  readonly fields: import("@angular/core").InputSignal<SdQueryBuilderField[]>;
15
17
  /** `'edit'` (default) = interactive tree · `'view'` = read-only raw-query string. */
16
18
  readonly mode: import("@angular/core").InputSignal<"edit" | "view">;
19
+ /** `value-only` = literal operands only · `value-or-field` = each rule may compare against another field. */
20
+ readonly comparisonMode: import("@angular/core").InputSignal<QbComparisonMode>;
17
21
  /** Disable all editing controls. */
18
22
  readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
19
23
  /** Prefix for `data-autoid` on inner controls (E2E selectors). */
@@ -26,12 +30,16 @@ export declare class SdQueryBuilder {
26
30
  readonly rootLogic: import("@angular/core").ModelSignal<"AND" | "OR">;
27
31
  readonly tree: import("@angular/core").Signal<QbGroup>;
28
32
  /** `field.key` → field, for fast lookup from a rule. */
33
+ readonly resolvedFields: import("@angular/core").Signal<SdQueryBuilderField[]>;
34
+ readonly resolvedMode: import("@angular/core").Signal<"edit" | "view">;
35
+ readonly resolvedComparisonMode: import("@angular/core").Signal<QbComparisonMode>;
36
+ readonly resolvedDisabled: import("@angular/core").Signal<boolean>;
37
+ readonly resolvedAutoId: import("@angular/core").Signal<string | undefined>;
29
38
  readonly fieldByKey: import("@angular/core").Signal<Record<string, SdQueryBuilderField>>;
30
39
  /** Stable option list for the date-mode select. */
31
- readonly dateModes: readonly {
32
- value: QbDateMode;
33
- display: string;
34
- }[];
40
+ readonly dateModes: readonly import("@sdcorejs/angular/components/query-builder").QbDateModeOption[];
41
+ /** Stable option list for the literal-vs-field operand select. */
42
+ readonly valueSourceOptions: readonly import("@sdcorejs/angular/components/query-builder").QbValueSourceOption[];
35
43
  /** Stable combined unit×direction option list for the relative select. */
36
44
  readonly relativeUnitOptions: readonly {
37
45
  value: string;
@@ -42,6 +50,8 @@ export declare class SdQueryBuilder {
42
50
  readonly isView: import("@angular/core").Signal<boolean>;
43
51
  /** Expose the type-guard to the template. */
44
52
  readonly isGroup: typeof isQbGroup;
53
+ /** Resolve the leading icon for a field (own `icon` → per-type → `'tune'`) — used by the field picker. */
54
+ readonly fieldIcon: typeof qbFieldIcon;
45
55
  constructor();
46
56
  /** Switch a group's AND/OR connector and re-emit. No-op when disabled or unchanged. */
47
57
  setGroupLogic(group: QbGroup, logic: 'AND' | 'OR'): void;
@@ -71,12 +81,19 @@ export declare class SdQueryBuilder {
71
81
  setBetweenFrom(rule: QbRule, raw: any): void;
72
82
  /** Set the upper bound of a BETWEEN rule's `{ from, to }` value. */
73
83
  setBetweenTo(rule: QbRule, raw: any): void;
84
+ setValueSource(rule: QbRule, source: QbValueSource): void;
85
+ setCompareField(rule: QbRule, key: any): void;
74
86
  /** The field metadata for a rule's current `field` key (or undefined if unset). */
75
87
  fieldOf(rule: QbRule): SdQueryBuilderField | undefined;
76
88
  /** Operators allowed for a rule, derived from its field's type / override. */
77
89
  allowedOperators(rule: QbRule): Operator[];
78
90
  /** Whether to render the operator picker — hidden when only one operator is allowed. */
79
91
  showOperatorSelector(rule: QbRule): boolean;
92
+ compareFields(rule: QbRule): SdQueryBuilderField[];
93
+ canCompareWithField(rule: QbRule): boolean;
94
+ showValueSourceSelector(rule: QbRule): boolean;
95
+ valueSourceOf(rule: QbRule): QbValueSource;
96
+ isFieldSource(rule: QbRule): boolean;
80
97
  /** True for NULL / NOT_NULL — the template then renders no value editor. */
81
98
  isNoData(op: Operator | undefined): boolean;
82
99
  /** True for IN / NOT_IN — the template then renders a multi-select value editor. */
@@ -98,5 +115,5 @@ export declare class SdQueryBuilder {
98
115
  /** Build a `data-autoid` for an inner control under this builder's `autoId` prefix. */
99
116
  autoIdFor(suffix: string): string;
100
117
  static ɵfac: i0.ɵɵFactoryDeclaration<SdQueryBuilder, never>;
101
- static ɵcmp: i0.ɵɵComponentDeclaration<SdQueryBuilder, "sd-query-builder", never, { "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "autoId": { "alias": "autoId"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "rootLogic": { "alias": "rootLogic"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "filters": "filtersChange"; "rootLogic": "rootLogicChange"; }, never, never, true, never>;
118
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdQueryBuilder, "sd-query-builder", never, { "option": { "alias": "option"; "required": false; "isSignal": true; }; "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "comparisonMode": { "alias": "comparisonMode"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "autoId": { "alias": "autoId"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "rootLogic": { "alias": "rootLogic"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "filters": "filtersChange"; "rootLogic": "rootLogicChange"; }, never, never, true, never>;
102
119
  }
@@ -1,4 +1,4 @@
1
- import { Operator } from '@sdcorejs/utils/models';
1
+ import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';
2
2
  /** Field kinds the builder understands. Drives the operator set + value editor. */
3
3
  export type SdQueryBuilderFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values';
4
4
  /** One option for a `values`-type field (enum / lookup). */
@@ -19,6 +19,8 @@ export interface SdQueryBuilderField {
19
19
  label: string;
20
20
  /** Field type — picks the default operator set + value editor control. */
21
21
  type: SdQueryBuilderFieldType;
22
+ /** Material icon shown before the label in the field picker; falls back to `QB_TYPE_ICON[type]` then `'tune'`. */
23
+ icon?: string;
22
24
  /** Override the allowed operator set (otherwise `QB_OPERATORS_BY_TYPE[type]`). */
23
25
  operators?: Operator[];
24
26
  /** Override the starting operator (otherwise `QB_DEFAULT_OPERATOR_BY_TYPE[type]`). */
@@ -33,8 +35,29 @@ export interface SdQueryBuilderField {
33
35
  min?: number | string;
34
36
  /** Upper bound for number / date value editors. */
35
37
  max?: number | string;
38
+ /** Optional domain guard for field-to-field comparison candidates. */
39
+ compareGroup?: string;
40
+ /** Set false to hide this field from field-to-field comparison. */
41
+ allowFieldCompare?: boolean;
42
+ }
43
+ export interface SdQueryBuilderOption {
44
+ autoId?: string;
45
+ fields: SdQueryBuilderField[];
46
+ mode?: 'edit' | 'view';
47
+ comparisonMode?: QbComparisonMode;
48
+ disabled?: boolean;
49
+ value?: Filter | null;
50
+ filters?: Filter[];
51
+ rootLogic?: 'AND' | 'OR';
52
+ onValueChange?: (value: Filter | null) => void;
53
+ onFiltersChange?: (filters: Filter[]) => void;
54
+ onRootLogicChange?: (logic: 'AND' | 'OR') => void;
36
55
  }
37
56
  export type QbNode = QbGroup | QbRule;
57
+ /** Component-level capability for right-hand operands. */
58
+ export type QbComparisonMode = 'value-only' | 'value-or-field';
59
+ /** Per-rule right-hand operand source. */
60
+ export type QbValueSource = 'literal' | 'field';
38
61
  /** A logical group of nodes joined by AND / OR. Maps to `FilterAndOr`. */
39
62
  export interface QbGroup {
40
63
  id: string;
@@ -52,6 +75,10 @@ export interface QbRule {
52
75
  operator?: Operator;
53
76
  /** Single value, `{ from, to }` for BETWEEN, or an array for IN / NOT_IN. */
54
77
  value?: any;
78
+ /** Internal UI state: literal input or a same-type field reference. */
79
+ valueSource?: QbValueSource;
80
+ /** Right-hand field key when `valueSource` is `'field'`. */
81
+ compareField?: string;
55
82
  }
56
83
  /** Type guard — narrows a `QbNode` to a `QbGroup`. */
57
84
  export declare function isQbGroup(node: QbNode): node is QbGroup;
@@ -77,38 +104,59 @@ export declare function qbDefaultOperator(field: SdQueryBuilderField | undefined
77
104
  export declare function qbIsNoDataOperator(op: Operator | undefined): boolean;
78
105
  /** True when `op` is IN / NOT_IN (array value). */
79
106
  export declare function qbIsMultiOperator(op: Operator | undefined): boolean;
107
+ /** True when the operator accepts one right-hand operand, including a field reference. */
108
+ export declare function qbSupportsFieldCompareOperator(op: Operator | undefined): boolean;
109
+ /**
110
+ * Icon fallback per field type when `SdQueryBuilderField.icon` is not set.
111
+ * Mirrors query-bar's `SD_QUERY_TYPE_ICON` so the two components read consistently,
112
+ * but kept local so query-builder has no dependency on the query-bar package.
113
+ */
114
+ export declare const QB_TYPE_ICON: Record<SdQueryBuilderFieldType, string>;
115
+ /**
116
+ * Icon shown before a field in the field picker / selected trigger.
117
+ * Priority: `field.icon` → `QB_TYPE_ICON[field.type]` → `'tune'` (default, like query-bar).
118
+ */
119
+ export declare function qbFieldIcon(field: SdQueryBuilderField | undefined): string;
80
120
  /** Next stable node id with the given prefix. */
81
121
  export declare function qbId(prefix?: string): string;
82
122
  /** Build a fresh rule node (optionally pre-filled). */
83
- export declare function qbNewRule(field?: string, operator?: Operator, value?: any): QbRule;
123
+ export declare function qbNewRule(field?: string, operator?: Operator, value?: any, valueSource?: QbValueSource, compareField?: string): QbRule;
84
124
  /** Build a fresh group node. */
85
125
  export declare function qbNewGroup(logic?: 'AND' | 'OR', children?: QbNode[]): QbGroup;
86
- /** Offset unit for a relative date. */
87
- export type SdQbRelativeUnit = 'day' | 'week' | 'month';
88
- /** Offset direction for a relative date. */
89
- export type SdQbRelativeDirection = 'previous' | 'next';
90
- /** A relative (resolved-at-query-time) date value stored in `Filter.data`. */
91
- export interface SdQbRelativeDate {
92
- /** `'now'` = current moment / today · `'offset'` = now ± amount × unit. */
93
- rel: 'now' | 'offset';
94
- /** Offset unit — only for `rel: 'offset'`. */
95
- unit?: SdQbRelativeUnit;
96
- /** Offset magnitude (>= 1) — only for `rel: 'offset'`. */
97
- amount?: number;
98
- /** Offset direction — only for `rel: 'offset'`. */
99
- direction?: SdQbRelativeDirection;
100
- }
126
+ /** Offset unit for a relative date — re-exported from the utils `DateRelative` model. */
127
+ export type SdQbRelativeUnit = DateRelative['unit'];
128
+ /** Offset direction for a relative date — re-exported from the utils `DateRelative` model. */
129
+ export type SdQbRelativeDirection = DateRelative['direction'];
130
+ /** Sentinel held as a rule value (and emitted as `data`) for the "today" date mode. */
131
+ export declare const QB_TODAY = "TODAY";
132
+ /** The `'TODAY'` sentinel type (matches the utils `date-today` data literal). */
133
+ export type QbToday = typeof QB_TODAY;
101
134
  /** Date value editor mode for a date/datetime rule (derived from the rule value). */
102
135
  export type QbDateMode = 'absolute' | 'now' | 'relative';
103
- /** Type guard — narrows an arbitrary value to a relative-date spec. */
104
- export declare function qbIsRelativeDate(v: any): v is SdQbRelativeDate;
136
+ /** Type guard — narrows a rule value to a utils `DateRelative` (offset spec). */
137
+ export declare const qbIsRelativeDate: (v: any) => v is DateRelative;
138
+ /** Type guard — narrows a rule value to the `'TODAY'` sentinel ("now"/today mode). */
139
+ export declare function qbIsToday(v: any): v is QbToday;
105
140
  /** Starting relative value when a rule first switches to "relative" mode. */
106
- export declare function qbDefaultRelative(): SdQbRelativeDate;
107
- /** Stable option list for the date-mode select (module ref never reallocated). */
108
- export declare const QB_DATE_MODES: ReadonlyArray<{
141
+ export declare function qbDefaultRelative(): DateRelative;
142
+ /** One date-mode option carries a Material icon shown in the dropdown + selected trigger. */
143
+ export interface QbDateModeOption {
109
144
  value: QbDateMode;
110
145
  display: string;
111
- }>;
146
+ /** Material icon name (outlined set). */
147
+ icon: string;
148
+ }
149
+ /** Stable option list for the date-mode select (module ref — never reallocated). */
150
+ export declare const QB_DATE_MODES: ReadonlyArray<QbDateModeOption>;
151
+ /** One value-source option for field-to-field comparison UI. */
152
+ export interface QbValueSourceOption {
153
+ value: QbValueSource;
154
+ display: string;
155
+ /** Material icon name (outlined set). */
156
+ icon: string;
157
+ }
158
+ /** Stable option list for choosing between a literal value and another field. */
159
+ export declare const QB_VALUE_SOURCE_OPTIONS: ReadonlyArray<QbValueSourceOption>;
112
160
  /** Stable combined direction×unit option list (token `'unit:direction'`). */
113
161
  export declare const QB_RELATIVE_UNIT_OPTIONS: ReadonlyArray<{
114
162
  value: string;
@@ -7,11 +7,14 @@ export declare class SdSection {
7
7
  icon: import("@angular/core").InputSignal<string | null | undefined>;
8
8
  iconColor: import("@angular/core").InputSignal<Color>;
9
9
  collapsed: import("@angular/core").ModelSignal<boolean>;
10
+ collapsible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
11
+ /** @deprecated Use `collapsible` instead. */
10
12
  collapsable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
13
+ readonly isCollapsible: import("@angular/core").Signal<boolean>;
11
14
  hideHeader: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12
15
  noPaddingBody: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
13
16
  constructor();
14
17
  toggleCollapse: () => void;
15
18
  static ɵfac: i0.ɵɵFactoryDeclaration<SdSection, never>;
16
- static ɵcmp: i0.ɵɵComponentDeclaration<SdSection, "sd-section", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subTitle": { "alias": "subTitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "collapsable": { "alias": "collapsable"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; "noPaddingBody": { "alias": "noPaddingBody"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*"], true, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdSection, "sd-section", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subTitle": { "alias": "subTitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "collapsable": { "alias": "collapsable"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; "noPaddingBody": { "alias": "noPaddingBody"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*"], true, never>;
17
20
  }
@@ -1,13 +1,19 @@
1
1
  import { SdSplitterPanelComponent } from './splitter-panel/splitter-panel.component';
2
- import { SplitterLayoutState, SplitterOrientation } from './splitter.models';
2
+ import { SdSplitterOption, SplitterLayoutState, SplitterOrientation } from './splitter.models';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class SdSplitterComponent {
5
5
  #private;
6
+ option: import("@angular/core").InputSignal<SdSplitterOption | undefined>;
6
7
  orientation: import("@angular/core").InputSignal<SplitterOrientation>;
7
8
  disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
8
9
  storageKey: import("@angular/core").InputSignal<string | undefined>;
9
10
  snapThreshold: import("@angular/core").InputSignalWithTransform<number, unknown>;
10
11
  keyboardStep: import("@angular/core").InputSignalWithTransform<number, unknown>;
12
+ resolvedOrientation: import("@angular/core").Signal<SplitterOrientation>;
13
+ resolvedDisabled: import("@angular/core").Signal<boolean>;
14
+ resolvedStorageKey: import("@angular/core").Signal<string | undefined>;
15
+ resolvedSnapThreshold: import("@angular/core").Signal<number>;
16
+ resolvedKeyboardStep: import("@angular/core").Signal<number>;
11
17
  readonly resizeEnd: import("@angular/core").OutputEmitterRef<SplitterLayoutState>;
12
18
  readonly collapsedChange: import("@angular/core").OutputEmitterRef<{
13
19
  panelId: string | number;
@@ -24,5 +30,5 @@ export declare class SdSplitterComponent {
24
30
  toggle(target: number | string): void;
25
31
  resizePanel(target: number | string, size: number): void;
26
32
  static ɵfac: i0.ɵɵFactoryDeclaration<SdSplitterComponent, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<SdSplitterComponent, "sd-splitter", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "storageKey": { "alias": "storageKey"; "required": false; "isSignal": true; }; "snapThreshold": { "alias": "snapThreshold"; "required": false; "isSignal": true; }; "keyboardStep": { "alias": "keyboardStep"; "required": false; "isSignal": true; }; }, { "resizeEnd": "resizeEnd"; "collapsedChange": "collapsedChange"; "layoutChange": "layoutChange"; }, ["panels"], ["sd-splitter-panel"], true, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdSplitterComponent, "sd-splitter", never, { "option": { "alias": "option"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "storageKey": { "alias": "storageKey"; "required": false; "isSignal": true; }; "snapThreshold": { "alias": "snapThreshold"; "required": false; "isSignal": true; }; "keyboardStep": { "alias": "keyboardStep"; "required": false; "isSignal": true; }; }, { "resizeEnd": "resizeEnd"; "collapsedChange": "collapsedChange"; "layoutChange": "layoutChange"; }, ["panels"], ["sd-splitter-panel"], true, never>;
28
34
  }
@@ -10,6 +10,19 @@ export interface SplitterLayoutState {
10
10
  v: 1;
11
11
  panels: SplitterPanelState[];
12
12
  }
13
+ export interface SdSplitterOption {
14
+ orientation?: SplitterOrientation;
15
+ disabled?: boolean;
16
+ storageKey?: string;
17
+ snapThreshold?: number;
18
+ keyboardStep?: number;
19
+ onResizeEnd?: (state: SplitterLayoutState) => void;
20
+ onCollapsedChange?: (event: {
21
+ panelId: string | number;
22
+ collapsed: boolean;
23
+ }) => void;
24
+ onLayoutChange?: (state: SplitterLayoutState) => void;
25
+ }
13
26
  export interface ResolvedPanelMeta {
14
27
  id: string | number;
15
28
  index: number;
@@ -47,6 +47,8 @@ export interface SdTableOptionFilter<T = any> {
47
47
  /** Chế độ thủ công: phải nhấn nút áp dụng mới gửi filter */
48
48
  manualFilter?: boolean;
49
49
  /** Có thể thu gọn bộ lọc hay không */
50
+ collapsible?: boolean;
51
+ /** @deprecated Use `collapsible` instead. */
50
52
  collapsable?: boolean;
51
53
  /** Ẩn toolbar (xóa bộ lọc, thiết lập) của external filter, khi có ít external filter user không cần chức năng này */
52
54
  hideExternalFilterToolbar?: boolean;
@@ -0,0 +1,3 @@
1
+ export * from './src/tree.component';
2
+ export * from './src/tree-item-def.directive';
3
+ export * from './src/tree.model';
@@ -0,0 +1,9 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import { SdTreeItemContext } from './tree.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SdTreeItemDefDirective<T = any> {
5
+ static ngTemplateContextGuard<T>(_dir: SdTreeItemDefDirective<T>, ctx: unknown): ctx is SdTreeItemContext<T>;
6
+ readonly templateRef: TemplateRef<SdTreeItemContext<T>>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTreeItemDefDirective<any>, never>;
8
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdTreeItemDefDirective<any>, "[sdTreeItemDef]", never, {}, {}, never, never, true, never>;
9
+ }
@@ -0,0 +1,102 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import { SdTreeItemDefDirective } from './tree-item-def.directive';
3
+ import { SdTreeCommand, SdTreeDataSource, SdTreeComponentOption, SdTreeItem, SdTreeItemContext, SdTreeNode, SdTreeOption, SdTreeSelectionAction, SdTreeSelectionEvent, SdTreeSelectorOption, SdTreeToggleEvent } from './tree.model';
4
+ import * as i0 from "@angular/core";
5
+ export type SdTreeAutoIdPart = 'row' | 'toggle' | 'checkbox' | 'icon' | 'label' | 'command';
6
+ export interface SdTreeNodeAutoIds {
7
+ row?: string;
8
+ toggle?: string;
9
+ checkbox?: string;
10
+ icon?: string;
11
+ label?: string;
12
+ command?: string;
13
+ }
14
+ export interface SdTreeViewCommand<T = any> {
15
+ key: string;
16
+ command: SdTreeCommand<T>;
17
+ title: string;
18
+ icon: string;
19
+ color: SdTreeCommand<T>['color'];
20
+ fontSet: SdTreeCommand<T>['fontSet'];
21
+ disabled: boolean;
22
+ autoId?: string;
23
+ defaultColor: boolean;
24
+ }
25
+ export interface SdTreeViewNode<T = any> extends SdTreeNode<T> {
26
+ icon?: string;
27
+ selected: boolean;
28
+ selectionDisabled: boolean;
29
+ toggleDisabled: boolean;
30
+ toggleLabel: string;
31
+ ariaExpanded: boolean | null;
32
+ autoIds: SdTreeNodeAutoIds;
33
+ commands: SdTreeViewCommand<T>[];
34
+ context: SdTreeItemContext<T>;
35
+ }
36
+ export interface SdTreeSelectionActionView<T = any> {
37
+ action: SdTreeSelectionAction<T>;
38
+ autoId: string | null;
39
+ }
40
+ export declare class SdTree<T = any> {
41
+ #private;
42
+ readonly autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
43
+ readonly option: import("@angular/core").InputSignal<SdTreeComponentOption<T> | undefined>;
44
+ /** Migration bridge. New usage should put the data source in `option.items`. */
45
+ readonly items: import("@angular/core").InputSignal<SdTreeDataSource<SdTreeItem<T>> | undefined>;
46
+ /** Migration bridge. New usage should put static/lazy config in `option.tree`. */
47
+ readonly tree: import("@angular/core").InputSignal<SdTreeOption<T> | undefined>;
48
+ readonly selectedItemsInput: import("@angular/core").InputSignal<T[] | null | undefined>;
49
+ readonly commands: import("@angular/core").InputSignal<SdTreeCommand<T>[] | null | undefined>;
50
+ readonly selectable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
51
+ readonly selector: import("@angular/core").InputSignal<SdTreeSelectorOption<T> | null | undefined>;
52
+ readonly itemTemplate: import("@angular/core").InputSignal<TemplateRef<SdTreeItemContext<T>> | null | undefined>;
53
+ readonly selectedItemsChange: import("@angular/core").OutputEmitterRef<T[]>;
54
+ readonly selectChange: import("@angular/core").OutputEmitterRef<SdTreeSelectionEvent<T>>;
55
+ readonly expandChange: import("@angular/core").OutputEmitterRef<SdTreeToggleEvent<T>>;
56
+ readonly collapseChange: import("@angular/core").OutputEmitterRef<SdTreeToggleEvent<T>>;
57
+ readonly itemDef: import("@angular/core").Signal<SdTreeItemDefDirective<any> | undefined>;
58
+ readonly resolvedItemsSource: import("@angular/core").Signal<SdTreeDataSource<SdTreeItem<T>>>;
59
+ readonly resolvedTree: import("@angular/core").Signal<SdTreeOption<T>>;
60
+ readonly resolvedSelector: import("@angular/core").Signal<SdTreeSelectorOption<T> | null | undefined>;
61
+ readonly resolvedCommands: import("@angular/core").Signal<SdTreeCommand<T>[]>;
62
+ readonly resolvedSelectable: import("@angular/core").Signal<boolean>;
63
+ readonly autoId: import("@angular/core").Signal<string | undefined>;
64
+ readonly resolvedItemTemplate: import("@angular/core").Signal<TemplateRef<SdTreeItemContext<T>> | undefined>;
65
+ readonly indentSize: import("@angular/core").Signal<number>;
66
+ readonly normalizedFilterText: import("@angular/core").Signal<string>;
67
+ readonly selectionVisible: import("@angular/core").Signal<boolean>;
68
+ readonly selectedIdSet: import("@angular/core").Signal<Set<string>>;
69
+ readonly rootNodes: import("@angular/core").Signal<SdTreeNode<T>[]>;
70
+ readonly visibleNodes: import("@angular/core").Signal<SdTreeNode<T>[]>;
71
+ readonly selectedItems: import("@angular/core").Signal<T[]>;
72
+ readonly selectedCount: import("@angular/core").Signal<number>;
73
+ readonly selectionMessage: import("@angular/core").Signal<string>;
74
+ readonly visibleSelectionActions: import("@angular/core").Signal<SdTreeSelectionAction<T>[]>;
75
+ readonly selectionActionViews: import("@angular/core").Signal<SdTreeSelectionActionView<T>[]>;
76
+ readonly clearSelectionAutoId: import("@angular/core").Signal<string | null>;
77
+ /**
78
+ * Template-facing row model. Expensive/variable values are resolved once per
79
+ * signal recomputation so the HTML does not call helper methods for every CD pass.
80
+ */
81
+ readonly visibleViewNodes: import("@angular/core").Signal<SdTreeViewNode<T>[]>;
82
+ readonly trackByNode: (_index: number, node: SdTreeNode<T>) => string;
83
+ constructor();
84
+ reload(): void;
85
+ filter(searchText: string | undefined | null): void;
86
+ isSelected(node: SdTreeNode<T>): boolean;
87
+ nodeIcon(node: SdTreeNode<T>): string | undefined;
88
+ visibleCommands(node: SdTreeNode<T>): SdTreeCommand<T>[];
89
+ isSelectionDisabled(node: SdTreeNode<T>): boolean;
90
+ commandTitle(command: SdTreeCommand<T>, item: T): string;
91
+ commandIcon(command: SdTreeCommand<T>, item: T): string;
92
+ isCommandDisabled(command: SdTreeCommand<T>, item: T): boolean;
93
+ toggle(node: SdTreeNode<T>, event?: Event): Promise<void>;
94
+ toggleSelection(node: SdTreeNode<T>, event?: Event): void;
95
+ clearSelection(): void;
96
+ onSelectionAction(action: SdTreeSelectionAction<T>): void;
97
+ createContext(node: SdTreeNode<T>): SdTreeItemContext<T>;
98
+ nodeAutoId(node: SdTreeNode<T>, part: SdTreeAutoIdPart): string | undefined;
99
+ commandAutoId(node: SdTreeNode<T>, command: SdTreeCommand<T>): string | undefined;
100
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTree<any>, never>;
101
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdTree<any>, "sd-tree", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "option": { "alias": "option"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "tree": { "alias": "tree"; "required": false; "isSignal": true; }; "selectedItemsInput": { "alias": "selectedItems"; "required": false; "isSignal": true; }; "commands": { "alias": "commands"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selector": { "alias": "selector"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; }, { "selectedItemsChange": "selectedItemsChange"; "selectChange": "selectChange"; "expandChange": "expandChange"; "collapseChange": "collapseChange"; }, ["itemDef"], never, true, never>;
102
+ }