@sdcorejs/angular 21.0.3 → 21.0.5

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 (56) hide show
  1. package/assets/{scss/README.md → STYLE-GUIDE.md} +3 -0
  2. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -4
  3. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  4. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +7 -11
  5. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  6. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +110 -0
  7. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -0
  8. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +37 -8
  9. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  10. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +867 -57
  11. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  12. package/fesm2022/sdcorejs-angular-components-section.mjs +9 -8
  13. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  14. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +2 -4
  15. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  16. package/fesm2022/sdcorejs-angular-components-splitter.mjs +24 -13
  17. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  18. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -4
  19. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-tab.mjs +2 -4
  21. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-table.mjs +8 -6
  23. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-tree.mjs +526 -0
  25. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -0
  26. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +15 -4
  27. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components.mjs +2 -0
  29. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +9 -4
  31. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +9 -3
  33. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-forms-input.mjs +2 -2
  35. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-forms-select.mjs +34 -4
  37. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-services-notify.mjs +26 -8
  39. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  40. package/package.json +9 -1
  41. package/types/sdcorejs-angular-components-button.d.ts +1 -2
  42. package/types/sdcorejs-angular-components-form-generic.d.ts +3 -4
  43. package/types/sdcorejs-angular-components-org-chart.d.ts +67 -0
  44. package/types/sdcorejs-angular-components-query-bar.d.ts +37 -2
  45. package/types/sdcorejs-angular-components-query-builder.d.ts +313 -23
  46. package/types/sdcorejs-angular-components-section.d.ts +5 -3
  47. package/types/sdcorejs-angular-components-side-drawer.d.ts +1 -2
  48. package/types/sdcorejs-angular-components-splitter.d.ts +20 -1
  49. package/types/sdcorejs-angular-components-stepper.d.ts +1 -2
  50. package/types/sdcorejs-angular-components-tab.d.ts +1 -2
  51. package/types/sdcorejs-angular-components-table.d.ts +3 -2
  52. package/types/sdcorejs-angular-components-tree.d.ts +253 -0
  53. package/types/sdcorejs-angular-components-upload-file.d.ts +2 -0
  54. package/types/sdcorejs-angular-components.d.ts +2 -0
  55. package/types/sdcorejs-angular-forms-select.d.ts +9 -1
  56. package/types/sdcorejs-angular-services-notify.d.ts +17 -0
@@ -0,0 +1,253 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { Signal, TemplateRef } from '@angular/core';
3
+ import { SdButton } from '@sdcorejs/angular/components/button';
4
+ import { SdUnwrapSignal, MaterialIconFontSet } from '@sdcorejs/angular/utilities/models';
5
+ import { Color } from '@sdcorejs/utils/models';
6
+
7
+ type SdTreeDataSource<TItem = any> = TItem[] | Signal<TItem[]> | (() => TItem[] | Promise<TItem[]>);
8
+ type SdTreeLoadType = 'static' | 'lazy';
9
+ type SdTreeOption<T = any> = SdTreeStaticOption<T> | SdTreeLazyOption<T>;
10
+ type SdTreeItem<T = any> = SdTreeItemStatic<T> | SdTreeItemLazy<T>;
11
+ type SdTreeItemByLoadType<T = any, TLoadType extends SdTreeLoadType = SdTreeLoadType> = TLoadType extends 'lazy' ? SdTreeItemLazy<T> : SdTreeItemStatic<T>;
12
+ interface SdTreeItemBase<T = any> {
13
+ /** Stable node id used for expansion, selection, filtering ancestry, and auto-id generation. */
14
+ id: string;
15
+ /** Text shown by the default tree row. Custom templates can still read `item` / `treeItem`. */
16
+ label: string;
17
+ /**
18
+ * Optional node icon override.
19
+ * - Branch without `icon`: tree renders the default folder icon (`folder` / `folder_open`).
20
+ * - Leaf without `icon`: tree renders no icon.
21
+ * This replaces the old `leafIcon` split. One field is enough because each node decides its own icon.
22
+ */
23
+ icon?: string | null;
24
+ /** Consumer payload. Commands, selection callbacks, and `$implicit` template context receive this value. */
25
+ data: T;
26
+ /** Initial expansion state for this node. Component state wins after the user toggles. */
27
+ expanded?: boolean;
28
+ }
29
+ interface SdTreeItemStatic<T = any> extends SdTreeItemBase<T> {
30
+ /** Static-mode children. Lazy mode does not use this field. */
31
+ children?: SdTreeItemStatic<T>[];
32
+ /** `hasChildren` belongs to lazy mode only; static mode derives branches from `children`. */
33
+ hasChildren?: never;
34
+ }
35
+ interface SdTreeItemLazy<T = any> extends SdTreeItemBase<T> {
36
+ /** Lazy-mode hint. Set `false` for known leaf nodes that do not need `onExpandChildren`. */
37
+ hasChildren?: boolean;
38
+ /** `children` belongs to static mode only; lazy loaded children are cached inside the component. */
39
+ children?: never;
40
+ }
41
+ interface SdTreeBaseOption {
42
+ maxDepth?: number;
43
+ indentSize?: number;
44
+ }
45
+ interface SdTreeStaticOption<T = any> extends SdTreeBaseOption {
46
+ loadType: 'static';
47
+ /** Expand all (`true`), none (`false`), or root levels where `level < number`. */
48
+ defaultExpanded?: boolean | number;
49
+ }
50
+ interface SdTreeLazyOption<T = any> extends SdTreeBaseOption {
51
+ loadType: 'lazy';
52
+ /**
53
+ * Called once when a lazy node is first expanded. Return wrapped `SdTreeItemLazy<T>` children,
54
+ * not raw data, so each child has a stable id/label/icon contract.
55
+ */
56
+ onExpandChildren: (item: SdTreeItemLazy<T>) => Promise<SdTreeItemLazy<T>[]> | SdTreeItemLazy<T>[];
57
+ }
58
+ interface SdTreeCommand<T = any> {
59
+ key: string;
60
+ title: string | ((item: T) => string);
61
+ icon?: string | ((item: T) => string | undefined | null);
62
+ color?: Color;
63
+ fontSet?: MaterialIconFontSet;
64
+ disabled?: boolean | ((item: T) => boolean);
65
+ hidden?: boolean | ((item: T) => boolean);
66
+ click: (item: T) => void;
67
+ }
68
+ interface SdTreeSelectorOption<T = any> {
69
+ visible?: boolean;
70
+ actions?: SdTreeSelectionAction<T>[];
71
+ message?: string | ((selectedItems: T[]) => string);
72
+ disabled?: (item: T, selectedItems: T[]) => boolean;
73
+ }
74
+ interface SdTreeSelectionAction<T = any> {
75
+ icon?: string;
76
+ fontSet?: SdUnwrapSignal<SdButton['fontSet']>;
77
+ tooltip?: SdUnwrapSignal<SdButton['tooltip']>;
78
+ title?: SdUnwrapSignal<SdButton['title']>;
79
+ color?: SdUnwrapSignal<SdButton['color']>;
80
+ type?: SdUnwrapSignal<SdButton['type']>;
81
+ hidden?: boolean | ((selectedItems: T[]) => boolean);
82
+ click: (selectedItems: T[]) => void;
83
+ }
84
+ interface SdTreeComponentOptionBase<T = any, TItem extends SdTreeItem<T> = SdTreeItem<T>> {
85
+ autoId?: string | null;
86
+ /** Root nodes can be an array, a signal, a sync loader, or an async loader. Call `reload()` to rerun loader sources. */
87
+ items: SdTreeDataSource<TItem>;
88
+ selectedItems?: T[] | null;
89
+ selector?: SdTreeSelectorOption<T> | null;
90
+ commands?: SdTreeCommand<T>[] | null;
91
+ itemTemplate?: SdTreeItemTemplate<T> | null;
92
+ selectable?: boolean;
93
+ onSelectedItemsChange?: (items: T[]) => void;
94
+ onSelect?: (event: SdTreeSelectionEvent<T>) => void;
95
+ onExpand?: (event: SdTreeToggleEvent<T>) => void;
96
+ onCollapse?: (event: SdTreeToggleEvent<T>) => void;
97
+ }
98
+ interface SdTreeStaticComponentOption<T = any> extends SdTreeComponentOptionBase<T, SdTreeItemStatic<T>> {
99
+ /** Static tree is the default when `tree` is omitted. */
100
+ tree?: SdTreeStaticOption<T>;
101
+ }
102
+ interface SdTreeLazyComponentOption<T = any> extends SdTreeComponentOptionBase<T, SdTreeItemLazy<T>> {
103
+ tree: SdTreeLazyOption<T>;
104
+ }
105
+ type SdTreeComponentOption<T = any> = SdTreeStaticComponentOption<T> | SdTreeLazyComponentOption<T>;
106
+ interface SdTreeNode<T = any> {
107
+ /** Wrapped tree item containing id/label/icon/data plus mode-specific tree metadata. */
108
+ treeItem: SdTreeItem<T>;
109
+ /** Raw consumer payload. Kept as a shortcut because most callbacks operate on data, not wrapper metadata. */
110
+ data: T;
111
+ id: string;
112
+ label: string;
113
+ level: number;
114
+ parent: SdTreeNode<T> | null;
115
+ children: SdTreeNode<T>[];
116
+ hasChildren: boolean;
117
+ isExpanded: boolean;
118
+ isLoading: boolean;
119
+ }
120
+ interface SdTreeItemContext<T = any> {
121
+ $implicit: T;
122
+ item: T;
123
+ treeItem: SdTreeItem<T>;
124
+ node: SdTreeNode<T>;
125
+ level: number;
126
+ expanded: boolean;
127
+ selected: boolean;
128
+ loading: boolean;
129
+ hasChildren: boolean;
130
+ isLeaf: boolean;
131
+ toggle: () => void;
132
+ select: () => void;
133
+ }
134
+ type SdTreeItemTemplate<T = any> = TemplateRef<SdTreeItemContext<T>>;
135
+ interface SdTreeSelectionEvent<T = any> {
136
+ item: T;
137
+ selected: boolean;
138
+ selectedItems: T[];
139
+ }
140
+ interface SdTreeToggleEvent<T = any> {
141
+ item: T;
142
+ expanded: boolean;
143
+ node: SdTreeNode<T>;
144
+ }
145
+
146
+ declare class SdTreeItemDefDirective<T = any> {
147
+ static ngTemplateContextGuard<T>(_dir: SdTreeItemDefDirective<T>, ctx: unknown): ctx is SdTreeItemContext<T>;
148
+ readonly templateRef: TemplateRef<SdTreeItemContext<T>>;
149
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdTreeItemDefDirective<any>, never>;
150
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SdTreeItemDefDirective<any>, "[sdTreeItemDef]", never, {}, {}, never, never, true, never>;
151
+ }
152
+
153
+ type SdTreeAutoIdPart = 'row' | 'toggle' | 'checkbox' | 'icon' | 'label' | 'command';
154
+ interface SdTreeNodeAutoIds {
155
+ row?: string;
156
+ toggle?: string;
157
+ checkbox?: string;
158
+ icon?: string;
159
+ label?: string;
160
+ command?: string;
161
+ }
162
+ interface SdTreeViewCommand<T = any> {
163
+ key: string;
164
+ command: SdTreeCommand<T>;
165
+ title: string;
166
+ icon: string;
167
+ color: SdTreeCommand<T>['color'];
168
+ fontSet: SdTreeCommand<T>['fontSet'];
169
+ disabled: boolean;
170
+ autoId?: string;
171
+ defaultColor: boolean;
172
+ }
173
+ interface SdTreeViewNode<T = any> extends SdTreeNode<T> {
174
+ icon?: string;
175
+ selected: boolean;
176
+ selectionDisabled: boolean;
177
+ toggleDisabled: boolean;
178
+ toggleLabel: string;
179
+ ariaExpanded: boolean | null;
180
+ autoIds: SdTreeNodeAutoIds;
181
+ commands: SdTreeViewCommand<T>[];
182
+ context: SdTreeItemContext<T>;
183
+ }
184
+ interface SdTreeSelectionActionView<T = any> {
185
+ action: SdTreeSelectionAction<T>;
186
+ autoId: string | null;
187
+ }
188
+ declare class SdTree<T = any> {
189
+ #private;
190
+ readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
191
+ readonly option: _angular_core.InputSignal<SdTreeComponentOption<T> | undefined>;
192
+ /** Migration bridge. New usage should put the data source in `option.items`. */
193
+ readonly items: _angular_core.InputSignal<SdTreeDataSource<SdTreeItem<T>> | undefined>;
194
+ /** Migration bridge. New usage should put static/lazy config in `option.tree`. */
195
+ readonly tree: _angular_core.InputSignal<SdTreeOption<T> | undefined>;
196
+ readonly selectedItemsInput: _angular_core.InputSignal<T[] | null | undefined>;
197
+ readonly commands: _angular_core.InputSignal<SdTreeCommand<T>[] | null | undefined>;
198
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
199
+ readonly selector: _angular_core.InputSignal<SdTreeSelectorOption<T> | null | undefined>;
200
+ readonly itemTemplate: _angular_core.InputSignal<TemplateRef<SdTreeItemContext<T>> | null | undefined>;
201
+ readonly selectedItemsChange: _angular_core.OutputEmitterRef<T[]>;
202
+ readonly selectChange: _angular_core.OutputEmitterRef<SdTreeSelectionEvent<T>>;
203
+ readonly expandChange: _angular_core.OutputEmitterRef<SdTreeToggleEvent<T>>;
204
+ readonly collapseChange: _angular_core.OutputEmitterRef<SdTreeToggleEvent<T>>;
205
+ readonly itemDef: _angular_core.Signal<SdTreeItemDefDirective<any> | undefined>;
206
+ readonly resolvedItemsSource: _angular_core.Signal<SdTreeDataSource<SdTreeItem<T>>>;
207
+ readonly resolvedTree: _angular_core.Signal<SdTreeOption<T>>;
208
+ readonly resolvedSelector: _angular_core.Signal<SdTreeSelectorOption<T> | null | undefined>;
209
+ readonly resolvedCommands: _angular_core.Signal<SdTreeCommand<T>[]>;
210
+ readonly resolvedSelectable: _angular_core.Signal<boolean>;
211
+ readonly autoId: _angular_core.Signal<string | undefined>;
212
+ readonly resolvedItemTemplate: _angular_core.Signal<TemplateRef<SdTreeItemContext<T>> | undefined>;
213
+ readonly indentSize: _angular_core.Signal<number>;
214
+ readonly normalizedFilterText: _angular_core.Signal<string>;
215
+ readonly selectionVisible: _angular_core.Signal<boolean>;
216
+ readonly selectedIdSet: _angular_core.Signal<Set<string>>;
217
+ readonly rootNodes: _angular_core.Signal<SdTreeNode<T>[]>;
218
+ readonly visibleNodes: _angular_core.Signal<SdTreeNode<T>[]>;
219
+ readonly selectedItems: _angular_core.Signal<T[]>;
220
+ readonly selectedCount: _angular_core.Signal<number>;
221
+ readonly selectionMessage: _angular_core.Signal<string>;
222
+ readonly visibleSelectionActions: _angular_core.Signal<SdTreeSelectionAction<T>[]>;
223
+ readonly selectionActionViews: _angular_core.Signal<SdTreeSelectionActionView<T>[]>;
224
+ readonly clearSelectionAutoId: _angular_core.Signal<string | null>;
225
+ /**
226
+ * Template-facing row model. Expensive/variable values are resolved once per
227
+ * signal recomputation so the HTML does not call helper methods for every CD pass.
228
+ */
229
+ readonly visibleViewNodes: _angular_core.Signal<SdTreeViewNode<T>[]>;
230
+ readonly trackByNode: (_index: number, node: SdTreeNode<T>) => string;
231
+ constructor();
232
+ reload(): void;
233
+ filter(searchText: string | undefined | null): void;
234
+ isSelected(node: SdTreeNode<T>): boolean;
235
+ nodeIcon(node: SdTreeNode<T>): string | undefined;
236
+ visibleCommands(node: SdTreeNode<T>): SdTreeCommand<T>[];
237
+ isSelectionDisabled(node: SdTreeNode<T>): boolean;
238
+ commandTitle(command: SdTreeCommand<T>, item: T): string;
239
+ commandIcon(command: SdTreeCommand<T>, item: T): string;
240
+ isCommandDisabled(command: SdTreeCommand<T>, item: T): boolean;
241
+ toggle(node: SdTreeNode<T>, event?: Event): Promise<void>;
242
+ toggleSelection(node: SdTreeNode<T>, event?: Event): void;
243
+ clearSelection(): void;
244
+ onSelectionAction(action: SdTreeSelectionAction<T>): void;
245
+ createContext(node: SdTreeNode<T>): SdTreeItemContext<T>;
246
+ nodeAutoId(node: SdTreeNode<T>, part: SdTreeAutoIdPart): string | undefined;
247
+ commandAutoId(node: SdTreeNode<T>, command: SdTreeCommand<T>): string | undefined;
248
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdTree<any>, never>;
249
+ static ɵcmp: _angular_core.ɵɵ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>;
250
+ }
251
+
252
+ export { SdTree, SdTreeItemDefDirective };
253
+ export type { SdTreeAutoIdPart, SdTreeBaseOption, SdTreeCommand, SdTreeComponentOption, SdTreeComponentOptionBase, SdTreeDataSource, SdTreeItem, SdTreeItemBase, SdTreeItemByLoadType, SdTreeItemContext, SdTreeItemLazy, SdTreeItemStatic, SdTreeItemTemplate, SdTreeLazyComponentOption, SdTreeLazyOption, SdTreeLoadType, SdTreeNode, SdTreeNodeAutoIds, SdTreeOption, SdTreeSelectionAction, SdTreeSelectionActionView, SdTreeSelectionEvent, SdTreeSelectorOption, SdTreeStaticComponentOption, SdTreeStaticOption, SdTreeToggleEvent, SdTreeViewCommand, SdTreeViewNode };
@@ -92,6 +92,8 @@ declare class SdUploadFile<TArgs = any> {
92
92
  #private;
93
93
  readonly id: string;
94
94
  readonly formControl: SdFormControl;
95
+ /** Hiển thị message "vui lòng upload": không disabled + đã touched + còn lỗi required. */
96
+ readonly showRequiredError: _angular_core.Signal<boolean>;
95
97
  readonly previewFiles: _angular_core.WritableSignal<PreviewFile[]>;
96
98
  readonly selectedFile: _angular_core.WritableSignal<PreviewFile | null | undefined>;
97
99
  readonly previewFileComponent: _angular_core.Signal<PreviewComponent | undefined>;
@@ -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';
@@ -15,6 +15,14 @@ declare class SdSelect<T extends object | string | number = Record<string, unkno
15
15
  selectRef: Signal<MatSelect | undefined>;
16
16
  sdLabelTemplate: Signal<TemplateRef<any> | undefined>;
17
17
  sdValueTemplate: Signal<TemplateRef<any> | undefined>;
18
+ /**
19
+ * Custom render for the SELECTED value shown in the editable trigger (`<mat-select-trigger>`).
20
+ * Distinct from `#sdValue`/`sdViewDef` which only drive the read-only `viewed`/`inline` face.
21
+ * Context: `{ $implicit, item, items: selectedItems(), display, multiple }` — `item`/`$implicit`
22
+ * is the single selected item object (single mode) or the selected-item array (multiple mode).
23
+ * Falls back to the plain `display` text when not projected, so existing usages are unaffected.
24
+ */
25
+ sdSelectedTemplate: Signal<TemplateRef<any> | undefined>;
18
26
  itemDef: Signal<SdItemDefDefDirective<any> | undefined>;
19
27
  sdViewDef: Signal<SdViewDefDirective<any, any> | undefined>;
20
28
  /**
@@ -107,7 +115,7 @@ declare class SdSelect<T extends object | string | number = Record<string, unkno
107
115
  open: () => void;
108
116
  onOpenedChange: (isOpened: boolean) => void;
109
117
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdSelect<any>, never>;
110
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdSelect<any>, "sd-select", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": true; "isSignal": true; }; "displayField": { "alias": "displayField"; "required": true; "isSignal": true; }; "disabledField": { "alias": "disabledField"; "required": false; "isSignal": true; }; "cacheChecksum": { "alias": "cacheChecksum"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "minWidthPanel": { "alias": "minWidthPanel"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdSelection": "sdSelection"; }, ["sdLabelTemplate", "sdValueTemplate", "itemDef", "sdViewDef"], ["[sdLabel]"], true, never>;
118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdSelect<any>, "sd-select", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": true; "isSignal": true; }; "displayField": { "alias": "displayField"; "required": true; "isSignal": true; }; "disabledField": { "alias": "disabledField"; "required": false; "isSignal": true; }; "cacheChecksum": { "alias": "cacheChecksum"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "minWidthPanel": { "alias": "minWidthPanel"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdSelection": "sdSelection"; }, ["sdLabelTemplate", "sdValueTemplate", "sdSelectedTemplate", "itemDef", "sdViewDef"], ["[sdLabel]"], true, never>;
111
119
  }
112
120
 
113
121
  export { SdSelect };
@@ -10,12 +10,29 @@ interface ToastData {
10
10
  duration: number;
11
11
  actionLabel?: string;
12
12
  onAction?: () => void;
13
+ /**
14
+ * Render `message` dưới dạng HTML thay vì text.
15
+ * - `false` (mặc định): message render dạng TEXT (auto-escape) — an toàn tuyệt đối.
16
+ * - `true`: message render dạng HTML, đã được `DomSanitizer.sanitize(HTML)`
17
+ * (strip `<script>`, event handler, `javascript:` URL). CHỈ dùng cho markup
18
+ * TIN CẬY (do dev tự viết); KHÔNG truyền data người dùng vào đây.
19
+ */
20
+ html?: boolean;
13
21
  }
14
22
  interface NotifyOption {
15
23
  duration?: number;
16
24
  title?: string;
17
25
  actionLabel?: string;
26
+ /**
27
+ * Callback khi bấm nút action — do APP tự cung cấp (không phải input không tin cậy).
28
+ * Chỉ được gọi khi user bấm `actionLabel`.
29
+ */
18
30
  onAction?: () => void;
31
+ /**
32
+ * Render message dạng HTML đã sanitize (mặc định `false` = text an toàn).
33
+ * Chỉ dùng cho markup tin cậy. Xem `ToastData.html`.
34
+ */
35
+ html?: boolean;
19
36
  }
20
37
 
21
38
  declare class SdNotifyService {