@sd-angular/core 19.0.19 → 19.0.30

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 (24) hide show
  1. package/fesm2022/sd-angular-core-components-form-generic.mjs +11 -11
  2. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  3. package/fesm2022/sd-angular-core-components-query-bar.mjs +2 -2
  4. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
  5. package/fesm2022/sd-angular-core-components-query-builder.mjs +1 -1
  6. package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
  7. package/fesm2022/sd-angular-core-components-table.mjs +6 -6
  8. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  9. package/fesm2022/sd-angular-core-forms-input-color.mjs +4 -2
  10. package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -1
  11. package/fesm2022/sd-angular-core-forms-input-number.mjs +6 -4
  12. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  13. package/fesm2022/sd-angular-core-forms-input.mjs +7 -4
  14. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  15. package/fesm2022/sd-angular-core-modules-layout.mjs +130 -75
  16. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  17. package/forms/input/src/input.component.d.ts +3 -1
  18. package/forms/input-color/src/input-color.component.d.ts +3 -1
  19. package/forms/input-number/src/input-number.component.d.ts +3 -1
  20. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +1 -0
  21. package/modules/layout/pipes/menu-focus.pipe.d.ts +6 -2
  22. package/modules/layout/utils/index.d.ts +1 -0
  23. package/modules/layout/utils/menu-path.util.d.ts +16 -0
  24. package/package.json +5 -5
@@ -39,6 +39,8 @@ export declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
39
39
  type: import("@angular/core").InputSignal<"number" | "text" | "password" | "email">;
40
40
  hideInlineError: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
41
41
  blurOnEnter: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
42
+ /** Whether to show the value-gated clear button in edit and inline modes. Default `true` (opt-out). */
43
+ clearable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
42
44
  required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
43
45
  readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
44
46
  disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
@@ -92,5 +94,5 @@ export declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
92
94
  blur: () => void;
93
95
  focus: () => void;
94
96
  static ɵfac: i0.ɵɵFactoryDeclaration<SdInput, never>;
95
- static ɵcmp: i0.ɵɵComponentDeclaration<SdInput, "sd-input", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "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; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "blurOnEnter": { "alias": "blurOnEnter"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "minlength": { "alias": "minlength"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "patternErrorMessage": { "alias": "patternErrorMessage"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; "sdBlur": "sdBlur"; "keyupEnter": "keyupEnter"; "cleared": "cleared"; "sdFocusForceBlur": "sdFocusForceBlur"; }, ["sdLabelTemplate", "sdValueTemplate", "sdSuffixDef", "sdViewDef"], ["[sdLabel]"], true, never>;
97
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdInput, "sd-input", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "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; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "blurOnEnter": { "alias": "blurOnEnter"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "minlength": { "alias": "minlength"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "patternErrorMessage": { "alias": "patternErrorMessage"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; "sdBlur": "sdBlur"; "keyupEnter": "keyupEnter"; "cleared": "cleared"; "sdFocusForceBlur": "sdFocusForceBlur"; }, ["sdLabelTemplate", "sdValueTemplate", "sdSuffixDef", "sdViewDef"], ["[sdLabel]"], true, never>;
96
98
  }
@@ -16,6 +16,8 @@ export declare class SdInputColor {
16
16
  readonly name: import("@angular/core").InputSignal<string | undefined>;
17
17
  readonly autoId: import("@angular/core").InputSignal<string | undefined>;
18
18
  readonly required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
19
+ /** Show the inner `<sd-input>` clear button. Default `true` (opt-out). */
20
+ readonly clearable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
19
21
  readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
20
22
  readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
21
23
  /** Display mode — forwarded to the inner `<sd-input>`. `'inline'` = borderless inline-edit; disabled `'inline'` → static. */
@@ -30,5 +32,5 @@ export declare class SdInputColor {
30
32
  onPickerChange: (ev: Event) => void;
31
33
  clear: (ev?: Event) => void;
32
34
  static ɵfac: i0.ɵɵFactoryDeclaration<SdInputColor, never>;
33
- static ɵcmp: i0.ɵɵComponentDeclaration<SdInputColor, "sd-input-color", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "autoId": { "alias": "autoId"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; }, never, never, true, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdInputColor, "sd-input-color", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "autoId": { "alias": "autoId"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; }, never, never, true, never>;
34
36
  }
@@ -41,6 +41,8 @@ export declare class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {
41
41
  placeholder: import("@angular/core").InputSignal<string | undefined>;
42
42
  hideInlineError: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
43
43
  blurOnEnter: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
44
+ /** Whether to show the value-gated clear button in edit and inline modes. Default `true` (opt-out). */
45
+ clearable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
44
46
  required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
45
47
  readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
46
48
  disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
@@ -101,6 +103,6 @@ export declare class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {
101
103
  blur: () => void;
102
104
  focus: () => void;
103
105
  static ɵfac: i0.ɵɵFactoryDeclaration<SdInputNumber, never>;
104
- static ɵcmp: i0.ɵɵComponentDeclaration<SdInputNumber, "sd-input-number", 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; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "blurOnEnter": { "alias": "blurOnEnter"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "precision": { "alias": "precision"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; "sdBlur": "sdBlur"; "keyupEnter": "keyupEnter"; "cleared": "cleared"; "sdFocusForceBlur": "sdFocusForceBlur"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef", "sdSuffixDef"], ["[sdLabel]"], true, never>;
106
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdInputNumber, "sd-input-number", 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; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "blurOnEnter": { "alias": "blurOnEnter"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "precision": { "alias": "precision"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; "sdBlur": "sdBlur"; "keyupEnter": "keyupEnter"; "cleared": "cleared"; "sdFocusForceBlur": "sdFocusForceBlur"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef", "sdSuffixDef"], ["[sdLabel]"], true, never>;
105
107
  }
106
108
  export {};
@@ -26,6 +26,7 @@ export declare class SidebarComponent {
26
26
  totalMenuInMenusByGroup: import("@angular/core").Signal<number>;
27
27
  pinnedNodeKeys: import("@angular/core").Signal<Set<string>>;
28
28
  isPinnedMenuGroupActive: import("@angular/core").Signal<boolean>;
29
+ activeMenuPath: import("@angular/core").Signal<string | null>;
29
30
  dataSource: MatTreeNestedDataSource<SdLayoutMenu>;
30
31
  treeControl: NestedTreeControl<SdLayoutMenu, SdLayoutMenu>;
31
32
  constructor();
@@ -2,8 +2,12 @@ import { PipeTransform } from '@angular/core';
2
2
  import { SdLayoutMenu } from '../services';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class MenuFocusPipe implements PipeTransform {
5
- #private;
6
- transform(routePath: string, menuItem: SdLayoutMenu): boolean;
5
+ /**
6
+ * @param activeMenuPath Path khớp sát nhất với route hiện tại (xem `resolveActiveMenuPath`).
7
+ * Truyền vào thì chỉ menu chứa đúng path đó mới focus, nên '/appointment' không sáng khi đang ở
8
+ * '/appointment/cs'. Bỏ trống thì giữ cách khớp phần đầu cũ.
9
+ */
10
+ transform(routePath: string, menuItem: SdLayoutMenu, activeMenuPath?: string | null): boolean;
7
11
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuFocusPipe, never>;
8
12
  static ɵpipe: i0.ɵɵPipeDeclaration<MenuFocusPipe, "menuFocus", true>;
9
13
  static ɵprov: i0.ɵɵInjectableDeclaration<MenuFocusPipe>;
@@ -1 +1,2 @@
1
+ export * from './menu-path.util';
1
2
  export * from './tab-name.util';
@@ -0,0 +1,16 @@
1
+ import { SdLayoutMenu } from '../services/menu/menu.model';
2
+ /** Thêm '/' ở cuối để so khớp theo segment: '/appointment' không khớp nhầm '/appointments'. */
3
+ export declare const normalizeMenuPath: (path: string) => string;
4
+ /** Route hiện tại có nằm trong nhánh của `path` không (khớp chính xác hoặc khớp phần đầu). */
5
+ export declare const isMenuPathMatch: (routePath: string, path: string) => boolean;
6
+ /** Mọi path trong cây menu khớp với route hiện tại. */
7
+ export declare const collectMatchedMenuPaths: (menus: SdLayoutMenu[] | null | undefined, routePath: string) => string[];
8
+ /**
9
+ * Path khớp sát nhất với route hiện tại trong cả cây menu.
10
+ * Khi cả '/appointment' và '/appointment/cs' cùng khớp route '/appointment/cs',
11
+ * chỉ path dài nhất được coi là active — path còn lại không được highlight.
12
+ * Hoà nhau thì lấy path xuất hiện trước theo thứ tự khai báo.
13
+ */
14
+ export declare const resolveActiveMenuPath: (menus: SdLayoutMenu[] | null | undefined, routePath: string) => string | null;
15
+ /** Chính menu này, hoặc bất kỳ menu con nào ở mọi cấp, có đúng path đó. */
16
+ export declare const containsMenuPath: (menuItem: SdLayoutMenu, path: string) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sd-angular/core",
3
- "version": "19.0.19",
3
+ "version": "19.0.30",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
6
6
  "@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
@@ -32,14 +32,14 @@
32
32
  "types": "./index.d.ts",
33
33
  "default": "./fesm2022/sd-angular-core.mjs"
34
34
  },
35
- "./configurations": {
36
- "types": "./configurations/index.d.ts",
37
- "default": "./fesm2022/sd-angular-core-configurations.mjs"
38
- },
39
35
  "./components": {
40
36
  "types": "./components/index.d.ts",
41
37
  "default": "./fesm2022/sd-angular-core-components.mjs"
42
38
  },
39
+ "./configurations": {
40
+ "types": "./configurations/index.d.ts",
41
+ "default": "./fesm2022/sd-angular-core-configurations.mjs"
42
+ },
43
43
  "./directives": {
44
44
  "types": "./directives/index.d.ts",
45
45
  "default": "./fesm2022/sd-angular-core-directives.mjs"