@sdcorejs/angular 20.0.4 → 20.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 (33) 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 +67 -0
  4. package/components/query-bar/index.d.ts +37 -2
  5. package/components/query-builder/index.d.ts +96 -30
  6. package/components/section/index.d.ts +4 -1
  7. package/components/splitter/index.d.ts +20 -1
  8. package/components/table/index.d.ts +2 -0
  9. package/components/tree/index.d.ts +253 -0
  10. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +2 -2
  11. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  12. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +110 -0
  13. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -0
  14. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +37 -8
  15. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  16. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +258 -60
  17. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  18. package/fesm2022/sdcorejs-angular-components-section.mjs +8 -5
  19. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-splitter.mjs +24 -13
  21. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-table.mjs +6 -2
  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.mjs +2 -0
  27. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +2 -2
  29. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-forms-select.mjs +34 -4
  31. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  32. package/forms/select/index.d.ts +9 -1
  33. package/package.json +9 -1
@@ -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 };
@@ -3063,7 +3063,7 @@ class SdFormRender {
3063
3063
  return messages;
3064
3064
  };
3065
3065
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: SdFormRender, deps: [{ token: i0.ChangeDetectorRef }, { token: SD_FORM_GENERIC_CONFIGURATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
3066
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.24", type: SdFormRender, isStandalone: true, selector: "sd-form-render", inputs: { form: "form", _configuration: ["configuration", "_configuration"], _default: ["defaultEntity", "_default"], _entity: ["entity", "_entity"], _properties: ["properties", "_properties"], _viewed: ["viewed", "_viewed"] }, viewQueries: [{ propertyName: "formRenderItems", predicate: LibItemComponent, descendants: true }], ngImport: i0, template: "@if (form && loadCompleted && hashedValues) {\n <div class=\"row mx-0\">\n @for (component of configuration.components; track component.id) {\n @let expression = hashedValues | whenExpression: component : formValue;\n @if (!expression.hidden) {\n @if (component.type === 'group') {\n @if (!!component.components.length) {\n <div class=\"col-12 mt-16\">\n <sd-section [title]=\"component.label\" [icon]=\"component.properties.icon\">\n <div class=\"row mx-0\">\n @for (childComponent of component.components; track childComponent.id) {\n @let childExpression = hashedValues | whenExpression: childComponent : formValue;\n @if (!childExpression.hidden) {\n <lib-item\n [setVariables]=\"setVariables\"\n [form]=\"form\"\n [entity]=\"entity\"\n [component]=\"childComponent\"\n [required]=\"childExpression.required\"\n [disabled]=\"childExpression.disabled\"\n [viewed]=\"viewed\"></lib-item>\n }\n }\n </div>\n </sd-section>\n </div>\n }\n } @else {\n <lib-item\n [setVariables]=\"setVariables\"\n [form]=\"form\"\n [entity]=\"entity\"\n [component]=\"component\"\n [required]=\"expression.required\"\n [disabled]=\"expression.disabled\"\n [viewed]=\"viewed\"></lib-item>\n }\n }\n }\n <variable [variables]=\"configuration.variables\" [setVariables]=\"setVariables\" [form]=\"form\" [entity]=\"entity\" ></variable>\n </div>\n}\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "component", type: SdSection, selector: "sd-section", inputs: ["title", "subTitle", "icon", "iconColor", "collapsed", "collapsable", "hideHeader", "noPaddingBody"], outputs: ["collapsedChange"] }, { kind: "component", type: LibItemComponent, selector: "lib-item", inputs: ["setVariables", "form", "entity", "component", "disabled", "required", "viewed", "validator"] }, { kind: "component", type: VariableComponent, selector: "variable", inputs: ["variables", "setVariables", "form", "entity"] }, { kind: "pipe", type: WhenExpressionPipe, name: "whenExpression" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3066
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.24", type: SdFormRender, isStandalone: true, selector: "sd-form-render", inputs: { form: "form", _configuration: ["configuration", "_configuration"], _default: ["defaultEntity", "_default"], _entity: ["entity", "_entity"], _properties: ["properties", "_properties"], _viewed: ["viewed", "_viewed"] }, viewQueries: [{ propertyName: "formRenderItems", predicate: LibItemComponent, descendants: true }], ngImport: i0, template: "@if (form && loadCompleted && hashedValues) {\n <div class=\"row mx-0\">\n @for (component of configuration.components; track component.id) {\n @let expression = hashedValues | whenExpression: component : formValue;\n @if (!expression.hidden) {\n @if (component.type === 'group') {\n @if (!!component.components.length) {\n <div class=\"col-12 mt-16\">\n <sd-section [title]=\"component.label\" [icon]=\"component.properties.icon\">\n <div class=\"row mx-0\">\n @for (childComponent of component.components; track childComponent.id) {\n @let childExpression = hashedValues | whenExpression: childComponent : formValue;\n @if (!childExpression.hidden) {\n <lib-item\n [setVariables]=\"setVariables\"\n [form]=\"form\"\n [entity]=\"entity\"\n [component]=\"childComponent\"\n [required]=\"childExpression.required\"\n [disabled]=\"childExpression.disabled\"\n [viewed]=\"viewed\"></lib-item>\n }\n }\n </div>\n </sd-section>\n </div>\n }\n } @else {\n <lib-item\n [setVariables]=\"setVariables\"\n [form]=\"form\"\n [entity]=\"entity\"\n [component]=\"component\"\n [required]=\"expression.required\"\n [disabled]=\"expression.disabled\"\n [viewed]=\"viewed\"></lib-item>\n }\n }\n }\n <variable [variables]=\"configuration.variables\" [setVariables]=\"setVariables\" [form]=\"form\" [entity]=\"entity\" ></variable>\n </div>\n}\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "component", type: SdSection, selector: "sd-section", inputs: ["title", "subTitle", "icon", "iconColor", "collapsed", "collapsible", "collapsable", "hideHeader", "noPaddingBody"], outputs: ["collapsedChange"] }, { kind: "component", type: LibItemComponent, selector: "lib-item", inputs: ["setVariables", "form", "entity", "component", "disabled", "required", "viewed", "validator"] }, { kind: "component", type: VariableComponent, selector: "variable", inputs: ["variables", "setVariables", "form", "entity"] }, { kind: "pipe", type: WhenExpressionPipe, name: "whenExpression" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3067
3067
  }
3068
3068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: SdFormRender, decorators: [{
3069
3069
  type: Component,
@@ -4590,7 +4590,7 @@ class AttributeSelection {
4590
4590
  this.ref.markForCheck();
4591
4591
  };
4592
4592
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: AttributeSelection, deps: [{ token: i0.ChangeDetectorRef }, { token: FormGenericService }], target: i0.ɵɵFactoryTarget.Component });
4593
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.24", type: AttributeSelection, isStandalone: true, selector: "attribute-selection", inputs: { components: "components", variables: "variables", component: "component", _valuesKey: ["valuesKey", "_valuesKey"], _values: ["values", "_values"] }, outputs: { valuesKeyChange: "valuesKeyChange", valuesChange: "valuesChange", sdChange: "sdChange" }, ngImport: i0, template: "<sd-section class=\"mt-8\" [title]=\"'core.component.form-builder.data' | translate\" icon=\"format_list_bulleted\">\n @if (selections.length) {\n <div class=\"d-flex align-items-center py-4\">\n <div class=\"T14M\" style=\"flex: 1\">{{ 'core.component.form-builder.data-api' | translate }}</div>\n <sd-autocomplete\n style=\"width: 200px\"\n size=\"sm\"\n [(model)]=\"valuesKey\"\n [items]=\"selections\"\n valueField=\"value\"\n displayField=\"display\"\n (sdChange)=\"onChangeValuesKey($event)\"\n hideInlineError></sd-autocomplete>\n </div>\n <!-- N\u1EBFu l\u00E0 select t\u1EEB API th\u00EC cho ph\u00E9p truy\u1EC1n th\u00EAm Query -->\n\n @if (component.type === 'select' && !!valuesKey) {\n <build-queries\n [label]=\"'core.component.form-builder.query-condition' | translate\"\n [selections]=\"selections\"\n [valuesKey]=\"valuesKey\"\n [components]=\"components\"\n [variables]=\"variables\"\n [(model)]=\"component.properties!.query\"></build-queries>\n <build-variables\n [label]=\"'core.component.form-builder.assign-value' | translate\"\n [selections]=\"selections\"\n [valuesKey]=\"valuesKey\"\n [components]=\"components\"\n [variables]=\"variables\"\n [(model)]=\"component.properties!.setVariables\"></build-variables>\n <!-- <div class=\"d-flex align-items-center py-4\">\n <div class=\"T14M\" style=\"flex: 1\">\u0110i\u1EC1u ki\u1EC7n truy v\u1EA5n</div>\n <sd-input style=\"width: 200px\" size=\"sm\" [(model)]=\"component.properties!.query\" hideInlineError></sd-input>\n </div> -->\n }\n }\n @if (!valuesKey) {\n <div class=\"d-flex flex-column\" style=\"gap: 4px\">\n <div class=\"T14M\">{{ 'core.component.form-builder.data-static' | translate }}</div>\n @for (item of values; track item.value; let idx = $index) {\n <div class=\"d-flex align-items-end py-4\" style=\"gap: 4px\">\n <sd-input style=\"width: 200px\" size=\"sm\" [(model)]=\"item.value\" (sdChange)=\"onChangeValues()\" hideInlineError></sd-input>\n <sd-input style=\"width: 200px\" size=\"sm\" [(model)]=\"item.label\" (sdChange)=\"onChangeValues()\" hideInlineError></sd-input>\n <sd-button prefixIcon=\"delete\" (click)=\"removeItem(idx)\" color=\"error\"></sd-button>\n </div>\n }\n <sd-button prefixIcon=\"add\" [title]=\"'core.component.form-builder.add-data' | translate\" (click)=\"addItem()\" color=\"primary\"></sd-button>\n </div>\n }\n</sd-section>\n", dependencies: [{ kind: "component", type: SdInput$1, selector: "sd-input", inputs: ["autoId", "name", "appearance", "floatLabel", "size", "form", "label", "helperText", "placeholder", "type", "hideInlineError", "blurOnEnter", "required", "readonly", "disabled", "viewed", "minlength", "maxlength", "pattern", "patternErrorMessage", "validator", "inlineError", "hyperlink", "model"], outputs: ["modelChange", "sdChange", "sdFocus", "sdBlur", "keyupEnter", "cleared", "sdFocusForceBlur"] }, { kind: "component", type: SdAutocomplete$1, selector: "sd-autocomplete", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "valueField", "displayField", "disabledField", "limit", "cacheChecksum", "hyperlink", "items", "hideInlineError", "addable", "required", "disabled", "viewed", "clearable", "validator", "inlineError", "appearance", "model"], outputs: ["modelChange", "sdChange", "sdSelection", "sdAdd"] }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "size", "fontSet", "title", "width", "tooltip", "prefixIcon", "suffixIcon", "disabled", "loading", "block", "htmlType"], outputs: ["click"] }, { kind: "component", type: SdSection, selector: "sd-section", inputs: ["title", "subTitle", "icon", "iconColor", "collapsed", "collapsable", "hideHeader", "noPaddingBody"], outputs: ["collapsedChange"] }, { kind: "component", type: BuildQueries$1, selector: "build-queries", inputs: ["components", "variables", "label", "selections", "valuesKey", "model"], outputs: ["modelChange"] }, { kind: "component", type: BuildVariables, selector: "build-variables", inputs: ["components", "variables", "label", "selections", "valuesKey", "model"], outputs: ["modelChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4593
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.24", type: AttributeSelection, isStandalone: true, selector: "attribute-selection", inputs: { components: "components", variables: "variables", component: "component", _valuesKey: ["valuesKey", "_valuesKey"], _values: ["values", "_values"] }, outputs: { valuesKeyChange: "valuesKeyChange", valuesChange: "valuesChange", sdChange: "sdChange" }, ngImport: i0, template: "<sd-section class=\"mt-8\" [title]=\"'core.component.form-builder.data' | translate\" icon=\"format_list_bulleted\">\n @if (selections.length) {\n <div class=\"d-flex align-items-center py-4\">\n <div class=\"T14M\" style=\"flex: 1\">{{ 'core.component.form-builder.data-api' | translate }}</div>\n <sd-autocomplete\n style=\"width: 200px\"\n size=\"sm\"\n [(model)]=\"valuesKey\"\n [items]=\"selections\"\n valueField=\"value\"\n displayField=\"display\"\n (sdChange)=\"onChangeValuesKey($event)\"\n hideInlineError></sd-autocomplete>\n </div>\n <!-- N\u1EBFu l\u00E0 select t\u1EEB API th\u00EC cho ph\u00E9p truy\u1EC1n th\u00EAm Query -->\n\n @if (component.type === 'select' && !!valuesKey) {\n <build-queries\n [label]=\"'core.component.form-builder.query-condition' | translate\"\n [selections]=\"selections\"\n [valuesKey]=\"valuesKey\"\n [components]=\"components\"\n [variables]=\"variables\"\n [(model)]=\"component.properties!.query\"></build-queries>\n <build-variables\n [label]=\"'core.component.form-builder.assign-value' | translate\"\n [selections]=\"selections\"\n [valuesKey]=\"valuesKey\"\n [components]=\"components\"\n [variables]=\"variables\"\n [(model)]=\"component.properties!.setVariables\"></build-variables>\n <!-- <div class=\"d-flex align-items-center py-4\">\n <div class=\"T14M\" style=\"flex: 1\">\u0110i\u1EC1u ki\u1EC7n truy v\u1EA5n</div>\n <sd-input style=\"width: 200px\" size=\"sm\" [(model)]=\"component.properties!.query\" hideInlineError></sd-input>\n </div> -->\n }\n }\n @if (!valuesKey) {\n <div class=\"d-flex flex-column\" style=\"gap: 4px\">\n <div class=\"T14M\">{{ 'core.component.form-builder.data-static' | translate }}</div>\n @for (item of values; track item.value; let idx = $index) {\n <div class=\"d-flex align-items-end py-4\" style=\"gap: 4px\">\n <sd-input style=\"width: 200px\" size=\"sm\" [(model)]=\"item.value\" (sdChange)=\"onChangeValues()\" hideInlineError></sd-input>\n <sd-input style=\"width: 200px\" size=\"sm\" [(model)]=\"item.label\" (sdChange)=\"onChangeValues()\" hideInlineError></sd-input>\n <sd-button prefixIcon=\"delete\" (click)=\"removeItem(idx)\" color=\"error\"></sd-button>\n </div>\n }\n <sd-button prefixIcon=\"add\" [title]=\"'core.component.form-builder.add-data' | translate\" (click)=\"addItem()\" color=\"primary\"></sd-button>\n </div>\n }\n</sd-section>\n", dependencies: [{ kind: "component", type: SdInput$1, selector: "sd-input", inputs: ["autoId", "name", "appearance", "floatLabel", "size", "form", "label", "helperText", "placeholder", "type", "hideInlineError", "blurOnEnter", "required", "readonly", "disabled", "viewed", "minlength", "maxlength", "pattern", "patternErrorMessage", "validator", "inlineError", "hyperlink", "model"], outputs: ["modelChange", "sdChange", "sdFocus", "sdBlur", "keyupEnter", "cleared", "sdFocusForceBlur"] }, { kind: "component", type: SdAutocomplete$1, selector: "sd-autocomplete", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "valueField", "displayField", "disabledField", "limit", "cacheChecksum", "hyperlink", "items", "hideInlineError", "addable", "required", "disabled", "viewed", "clearable", "validator", "inlineError", "appearance", "model"], outputs: ["modelChange", "sdChange", "sdSelection", "sdAdd"] }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "size", "fontSet", "title", "width", "tooltip", "prefixIcon", "suffixIcon", "disabled", "loading", "block", "htmlType"], outputs: ["click"] }, { kind: "component", type: SdSection, selector: "sd-section", inputs: ["title", "subTitle", "icon", "iconColor", "collapsed", "collapsible", "collapsable", "hideHeader", "noPaddingBody"], outputs: ["collapsedChange"] }, { kind: "component", type: BuildQueries$1, selector: "build-queries", inputs: ["components", "variables", "label", "selections", "valuesKey", "model"], outputs: ["modelChange"] }, { kind: "component", type: BuildVariables, selector: "build-variables", inputs: ["components", "variables", "label", "selections", "valuesKey", "model"], outputs: ["modelChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4594
4594
  }
4595
4595
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: AttributeSelection, decorators: [{
4596
4596
  type: Component,