@sdcorejs/angular 19.2.0 → 19.2.2

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 (42) hide show
  1. package/components/api-contract-builder/index.d.ts +8 -0
  2. package/components/api-contract-builder/src/api-contract-builder.component.d.ts +123 -0
  3. package/components/api-contract-builder/src/api-contract.configuration.d.ts +41 -0
  4. package/components/api-contract-builder/src/api-contract.expression.d.ts +43 -0
  5. package/components/api-contract-builder/src/api-contract.model.d.ts +167 -0
  6. package/components/api-contract-builder/src/api-contract.samples.d.ts +25 -0
  7. package/components/api-contract-builder/src/api-contract.schema.d.ts +126 -0
  8. package/components/api-contract-builder/src/api-contract.serializer.d.ts +17 -0
  9. package/components/api-contract-builder/src/api-contract.validation.d.ts +12 -0
  10. package/components/api-contract-builder/src/components/api-contract-diagnostic-list.component.d.ts +18 -0
  11. package/components/api-contract-builder/src/components/api-contract-node-drawer.component.d.ts +130 -0
  12. package/components/api-contract-builder/src/components/api-contract-node-editor.component.d.ts +35 -0
  13. package/components/api-contract-builder/src/components/api-contract-node-summary.component.d.ts +41 -0
  14. package/components/api-contract-builder/src/components/api-contract-record-editor.component.d.ts +36 -0
  15. package/components/api-contract-builder/src/components/api-contract-source-editor.component.d.ts +86 -0
  16. package/components/api-contract-builder/src/components/api-contract-suggestion.model.d.ts +17 -0
  17. package/components/badge/src/badge.component.d.ts +1 -0
  18. package/components/index.d.ts +1 -0
  19. package/components/section/src/section.component.d.ts +2 -0
  20. package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs +3411 -0
  21. package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs.map +1 -0
  22. package/fesm2022/sdcorejs-angular-components-badge.mjs +14 -2
  23. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
  25. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-section.mjs +22 -5
  27. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-table.mjs +14 -13
  29. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components.mjs +1 -0
  31. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-i18n.mjs +405 -0
  33. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  35. package/fesm2022/sdcorejs-angular-modules-layout.mjs +146 -83
  36. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  37. package/i18n/src/en.d.ts +80 -0
  38. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +9 -0
  39. package/modules/layout/pipes/menu-focus.pipe.d.ts +6 -2
  40. package/modules/layout/utils/index.d.ts +1 -0
  41. package/modules/layout/utils/menu-path.util.d.ts +16 -0
  42. package/package.json +17 -13
package/i18n/src/en.d.ts CHANGED
@@ -133,6 +133,8 @@ export declare const EN_MESSAGES: {
133
133
  readonly 'core.form.tree-select.cancel': "Cancel";
134
134
  readonly 'core.form.tree-select.apply': "Apply";
135
135
  readonly 'core.component.tree.retry': "Retry";
136
+ readonly 'core.component.section.expand': "Expand {title}";
137
+ readonly 'core.component.section.collapse': "Collapse {title}";
136
138
  readonly 'core.service.unsaved-changes.message': "You have unsaved changes. Discard them and continue?";
137
139
  readonly 'core.component.job-progress.status.idle': "Ready";
138
140
  readonly 'core.component.job-progress.status.queued': "Queued";
@@ -581,6 +583,84 @@ export declare const EN_MESSAGES: {
581
583
  readonly 'core.component.query-builder.to': "To";
582
584
  readonly 'core.component.query-builder.boolean.true': "Yes";
583
585
  readonly 'core.component.query-builder.boolean.false': "No";
586
+ readonly 'core.component.api-contract-builder.steps': "Contract steps";
587
+ readonly 'core.component.api-contract-builder.step.general': "General";
588
+ readonly 'core.component.api-contract-builder.step.input': "Input schema";
589
+ readonly 'core.component.api-contract-builder.step.request': "Request";
590
+ readonly 'core.component.api-contract-builder.step.response': "Response";
591
+ readonly 'core.component.api-contract-builder.step.output': "Output";
592
+ readonly 'core.component.api-contract-builder.step.review': "Review";
593
+ readonly 'core.component.api-contract-builder.empty.contract': "No contract yet";
594
+ readonly 'core.component.api-contract-builder.create-contract': "Create a contract";
595
+ readonly 'core.component.api-contract-builder.contract.code': "Contract code";
596
+ readonly 'core.component.api-contract-builder.contract.name': "Name";
597
+ readonly 'core.component.api-contract-builder.contract.description': "Description";
598
+ readonly 'core.component.api-contract-builder.contract.version': "Contract version";
599
+ readonly 'core.component.api-contract-builder.node.name': "Name";
600
+ readonly 'core.component.api-contract-builder.node.type': "Type";
601
+ readonly 'core.component.api-contract-builder.node.required': "Required";
602
+ readonly 'core.component.api-contract-builder.node.label': "Label";
603
+ readonly 'core.component.api-contract-builder.node.description': "Description";
604
+ readonly 'core.component.api-contract-builder.node.transform': "Temporal transform";
605
+ readonly 'core.component.api-contract-builder.node.items': "Item schema";
606
+ readonly 'core.component.api-contract-builder.node.remove': "Remove";
607
+ readonly 'core.component.api-contract-builder.node.empty': "No properties yet";
608
+ readonly 'core.component.api-contract-builder.node.add-property': "Add property";
609
+ readonly 'core.component.api-contract-builder.node.duplicate-key': "This name is already used by a sibling";
610
+ readonly 'core.component.api-contract-builder.node.confirm-remove': "Remove \"{name}\" and every field inside it?";
611
+ readonly 'core.component.api-contract-builder.node.confirm-type': "Changing the type discards the nested fields. Continue?";
612
+ readonly 'core.component.api-contract-builder.confirm.yes': "Yes";
613
+ readonly 'core.component.api-contract-builder.confirm.no': "No";
614
+ readonly 'core.component.api-contract-builder.required.true': "Yes";
615
+ readonly 'core.component.api-contract-builder.required.false': "No";
616
+ readonly 'core.component.api-contract-builder.field.required': "Required";
617
+ readonly 'core.component.api-contract-builder.transform.none': "None";
618
+ readonly 'core.component.api-contract-builder.mapping.mode': "Value";
619
+ readonly 'core.component.api-contract-builder.mapping.mode.source': "From source";
620
+ readonly 'core.component.api-contract-builder.mapping.mode.static': "Static value";
621
+ readonly 'core.component.api-contract-builder.mapping.mode.advanced': "Advanced";
622
+ readonly 'core.component.api-contract-builder.mapping.mode.nested': "Map each field";
623
+ readonly 'core.component.api-contract-builder.mapping.source': "Source expression";
624
+ readonly 'core.component.api-contract-builder.mapping.value': "Static value";
625
+ readonly 'core.component.api-contract-builder.mapping.sensitive': "sensitive";
626
+ readonly 'core.component.api-contract-builder.drawer.add-title': "Add field";
627
+ readonly 'core.component.api-contract-builder.drawer.edit-title': "Edit field";
628
+ readonly 'core.component.api-contract-builder.drawer.save': "Save";
629
+ readonly 'core.component.api-contract-builder.drawer.cancel': "Cancel";
630
+ readonly 'core.component.api-contract-builder.drawer.discard-confirm': "Discard unsaved changes?";
631
+ readonly 'core.component.api-contract-builder.summary.unmapped': "unmapped";
632
+ readonly 'core.component.api-contract-builder.summary.field-count': "{count} field(s)";
633
+ readonly 'core.component.api-contract-builder.node.name-required': "The field name cannot be empty";
634
+ readonly 'core.component.api-contract-builder.boolean.true': "True";
635
+ readonly 'core.component.api-contract-builder.boolean.false': "False";
636
+ readonly 'core.component.api-contract-builder.request.method': "Method";
637
+ readonly 'core.component.api-contract-builder.request.url': "URL";
638
+ readonly 'core.component.api-contract-builder.request.path': "Path parameters";
639
+ readonly 'core.component.api-contract-builder.request.query': "Query parameters";
640
+ readonly 'core.component.api-contract-builder.request.headers': "Headers";
641
+ readonly 'core.component.api-contract-builder.request.body': "Body";
642
+ readonly 'core.component.api-contract-builder.request.add-body': "Add a body";
643
+ readonly 'core.component.api-contract-builder.request.remove-body': "Remove the body";
644
+ readonly 'core.component.api-contract-builder.request.add-entry': "Add";
645
+ readonly 'core.component.api-contract-builder.response.status': "Success status codes";
646
+ readonly 'core.component.api-contract-builder.response.status-hint': "Comma separated, for example 200, 201";
647
+ readonly 'core.component.api-contract-builder.response.headers': "Response headers";
648
+ readonly 'core.component.api-contract-builder.response.body': "Response body";
649
+ readonly 'core.component.api-contract-builder.response.add-body': "Add a body";
650
+ readonly 'core.component.api-contract-builder.response.remove-body': "Remove the body";
651
+ readonly 'core.component.api-contract-builder.output.schema': "Output schema";
652
+ readonly 'core.component.api-contract-builder.output.use-response': "Use a response field as the output";
653
+ readonly 'core.component.api-contract-builder.output.fields': "Fields available to consumers";
654
+ readonly 'core.component.api-contract-builder.output.no-fields': "No leaf field yet";
655
+ readonly 'core.component.api-contract-builder.review.valid': "The contract is valid";
656
+ readonly 'core.component.api-contract-builder.review.errors': "{count} error(s)";
657
+ readonly 'core.component.api-contract-builder.review.warnings': "{count} warning(s)";
658
+ readonly 'core.component.api-contract-builder.review.json': "Contract JSON";
659
+ readonly 'core.component.api-contract-builder.empty.path': "No path parameter yet";
660
+ readonly 'core.component.api-contract-builder.empty.query': "No query parameter yet";
661
+ readonly 'core.component.api-contract-builder.empty.headers': "No header yet";
662
+ readonly 'core.component.api-contract-builder.empty.body': "No body declared";
663
+ readonly 'core.component.api-contract-builder.empty.section': "This section is missing from the contract";
584
664
  readonly 'core.component.tree.selected-count': "{count} item(s) selected";
585
665
  readonly 'core.component.tree.expand': "Expand tree item";
586
666
  readonly 'core.component.tree.collapse': "Collapse tree item";
@@ -26,11 +26,20 @@ export declare class SdSidebarV1Panel {
26
26
  logoUrl: import("@angular/core").Signal<string | undefined>;
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();
32
33
  hasChild: (_: number, node: SdLayoutMenu) => boolean;
33
34
  onToggleMenuNode: (menu: SdLayoutMenu) => void;
35
+ menuNodeHref: (node: {
36
+ path: string;
37
+ queryParams?: Params;
38
+ }) => string;
39
+ onMenuNodeClick: (event: MouseEvent, node: {
40
+ path: string;
41
+ queryParams?: Params;
42
+ }) => void;
34
43
  onMenuNodeKeydown: (event: KeyboardEvent, node: {
35
44
  path: string;
36
45
  queryParams: Params;
@@ -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": "@sdcorejs/angular",
3
- "version": "19.2.0",
3
+ "version": "19.2.2",
4
4
  "description": "Angular component library: data table, query bar/builder, 20+ signal-based form controls, layout, auth and workflow services. Standalone, OnPush, signals-first. Published in parallel lines for Angular 19, 20 and 21.",
5
5
  "keywords": [
6
6
  "angular",
@@ -74,14 +74,14 @@
74
74
  "types": "./components/index.d.ts",
75
75
  "default": "./fesm2022/sdcorejs-angular-components.mjs"
76
76
  },
77
- "./directives": {
78
- "types": "./directives/index.d.ts",
79
- "default": "./fesm2022/sdcorejs-angular-directives.mjs"
80
- },
81
77
  "./configurations": {
82
78
  "types": "./configurations/index.d.ts",
83
79
  "default": "./fesm2022/sdcorejs-angular-configurations.mjs"
84
80
  },
81
+ "./directives": {
82
+ "types": "./directives/index.d.ts",
83
+ "default": "./fesm2022/sdcorejs-angular-directives.mjs"
84
+ },
85
85
  "./forms": {
86
86
  "types": "./forms/index.d.ts",
87
87
  "default": "./fesm2022/sdcorejs-angular-forms.mjs"
@@ -118,6 +118,10 @@
118
118
  "types": "./components/anchor/index.d.ts",
119
119
  "default": "./fesm2022/sdcorejs-angular-components-anchor.mjs"
120
120
  },
121
+ "./components/api-contract-builder": {
122
+ "types": "./components/api-contract-builder/index.d.ts",
123
+ "default": "./fesm2022/sdcorejs-angular-components-api-contract-builder.mjs"
124
+ },
121
125
  "./components/audit-diff": {
122
126
  "types": "./components/audit-diff/index.d.ts",
123
127
  "default": "./fesm2022/sdcorejs-angular-components-audit-diff.mjs"
@@ -298,14 +302,14 @@
298
302
  "types": "./forms/inline-text/index.d.ts",
299
303
  "default": "./fesm2022/sdcorejs-angular-forms-inline-text.mjs"
300
304
  },
301
- "./forms/input": {
302
- "types": "./forms/input/index.d.ts",
303
- "default": "./fesm2022/sdcorejs-angular-forms-input.mjs"
304
- },
305
305
  "./forms/input-color": {
306
306
  "types": "./forms/input-color/index.d.ts",
307
307
  "default": "./fesm2022/sdcorejs-angular-forms-input-color.mjs"
308
308
  },
309
+ "./forms/input": {
310
+ "types": "./forms/input/index.d.ts",
311
+ "default": "./fesm2022/sdcorejs-angular-forms-input.mjs"
312
+ },
309
313
  "./forms/input-number": {
310
314
  "types": "./forms/input-number/index.d.ts",
311
315
  "default": "./fesm2022/sdcorejs-angular-forms-input-number.mjs"
@@ -378,6 +382,10 @@
378
382
  "types": "./services/confirm/index.d.ts",
379
383
  "default": "./fesm2022/sdcorejs-angular-services-confirm.mjs"
380
384
  },
385
+ "./services/excel": {
386
+ "types": "./services/excel/index.d.ts",
387
+ "default": "./fesm2022/sdcorejs-angular-services-excel.mjs"
388
+ },
381
389
  "./services/loading": {
382
390
  "types": "./services/loading/index.d.ts",
383
391
  "default": "./fesm2022/sdcorejs-angular-services-loading.mjs"
@@ -386,10 +394,6 @@
386
394
  "types": "./services/notify/index.d.ts",
387
395
  "default": "./fesm2022/sdcorejs-angular-services-notify.mjs"
388
396
  },
389
- "./services/excel": {
390
- "types": "./services/excel/index.d.ts",
391
- "default": "./fesm2022/sdcorejs-angular-services-excel.mjs"
392
- },
393
397
  "./services/persistence": {
394
398
  "types": "./services/persistence/index.d.ts",
395
399
  "default": "./fesm2022/sdcorejs-angular-services-persistence.mjs"