@sdcorejs/angular 21.1.2 → 21.1.4

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 (177) hide show
  1. package/README.md +127 -807
  2. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  3. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  4. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  5. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  6. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  7. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  8. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  9. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  10. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  11. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  12. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  13. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  14. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  15. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  16. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +633 -886
  17. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  18. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +26 -41
  19. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  21. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  22. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  23. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  25. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  27. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +9 -17
  29. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  31. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  33. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +76 -52
  35. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  37. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-table.mjs +123 -89
  39. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-tree.mjs +188 -18
  41. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +17 -23
  43. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  45. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  47. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +9 -8
  49. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -71
  51. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +8 -4
  53. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-forms-chip.mjs +8 -4
  55. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +18 -14
  57. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-forms-date.mjs +48 -70
  59. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +62 -528
  61. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  63. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  64. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +5 -3
  65. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +16 -11
  67. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-input.mjs +297 -59
  69. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  71. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -66
  73. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-select.mjs +8 -21
  75. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -64
  77. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +8 -6
  79. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +277 -0
  81. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-time.mjs +307 -0
  83. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  84. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  85. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  86. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  87. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  89. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  91. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  93. package/fesm2022/sdcorejs-angular-modules-layout.mjs +861 -80
  94. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  95. package/fesm2022/sdcorejs-angular-modules.mjs +0 -1
  96. package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
  97. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  98. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  100. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  101. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  102. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  104. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  105. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  106. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  107. package/fesm2022/sdcorejs-angular-services-loading.mjs +340 -66
  108. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  109. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  110. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  112. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  113. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  114. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  116. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  117. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  118. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  119. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  120. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  121. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  122. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  123. package/package.json +50 -5
  124. package/types/sdcorejs-angular-components-audit-diff.d.ts +74 -0
  125. package/types/sdcorejs-angular-components-badge.d.ts +1 -1
  126. package/types/sdcorejs-angular-components-breadcrumb.d.ts +53 -0
  127. package/types/sdcorejs-angular-components-data-state.d.ts +44 -0
  128. package/types/sdcorejs-angular-components-document-builder.d.ts +5 -5
  129. package/types/sdcorejs-angular-components-form-generic.d.ts +89 -103
  130. package/types/sdcorejs-angular-components-import-excel.d.ts +4 -14
  131. package/types/sdcorejs-angular-components-job-progress.d.ts +38 -0
  132. package/types/sdcorejs-angular-components-mini-editor.d.ts +9 -9
  133. package/types/sdcorejs-angular-components-modal.d.ts +7 -1
  134. package/types/sdcorejs-angular-components-preview.d.ts +181 -28
  135. package/types/sdcorejs-angular-components-side-drawer.d.ts +7 -1
  136. package/types/sdcorejs-angular-components-tab.d.ts +9 -2
  137. package/types/sdcorejs-angular-components-table.d.ts +8 -7
  138. package/types/sdcorejs-angular-components-tree.d.ts +24 -2
  139. package/types/sdcorejs-angular-components-upload-file.d.ts +5 -4
  140. package/types/sdcorejs-angular-components.d.ts +4 -0
  141. package/types/sdcorejs-angular-directives.d.ts +10 -8
  142. package/types/sdcorejs-angular-forms-autocomplete.d.ts +3 -4
  143. package/types/sdcorejs-angular-forms-checkbox.d.ts +4 -8
  144. package/types/sdcorejs-angular-forms-date-range.d.ts +6 -7
  145. package/types/sdcorejs-angular-forms-date.d.ts +3 -3
  146. package/types/sdcorejs-angular-forms-datetime.d.ts +3 -3
  147. package/types/sdcorejs-angular-forms-entity-picker.d.ts +128 -0
  148. package/types/sdcorejs-angular-forms-input-color.d.ts +3 -1
  149. package/types/sdcorejs-angular-forms-input-number.d.ts +4 -2
  150. package/types/sdcorejs-angular-forms-input.d.ts +76 -11
  151. package/types/sdcorejs-angular-forms-models.d.ts +86 -3
  152. package/types/sdcorejs-angular-forms-radio.d.ts +12 -8
  153. package/types/sdcorejs-angular-forms-switch.d.ts +4 -7
  154. package/types/sdcorejs-angular-forms-time-range.d.ts +98 -0
  155. package/types/sdcorejs-angular-forms-time.d.ts +117 -0
  156. package/types/sdcorejs-angular-forms-tree-select.d.ts +76 -0
  157. package/types/sdcorejs-angular-forms.d.ts +15 -5
  158. package/types/sdcorejs-angular-i18n.d.ts +68 -2
  159. package/types/sdcorejs-angular-interceptors.d.ts +5 -6
  160. package/types/sdcorejs-angular-modules-icon.d.ts +2 -3
  161. package/types/sdcorejs-angular-modules-layout.d.ts +288 -15
  162. package/types/sdcorejs-angular-modules.d.ts +0 -1
  163. package/types/sdcorejs-angular-pipes.d.ts +2 -2
  164. package/types/sdcorejs-angular-services-api.d.ts +68 -24
  165. package/types/sdcorejs-angular-services-cache.d.ts +52 -16
  166. package/types/sdcorejs-angular-services-confirm.d.ts +3 -2
  167. package/types/sdcorejs-angular-services-docx.d.ts +2 -3
  168. package/types/sdcorejs-angular-services-loading.d.ts +16 -8
  169. package/types/sdcorejs-angular-services-persistence.d.ts +159 -0
  170. package/types/sdcorejs-angular-services-storage.d.ts +26 -8
  171. package/types/sdcorejs-angular-services-task.d.ts +104 -0
  172. package/types/sdcorejs-angular-services-unsaved-changes.d.ts +83 -0
  173. package/types/sdcorejs-angular-services-viewport.d.ts +42 -0
  174. package/types/sdcorejs-angular-services.d.ts +4 -0
  175. package/fesm2022/sdcorejs-angular-modules-authom.mjs +0 -360
  176. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +0 -1
  177. package/types/sdcorejs-angular-modules-authom.d.ts +0 -70
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, ElementRef, Renderer2, OnChanges, SimpleChanges, TemplateRef } from '@angular/core';
2
+ import { OnInit, OnChanges, SimpleChanges, TemplateRef } from '@angular/core';
3
3
 
4
4
  declare class SdScrollDirective implements OnInit {
5
5
  #private;
@@ -7,7 +7,8 @@ declare class SdScrollDirective implements OnInit {
7
7
  private renderer;
8
8
  onMouseOver(): void;
9
9
  onMouseOut(): void;
10
- constructor(elementRef: ElementRef, renderer: Renderer2);
10
+ /** Inserted by Angular inject() migration for backwards compatibility */
11
+ constructor(...args: unknown[]);
11
12
  ngOnInit(): void;
12
13
  scrollTop: () => void;
13
14
  static ɵfac: i0.ɵɵFactoryDeclaration<SdScrollDirective, never>;
@@ -32,24 +33,25 @@ declare class SdHoverCopyDirective implements OnInit, OnChanges {
32
33
  #private;
33
34
  private el;
34
35
  private renderer;
35
- copyText: string;
36
- sdHoverCopyDisabled: boolean;
37
- constructor(el: ElementRef, renderer: Renderer2);
36
+ readonly copyText: i0.InputSignal<string>;
37
+ readonly sdHoverCopyDisabled: i0.InputSignal<boolean>;
38
+ /** Inserted by Angular inject() migration for backwards compatibility */
39
+ constructor(...args: unknown[]);
38
40
  ngOnInit(): void;
39
41
  ngOnChanges(changes: SimpleChanges): void;
40
42
  onMouseEnter(): void;
41
43
  onMouseLeave(): void;
42
44
  static ɵfac: i0.ɵɵFactoryDeclaration<SdHoverCopyDirective, never>;
43
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdHoverCopyDirective, "[sdHoverCopy]", never, { "copyText": { "alias": "sdHoverCopy"; "required": true; }; "sdHoverCopyDisabled": { "alias": "sdHoverCopyDisabled"; "required": false; }; }, {}, never, never, true, never>;
45
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdHoverCopyDirective, "[sdHoverCopy]", never, { "copyText": { "alias": "sdHoverCopy"; "required": true; "isSignal": true; }; "sdHoverCopyDisabled": { "alias": "sdHoverCopyDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
44
46
  }
45
47
 
46
48
  declare class SdHrefDirective {
47
49
  #private;
48
- url: string;
50
+ readonly url: i0.InputSignal<string>;
49
51
  get href(): string;
50
52
  onClick(event: Event): void;
51
53
  static ɵfac: i0.ɵɵFactoryDeclaration<SdHrefDirective, never>;
52
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdHrefDirective, "a[sdHref]", never, { "url": { "alias": "sdHref"; "required": false; }; }, {}, never, never, true, never>;
54
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdHrefDirective, "a[sdHref]", never, { "url": { "alias": "sdHref"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
53
55
  }
54
56
 
55
57
  type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnInit, OnDestroy, AfterViewInit, ElementRef, TemplateRef, EventEmitter } from '@angular/core';
2
+ import { OnInit, OnDestroy, ElementRef, TemplateRef, EventEmitter } from '@angular/core';
3
3
  import { FormGroup, FormControl, FormGroupDirective, NgForm } from '@angular/forms';
4
4
  import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
5
5
  import { ErrorStateMatcher } from '@angular/material/core';
@@ -13,7 +13,7 @@ declare class SdAutocompleteErrotStateMatcher implements ErrorStateMatcher {
13
13
  constructor(formControl: FormControl);
14
14
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;
15
15
  }
16
- declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, AfterViewInit {
16
+ declare class SdAutocomplete<T = any> implements OnInit, OnDestroy {
17
17
  #private;
18
18
  id: string;
19
19
  inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
@@ -73,7 +73,7 @@ declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, AfterViewIni
73
73
  valueModel: _angular_core.ModelSignal<string | number | null | undefined>;
74
74
  sdChange: _angular_core.OutputEmitterRef<string | number | null>;
75
75
  sdSelection: _angular_core.OutputEmitterRef<SdSelectionData<any>>;
76
- sdAdd: EventEmitter<void>;
76
+ readonly sdAdd: EventEmitter<void>;
77
77
  loading: _angular_core.WritableSignal<boolean>;
78
78
  isFocused: boolean;
79
79
  isTyping: _angular_core.WritableSignal<boolean>;
@@ -88,7 +88,6 @@ declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, AfterViewIni
88
88
  getNestedValue: (obj: any, path: string | undefined) => any;
89
89
  constructor();
90
90
  ngOnInit(): void;
91
- ngAfterViewInit(): void;
92
91
  ngOnDestroy(): void;
93
92
  onSelect: (item: T) => void;
94
93
  onFocus: () => void;
@@ -1,16 +1,15 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, AfterViewInit } from '@angular/core';
3
- import { FormControl, FormGroup } from '@angular/forms';
4
- import { SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
2
+ import { FormControl } from '@angular/forms';
3
+ import { ɵSdFormControlParent as _SdFormControlParent, SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
5
4
  import { Color } from '@sdcorejs/utils/models';
6
5
 
7
- declare class SdCheckbox implements OnDestroy, AfterViewInit {
6
+ declare class SdCheckbox {
8
7
  #private;
9
8
  id: string;
10
9
  formControl: FormControl<any>;
11
10
  readonly autoIdInput: _angular_core.InputSignalWithTransform<string | undefined, string | null | undefined>;
12
11
  readonly name: _angular_core.InputSignalWithTransform<string | undefined, string | null | undefined>;
13
- readonly form: _angular_core.InputSignalWithTransform<FormGroup<any> | undefined, any>;
12
+ readonly form: _angular_core.InputSignal<_SdFormControlParent>;
14
13
  readonly label: _angular_core.InputSignalWithTransform<string | undefined, string | null | undefined>;
15
14
  readonly color: _angular_core.InputSignalWithTransform<Color, Color | null | undefined>;
16
15
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -25,9 +24,6 @@ declare class SdCheckbox implements OnDestroy, AfterViewInit {
25
24
  readonly dataDisabled: _angular_core.Signal<"true" | "false">;
26
25
  readonly dataEmpty: _angular_core.Signal<"true" | "false">;
27
26
  readonly dataValue: _angular_core.Signal<string>;
28
- constructor();
29
- ngAfterViewInit(): void;
30
- ngOnDestroy(): void;
31
27
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdCheckbox, never>;
32
28
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdCheckbox, "sd-checkbox", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "sdChange": "sdChange"; }, never, never, true, never>;
33
29
  }
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, OnInit, TemplateRef } from '@angular/core';
2
+ import { TemplateRef } from '@angular/core';
3
3
  import { FormGroup, FormControl } from '@angular/forms';
4
4
  import { MatDateRangePicker, MatDatepickerInputEvent } from '@angular/material/datepicker';
5
5
  import { MatFormFieldAppearance, FloatLabelType } from '@angular/material/form-field';
@@ -7,11 +7,11 @@ import { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
7
7
  import { SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
8
8
  import { Size } from '@sdcorejs/utils/models';
9
9
 
10
- interface Daterange {
10
+ interface SdDateRangeValue {
11
11
  from?: string | null;
12
12
  to?: string | null;
13
13
  }
14
- declare class SdDateRange implements OnDestroy, OnInit {
14
+ declare class SdDateRange {
15
15
  #private;
16
16
  id1: string;
17
17
  id2: string;
@@ -68,15 +68,13 @@ declare class SdDateRange implements OnDestroy, OnInit {
68
68
  resolvedMin: _angular_core.Signal<Date | null>;
69
69
  maxInput: _angular_core.InputSignal<any>;
70
70
  resolvedMax: _angular_core.Signal<Date | null>;
71
- valueModel: _angular_core.ModelSignal<Daterange | null | undefined>;
72
- sdChange: _angular_core.OutputEmitterRef<Daterange | null | undefined>;
71
+ valueModel: _angular_core.ModelSignal<SdDateRangeValue | null | undefined>;
72
+ sdChange: _angular_core.OutputEmitterRef<SdDateRangeValue | null | undefined>;
73
73
  isMobileOrTablet: boolean;
74
74
  formControl: FormControl<any>;
75
75
  control1: FormControl<any>;
76
76
  control2: FormControl<any>;
77
77
  constructor();
78
- ngOnInit(): void;
79
- ngOnDestroy(): void;
80
78
  onStartChange: (event: MatDatepickerInputEvent<Date>) => void;
81
79
  onEndChange: (event: MatDatepickerInputEvent<Date>) => void;
82
80
  clear: () => void;
@@ -90,3 +88,4 @@ declare class SdDateRange implements OnDestroy, OnInit {
90
88
  }
91
89
 
92
90
  export { SdDateRange };
91
+ export type { SdDateRangeValue };
@@ -7,6 +7,7 @@ import { SdViewDefDirective, SdLabelDefDirective } from '@sdcorejs/angular/forms
7
7
  import { SdViewed, SdViewedInput, SdFormControl } from '@sdcorejs/angular/forms/models';
8
8
  import { Size } from '@sdcorejs/utils/models';
9
9
 
10
+ type SdDateModelValue = string | number | Date | undefined | null;
10
11
  declare class SdDate implements OnDestroy, OnInit {
11
12
  #private;
12
13
  id: string;
@@ -37,7 +38,7 @@ declare class SdDate implements OnDestroy, OnInit {
37
38
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
38
39
  /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (calendar). */
39
40
  viewed: _angular_core.InputSignalWithTransform<SdViewed, SdViewedInput>;
40
- /** In `viewed='inline'`, show a hover clear on the text face. Set `false` when the host owns removal (chips). */
41
+ /** Whether to show the value-gated clear button in edit and inline modes. */
41
42
  clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
42
43
  /** `true` when `viewed === 'inline'`. */
43
44
  readonly isInline: _angular_core.Signal<boolean>;
@@ -62,14 +63,13 @@ declare class SdDate implements OnDestroy, OnInit {
62
63
  maxInput: _angular_core.InputSignal<any>;
63
64
  maxDateInput: _angular_core.InputSignal<any>;
64
65
  resolvedMax: _angular_core.Signal<Date | null>;
65
- valueModel: _angular_core.ModelSignal<string | number | Date | null | undefined>;
66
+ valueModel: _angular_core.ModelSignal<SdDateModelValue>;
66
67
  sdChange: _angular_core.OutputEmitterRef<any>;
67
68
  sdFocus: _angular_core.OutputEmitterRef<void>;
68
69
  isMobileOrTablet: boolean;
69
70
  formControl: SdFormControl;
70
71
  isFocused: boolean;
71
72
  isValid?: boolean;
72
- constructor();
73
73
  ngOnInit(): void;
74
74
  ngOnDestroy(): void;
75
75
  onFocus: () => void;
@@ -6,6 +6,7 @@ import { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';
6
6
  import { SdViewed, SdViewedInput, SdFormControl } from '@sdcorejs/angular/forms/models';
7
7
  import { Size } from '@sdcorejs/utils/models';
8
8
 
9
+ type SdDatetimeModelValue = string | number | Date | undefined | null;
9
10
  declare class SdDatetime implements OnDestroy, OnInit {
10
11
  #private;
11
12
  id: string;
@@ -38,7 +39,7 @@ declare class SdDatetime implements OnDestroy, OnInit {
38
39
  viewed: _angular_core.InputSignalWithTransform<SdViewed, SdViewedInput>;
39
40
  /** Hiển thị thêm cột giây trong picker. Mặc định: chỉ HH:MM. */
40
41
  showSeconds: _angular_core.InputSignalWithTransform<boolean, unknown>;
41
- /** In `viewed='inline'`, show a hover clear on the text face. Set `false` when the host owns removal (chips). */
42
+ /** Whether to show the value-gated clear button in edit and inline modes. */
42
43
  clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
43
44
  /** `true` when `viewed === 'inline'`. */
44
45
  readonly isInline: _angular_core.Signal<boolean>;
@@ -63,7 +64,7 @@ declare class SdDatetime implements OnDestroy, OnInit {
63
64
  maxInput: _angular_core.InputSignal<any>;
64
65
  maxDateInput: _angular_core.InputSignal<any>;
65
66
  resolvedMax: _angular_core.Signal<Date | null>;
66
- valueModel: _angular_core.ModelSignal<string | number | Date | null | undefined>;
67
+ valueModel: _angular_core.ModelSignal<SdDatetimeModelValue>;
67
68
  viewedDate: _angular_core.Signal<Date | null>;
68
69
  sdChange: _angular_core.OutputEmitterRef<any>;
69
70
  sdFocus: _angular_core.OutputEmitterRef<void>;
@@ -73,7 +74,6 @@ declare class SdDatetime implements OnDestroy, OnInit {
73
74
  isValid?: boolean;
74
75
  /** State popup — true khi picker package đang mở. */
75
76
  pickerOpened: _angular_core.Signal<boolean>;
76
- constructor();
77
77
  ngOnInit(): void;
78
78
  ngOnDestroy(): void;
79
79
  /** Mở popup chọn datetime, neo vào input. */
@@ -0,0 +1,128 @@
1
+ import * as _sdcorejs_angular_forms_models from '@sdcorejs/angular/forms/models';
2
+ import { ɵSdFormControlParent as _SdFormControlParent, SdViewed, SdViewedInput, SdFormControl } from '@sdcorejs/angular/forms/models';
3
+ import * as _angular_core from '@angular/core';
4
+ import { ElementRef, TemplateRef } from '@angular/core';
5
+ import { FormGroup } from '@angular/forms';
6
+ import { SdModal } from '@sdcorejs/angular/components/modal';
7
+ import { SdQuery, SdQueryField } from '@sdcorejs/angular/components/query-bar';
8
+ import { SdTable, SdTableColumn, SdTableOption, SdTableFilterRequest } from '@sdcorejs/angular/components/table';
9
+ import { PagingReq } from '@sdcorejs/utils/models';
10
+
11
+ type SdEntityPickerModel<TKey> = TKey | TKey[] | null | undefined;
12
+ interface SdEntityPickerPage<T> {
13
+ readonly items: T[];
14
+ readonly total: number;
15
+ }
16
+ interface SdEntityPickerRequest<T> {
17
+ readonly query: SdQuery<T>;
18
+ readonly pageIndex: number;
19
+ readonly pageSize: number;
20
+ readonly orderBy?: string;
21
+ readonly orderDirection?: 'ASC' | 'DESC';
22
+ readonly signal: AbortSignal;
23
+ }
24
+ interface SdEntityPickerDataProvider<T, TKey> {
25
+ load(request: SdEntityPickerRequest<T>): SdEntityPickerPage<T> | Promise<SdEntityPickerPage<T>>;
26
+ hydrate?(keys: readonly TKey[], signal: AbortSignal): T[] | Promise<T[]>;
27
+ }
28
+ interface SdEntityPickerSelectedTemplateContext<T, TKey> {
29
+ readonly $implicit: readonly T[];
30
+ readonly entities: readonly T[];
31
+ readonly keys: readonly TKey[];
32
+ }
33
+ interface SdEntityPickerRowTemplateContext<T> {
34
+ readonly $implicit: T;
35
+ readonly item: T;
36
+ }
37
+ declare class SdEntityPickerSelectedTemplateDirective<T, TKey> {
38
+ readonly template: TemplateRef<SdEntityPickerSelectedTemplateContext<T, TKey>>;
39
+ static ngTemplateContextGuard<T, TKey>(_directive: SdEntityPickerSelectedTemplateDirective<T, TKey>, _context: unknown): _context is SdEntityPickerSelectedTemplateContext<T, TKey>;
40
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdEntityPickerSelectedTemplateDirective<any, any>, never>;
41
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SdEntityPickerSelectedTemplateDirective<any, any>, "ng-template[sdEntityPickerSelected]", never, {}, {}, never, never, true, never>;
42
+ }
43
+ declare class SdEntityPickerRowTemplateDirective<T> {
44
+ readonly template: TemplateRef<SdEntityPickerRowTemplateContext<T>>;
45
+ static ngTemplateContextGuard<T>(_directive: SdEntityPickerRowTemplateDirective<T>, _context: unknown): _context is SdEntityPickerRowTemplateContext<T>;
46
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdEntityPickerRowTemplateDirective<any>, never>;
47
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SdEntityPickerRowTemplateDirective<any>, "ng-template[sdEntityPickerRow]", never, {}, {}, never, never, true, never>;
48
+ }
49
+ declare class SdEntityPickerDetailTemplateDirective<T, TKey> {
50
+ readonly template: TemplateRef<SdEntityPickerSelectedTemplateContext<T, TKey>>;
51
+ static ngTemplateContextGuard<T, TKey>(_directive: SdEntityPickerDetailTemplateDirective<T, TKey>, _context: unknown): _context is SdEntityPickerSelectedTemplateContext<T, TKey>;
52
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdEntityPickerDetailTemplateDirective<any, any>, never>;
53
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SdEntityPickerDetailTemplateDirective<any, any>, "ng-template[sdEntityPickerDetail]", never, {}, {}, never, never, true, never>;
54
+ }
55
+ declare class SdEntityPicker<T = unknown, TKey = string | number> {
56
+ #private;
57
+ readonly trigger: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
58
+ readonly modal: _angular_core.Signal<SdModal | undefined>;
59
+ readonly table: _angular_core.Signal<SdTable<T> | undefined>;
60
+ readonly selectedTemplate: _angular_core.Signal<SdEntityPickerSelectedTemplateDirective<any, any> | undefined>;
61
+ readonly rowTemplate: _angular_core.Signal<SdEntityPickerRowTemplateDirective<any> | undefined>;
62
+ readonly detailTemplate: _angular_core.Signal<SdEntityPickerDetailTemplateDirective<any, any> | undefined>;
63
+ readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
64
+ readonly autoId: _angular_core.Signal<string | undefined>;
65
+ readonly name: _angular_core.InputSignal<string>;
66
+ readonly form: _angular_core.InputSignalWithTransform<FormGroup<any> | undefined, _SdFormControlParent>;
67
+ readonly label: _angular_core.InputSignal<string | undefined>;
68
+ readonly placeholder: _angular_core.InputSignal<string | null | undefined>;
69
+ readonly modalTitle: _angular_core.InputSignal<string | null | undefined>;
70
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
71
+ readonly provider: _angular_core.InputSignal<SdEntityPickerDataProvider<T, TKey> | null | undefined>;
72
+ readonly columns: _angular_core.InputSignal<readonly SdTableColumn<T>[]>;
73
+ readonly queryFields: _angular_core.InputSignal<readonly SdQueryField<T>[]>;
74
+ readonly pageSize: _angular_core.InputSignal<number>;
75
+ readonly valueField: _angular_core.InputSignal<(T extends object ? { [Key in keyof T & string]: T[Key] extends string | number | boolean | Function | Date | null | undefined ? Key : T[Key] extends any[] ? Key : T[Key] extends object ? Key | `${Key}.${T[Key] extends infer T_1 ? T_1 extends T[Key] ? T_1 extends object ? { [Key_2 in keyof T_1 & string]: T_1[Key_2] extends string | number | boolean | Function | Date | null | undefined ? Key_2 : T_1[Key_2] extends any[] ? Key_2 : T_1[Key_2] extends object ? Key_2 | `${Key_2}.${T_1[Key_2] extends infer T_2 ? T_2 extends T_1[Key_2] ? T_2 extends object ? { [Key_3 in keyof T_2 & string]: T_2[Key_3] extends string | number | boolean | Function | Date | null | undefined ? Key_3 : T_2[Key_3] extends any[] ? Key_3 : T_2[Key_3] extends object ? Key_3 | `${Key_3}.${T_2[Key_3] extends infer T_3 ? T_3 extends T_2[Key_3] ? T_3 extends object ? { [Key_4 in keyof T_3 & string]: T_3[Key_4] extends string | number | boolean | Function | Date | null | undefined ? Key_4 : T_3[Key_4] extends any[] ? Key_4 : T_3[Key_4] extends object ? Key_4 : Key_4; }[keyof T_3 & string] : string : never : never}` : Key_3; }[keyof T_2 & string] : string : never : never}` : Key_2; }[keyof T_1 & string] : string : never : never}` : Key; }[keyof T & string] : string) | undefined>;
76
+ readonly keySelector: _angular_core.InputSignal<((item: T) => TKey) | undefined>;
77
+ readonly displayField: _angular_core.InputSignal<(T extends object ? { [Key in keyof T & string]: T[Key] extends string | number | boolean | Function | Date | null | undefined ? Key : T[Key] extends any[] ? Key : T[Key] extends object ? Key | `${Key}.${T[Key] extends infer T_1 ? T_1 extends T[Key] ? T_1 extends object ? { [Key_2 in keyof T_1 & string]: T_1[Key_2] extends string | number | boolean | Function | Date | null | undefined ? Key_2 : T_1[Key_2] extends any[] ? Key_2 : T_1[Key_2] extends object ? Key_2 | `${Key_2}.${T_1[Key_2] extends infer T_2 ? T_2 extends T_1[Key_2] ? T_2 extends object ? { [Key_3 in keyof T_2 & string]: T_2[Key_3] extends string | number | boolean | Function | Date | null | undefined ? Key_3 : T_2[Key_3] extends any[] ? Key_3 : T_2[Key_3] extends object ? Key_3 | `${Key_3}.${T_2[Key_3] extends infer T_3 ? T_3 extends T_2[Key_3] ? T_3 extends object ? { [Key_4 in keyof T_3 & string]: T_3[Key_4] extends string | number | boolean | Function | Date | null | undefined ? Key_4 : T_3[Key_4] extends any[] ? Key_4 : T_3[Key_4] extends object ? Key_4 : Key_4; }[keyof T_3 & string] : string : never : never}` : Key_3; }[keyof T_2 & string] : string : never : never}` : Key_2; }[keyof T_1 & string] : string : never : never}` : Key; }[keyof T & string] : string) | undefined>;
78
+ readonly displayWith: _angular_core.InputSignal<((item: T) => string) | undefined>;
79
+ readonly compareWith: _angular_core.InputSignal<(left: TKey, right: TKey) => boolean>;
80
+ readonly disabledEntity: _angular_core.InputSignal<((item: T) => boolean) | undefined>;
81
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
82
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
83
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
84
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
85
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
86
+ readonly viewed: _angular_core.InputSignalWithTransform<SdViewed, SdViewedInput>;
87
+ readonly addable: _angular_core.InputSignalWithTransform<boolean, unknown>;
88
+ readonly model: _angular_core.ModelSignal<SdEntityPickerModel<TKey>>;
89
+ readonly sdChange: _angular_core.OutputEmitterRef<SdEntityPickerModel<TKey>>;
90
+ readonly sdAdd: _angular_core.OutputEmitterRef<void>;
91
+ readonly sdLoadError: _angular_core.OutputEmitterRef<unknown>;
92
+ readonly formControl: SdFormControl;
93
+ readonly connectorState: _angular_core.Signal<_sdcorejs_angular_forms_models.ɵSdFormControlConnectorState<SdEntityPickerModel<TKey>>>;
94
+ readonly draftKeys: _angular_core.WritableSignal<TKey[]>;
95
+ readonly loadError: _angular_core.WritableSignal<unknown>;
96
+ readonly loading: _angular_core.WritableSignal<boolean>;
97
+ readonly hydrating: _angular_core.WritableSignal<boolean>;
98
+ readonly query: _angular_core.WritableSignal<SdQuery<T>>;
99
+ readonly modelKeys: _angular_core.Signal<TKey[]>;
100
+ readonly effectivePlaceholder: _angular_core.Signal<string>;
101
+ readonly effectiveModalTitle: _angular_core.Signal<string>;
102
+ readonly selectedEntities: _angular_core.Signal<T[]>;
103
+ readonly draftEntities: _angular_core.Signal<T[]>;
104
+ readonly displayText: _angular_core.Signal<string>;
105
+ readonly selectedTemplateContext: _angular_core.Signal<SdEntityPickerSelectedTemplateContext<T, TKey>>;
106
+ readonly detailTemplateContext: _angular_core.Signal<SdEntityPickerSelectedTemplateContext<T, TKey>>;
107
+ readonly tableOption: _angular_core.Signal<SdTableOption<T>>;
108
+ constructor();
109
+ open(): void;
110
+ applySelection(): void;
111
+ cancel(): void;
112
+ clear(event?: Event): void;
113
+ onModalClosed(): void;
114
+ onTableSelect(item: T, selectedItems: T[]): void;
115
+ onTableSelectAll(selectedItems: T[], pageItems?: T[]): void;
116
+ onQueryChange(query: SdQuery<T>): void;
117
+ loadPage(filterRequest: SdTableFilterRequest<T>, pagingRequest: PagingReq<T>): Promise<SdEntityPickerPage<T>>;
118
+ retry(): void;
119
+ add(): void;
120
+ keyOf(item: T): TKey;
121
+ displayEntity(item: T): string;
122
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdEntityPicker<any, any>, never>;
123
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdEntityPicker<any, any>, "sd-entity-picker", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "modalTitle": { "alias": "modalTitle"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "provider": { "alias": "provider"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "queryFields": { "alias": "queryFields"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; "keySelector": { "alias": "keySelector"; "required": false; "isSignal": true; }; "displayField": { "alias": "displayField"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "disabledEntity": { "alias": "disabledEntity"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "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; }; "addable": { "alias": "addable"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "sdChange": "sdChange"; "sdAdd": "sdAdd"; "sdLoadError": "sdLoadError"; }, ["selectedTemplate", "rowTemplate", "detailTemplate"], never, true, never>;
124
+ }
125
+ declare function normalizePickerKeys<TKey>(value: SdEntityPickerModel<TKey>, multiple: boolean): TKey[];
126
+
127
+ export { SdEntityPicker, SdEntityPickerDetailTemplateDirective, SdEntityPickerRowTemplateDirective, SdEntityPickerSelectedTemplateDirective, normalizePickerKeys };
128
+ export type { SdEntityPickerDataProvider, SdEntityPickerModel, SdEntityPickerPage, SdEntityPickerRequest, SdEntityPickerRowTemplateContext, SdEntityPickerSelectedTemplateContext };
@@ -19,6 +19,8 @@ declare class SdInputColor {
19
19
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
20
20
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
21
21
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
22
+ /** Whether the inner `<sd-input>` should render its clear button. */
23
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
22
24
  readonly hideInlineError: _angular_core.InputSignalWithTransform<boolean, unknown>;
23
25
  /** Display mode — forwarded to the inner `<sd-input>`. `'inline'` = borderless inline-edit; disabled `'inline'` → static. */
24
26
  readonly viewed: _angular_core.InputSignalWithTransform<SdViewed, SdViewedInput>;
@@ -32,7 +34,7 @@ declare class SdInputColor {
32
34
  onPickerChange: (ev: Event) => void;
33
35
  clear: (ev?: Event) => void;
34
36
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdInputColor, never>;
35
- static ɵcmp: _angular_core.ɵɵ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; }; "hideInlineError": { "alias": "hideInlineError"; "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>;
37
+ static ɵcmp: _angular_core.ɵɵ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; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "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>;
36
38
  }
37
39
 
38
40
  export { SD_INPUT_COLOR_HEX_PATTERN, SdInputColor };
@@ -42,6 +42,8 @@ declare class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {
42
42
  placeholder: _angular_core.InputSignal<string | undefined>;
43
43
  hideInlineError: _angular_core.InputSignalWithTransform<boolean, unknown>;
44
44
  blurOnEnter: _angular_core.InputSignalWithTransform<boolean, unknown>;
45
+ /** Whether to show the value-gated clear button in edit and inline modes. */
46
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
45
47
  required: _angular_core.InputSignalWithTransform<boolean, unknown>;
46
48
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
47
49
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -76,7 +78,7 @@ declare class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {
76
78
  sdBlur: _angular_core.OutputEmitterRef<any>;
77
79
  keyupEnter: _angular_core.OutputEmitterRef<any>;
78
80
  cleared: _angular_core.OutputEmitterRef<void>;
79
- sdFocusForceBlur: EventEmitter<void>;
81
+ readonly sdFocusForceBlur: EventEmitter<void>;
80
82
  formControl: SdFormControl;
81
83
  inputControl: SdFormControl;
82
84
  matcher: SdInputNumberErrotStateMatcher;
@@ -102,7 +104,7 @@ declare class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {
102
104
  blur: () => void;
103
105
  focus: () => void;
104
106
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdInputNumber, never>;
105
- static ɵcmp: _angular_core.ɵɵ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>;
107
+ static ɵcmp: _angular_core.ɵɵ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>;
106
108
  }
107
109
 
108
110
  export { SdInputNumber };
@@ -1,12 +1,58 @@
1
+ import * as _sdcorejs_angular_forms_models from '@sdcorejs/angular/forms/models';
2
+ import { SdViewed, SdViewedInput, SdCustomValidator, SdFormControl } from '@sdcorejs/angular/forms/models';
3
+ import * as _sdcorejs_angular_forms_input from '@sdcorejs/angular/forms/input';
1
4
  import * as _angular_core from '@angular/core';
2
5
  import { OnDestroy, OnInit, AfterViewInit, ElementRef, TemplateRef, EventEmitter } from '@angular/core';
3
6
  import { FormGroup } from '@angular/forms';
4
7
  import { MatFormFieldAppearance, FloatLabelType } from '@angular/material/form-field';
5
8
  import { SdInlineText } from '@sdcorejs/angular/forms/inline-text';
6
9
  import { SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';
7
- import { SdViewed, SdViewedInput, SdCustomValidator, SdFormControl } from '@sdcorejs/angular/forms/models';
8
10
  import { Size } from '@sdcorejs/utils/models';
9
11
 
12
+ type SdInputMaskStatus = 'empty' | 'incomplete' | 'valid' | 'invalid';
13
+ type SdInputMaskInputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
14
+ interface SdInputMaskResult {
15
+ readonly raw: string;
16
+ readonly display: string;
17
+ readonly status: SdInputMaskStatus;
18
+ readonly selectionStart: number;
19
+ readonly selectionEnd: number;
20
+ }
21
+ interface SdInputMaskAdapter {
22
+ readonly inputMode?: SdInputMaskInputMode;
23
+ readonly maxDisplayLength?: number;
24
+ format(raw: string | null | undefined): SdInputMaskResult;
25
+ parse(display: string, selectionStart?: number | null, selectionEnd?: number | null): SdInputMaskResult;
26
+ }
27
+ interface SdInputMaskToken {
28
+ readonly pattern: RegExp;
29
+ readonly optional?: boolean;
30
+ readonly transform?: (value: string) => string;
31
+ }
32
+ interface SdCreateInputMaskOptions {
33
+ readonly tokens?: Readonly<Record<string, SdInputMaskToken>>;
34
+ readonly inputMode?: SdInputMaskInputMode;
35
+ }
36
+ /**
37
+ * Creates a dependency-free slot mask.
38
+ *
39
+ * Default tokens: `#` required digit, `9` optional digit, `A`/`a` required/optional
40
+ * letter, and `*`/`?` required/optional alphanumeric. Every other character is a
41
+ * display literal and never leaks into the raw model.
42
+ */
43
+ declare function sdCreateInputMask(pattern: string, options?: SdCreateInputMaskOptions): SdInputMaskAdapter;
44
+ /** Common business masks. Models remain raw strings; separators are display-only. */
45
+ declare const SD_INPUT_MASKS: {
46
+ readonly VN_PHONE: SdInputMaskAdapter;
47
+ readonly VN_ID: SdInputMaskAdapter;
48
+ readonly VN_TAX_CODE: SdInputMaskAdapter;
49
+ readonly BANK_ACCOUNT: SdInputMaskAdapter;
50
+ readonly BUSINESS_CODE: SdInputMaskAdapter;
51
+ };
52
+ type SdInputMaskPreset = keyof typeof SD_INPUT_MASKS;
53
+ type SdInputMask = SdInputMaskAdapter | SdInputMaskPreset;
54
+ declare function sdResolveInputMask(mask: SdInputMask | null | undefined): SdInputMaskAdapter | undefined;
55
+
10
56
  declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
11
57
  #private;
12
58
  id: string;
@@ -37,20 +83,21 @@ declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
37
83
  label: _angular_core.InputSignal<string | undefined>;
38
84
  helperText: _angular_core.InputSignal<string | undefined>;
39
85
  placeholder: _angular_core.InputSignal<string | undefined>;
40
- type: _angular_core.InputSignal<"number" | "text" | "password" | "email">;
86
+ type: _angular_core.InputSignal<"number" | "text" | "email" | "password">;
87
+ mask: _angular_core.InputSignal<SdInputMask | null | undefined>;
88
+ readonly maskAdapter: _angular_core.Signal<_sdcorejs_angular_forms_input.SdInputMaskAdapter | undefined>;
89
+ readonly effectiveType: _angular_core.Signal<"number" | "text" | "email" | "password">;
90
+ readonly inputMode: _angular_core.Signal<_sdcorejs_angular_forms_input.SdInputMaskInputMode | undefined>;
91
+ readonly maxDisplayLength: _angular_core.Signal<number | undefined>;
41
92
  hideInlineError: _angular_core.InputSignalWithTransform<boolean, unknown>;
42
93
  blurOnEnter: _angular_core.InputSignalWithTransform<boolean, unknown>;
94
+ /** Whether to show the value-gated clear button in edit and inline modes. */
95
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
43
96
  required: _angular_core.InputSignalWithTransform<boolean, unknown>;
44
97
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
45
98
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
46
99
  /** Display mode: `false` edit · `true` static view · `'inline'` borderless inline-edit (no panel — the input IS the face). */
47
100
  viewed: _angular_core.InputSignalWithTransform<SdViewed, SdViewedInput>;
48
- /** `true` when `viewed === 'inline'`. */
49
- readonly isInline: _angular_core.Signal<boolean>;
50
- /** `true` when `viewed === true` (static view, no input). */
51
- readonly isViewed: _angular_core.Signal<boolean>;
52
- /** Focus the inline input. No-op unless `viewed='inline'`. */
53
- enterInlineEdit: () => void;
54
101
  /** View display template: `sdViewDef` overrides the projected `#sdValue` for the static view (unified). */
55
102
  readonly viewTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
56
103
  minlength: _angular_core.InputSignalWithTransform<number | undefined, unknown>;
@@ -74,9 +121,24 @@ declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
74
121
  sdBlur: _angular_core.OutputEmitterRef<any>;
75
122
  keyupEnter: _angular_core.OutputEmitterRef<any>;
76
123
  cleared: _angular_core.OutputEmitterRef<void>;
77
- sdFocusForceBlur: EventEmitter<void>;
124
+ readonly sdFocusForceBlur: EventEmitter<void>;
78
125
  formControl: SdFormControl;
126
+ /** Display-only control used by the input element while a mask is active. */
127
+ readonly displayControl: SdFormControl;
128
+ readonly activeControl: _angular_core.Signal<SdFormControl>;
129
+ readonly maskStatus: _angular_core.WritableSignal<SdInputMaskStatus>;
130
+ readonly displayValue: _angular_core.Signal<any>;
79
131
  isFocused: boolean;
132
+ /** Shared reactive form policy consumed by template-facing state below. */
133
+ readonly connectorState: _angular_core.Signal<_sdcorejs_angular_forms_models.ɵSdFormControlConnectorState<unknown>>;
134
+ readonly isReadonly: _angular_core.Signal<boolean>;
135
+ readonly visibleErrorMessage: _angular_core.Signal<string | undefined>;
136
+ /** `true` when `viewed === 'inline'`. */
137
+ readonly isInline: _angular_core.Signal<boolean>;
138
+ /** `true` when `viewed === true` (static view, no input). */
139
+ readonly isViewed: _angular_core.Signal<boolean>;
140
+ /** Focus the inline input. No-op unless `viewed='inline'`. */
141
+ enterInlineEdit: () => void;
80
142
  constructor();
81
143
  ngOnInit(): void;
82
144
  ngAfterViewInit(): void;
@@ -84,6 +146,8 @@ declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
84
146
  reValidate: () => void;
85
147
  getCurrentLength: () => number;
86
148
  isMaxlengthExceeded: () => boolean;
149
+ onCompositionStart(): void;
150
+ onCompositionEnd(event: CompositionEvent): void;
87
151
  showClear: () => boolean;
88
152
  clear: ($event?: Event) => void;
89
153
  onKeyupEnter: () => void;
@@ -93,7 +157,8 @@ declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
93
157
  blur: () => void;
94
158
  focus: () => void;
95
159
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdInput, never>;
96
- static ɵcmp: _angular_core.ɵɵ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>;
160
+ static ɵcmp: _angular_core.ɵɵ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; }; "mask": { "alias": "mask"; "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>;
97
161
  }
98
162
 
99
- export { SdInput };
163
+ export { SD_INPUT_MASKS, SdInput, sdCreateInputMask, sdResolveInputMask };
164
+ export type { SdCreateInputMaskOptions, SdInputMask, SdInputMaskAdapter, SdInputMaskInputMode, SdInputMaskPreset, SdInputMaskResult, SdInputMaskStatus, SdInputMaskToken };