@sdcorejs/angular 20.1.3 → 20.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +19 -14
  2. package/components/audit-diff/index.d.ts +74 -0
  3. package/components/badge/index.d.ts +1 -1
  4. package/components/breadcrumb/index.d.ts +53 -0
  5. package/components/data-state/index.d.ts +44 -0
  6. package/components/document-builder/index.d.ts +5 -5
  7. package/components/form-generic/index.d.ts +67 -104
  8. package/components/import-excel/index.d.ts +4 -14
  9. package/components/index.d.ts +4 -0
  10. package/components/job-progress/index.d.ts +38 -0
  11. package/components/mini-editor/index.d.ts +9 -9
  12. package/components/modal/index.d.ts +7 -1
  13. package/components/preview/index.d.ts +181 -28
  14. package/components/side-drawer/index.d.ts +7 -1
  15. package/components/tab/index.d.ts +9 -2
  16. package/components/table/index.d.ts +8 -7
  17. package/components/tree/index.d.ts +24 -2
  18. package/components/upload-file/index.d.ts +5 -4
  19. package/directives/index.d.ts +10 -8
  20. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  21. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  23. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  24. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  25. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  27. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  28. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  29. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  30. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  31. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  33. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +495 -838
  35. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +24 -34
  37. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  39. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  40. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  41. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  43. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  45. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
  47. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  49. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  51. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
  53. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  55. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-table.mjs +96 -63
  57. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-tree.mjs +186 -17
  59. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +15 -22
  61. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  63. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  65. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
  67. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -83
  69. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
  71. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
  73. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
  75. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
  77. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
  79. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  81. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
  83. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
  85. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-input.mjs +290 -56
  87. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  89. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -78
  91. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
  93. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -76
  95. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
  97. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +280 -0
  99. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  100. package/fesm2022/sdcorejs-angular-forms-time.mjs +310 -0
  101. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  102. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  103. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  104. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  105. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +375 -10
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-layout.mjs +994 -168
  111. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  113. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  115. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  117. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  119. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  121. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
  123. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  125. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  127. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  128. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  129. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  131. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  132. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  133. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  134. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  135. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  136. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  137. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  138. package/forms/autocomplete/index.d.ts +3 -4
  139. package/forms/checkbox/index.d.ts +4 -8
  140. package/forms/date/index.d.ts +2 -2
  141. package/forms/date-range/index.d.ts +6 -7
  142. package/forms/datetime/index.d.ts +2 -2
  143. package/forms/entity-picker/index.d.ts +128 -0
  144. package/forms/index.d.ts +15 -5
  145. package/forms/input/index.d.ts +74 -11
  146. package/forms/input-number/index.d.ts +1 -1
  147. package/forms/models/index.d.ts +86 -3
  148. package/forms/radio/index.d.ts +12 -8
  149. package/forms/switch/index.d.ts +4 -7
  150. package/forms/time/index.d.ts +117 -0
  151. package/forms/time-range/index.d.ts +98 -0
  152. package/forms/tree-select/index.d.ts +76 -0
  153. package/i18n/index.d.ts +72 -2
  154. package/interceptors/index.d.ts +5 -6
  155. package/modules/layout/index.d.ts +354 -17
  156. package/package.json +49 -1
  157. package/pipes/index.d.ts +2 -2
  158. package/services/api/index.d.ts +68 -24
  159. package/services/cache/index.d.ts +52 -16
  160. package/services/confirm/index.d.ts +3 -2
  161. package/services/docx/index.d.ts +2 -3
  162. package/services/index.d.ts +4 -0
  163. package/services/loading/index.d.ts +16 -8
  164. package/services/persistence/index.d.ts +159 -0
  165. package/services/storage/index.d.ts +26 -8
  166. package/services/task/index.d.ts +104 -0
  167. package/services/unsaved-changes/index.d.ts +83 -0
  168. package/services/viewport/index.d.ts +42 -0
@@ -1,10 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { PipeTransform, OnInit, OnDestroy, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
+ import { OnInit, OnDestroy } from '@angular/core';
3
3
  import { MatPaginator } from '@angular/material/paginator';
4
4
  import { SdModal } from '@sdcorejs/angular/components/modal';
5
- import { SdExcelService } from '@sdcorejs/angular/services/excel';
6
- import { SdNotifyService } from '@sdcorejs/angular/services/notify';
7
- import { SdLoadingService } from '@sdcorejs/angular/services/loading';
8
5
 
9
6
  interface SdImportExcelValidation {
10
7
  idx: number;
@@ -109,14 +106,6 @@ interface SdImportExcelItem<T = any> {
109
106
  };
110
107
  }
111
108
 
112
- declare class ColumnHiddenPipe implements PipeTransform {
113
- constructor();
114
- transform(column: SdUploadExcelColumn): boolean;
115
- static ɵfac: i0.ɵɵFactoryDeclaration<ColumnHiddenPipe, never>;
116
- static ɵpipe: i0.ɵɵPipeDeclaration<ColumnHiddenPipe, "columnHidden", true>;
117
- static ɵprov: i0.ɵɵInjectableDeclaration<ColumnHiddenPipe>;
118
- }
119
-
120
109
  declare class SdImportExcel implements OnInit, OnDestroy {
121
110
  #private;
122
111
  private ref;
@@ -139,8 +128,9 @@ declare class SdImportExcel implements OnInit, OnDestroy {
139
128
  uploading: boolean;
140
129
  isUploaded: boolean;
141
130
  isDownloadTemplate: boolean;
142
- sdClosed: EventEmitter<any>;
143
- constructor(ref: ChangeDetectorRef, excelService: SdExcelService, notifyService: SdNotifyService, columnHiddenPipe: ColumnHiddenPipe, loadingService: SdLoadingService);
131
+ readonly sdClosed: i0.OutputEmitterRef<void>;
132
+ /** Inserted by Angular inject() migration for backwards compatibility */
133
+ constructor(...args: unknown[]);
144
134
  ngOnInit(): void;
145
135
  ngOnDestroy(): void;
146
136
  open: () => void;
@@ -25,3 +25,7 @@ export * from '@sdcorejs/angular/components/editor';
25
25
  export * from '@sdcorejs/angular/components/splitter';
26
26
  export * from '@sdcorejs/angular/components/preview';
27
27
  export * from '@sdcorejs/angular/components/autoid-inspector';
28
+ export * from '@sdcorejs/angular/components/breadcrumb';
29
+ export * from '@sdcorejs/angular/components/data-state';
30
+ export * from '@sdcorejs/angular/components/job-progress';
31
+ export * from '@sdcorejs/angular/components/audit-diff';
@@ -0,0 +1,38 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { SdTaskState, SdTaskView, SdTaskStatus } from '@sdcorejs/angular/services/task';
3
+
4
+ type SdJobProgressMode = 'bar' | 'compact' | 'details';
5
+ declare class SdJobProgress {
6
+ #private;
7
+ readonly taskId: _angular_core.InputSignal<string | undefined>;
8
+ readonly state: _angular_core.InputSignal<SdTaskState<unknown> | undefined>;
9
+ readonly mode: _angular_core.InputSignal<SdJobProgressMode>;
10
+ readonly title: _angular_core.InputSignal<string | undefined>;
11
+ readonly message: _angular_core.InputSignal<string | undefined>;
12
+ readonly showActions: _angular_core.InputSignalWithTransform<boolean, unknown>;
13
+ readonly sdCancel: _angular_core.OutputEmitterRef<void>;
14
+ readonly sdRetry: _angular_core.OutputEmitterRef<void>;
15
+ readonly task: _angular_core.Signal<SdTaskView<unknown> | undefined>;
16
+ readonly resolvedState: _angular_core.Signal<SdTaskState<unknown> | undefined>;
17
+ readonly progress: _angular_core.Signal<number | undefined>;
18
+ readonly effectiveTitle: _angular_core.Signal<string | undefined>;
19
+ readonly effectiveMessage: _angular_core.Signal<string | undefined>;
20
+ readonly statusLabel: _angular_core.Signal<string>;
21
+ readonly progressLabel: _angular_core.Signal<string>;
22
+ readonly cancelLabel: _angular_core.Signal<string>;
23
+ readonly retryLabel: _angular_core.Signal<string>;
24
+ readonly displayedError: _angular_core.Signal<string | undefined>;
25
+ readonly active: _angular_core.Signal<boolean>;
26
+ readonly canCancel: _angular_core.Signal<boolean>;
27
+ readonly canRetry: _angular_core.Signal<boolean>;
28
+ get modeAttr(): SdJobProgressMode;
29
+ get statusAttr(): SdTaskStatus;
30
+ readonly ariaLive = "polite";
31
+ onCancel(): void;
32
+ onRetry(): void;
33
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdJobProgress, never>;
34
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdJobProgress, "sd-job-progress", never, { "taskId": { "alias": "taskId"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "showActions": { "alias": "showActions"; "required": false; "isSignal": true; }; }, { "sdCancel": "sdCancel"; "sdRetry": "sdRetry"; }, never, never, true, never>;
35
+ }
36
+
37
+ export { SdJobProgress };
38
+ export type { SdJobProgressMode };
@@ -1,7 +1,7 @@
1
1
  import { MentionFeed, MentionFeedObjectItem, EditorConfig, ClassicEditor } from 'ckeditor5';
2
2
  export { MentionFeedObjectItem } from 'ckeditor5';
3
- import * as i0 from '@angular/core';
4
- import { OnDestroy, EventEmitter } from '@angular/core';
3
+ import * as _angular_core from '@angular/core';
4
+ import { OnDestroy } from '@angular/core';
5
5
  import { ControlValueAccessor } from '@angular/forms';
6
6
 
7
7
  type SdMiniEditorOutputFormat = 'html' | 'markdown';
@@ -69,15 +69,15 @@ declare class SdMiniEditor implements ControlValueAccessor, OnDestroy {
69
69
  get maxEditorHeight(): string | undefined;
70
70
  /** NgModel binding - nội dung HTML/Markdown */
71
71
  value: string;
72
- valueChange: EventEmitter<string>;
72
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
73
73
  /** Event emitter khi content thay đổi */
74
- contentChange: EventEmitter<string>;
74
+ readonly contentChange: _angular_core.OutputEmitterRef<string>;
75
75
  /** Event emitter khi blur */
76
- blur: EventEmitter<FocusEvent>;
76
+ readonly blur: _angular_core.OutputEmitterRef<FocusEvent>;
77
77
  /** Event emitter khi focus */
78
- focus: EventEmitter<FocusEvent>;
78
+ readonly focus: _angular_core.OutputEmitterRef<FocusEvent>;
79
79
  /** Disabled state */
80
- disabled: boolean;
80
+ readonly disabled: _angular_core.InputSignal<boolean>;
81
81
  Editor: typeof ClassicEditor;
82
82
  get editorConfig(): SdMiniEditorConfig;
83
83
  constructor();
@@ -130,8 +130,8 @@ declare class SdMiniEditor implements ControlValueAccessor, OnDestroy {
130
130
  * ControlValueAccessor: Register touched callback
131
131
  */
132
132
  registerOnTouched(fn: () => void): void;
133
- static ɵfac: i0.ɵɵFactoryDeclaration<SdMiniEditor, never>;
134
- static ɵcmp: i0.ɵɵComponentDeclaration<SdMiniEditor, "sd-mini-editor", never, { "option": { "alias": "option"; "required": true; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; "contentChange": "contentChange"; "blur": "blur"; "focus": "focus"; }, never, never, true, never>;
133
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdMiniEditor, never>;
134
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdMiniEditor, "sd-mini-editor", never, { "option": { "alias": "option"; "required": true; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "contentChange": "contentChange"; "blur": "blur"; "focus": "focus"; }, never, never, true, never>;
135
135
  }
136
136
 
137
137
  export { SdMiniEditor };
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, ElementRef } from '@angular/core';
3
3
  import { Color } from '@sdcorejs/utils/models';
4
4
 
5
+ type SdModalBeforeClose = () => boolean | Promise<boolean>;
5
6
  declare class SdModal {
6
7
  #private;
7
8
  static index: _angular_core.WritableSignal<number>;
@@ -20,14 +21,19 @@ declare class SdModal {
20
21
  lazyLoadContent: _angular_core.InputSignalWithTransform<boolean, unknown>;
21
22
  hideClose: _angular_core.InputSignalWithTransform<boolean, boolean | "">;
22
23
  disableBackdropClose: _angular_core.InputSignalWithTransform<boolean, boolean | "">;
24
+ beforeClose: _angular_core.InputSignal<SdModalBeforeClose | undefined>;
23
25
  sdClosed: _angular_core.OutputEmitterRef<void>;
26
+ sdCloseError: _angular_core.OutputEmitterRef<unknown>;
24
27
  isOpened: _angular_core.WritableSignal<boolean>;
25
28
  alreadyOpened: _angular_core.WritableSignal<boolean>;
26
29
  constructor();
27
30
  open: () => void;
28
31
  close: () => void;
32
+ requestClose: () => Promise<boolean>;
33
+ forceClose: () => void;
29
34
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdModal, never>;
30
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdModal, "sd-modal", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "modalClass": { "alias": "modalClass"; "required": false; "isSignal": true; }; "lazyLoadContent": { "alias": "lazyLoadContent"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "disableBackdropClose": { "alias": "disableBackdropClose"; "required": false; "isSignal": true; }; }, { "sdClosed": "sdClosed"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*", "[sdFooterLeft]", "[sdFooterRight]"], true, never>;
35
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdModal, "sd-modal", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "modalClass": { "alias": "modalClass"; "required": false; "isSignal": true; }; "lazyLoadContent": { "alias": "lazyLoadContent"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "disableBackdropClose": { "alias": "disableBackdropClose"; "required": false; "isSignal": true; }; "beforeClose": { "alias": "beforeClose"; "required": false; "isSignal": true; }; }, { "sdClosed": "sdClosed"; "sdCloseError": "sdCloseError"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*", "[sdFooterLeft]", "[sdFooterRight]"], true, never>;
31
36
  }
32
37
 
33
38
  export { SdModal };
39
+ export type { SdModalBeforeClose };
@@ -161,17 +161,18 @@ type PdfSource = string | File | Blob | ArrayBuffer | Uint8Array | {
161
161
  * page change.
162
162
  */
163
163
  type PdfZoomMode = number | 'page-fit' | 'page-width' | 'page-actual';
164
- /**
165
- * Which tab the sidebar shows. `'none'` collapses the sidebar entirely.
166
- * NOTE: outline + search tabs are deferred — selecting them shows a placeholder.
167
- */
164
+ /** Which tab the sidebar shows. `'none'` collapses the sidebar entirely. */
168
165
  type PdfSidebarMode = 'thumbnails' | 'outline' | 'search' | 'none';
169
- /**
170
- * Page layout mode. `'continuous'` is deferred — the input is kept on the
171
- * public API so consumer code compiles, but the component falls back to
172
- * single-page behavior with a warning.
173
- */
166
+ /** Page layout mode. */
174
167
  type PdfScrollMode = 'page' | 'continuous';
168
+ /** Consumer-facing, recursively resolved PDF document-outline item. */
169
+ interface PdfOutlineItem {
170
+ readonly id: string;
171
+ readonly title: string;
172
+ readonly page: number | null;
173
+ readonly url?: string;
174
+ readonly children: readonly PdfOutlineItem[];
175
+ }
175
176
  /**
176
177
  * Document-level metadata extracted from `pdfDoc.getMetadata()`.
177
178
  */
@@ -224,35 +225,115 @@ interface PdfSearchState {
224
225
  wholeWord: boolean;
225
226
  results: PdfSearchResult[];
226
227
  activeIndex: number;
228
+ truncated: boolean;
227
229
  }
228
230
 
229
- /**
230
- * Minimal pdfjs surface the component depends on. We wrap pdfjs in a DI token
231
- * so unit tests can supply a hand-rolled mock without going through
232
- * jasmine.createSpyObj on the real module (which is harder with ESM).
233
- */
231
+ interface SdPdfRenderTask {
232
+ readonly promise: Promise<void>;
233
+ cancel(): void;
234
+ }
235
+ interface SdPdfViewport {
236
+ readonly width: number;
237
+ readonly height: number;
238
+ }
239
+ interface SdPdfTextItem {
240
+ readonly str: string;
241
+ }
242
+ interface SdPdfTextContent {
243
+ readonly items: readonly unknown[];
244
+ }
245
+ interface SdPdfPageProxy {
246
+ getViewport(parameters: {
247
+ scale: number;
248
+ rotation?: number;
249
+ }): SdPdfViewport;
250
+ render(parameters: {
251
+ canvasContext: CanvasRenderingContext2D;
252
+ viewport: SdPdfViewport;
253
+ }): SdPdfRenderTask;
254
+ getTextContent(): Promise<SdPdfTextContent | unknown>;
255
+ cleanup(): void;
256
+ }
257
+ interface SdPdfReference {
258
+ readonly num: number;
259
+ readonly gen: number;
260
+ }
261
+ type SdPdfDestination = string | readonly unknown[] | null;
262
+ interface SdPdfRawOutlineItem {
263
+ readonly title?: string;
264
+ readonly dest?: SdPdfDestination;
265
+ readonly url?: string | null;
266
+ readonly items?: readonly SdPdfRawOutlineItem[];
267
+ }
268
+ interface SdPdfDocumentProxy {
269
+ readonly numPages: number;
270
+ getPage(pageNumber: number): Promise<SdPdfPageProxy>;
271
+ getMetadata(): Promise<{
272
+ readonly info?: {
273
+ readonly Title?: string;
274
+ readonly Author?: string;
275
+ readonly Subject?: string;
276
+ };
277
+ }>;
278
+ getOutline(): Promise<readonly SdPdfRawOutlineItem[] | null>;
279
+ getDestination(name: string): Promise<readonly unknown[] | null>;
280
+ getPageIndex(reference: SdPdfReference): Promise<number>;
281
+ cachedPageNumber(reference: SdPdfReference): number | null;
282
+ getData(): Promise<Uint8Array>;
283
+ destroy(): Promise<void>;
284
+ }
285
+ interface SdPdfLoadingTask {
286
+ readonly promise: Promise<SdPdfDocumentProxy>;
287
+ onProgress?: (progress: {
288
+ loaded: number;
289
+ total: number;
290
+ }) => void;
291
+ destroy?(): Promise<void> | void;
292
+ }
293
+ interface SdPdfDocumentSpec {
294
+ url?: string;
295
+ data?: Uint8Array;
296
+ httpHeaders?: Record<string, string>;
297
+ withCredentials?: boolean;
298
+ password?: string;
299
+ }
234
300
  interface SdPdfJsLib {
235
- getDocument: (spec: unknown) => {
236
- promise: Promise<unknown>;
237
- onProgress?: (p: {
238
- loaded: number;
239
- total: number;
240
- }) => void;
241
- };
242
- GlobalWorkerOptions: {
301
+ getDocument(spec: SdPdfDocumentSpec): SdPdfLoadingTask;
302
+ readonly GlobalWorkerOptions: {
243
303
  workerSrc: string;
244
304
  };
245
305
  }
246
306
  declare const SD_PDFJS_LIB: InjectionToken<SdPdfJsLib>;
247
- declare class SdPreviewPdf implements OnDestroy {
307
+
308
+ interface PdfOutlineRow {
309
+ readonly item: PdfOutlineItem;
310
+ readonly level: number;
311
+ readonly parentId: string | null;
312
+ }
313
+ type PdfSidebarTabMode = Exclude<PdfSidebarMode, 'none'>;
314
+ declare class SdPreviewPdf {
248
315
  #private;
249
316
  static readonly MIN_ZOOM = 0.25;
250
317
  static readonly MAX_ZOOM = 4;
251
318
  static readonly ZOOM_STEP = 0.1;
319
+ static readonly OUTLINE_MAX_DEPTH = 64;
320
+ static readonly OUTLINE_MAX_NODES = 10000;
321
+ static readonly MAX_SEARCH_RESULTS = 1000;
322
+ static readonly MAX_PAGE_TEXT_CACHE_PAGES = 128;
323
+ static readonly THUMBNAIL_WINDOW_SIZE = 48;
324
+ static readonly THUMBNAIL_ITEM_HEIGHT = 220;
325
+ static readonly MAX_THUMBNAIL_CACHE_ENTRIES = 96;
326
+ private static readonly MAX_CONCURRENT_THUMBNAIL_WORK;
327
+ static readonly MAX_CANVAS_DIMENSION = 8192;
328
+ static readonly MAX_CANVAS_PIXELS = 16777216;
252
329
  protected readonly pageCanvasRef: _angular_core.Signal<ElementRef<HTMLCanvasElement> | undefined>;
253
330
  protected readonly stageEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
254
331
  protected readonly pageInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
255
332
  protected readonly searchInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
333
+ protected readonly sidebarContentRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
334
+ protected readonly outlineItemRefs: _angular_core.Signal<readonly ElementRef<HTMLElement>[]>;
335
+ protected readonly sidebarTabRefs: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
336
+ protected readonly continuousCanvases: _angular_core.Signal<readonly ElementRef<HTMLCanvasElement>[]>;
256
337
  protected readonly thumbCanvases: _angular_core.Signal<readonly ElementRef<HTMLCanvasElement>[]>;
257
338
  readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
258
339
  readonly autoId: _angular_core.Signal<string | undefined>;
@@ -276,6 +357,13 @@ declare class SdPreviewPdf implements OnDestroy {
276
357
  readonly autoIdTabThumbnails: _angular_core.Signal<string | undefined>;
277
358
  readonly autoIdTabOutline: _angular_core.Signal<string | undefined>;
278
359
  readonly autoIdTabSearch: _angular_core.Signal<string | undefined>;
360
+ readonly sidebarPanelId: _angular_core.Signal<string>;
361
+ readonly sidebarRegionId: _angular_core.Signal<string>;
362
+ readonly searchBarId: _angular_core.Signal<string>;
363
+ readonly tabThumbnailsId: _angular_core.Signal<string>;
364
+ readonly tabOutlineId: _angular_core.Signal<string>;
365
+ readonly tabSearchId: _angular_core.Signal<string>;
366
+ readonly sidebarActiveTabId: _angular_core.Signal<string>;
279
367
  readonly autoIdSearchInput: _angular_core.Signal<string | undefined>;
280
368
  readonly autoIdSearchNext: _angular_core.Signal<string | undefined>;
281
369
  readonly autoIdSearchPrev: _angular_core.Signal<string | undefined>;
@@ -309,6 +397,7 @@ declare class SdPreviewPdf implements OnDestroy {
309
397
  term: string;
310
398
  total: number;
311
399
  current: number;
400
+ truncated: boolean;
312
401
  }>;
313
402
  readonly stage: _angular_core.Signal<PdfStage>;
314
403
  readonly activePage: _angular_core.Signal<number>;
@@ -323,14 +412,28 @@ declare class SdPreviewPdf implements OnDestroy {
323
412
  readonly fileSize: _angular_core.Signal<number>;
324
413
  readonly loadError$: _angular_core.Signal<PdfErrorEvent | null>;
325
414
  readonly thumbCache: _angular_core.Signal<Record<number, string>>;
415
+ readonly thumbnailWorkCount: _angular_core.Signal<number>;
416
+ readonly pageTextCacheSize: _angular_core.Signal<number>;
417
+ readonly continuousPages: _angular_core.Signal<number[]>;
418
+ readonly continuousTopSpacer: _angular_core.Signal<number>;
419
+ readonly continuousBottomSpacer: _angular_core.Signal<number>;
420
+ readonly continuousPageHeights: _angular_core.Signal<Record<number, number>>;
421
+ readonly outline: _angular_core.Signal<readonly PdfOutlineItem[]>;
422
+ readonly outlineFocusId: _angular_core.Signal<string | null>;
423
+ readonly visibleOutline: _angular_core.Signal<readonly PdfOutlineRow[]>;
326
424
  readonly numPages: _angular_core.Signal<number>;
327
425
  readonly canPrev: _angular_core.Signal<boolean>;
328
426
  readonly canNext: _angular_core.Signal<boolean>;
329
427
  readonly zoomPercent: _angular_core.Signal<number>;
330
428
  readonly loadPercent: _angular_core.Signal<number>;
331
429
  readonly isSidebarOpen: _angular_core.Signal<boolean>;
430
+ readonly canDownload: _angular_core.Signal<boolean>;
431
+ readonly canFullscreen: _angular_core.Signal<boolean>;
432
+ readonly canPrint: _angular_core.Signal<boolean>;
332
433
  readonly pageList: _angular_core.Signal<number[]>;
333
434
  readonly pageNumbers: _angular_core.Signal<number[]>;
435
+ readonly thumbnailTopSpacer: _angular_core.Signal<number>;
436
+ readonly thumbnailBottomSpacer: _angular_core.Signal<number>;
334
437
  readonly searchBarOpen: _angular_core.Signal<boolean>;
335
438
  readonly searchTerm: _angular_core.Signal<string>;
336
439
  readonly searchResults: _angular_core.Signal<PdfSearchResult[]>;
@@ -338,11 +441,11 @@ declare class SdPreviewPdf implements OnDestroy {
338
441
  readonly searchCaseSensitive: _angular_core.Signal<boolean>;
339
442
  readonly searchWholeWord: _angular_core.Signal<boolean>;
340
443
  readonly searchTotal: _angular_core.Signal<number>;
444
+ readonly searchTruncated: _angular_core.Signal<boolean>;
341
445
  readonly searchCurrent: _angular_core.Signal<number>;
342
446
  readonly searchActiveResult: _angular_core.Signal<PdfSearchResult | null>;
343
447
  readonly searchState: _angular_core.Signal<PdfSearchState>;
344
448
  constructor();
345
- ngOnDestroy(): void;
346
449
  goToPage(page: number): void;
347
450
  nextPage(): void;
348
451
  prevPage(): void;
@@ -354,14 +457,23 @@ declare class SdPreviewPdf implements OnDestroy {
354
457
  rotate(direction: 'left' | 'right'): void;
355
458
  toggleSidebar(): void;
356
459
  setSidebarMode(mode: PdfSidebarMode): void;
460
+ onSidebarTabKeyDown(event: KeyboardEvent, currentMode: PdfSidebarTabMode): void;
461
+ onThumbnailSidebarScroll(event: Event): void;
357
462
  setScrollMode(mode: PdfScrollMode): void;
358
463
  downloadFile(): void;
464
+ downloadFileAsync(): Promise<boolean>;
359
465
  toggleFullscreen(): void;
360
466
  /** Programmatic equivalent of clicking the X — emits the close output. */
361
467
  requestClose(): void;
362
468
  /** Retry the active load attempt (called from the error state retry button). */
363
469
  retryLoad(): void;
364
470
  printFile(): void;
471
+ print(): Promise<void>;
472
+ isOutlineExpanded(id: string): boolean;
473
+ toggleOutlineItem(id: string, event?: Event): void;
474
+ focusOutlineItem(id: string): void;
475
+ activateOutlineItem(id: string): void;
476
+ onOutlineKeyDown(event: KeyboardEvent, id: string): void;
365
477
  /**
366
478
  * Run a full-document search for `term`. Returns the result count.
367
479
  *
@@ -384,6 +496,7 @@ declare class SdPreviewPdf implements OnDestroy {
384
496
  }): Promise<number>;
385
497
  searchNext(): void;
386
498
  searchPrev(): void;
499
+ activateSearchResult(index: number): void;
387
500
  clearSearch(): void;
388
501
  /** Open the search bar and focus its input. Idempotent. */
389
502
  openSearch(): void;
@@ -392,15 +505,17 @@ declare class SdPreviewPdf implements OnDestroy {
392
505
  toggleSearchCaseSensitive(): void;
393
506
  toggleSearchWholeWord(): void;
394
507
  /** Live binding from the search bar's `(input)` event. */
395
- onSearchInput(value: string): void;
508
+ onSearchInput(event: Event): void;
396
509
  onKeyDown(event: KeyboardEvent): void;
397
510
  onPageInputEnter(event: Event): void;
398
511
  onPageInputBlur(event: Event): void;
399
512
  onWheel(event: WheelEvent): void;
400
513
  trackByPage(_i: number, page: number): number;
514
+ onStageScroll(): void;
401
515
  /**
402
516
  * Render a single page into a sidebar thumbnail canvas at ~140px width.
403
- * Cached via `#thumbsRendering` so rapid scroll bounces don't double-render.
517
+ * Reserved in `#thumbnailWork` before getPage() so rapid scroll bounces
518
+ * cannot start duplicate work for the same mounted page.
404
519
  *
405
520
  * Visible for testing — tests can stub `getPage()` on the fake doc to
406
521
  * assert this method calls `render(...)` with the right page argument.
@@ -410,5 +525,43 @@ declare class SdPreviewPdf implements OnDestroy {
410
525
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdPreviewPdf, "sd-preview-pdf", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "source": { "alias": "source"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "startPage": { "alias": "startPage"; "required": false; "isSignal": true; }; "initialZoom": { "alias": "initialZoom"; "required": false; "isSignal": true; }; "sidebar": { "alias": "sidebar"; "required": false; "isSignal": true; }; "sidebarOpen": { "alias": "sidebarOpen"; "required": false; "isSignal": true; }; "scrollMode": { "alias": "scrollMode"; "required": false; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "downloadable": { "alias": "downloadable"; "required": false; "isSignal": true; }; "password": { "alias": "password"; "required": false; "isSignal": true; }; "httpHeaders": { "alias": "httpHeaders"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; }, { "close": "close"; "loaded": "loaded"; "pageChange": "pageChange"; "zoomChange": "zoomChange"; "download": "download"; "loadError": "loadError"; "searchChange": "searchChange"; }, never, never, true, never>;
411
526
  }
412
527
 
413
- export { SD_PDFJS_LIB, SdPreviewImage, SdPreviewPdf };
414
- export type { NormalizedImage, PdfErrorEvent, PdfErrorReason, PdfLoadEvent, PdfMeta, PdfScrollMode, PdfSearchResult, PdfSearchState, PdfSidebarMode, PdfSource, PdfStage, PdfZoomMode, PreviewItem, PreviewStage, PreviewTheme, SdPdfJsLib, ThumbnailPosition };
528
+ interface SdPdfIntersectionEntry {
529
+ readonly target: Element;
530
+ readonly isIntersecting: boolean;
531
+ }
532
+ interface SdPdfBrowserAdapter {
533
+ readonly isBrowser: boolean;
534
+ /** The platform can trigger an anchor download for an existing URL. */
535
+ readonly canDownloadUrl: boolean;
536
+ /** The platform can create/revoke an object URL and then download it. */
537
+ readonly canDownloadBlob: boolean;
538
+ readonly canFullscreen: boolean;
539
+ isFile(value: unknown): value is File;
540
+ isBlob(value: unknown): value is Blob;
541
+ createPdfBlob(data: Uint8Array): Blob | null;
542
+ createObjectUrl(blob: Blob): string | null;
543
+ revokeObjectUrl(url: string): void;
544
+ download(href: string, filename: string): boolean;
545
+ createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K] | null;
546
+ createImage(): HTMLImageElement | null;
547
+ listenFullscreen(host: HTMLElement, listener: (active: boolean) => void): () => void;
548
+ toggleFullscreen(host: HTMLElement): Promise<void>;
549
+ observeResize(element: Element, listener: () => void): () => void;
550
+ observeIntersections(elements: readonly Element[], listener: (entries: readonly SdPdfIntersectionEntry[]) => void, options?: IntersectionObserverInit): () => void;
551
+ scheduleFrame(callback: FrameRequestCallback): number | null;
552
+ cancelFrame(handle: number | null): void;
553
+ }
554
+ declare const SD_PDF_BROWSER_ADAPTER: InjectionToken<SdPdfBrowserAdapter>;
555
+
556
+ interface SdPdfPrintJob {
557
+ readonly finished: Promise<void>;
558
+ cancel(): void;
559
+ }
560
+ interface SdPdfPrintAdapter {
561
+ readonly isSupported: boolean;
562
+ start(data: Uint8Array, filename: string): SdPdfPrintJob | null;
563
+ }
564
+ declare const SD_PDF_PRINT_ADAPTER: InjectionToken<SdPdfPrintAdapter>;
565
+
566
+ export { SD_PDFJS_LIB, SD_PDF_BROWSER_ADAPTER, SD_PDF_PRINT_ADAPTER, SdPreviewImage, SdPreviewPdf };
567
+ export type { NormalizedImage, PdfErrorEvent, PdfErrorReason, PdfLoadEvent, PdfMeta, PdfOutlineItem, PdfScrollMode, PdfSearchResult, PdfSearchState, PdfSidebarMode, PdfSource, PdfStage, PdfZoomMode, PreviewItem, PreviewStage, PreviewTheme, SdPdfBrowserAdapter, SdPdfDestination, SdPdfDocumentProxy, SdPdfDocumentSpec, SdPdfIntersectionEntry, SdPdfJsLib, SdPdfLoadingTask, SdPdfPageProxy, SdPdfPrintAdapter, SdPdfPrintJob, SdPdfRawOutlineItem, SdPdfReference, SdPdfRenderTask, SdPdfTextContent, SdPdfTextItem, SdPdfViewport, ThumbnailPosition };
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { CdkPortal } from '@angular/cdk/portal';
3
3
  import { Observable } from 'rxjs';
4
4
 
5
+ type SdSideDrawerBeforeClose = () => boolean | Promise<boolean>;
5
6
  declare class SdSideDrawer {
6
7
  #private;
7
8
  id: string;
@@ -10,10 +11,12 @@ declare class SdSideDrawer {
10
11
  width: _angular_core.InputSignal<string>;
11
12
  hideClose: _angular_core.InputSignalWithTransform<boolean, boolean | "">;
12
13
  disableBackdropClose: _angular_core.InputSignalWithTransform<boolean, boolean | "">;
14
+ beforeClose: _angular_core.InputSignal<SdSideDrawerBeforeClose | undefined>;
13
15
  drawerClass: _angular_core.InputSignal<any>;
14
16
  readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
15
17
  readonly autoId: _angular_core.Signal<string | undefined>;
16
18
  sdClosed: _angular_core.OutputEmitterRef<void>;
19
+ sdCloseError: _angular_core.OutputEmitterRef<unknown>;
17
20
  readonly isOpened: _angular_core.Signal<boolean>;
18
21
  readonly isLoading: _angular_core.Signal<boolean>;
19
22
  readonly dataOpened: _angular_core.Signal<"true" | "false">;
@@ -22,11 +25,14 @@ declare class SdSideDrawer {
22
25
  constructor();
23
26
  open: () => void;
24
27
  close: () => void;
28
+ requestClose: () => Promise<boolean>;
29
+ forceClose: () => void;
25
30
  startLoading: () => void;
26
31
  stopLoading: () => void;
27
32
  preventScroll: (event: Event) => void;
28
33
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdSideDrawer, never>;
29
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdSideDrawer, "sd-side-drawer", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "disableBackdropClose": { "alias": "disableBackdropClose"; "required": false; "isSignal": true; }; "drawerClass": { "alias": "drawerClass"; "required": false; "isSignal": true; }; "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; }, { "sdClosed": "sdClosed"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*", "[sdFooterLeft]", "[sdFooterRight]"], true, never>;
34
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdSideDrawer, "sd-side-drawer", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "disableBackdropClose": { "alias": "disableBackdropClose"; "required": false; "isSignal": true; }; "beforeClose": { "alias": "beforeClose"; "required": false; "isSignal": true; }; "drawerClass": { "alias": "drawerClass"; "required": false; "isSignal": true; }; "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; }, { "sdClosed": "sdClosed"; "sdCloseError": "sdCloseError"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*", "[sdFooterLeft]", "[sdFooterRight]"], true, never>;
30
35
  }
31
36
 
32
37
  export { SdSideDrawer };
38
+ export type { SdSideDrawerBeforeClose };
@@ -3,16 +3,22 @@ import { TemplateRef } from '@angular/core';
3
3
  import { MatTabGroup } from '@angular/material/tabs';
4
4
  import { Color } from '@sdcorejs/utils/models';
5
5
 
6
+ type SdTabBeforeClose = () => boolean | Promise<boolean>;
6
7
  declare class SdTab {
8
+ #private;
7
9
  label: _angular_core.InputSignal<string>;
8
10
  icon: _angular_core.InputSignal<string | null | undefined>;
9
11
  badge: _angular_core.InputSignal<string | number | null | undefined>;
10
12
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
11
13
  closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
14
+ beforeClose: _angular_core.InputSignal<SdTabBeforeClose | undefined>;
12
15
  close: _angular_core.OutputEmitterRef<void>;
16
+ closeError: _angular_core.OutputEmitterRef<unknown>;
17
+ requestClose: () => Promise<boolean>;
18
+ forceClose: () => void;
13
19
  bodyTpl: _angular_core.Signal<TemplateRef<unknown>>;
14
20
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdTab, never>;
15
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdTab, "sd-tab", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["*"], true, never>;
21
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdTab, "sd-tab", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "beforeClose": { "alias": "beforeClose"; "required": false; "isSignal": true; }; }, { "close": "close"; "closeError": "closeError"; }, never, ["*"], true, never>;
16
22
  }
17
23
 
18
24
  interface SdTabClosedEvent {
@@ -20,6 +26,7 @@ interface SdTabClosedEvent {
20
26
  tab: SdTab;
21
27
  }
22
28
  declare class SdTabGroup {
29
+ #private;
23
30
  tabs: _angular_core.Signal<readonly SdTab[]>;
24
31
  selectedIndex: _angular_core.ModelSignal<number>;
25
32
  variant: _angular_core.InputSignal<"line" | "pills" | "segmented">;
@@ -49,4 +56,4 @@ declare class SdTabGroup {
49
56
  }
50
57
 
51
58
  export { SdTab, SdTabGroup };
52
- export type { SdTabClosedEvent };
59
+ export type { SdTabBeforeClose, SdTabClosedEvent };
@@ -1,13 +1,13 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, Signal, EventEmitter, ChangeDetectorRef, InjectionToken, AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { TemplateRef, Signal, InjectionToken, AfterViewInit, OnDestroy } from '@angular/core';
3
3
  import { SdBadge } from '@sdcorejs/angular/components/badge';
4
- import { SdSearch } from '@sdcorejs/angular/forms';
4
+ import { SdSearch } from '@sdcorejs/angular/forms/models';
5
5
  import { Operator, NestedKeyOf, Order, PagingReq, Color } from '@sdcorejs/utils/models';
6
6
  import { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';
7
7
  import { MatPaginatorIntl, MatPaginator } from '@angular/material/paginator';
8
8
  import { MatSort } from '@angular/material/sort';
9
9
  import { MatTable } from '@angular/material/table';
10
- import { SdExcelColumn, SdLoadingService, SdExcelService, SdNotifyService, SdConfirmService } from '@sdcorejs/angular/services';
10
+ import { SdExcelColumn } from '@sdcorejs/angular/services';
11
11
  import { Observable } from 'rxjs';
12
12
  import { SdIconSet } from '@sdcorejs/angular/modules/icon';
13
13
  import { SdButton } from '@sdcorejs/angular/components/button';
@@ -1077,7 +1077,7 @@ declare class SdPopupExport {
1077
1077
  listGroups?: MatSelectionList;
1078
1078
  selected: Record<string, boolean>;
1079
1079
  files: any[];
1080
- export: EventEmitter<{
1080
+ readonly export: _angular_core.OutputEmitterRef<{
1081
1081
  file: any | null;
1082
1082
  columns: SdExcelColumn[];
1083
1083
  isCSV?: boolean;
@@ -1085,11 +1085,12 @@ declare class SdPopupExport {
1085
1085
  form: FormGroup<{}>;
1086
1086
  exportOption?: SdTableOptionExportDefault;
1087
1087
  set _tableOption(option: SdTableOption);
1088
- configuration?: ConfiguredTableResult;
1088
+ readonly configuration: _angular_core.InputSignal<ConfiguredTableResult | undefined>;
1089
1089
  private get key();
1090
1090
  private get tableColumns();
1091
1091
  private get additionalColumns();
1092
- constructor(ref: ChangeDetectorRef, loadingService: SdLoadingService, excelService: SdExcelService, notifyService: SdNotifyService, confirmService: SdConfirmService);
1092
+ /** Inserted by Angular inject() migration for backwards compatibility */
1093
+ constructor(...args: unknown[]);
1093
1094
  open: () => Promise<void>;
1094
1095
  exportDefault: () => void;
1095
1096
  exportCSV: () => void;
@@ -1102,7 +1103,7 @@ declare class SdPopupExport {
1102
1103
  createTemplate: () => Promise<void>;
1103
1104
  templateNameValidator: (val: string) => string;
1104
1105
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdPopupExport, never>;
1105
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdPopupExport, "sd-popup-export", never, { "_tableOption": { "alias": "tableOption"; "required": false; }; "configuration": { "alias": "configuration"; "required": false; }; }, { "export": "export"; }, never, never, true, never>;
1106
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdPopupExport, "sd-popup-export", never, { "_tableOption": { "alias": "tableOption"; "required": false; }; "configuration": { "alias": "configuration"; "required": false; "isSignal": true; }; }, { "export": "export"; }, never, never, true, never>;
1106
1107
  }
1107
1108
 
1108
1109
  interface ISdTableConfiguration {