@sdcorejs/angular 19.1.3 → 19.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 (295) hide show
  1. package/README.md +17 -14
  2. package/components/audit-diff/index.d.ts +2 -0
  3. package/components/audit-diff/src/audit-diff.component.d.ts +30 -0
  4. package/components/audit-diff/src/audit-diff.engine.d.ts +40 -0
  5. package/components/badge/src/badge.component.d.ts +1 -1
  6. package/components/breadcrumb/index.d.ts +1 -0
  7. package/components/breadcrumb/src/breadcrumb.component.d.ts +50 -0
  8. package/components/data-state/index.d.ts +1 -0
  9. package/components/data-state/src/data-state.component.d.ts +40 -0
  10. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +1 -2
  11. package/components/document-builder/src/document-builder.component.d.ts +4 -4
  12. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +7 -8
  13. package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +4 -5
  14. package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +1 -2
  15. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +6 -5
  16. package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +4 -5
  17. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +9 -9
  18. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +8 -7
  19. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +8 -7
  20. package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +3 -4
  21. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +5 -6
  22. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +1 -2
  23. package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +4 -5
  24. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +6 -6
  25. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +6 -6
  26. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +3 -3
  27. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +6 -6
  28. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +3 -3
  29. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +2 -2
  30. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +6 -6
  31. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +3 -3
  32. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +6 -5
  33. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +7 -6
  34. package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +7 -8
  35. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +3 -4
  36. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +6 -6
  37. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +3 -3
  38. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +6 -6
  39. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +3 -3
  40. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +6 -6
  41. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +3 -3
  42. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +6 -6
  43. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -3
  44. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +6 -6
  45. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +3 -3
  46. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +6 -6
  47. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +3 -3
  48. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +6 -6
  49. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +3 -3
  50. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +7 -6
  51. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +7 -6
  52. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +7 -7
  53. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +6 -6
  54. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +7 -6
  55. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +6 -7
  56. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +6 -7
  57. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +8 -8
  58. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +7 -6
  59. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +7 -6
  60. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +7 -6
  61. package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +4 -4
  62. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +8 -9
  63. package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +2 -3
  64. package/components/form-generic/src/pipes/html.pipe.d.ts +2 -2
  65. package/components/form-generic/src/services/form-render.service.d.ts +2 -2
  66. package/components/import-excel/src/import-excel.component.d.ts +4 -7
  67. package/components/import-excel/src/pipes/column-transform.pipe.d.ts +3 -2
  68. package/components/index.d.ts +4 -0
  69. package/components/job-progress/index.d.ts +1 -0
  70. package/components/job-progress/src/job-progress.component.d.ts +34 -0
  71. package/components/mini-editor/src/mini-editor.component.d.ts +7 -7
  72. package/components/modal/src/modal.component.d.ts +6 -1
  73. package/components/preview/index.d.ts +3 -0
  74. package/components/preview/src/preview-pdf/preview-pdf.browser.d.ts +28 -0
  75. package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +61 -23
  76. package/components/preview/src/preview-pdf/preview-pdf.pdfjs.d.ts +77 -0
  77. package/components/preview/src/preview-pdf/preview-pdf.print.d.ts +10 -0
  78. package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +11 -9
  79. package/components/side-drawer/src/side-drawer.component.d.ts +6 -1
  80. package/components/tab/src/tab-group.component.d.ts +1 -0
  81. package/components/tab/src/tab.component.d.ts +7 -1
  82. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +3 -4
  83. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  84. package/components/tab-router/src/services/tab-decorator.service.d.ts +2 -1
  85. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -1
  86. package/components/table/src/components/popup-export/popup-export.component.d.ts +6 -6
  87. package/components/table/src/models/table-column.model.d.ts +1 -1
  88. package/components/table/src/services/config.service.d.ts +3 -2
  89. package/components/table/src/services/table-filter/table-filter.model.d.ts +1 -1
  90. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  91. package/components/tree/src/tree.component.d.ts +13 -2
  92. package/components/tree/src/tree.model.d.ts +11 -0
  93. package/components/upload-file/src/components/preview/preview.component.d.ts +4 -4
  94. package/directives/src/sd-hover-copy.directive.d.ts +6 -5
  95. package/directives/src/sd-href.directive.d.ts +2 -2
  96. package/directives/src/sd-scroll.directive.d.ts +3 -2
  97. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  98. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  100. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  101. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  102. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  104. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  105. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  106. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  107. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +16 -21
  108. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  109. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  110. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +463 -806
  112. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +23 -33
  114. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  116. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  117. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +9 -19
  118. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-components-modal.mjs +60 -3
  120. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-components-preview.mjs +1437 -217
  122. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
  124. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  126. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +38 -1
  128. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
  130. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-components-tab.mjs +47 -3
  132. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-components-table.mjs +94 -61
  134. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-components-tree.mjs +185 -16
  136. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +14 -21
  138. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  140. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  142. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
  144. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -73
  146. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
  148. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
  150. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
  152. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
  154. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
  156. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  158. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  159. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
  160. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
  162. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-input.mjs +289 -55
  164. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  166. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -68
  168. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
  170. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -66
  172. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
  174. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +279 -0
  176. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  177. package/fesm2022/sdcorejs-angular-forms-time.mjs +309 -0
  178. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  179. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  180. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  181. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  182. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  184. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  186. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-modules-layout.mjs +859 -78
  188. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  190. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  192. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  194. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  196. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  198. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
  200. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  202. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  204. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  205. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  206. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  208. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  209. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  210. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  211. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  212. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  213. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  214. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  215. package/forms/autocomplete/src/autocomplete.component.d.ts +3 -4
  216. package/forms/checkbox/src/checkbox.component.d.ts +4 -8
  217. package/forms/date/src/date.component.d.ts +3 -2
  218. package/forms/date-range/src/date-range.component.d.ts +5 -8
  219. package/forms/datetime/src/datetime.component.d.ts +3 -2
  220. package/forms/entity-picker/index.d.ts +1 -0
  221. package/forms/entity-picker/src/entity-picker.component.d.ts +123 -0
  222. package/forms/index.d.ts +6 -0
  223. package/forms/input/index.d.ts +1 -0
  224. package/forms/input/src/input-mask.d.ts +43 -0
  225. package/forms/input/src/input.component.d.ts +26 -9
  226. package/forms/input-number/src/input-number.component.d.ts +1 -1
  227. package/forms/models/index.d.ts +1 -0
  228. package/forms/models/src/sd-form-control-connector.d.ts +86 -0
  229. package/forms/radio/src/radio.component.d.ts +12 -8
  230. package/forms/src/forms.module.d.ts +9 -5
  231. package/forms/switch/src/switch.component.d.ts +4 -7
  232. package/forms/time/index.d.ts +3 -0
  233. package/forms/time/src/time-picker.adapter.d.ts +13 -0
  234. package/forms/time/src/time-value.d.ts +19 -0
  235. package/forms/time/src/time.component.d.ts +78 -0
  236. package/forms/time-range/index.d.ts +2 -0
  237. package/forms/time-range/src/time-range-value.d.ts +14 -0
  238. package/forms/time-range/src/time-range.component.d.ts +80 -0
  239. package/forms/tree-select/index.d.ts +1 -0
  240. package/forms/tree-select/src/tree-select.component.d.ts +71 -0
  241. package/i18n/src/en.d.ts +68 -2
  242. package/interceptors/no-internet/no-internet.interceptor.d.ts +2 -3
  243. package/interceptors/unauthorized/unauthorized.interceptor.d.ts +2 -2
  244. package/modules/layout/components/index.d.ts +6 -0
  245. package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -2
  246. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +28 -0
  247. package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +25 -0
  248. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +27 -0
  249. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +28 -0
  250. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +3 -4
  251. package/modules/layout/components/sidebar-v1/main.component.d.ts +2 -2
  252. package/modules/layout/components/sidebar-v2/main.component.d.ts +36 -0
  253. package/modules/layout/components/sidebar-v3/main.component.d.ts +29 -0
  254. package/modules/layout/configurations/layout.configuration.d.ts +36 -2
  255. package/modules/layout/index.d.ts +1 -0
  256. package/modules/layout/pipes/menu.pipe.d.ts +2 -2
  257. package/modules/layout/services/index.d.ts +3 -0
  258. package/modules/layout/services/layout.service.d.ts +2 -2
  259. package/modules/layout/services/menu/menu.utils.d.ts +6 -0
  260. package/modules/layout/services/navigation-state/navigation-state.service.d.ts +18 -0
  261. package/modules/layout/services/responsive/responsive.service.d.ts +12 -0
  262. package/modules/layout/services/storage/storage.service.d.ts +21 -8
  263. package/package.json +49 -1
  264. package/pipes/src/safe-html.pipe.d.ts +2 -2
  265. package/services/api/src/api.model.d.ts +54 -15
  266. package/services/api/src/api.service.d.ts +13 -8
  267. package/services/api/src/interceptors/api.interceptor.d.ts +1 -1
  268. package/services/cache/src/cache.model.d.ts +46 -13
  269. package/services/cache/src/cache.service.d.ts +5 -2
  270. package/services/confirm/src/lib/confirm.service.d.ts +2 -2
  271. package/services/docx/src/lib/docx.service.d.ts +2 -3
  272. package/services/index.d.ts +4 -0
  273. package/services/loading/src/loading.service.d.ts +15 -8
  274. package/services/notify/src/components/toast/toast.component.d.ts +2 -3
  275. package/services/persistence/index.d.ts +5 -0
  276. package/services/persistence/src/graph-serializer.d.ts +16 -0
  277. package/services/persistence/src/persistence-envelope.d.ts +28 -0
  278. package/services/persistence/src/persistence-key.d.ts +17 -0
  279. package/services/persistence/src/persistence.model.d.ts +63 -0
  280. package/services/persistence/src/storage-adapter.d.ts +29 -0
  281. package/services/storage/src/storage.model.d.ts +20 -5
  282. package/services/storage/src/storage.service.d.ts +6 -3
  283. package/services/task/index.d.ts +3 -0
  284. package/services/task/src/task.model.d.ts +75 -0
  285. package/services/task/src/task.service.d.ts +14 -0
  286. package/services/task/src/task.tokens.d.ts +12 -0
  287. package/services/unsaved-changes/index.d.ts +4 -0
  288. package/services/unsaved-changes/src/unsaved-changes.adapters.d.ts +15 -0
  289. package/services/unsaved-changes/src/unsaved-changes.model.d.ts +41 -0
  290. package/services/unsaved-changes/src/unsaved-changes.service.d.ts +16 -0
  291. package/services/unsaved-changes/src/unsaved-changes.tokens.d.ts +9 -0
  292. package/services/viewport/index.d.ts +3 -0
  293. package/services/viewport/src/viewport.model.d.ts +12 -0
  294. package/services/viewport/src/viewport.service.d.ts +18 -0
  295. package/services/viewport/src/viewport.tokens.d.ts +6 -0
@@ -0,0 +1,255 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { InjectionToken, inject, DestroyRef, signal, computed, effect, Injectable, isSignal } from '@angular/core';
4
+ import { I18nService } from '@sdcorejs/angular/i18n';
5
+
6
+ const SD_UNSAVED_CHANGES_WINDOW = new InjectionToken('SD_UNSAVED_CHANGES_WINDOW', {
7
+ factory: () => inject(DOCUMENT).defaultView,
8
+ });
9
+ const SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER = new InjectionToken('SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER', {
10
+ factory: () => {
11
+ const windowRef = inject(SD_UNSAVED_CHANGES_WINDOW);
12
+ const i18n = inject(I18nService);
13
+ return {
14
+ confirm: (context) => {
15
+ if (!windowRef?.confirm)
16
+ return 'cancel';
17
+ const message = context.message || i18n.t('core.service.unsaved-changes.message');
18
+ return windowRef.confirm(message) ? 'discard' : 'cancel';
19
+ },
20
+ };
21
+ },
22
+ });
23
+
24
+ class SdUnsavedChangesService {
25
+ #adapter = inject(SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER);
26
+ #window = inject(SD_UNSAVED_CHANGES_WINDOW);
27
+ #i18n = inject(I18nService);
28
+ #destroyRef = inject(DestroyRef);
29
+ #entries = signal([]);
30
+ #pendingPrompts = new Map();
31
+ registrations = computed(() => this.#entries().map(entry => entry.ref));
32
+ dirty = computed(() => this.#dirtyEntries().length > 0);
33
+ constructor() {
34
+ effect(onCleanup => {
35
+ if (!this.#window || !this.dirty())
36
+ return;
37
+ const listener = (event) => {
38
+ const message = this.#dirtyEntries()[0]?.watcher.message ?? this.#i18n.t('core.service.unsaved-changes.message');
39
+ event.preventDefault();
40
+ event.returnValue = message;
41
+ };
42
+ this.#window.addEventListener('beforeunload', listener);
43
+ onCleanup(() => this.#window?.removeEventListener('beforeunload', listener));
44
+ });
45
+ this.#destroyRef.onDestroy(() => {
46
+ for (const entry of this.#entries()) {
47
+ if (entry.destroyed())
48
+ continue;
49
+ entry.destroyed.set(true);
50
+ this.#runCleanup(entry.watcher);
51
+ }
52
+ this.#entries.set([]);
53
+ this.#pendingPrompts.clear();
54
+ });
55
+ }
56
+ register(watcher) {
57
+ const existing = this.#entries().find(entry => entry.watcher.id === watcher.id && Object.is(entry.watcher.scope, watcher.scope));
58
+ if (existing) {
59
+ if (existing.watcher !== watcher)
60
+ this.#runCleanup(watcher);
61
+ return existing.ref;
62
+ }
63
+ const dirtyOverride = signal(undefined);
64
+ const destroyed = signal(false);
65
+ const dirty = computed(() => !destroyed() && (dirtyOverride() ?? readDirty(watcher.isDirty)));
66
+ const entry = {};
67
+ const ref = {
68
+ id: watcher.id,
69
+ scope: watcher.scope,
70
+ message: watcher.message,
71
+ destroyed: destroyed.asReadonly(),
72
+ dirty,
73
+ markDirty: () => dirtyOverride.set(true),
74
+ markPristine: () => dirtyOverride.set(false),
75
+ save: () => this.#runEntryAction(entry, 'save'),
76
+ reset: () => this.#runEntryAction(entry, 'reset'),
77
+ discard: () => this.#runEntryAction(entry, 'discard'),
78
+ destroy: () => this.#destroyEntry(entry),
79
+ };
80
+ Object.assign(entry, { watcher, dirtyOverride, destroyed, dirty, ref });
81
+ this.#entries.update(entries => [...entries, entry]);
82
+ return ref;
83
+ }
84
+ hasChanges(scope) {
85
+ return this.#dirtyEntries(scope).length > 0;
86
+ }
87
+ confirmLeave(options = {}) {
88
+ if (!this.hasChanges(options.scope))
89
+ return Promise.resolve(true);
90
+ const promptKey = options.scope;
91
+ const existingPrompt = this.#pendingPrompts.get(promptKey);
92
+ if (existingPrompt)
93
+ return existingPrompt;
94
+ const watchers = this.#dirtyEntries(options.scope).map(entry => entry.ref);
95
+ const message = watchers.find(watcher => watcher.message)?.message ?? this.#i18n.t('core.service.unsaved-changes.message');
96
+ const run = async () => {
97
+ try {
98
+ const rawDecision = await Promise.resolve(this.#adapter.confirm({ reason: options.reason ?? 'manual', scope: options.scope, message, watchers }));
99
+ const decision = typeof rawDecision === 'boolean' ? (rawDecision ? 'discard' : 'cancel') : rawDecision;
100
+ if (decision === 'save')
101
+ return this.saveAll(options.scope);
102
+ if (decision === 'discard')
103
+ return this.discardAll(options.scope);
104
+ return false;
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ };
110
+ const pending = run().finally(() => {
111
+ if (this.#pendingPrompts.get(promptKey) === pending)
112
+ this.#pendingPrompts.delete(promptKey);
113
+ });
114
+ this.#pendingPrompts.set(promptKey, pending);
115
+ return pending;
116
+ }
117
+ saveAll(scope) {
118
+ return this.#runAll('save', scope);
119
+ }
120
+ resetAll(scope) {
121
+ return this.#runAll('reset', scope);
122
+ }
123
+ discardAll(scope) {
124
+ return this.#runAll('discard', scope);
125
+ }
126
+ async #runAll(action, scope) {
127
+ for (const entry of this.#dirtyEntries(scope)) {
128
+ if (!(await this.#runEntryAction(entry, action)))
129
+ return false;
130
+ }
131
+ return true;
132
+ }
133
+ async #runEntryAction(entry, action) {
134
+ if (entry.destroyed())
135
+ return true;
136
+ try {
137
+ const callback = entry.watcher[action];
138
+ const result = callback ? await Promise.resolve(callback()) : undefined;
139
+ if (result === false)
140
+ return false;
141
+ // A callback owns its underlying dirty source (for example FormGroup
142
+ // marks itself pristine). Only synthesize pristine state when there is
143
+ // no callback capable of updating that source.
144
+ entry.dirtyOverride.set(callback ? undefined : false);
145
+ return true;
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ #dirtyEntries(scope) {
152
+ return this.#entries().filter(entry => (scope === undefined || Object.is(entry.watcher.scope, scope)) && entry.dirty());
153
+ }
154
+ #destroyEntry(entry) {
155
+ if (entry.destroyed())
156
+ return;
157
+ entry.destroyed.set(true);
158
+ this.#runCleanup(entry.watcher);
159
+ this.#entries.update(entries => entries.filter(candidate => candidate !== entry));
160
+ }
161
+ #runCleanup(watcher) {
162
+ try {
163
+ watcher.cleanup?.();
164
+ }
165
+ catch {
166
+ // Cleanup must never prevent registry teardown.
167
+ }
168
+ }
169
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdUnsavedChangesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
170
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdUnsavedChangesService, providedIn: 'root' });
171
+ }
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdUnsavedChangesService, decorators: [{
173
+ type: Injectable,
174
+ args: [{ providedIn: 'root' }]
175
+ }], ctorParameters: () => [] });
176
+ function readDirty(source) {
177
+ if (typeof source === 'boolean')
178
+ return source;
179
+ if (isSignal(source))
180
+ return !!source();
181
+ return !!source();
182
+ }
183
+
184
+ function registerSdUnsavedChangesForm(service, form, options) {
185
+ let snapshot = cloneValue(form.getRawValue());
186
+ const dirty = signal(form.dirty);
187
+ const subscription = form.events.subscribe(() => dirty.set(form.dirty));
188
+ const resetToSnapshot = () => {
189
+ form.reset(cloneValue(snapshot));
190
+ form.markAsPristine();
191
+ dirty.set(false);
192
+ };
193
+ const registration = service.register({
194
+ id: options.id,
195
+ scope: options.scope,
196
+ message: options.message,
197
+ isDirty: dirty,
198
+ save: async () => {
199
+ const result = options.save ? await Promise.resolve(options.save(form.getRawValue())) : undefined;
200
+ if (result === false)
201
+ return false;
202
+ snapshot = cloneValue(form.getRawValue());
203
+ form.markAsPristine();
204
+ dirty.set(false);
205
+ return true;
206
+ },
207
+ reset: async () => {
208
+ const result = options.reset ? await Promise.resolve(options.reset(form)) : undefined;
209
+ if (result === false)
210
+ return false;
211
+ if (!options.reset)
212
+ resetToSnapshot();
213
+ else {
214
+ form.markAsPristine();
215
+ dirty.set(false);
216
+ }
217
+ return true;
218
+ },
219
+ discard: async () => {
220
+ const result = options.discard ? await Promise.resolve(options.discard(form)) : undefined;
221
+ if (result === false)
222
+ return false;
223
+ if (!options.discard)
224
+ resetToSnapshot();
225
+ else {
226
+ form.markAsPristine();
227
+ dirty.set(false);
228
+ }
229
+ return true;
230
+ },
231
+ cleanup: () => subscription.unsubscribe(),
232
+ });
233
+ return registration;
234
+ }
235
+ function createSdUnsavedChangesCloseGuard(service, options = {}) {
236
+ return () => service.confirmLeave({ ...options, reason: 'close' });
237
+ }
238
+ const sdUnsavedChangesGuard = () => inject(SdUnsavedChangesService).confirmLeave({ reason: 'navigation' });
239
+ function cloneValue(value) {
240
+ if (value instanceof Date)
241
+ return new Date(value.getTime());
242
+ if (Array.isArray(value))
243
+ return value.map(item => cloneValue(item));
244
+ if (value && typeof value === 'object') {
245
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneValue(item)]));
246
+ }
247
+ return value;
248
+ }
249
+
250
+ /**
251
+ * Generated bundle index. Do not edit.
252
+ */
253
+
254
+ export { SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER, SD_UNSAVED_CHANGES_WINDOW, SdUnsavedChangesService, createSdUnsavedChangesCloseGuard, registerSdUnsavedChangesForm, sdUnsavedChangesGuard };
255
+ //# sourceMappingURL=sdcorejs-angular-services-unsaved-changes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdcorejs-angular-services-unsaved-changes.mjs","sources":["../../../projects/sdcorejs-angular/services/unsaved-changes/src/unsaved-changes.tokens.ts","../../../projects/sdcorejs-angular/services/unsaved-changes/src/unsaved-changes.service.ts","../../../projects/sdcorejs-angular/services/unsaved-changes/src/unsaved-changes.adapters.ts","../../../projects/sdcorejs-angular/services/unsaved-changes/sdcorejs-angular-services-unsaved-changes.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { InjectionToken, inject } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdUnsavedChangesConfirmationAdapter, SdUnsavedChangesDecision, SdUnsavedChangesPromptContext } from './unsaved-changes.model';\n\nexport interface SdUnsavedChangesWindow {\n addEventListener(type: 'beforeunload', listener: (event: BeforeUnloadEvent) => void): void;\n removeEventListener(type: 'beforeunload', listener: (event: BeforeUnloadEvent) => void): void;\n confirm?(message?: string): boolean;\n}\n\nexport const SD_UNSAVED_CHANGES_WINDOW = new InjectionToken<SdUnsavedChangesWindow | null>('SD_UNSAVED_CHANGES_WINDOW', {\n factory: () => inject(DOCUMENT).defaultView as SdUnsavedChangesWindow | null,\n});\n\nexport const SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER = new InjectionToken<SdUnsavedChangesConfirmationAdapter>(\n 'SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER',\n {\n factory: () => {\n const windowRef = inject(SD_UNSAVED_CHANGES_WINDOW);\n const i18n = inject(I18nService);\n return {\n confirm: (context: SdUnsavedChangesPromptContext): SdUnsavedChangesDecision => {\n if (!windowRef?.confirm) return 'cancel';\n const message = context.message || i18n.t('core.service.unsaved-changes.message');\n return windowRef.confirm(message) ? 'discard' : 'cancel';\n },\n };\n },\n }\n);\n","import { DestroyRef, Injectable, computed, effect, inject, isSignal, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport {\n SdUnsavedChangesConfirmOptions,\n SdUnsavedChangesDecision,\n SdUnsavedChangesRegistration,\n SdUnsavedChangesWatcher,\n} from './unsaved-changes.model';\nimport { SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER, SD_UNSAVED_CHANGES_WINDOW } from './unsaved-changes.tokens';\n\ninterface RegistryEntry {\n readonly watcher: SdUnsavedChangesWatcher;\n readonly dirtyOverride: ReturnType<typeof signal<boolean | undefined>>;\n readonly destroyed: ReturnType<typeof signal<boolean>>;\n readonly dirty: ReturnType<typeof computed<boolean>>;\n readonly ref: SdUnsavedChangesRegistration;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdUnsavedChangesService {\n readonly #adapter = inject(SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER);\n readonly #window = inject(SD_UNSAVED_CHANGES_WINDOW);\n readonly #i18n = inject(I18nService);\n readonly #destroyRef = inject(DestroyRef);\n readonly #entries = signal<readonly RegistryEntry[]>([]);\n readonly #pendingPrompts = new Map<unknown, Promise<boolean>>();\n\n readonly registrations = computed(() => this.#entries().map(entry => entry.ref));\n readonly dirty = computed(() => this.#dirtyEntries().length > 0);\n\n constructor() {\n effect(onCleanup => {\n if (!this.#window || !this.dirty()) return;\n const listener = (event: BeforeUnloadEvent): void => {\n const message = this.#dirtyEntries()[0]?.watcher.message ?? this.#i18n.t('core.service.unsaved-changes.message');\n event.preventDefault();\n event.returnValue = message;\n };\n this.#window.addEventListener('beforeunload', listener);\n onCleanup(() => this.#window?.removeEventListener('beforeunload', listener));\n });\n\n this.#destroyRef.onDestroy(() => {\n for (const entry of this.#entries()) {\n if (entry.destroyed()) continue;\n entry.destroyed.set(true);\n this.#runCleanup(entry.watcher);\n }\n this.#entries.set([]);\n this.#pendingPrompts.clear();\n });\n }\n\n register(watcher: SdUnsavedChangesWatcher): SdUnsavedChangesRegistration {\n const existing = this.#entries().find(entry => entry.watcher.id === watcher.id && Object.is(entry.watcher.scope, watcher.scope));\n if (existing) {\n if (existing.watcher !== watcher) this.#runCleanup(watcher);\n return existing.ref;\n }\n\n const dirtyOverride = signal<boolean | undefined>(undefined);\n const destroyed = signal(false);\n const dirty = computed(() => !destroyed() && (dirtyOverride() ?? readDirty(watcher.isDirty)));\n const entry = {} as RegistryEntry;\n const ref: SdUnsavedChangesRegistration = {\n id: watcher.id,\n scope: watcher.scope,\n message: watcher.message,\n destroyed: destroyed.asReadonly(),\n dirty,\n markDirty: () => dirtyOverride.set(true),\n markPristine: () => dirtyOverride.set(false),\n save: () => this.#runEntryAction(entry, 'save'),\n reset: () => this.#runEntryAction(entry, 'reset'),\n discard: () => this.#runEntryAction(entry, 'discard'),\n destroy: () => this.#destroyEntry(entry),\n };\n Object.assign(entry, { watcher, dirtyOverride, destroyed, dirty, ref });\n this.#entries.update(entries => [...entries, entry]);\n return ref;\n }\n\n hasChanges(scope?: unknown): boolean {\n return this.#dirtyEntries(scope).length > 0;\n }\n\n confirmLeave(options: SdUnsavedChangesConfirmOptions = {}): Promise<boolean> {\n if (!this.hasChanges(options.scope)) return Promise.resolve(true);\n const promptKey = options.scope;\n const existingPrompt = this.#pendingPrompts.get(promptKey);\n if (existingPrompt) return existingPrompt;\n\n const watchers = this.#dirtyEntries(options.scope).map(entry => entry.ref);\n const message = watchers.find(watcher => watcher.message)?.message ?? this.#i18n.t('core.service.unsaved-changes.message');\n const run = async (): Promise<boolean> => {\n try {\n const rawDecision = await Promise.resolve(\n this.#adapter.confirm({ reason: options.reason ?? 'manual', scope: options.scope, message, watchers })\n );\n const decision: SdUnsavedChangesDecision = typeof rawDecision === 'boolean' ? (rawDecision ? 'discard' : 'cancel') : rawDecision;\n if (decision === 'save') return this.saveAll(options.scope);\n if (decision === 'discard') return this.discardAll(options.scope);\n return false;\n } catch {\n return false;\n }\n };\n\n const pending = run().finally(() => {\n if (this.#pendingPrompts.get(promptKey) === pending) this.#pendingPrompts.delete(promptKey);\n });\n this.#pendingPrompts.set(promptKey, pending);\n return pending;\n }\n\n saveAll(scope?: unknown): Promise<boolean> {\n return this.#runAll('save', scope);\n }\n\n resetAll(scope?: unknown): Promise<boolean> {\n return this.#runAll('reset', scope);\n }\n\n discardAll(scope?: unknown): Promise<boolean> {\n return this.#runAll('discard', scope);\n }\n\n async #runAll(action: 'save' | 'reset' | 'discard', scope?: unknown): Promise<boolean> {\n for (const entry of this.#dirtyEntries(scope)) {\n if (!(await this.#runEntryAction(entry, action))) return false;\n }\n return true;\n }\n\n async #runEntryAction(entry: RegistryEntry, action: 'save' | 'reset' | 'discard'): Promise<boolean> {\n if (entry.destroyed()) return true;\n try {\n const callback = entry.watcher[action];\n const result = callback ? await Promise.resolve(callback()) : undefined;\n if (result === false) return false;\n // A callback owns its underlying dirty source (for example FormGroup\n // marks itself pristine). Only synthesize pristine state when there is\n // no callback capable of updating that source.\n entry.dirtyOverride.set(callback ? undefined : false);\n return true;\n } catch {\n return false;\n }\n }\n\n #dirtyEntries(scope?: unknown): RegistryEntry[] {\n return this.#entries().filter(entry => (scope === undefined || Object.is(entry.watcher.scope, scope)) && entry.dirty());\n }\n\n #destroyEntry(entry: RegistryEntry): void {\n if (entry.destroyed()) return;\n entry.destroyed.set(true);\n this.#runCleanup(entry.watcher);\n this.#entries.update(entries => entries.filter(candidate => candidate !== entry));\n }\n\n #runCleanup(watcher: SdUnsavedChangesWatcher): void {\n try {\n watcher.cleanup?.();\n } catch {\n // Cleanup must never prevent registry teardown.\n }\n }\n}\n\nfunction readDirty(source: SdUnsavedChangesWatcher['isDirty']): boolean {\n if (typeof source === 'boolean') return source;\n if (isSignal(source)) return !!source();\n return !!source();\n}\n","import { signal } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { CanDeactivateFn } from '@angular/router';\nimport { SdUnsavedChangesConfirmOptions, SdUnsavedChangesMaybeAsync, SdUnsavedChangesRegistration } from './unsaved-changes.model';\nimport { SdUnsavedChangesService } from './unsaved-changes.service';\nimport { inject } from '@angular/core';\n\nexport interface SdUnsavedChangesFormOptions<TValue> {\n readonly id: string;\n readonly scope?: unknown;\n readonly message?: string;\n readonly save?: (value: TValue) => SdUnsavedChangesMaybeAsync<void | boolean>;\n readonly reset?: (form: FormGroup) => SdUnsavedChangesMaybeAsync<void | boolean>;\n readonly discard?: (form: FormGroup) => SdUnsavedChangesMaybeAsync<void | boolean>;\n}\n\nexport function registerSdUnsavedChangesForm<TValue extends Record<string, unknown>>(\n service: SdUnsavedChangesService,\n form: FormGroup,\n options: SdUnsavedChangesFormOptions<TValue>\n): SdUnsavedChangesRegistration {\n let snapshot = cloneValue(form.getRawValue()) as TValue;\n const dirty = signal(form.dirty);\n const subscription = form.events.subscribe(() => dirty.set(form.dirty));\n const resetToSnapshot = (): void => {\n form.reset(cloneValue(snapshot));\n form.markAsPristine();\n dirty.set(false);\n };\n const registration = service.register({\n id: options.id,\n scope: options.scope,\n message: options.message,\n isDirty: dirty,\n save: async () => {\n const result = options.save ? await Promise.resolve(options.save(form.getRawValue() as TValue)) : undefined;\n if (result === false) return false;\n snapshot = cloneValue(form.getRawValue()) as TValue;\n form.markAsPristine();\n dirty.set(false);\n return true;\n },\n reset: async () => {\n const result = options.reset ? await Promise.resolve(options.reset(form)) : undefined;\n if (result === false) return false;\n if (!options.reset) resetToSnapshot();\n else {\n form.markAsPristine();\n dirty.set(false);\n }\n return true;\n },\n discard: async () => {\n const result = options.discard ? await Promise.resolve(options.discard(form)) : undefined;\n if (result === false) return false;\n if (!options.discard) resetToSnapshot();\n else {\n form.markAsPristine();\n dirty.set(false);\n }\n return true;\n },\n cleanup: () => subscription.unsubscribe(),\n });\n return registration;\n}\n\nexport function createSdUnsavedChangesCloseGuard(\n service: SdUnsavedChangesService,\n options: Omit<SdUnsavedChangesConfirmOptions, 'reason'> = {}\n): () => Promise<boolean> {\n return () => service.confirmLeave({ ...options, reason: 'close' });\n}\n\nexport const sdUnsavedChangesGuard: CanDeactivateFn<unknown> = () => inject(SdUnsavedChangesService).confirmLeave({ reason: 'navigation' });\n\nfunction cloneValue<T>(value: T): T {\n if (value instanceof Date) return new Date(value.getTime()) as T;\n if (Array.isArray(value)) return value.map(item => cloneValue(item)) as T;\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneValue(item)])) as T;\n }\n return value;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, DestroyRef, signal, computed, Injectable } from '@angular/core';
3
+
4
+ const SD_VIEWPORT_DEFAULT_BREAKPOINTS = Object.freeze({
5
+ mobile: 0,
6
+ tablet: 768,
7
+ desktop: 1024,
8
+ });
9
+ const SD_VIEWPORT = new InjectionToken('sd.viewport', {
10
+ providedIn: 'root',
11
+ factory: () => (typeof window === 'undefined' ? null : window),
12
+ });
13
+ const SD_VIEWPORT_BREAKPOINTS = new InjectionToken('sd.viewport.breakpoints', {
14
+ providedIn: 'root',
15
+ factory: () => SD_VIEWPORT_DEFAULT_BREAKPOINTS,
16
+ });
17
+ function sdNormalizeViewportBreakpoints(value) {
18
+ const mobile = normalizeBreakpoint(value.mobile);
19
+ const tablet = normalizeBreakpoint(value.tablet);
20
+ const desktop = normalizeBreakpoint(value.desktop);
21
+ if (mobile === undefined || tablet === undefined || desktop === undefined || mobile >= tablet || tablet >= desktop) {
22
+ return SD_VIEWPORT_DEFAULT_BREAKPOINTS;
23
+ }
24
+ return Object.freeze({ mobile, tablet, desktop });
25
+ }
26
+ function normalizeBreakpoint(value) {
27
+ return Number.isFinite(value) && value >= 0 ? Math.floor(value) : undefined;
28
+ }
29
+
30
+ /**
31
+ * Exposes one SSR-safe, signal-based viewport state for the application.
32
+ * Breakpoints use min-width semantics and can be configured through `SD_VIEWPORT_BREAKPOINTS`.
33
+ */
34
+ class SdViewportService {
35
+ #viewport = inject(SD_VIEWPORT);
36
+ #destroyRef = inject(DestroyRef);
37
+ #width = signal(this.#viewport?.innerWidth ?? Number.MAX_SAFE_INTEGER);
38
+ #height = signal(this.#viewport?.innerHeight ?? Number.MAX_SAFE_INTEGER);
39
+ breakpoints = sdNormalizeViewportBreakpoints(inject(SD_VIEWPORT_BREAKPOINTS));
40
+ width = this.#width.asReadonly();
41
+ height = this.#height.asReadonly();
42
+ currentBreakpoint = computed(() => {
43
+ const width = this.width();
44
+ if (width >= this.breakpoints.desktop)
45
+ return 'desktop';
46
+ if (width >= this.breakpoints.tablet)
47
+ return 'tablet';
48
+ return 'mobile';
49
+ });
50
+ isMobile = computed(() => this.currentBreakpoint() === 'mobile');
51
+ isTablet = computed(() => this.currentBreakpoint() === 'tablet');
52
+ isDesktop = computed(() => this.currentBreakpoint() === 'desktop');
53
+ constructor() {
54
+ if (!this.#viewport)
55
+ return;
56
+ const onResize = () => {
57
+ this.#width.set(this.#viewport?.innerWidth ?? Number.MAX_SAFE_INTEGER);
58
+ this.#height.set(this.#viewport?.innerHeight ?? Number.MAX_SAFE_INTEGER);
59
+ };
60
+ this.#viewport.addEventListener('resize', onResize);
61
+ this.#destroyRef.onDestroy(() => this.#viewport?.removeEventListener('resize', onResize));
62
+ }
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdViewportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
64
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdViewportService, providedIn: 'root' });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdViewportService, decorators: [{
67
+ type: Injectable,
68
+ args: [{ providedIn: 'root' }]
69
+ }], ctorParameters: () => [] });
70
+
71
+ /**
72
+ * Generated bundle index. Do not edit.
73
+ */
74
+
75
+ export { SD_VIEWPORT, SD_VIEWPORT_BREAKPOINTS, SD_VIEWPORT_DEFAULT_BREAKPOINTS, SdViewportService, sdNormalizeViewportBreakpoints };
76
+ //# sourceMappingURL=sdcorejs-angular-services-viewport.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdcorejs-angular-services-viewport.mjs","sources":["../../../projects/sdcorejs-angular/services/viewport/src/viewport.tokens.ts","../../../projects/sdcorejs-angular/services/viewport/src/viewport.service.ts","../../../projects/sdcorejs-angular/services/viewport/sdcorejs-angular-services-viewport.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { SdViewport, SdViewportBreakpoints } from './viewport.model';\n\nexport const SD_VIEWPORT_DEFAULT_BREAKPOINTS: Readonly<SdViewportBreakpoints> = Object.freeze({\n mobile: 0,\n tablet: 768,\n desktop: 1024,\n});\n\nexport const SD_VIEWPORT = new InjectionToken<SdViewport | null>('sd.viewport', {\n providedIn: 'root',\n factory: () => (typeof window === 'undefined' ? null : window),\n});\n\nexport const SD_VIEWPORT_BREAKPOINTS = new InjectionToken<Readonly<SdViewportBreakpoints>>('sd.viewport.breakpoints', {\n providedIn: 'root',\n factory: () => SD_VIEWPORT_DEFAULT_BREAKPOINTS,\n});\n\nexport function sdNormalizeViewportBreakpoints(value: Readonly<SdViewportBreakpoints>): Readonly<SdViewportBreakpoints> {\n const mobile = normalizeBreakpoint(value.mobile);\n const tablet = normalizeBreakpoint(value.tablet);\n const desktop = normalizeBreakpoint(value.desktop);\n\n if (mobile === undefined || tablet === undefined || desktop === undefined || mobile >= tablet || tablet >= desktop) {\n return SD_VIEWPORT_DEFAULT_BREAKPOINTS;\n }\n\n return Object.freeze({ mobile, tablet, desktop });\n}\n\nfunction normalizeBreakpoint(value: number): number | undefined {\n return Number.isFinite(value) && value >= 0 ? Math.floor(value) : undefined;\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport { SdViewportBreakpoint } from './viewport.model';\nimport { SD_VIEWPORT, SD_VIEWPORT_BREAKPOINTS, sdNormalizeViewportBreakpoints } from './viewport.tokens';\n\n/**\n * Exposes one SSR-safe, signal-based viewport state for the application.\n * Breakpoints use min-width semantics and can be configured through `SD_VIEWPORT_BREAKPOINTS`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SdViewportService {\n readonly #viewport = inject(SD_VIEWPORT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #width = signal(this.#viewport?.innerWidth ?? Number.MAX_SAFE_INTEGER);\n readonly #height = signal(this.#viewport?.innerHeight ?? Number.MAX_SAFE_INTEGER);\n\n readonly breakpoints = sdNormalizeViewportBreakpoints(inject(SD_VIEWPORT_BREAKPOINTS));\n readonly width = this.#width.asReadonly();\n readonly height = this.#height.asReadonly();\n readonly currentBreakpoint = computed<SdViewportBreakpoint>(() => {\n const width = this.width();\n if (width >= this.breakpoints.desktop) return 'desktop';\n if (width >= this.breakpoints.tablet) return 'tablet';\n return 'mobile';\n });\n readonly isMobile = computed(() => this.currentBreakpoint() === 'mobile');\n readonly isTablet = computed(() => this.currentBreakpoint() === 'tablet');\n readonly isDesktop = computed(() => this.currentBreakpoint() === 'desktop');\n\n constructor() {\n if (!this.#viewport) return;\n\n const onResize = (): void => {\n this.#width.set(this.#viewport?.innerWidth ?? Number.MAX_SAFE_INTEGER);\n this.#height.set(this.#viewport?.innerHeight ?? Number.MAX_SAFE_INTEGER);\n };\n this.#viewport.addEventListener('resize', onResize);\n this.#destroyRef.onDestroy(() => this.#viewport?.removeEventListener('resize', onResize));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,15 @@
1
1
  export * from '@sdcorejs/angular/services/cache';
2
2
  export * from '@sdcorejs/angular/services/storage';
3
+ export * from '@sdcorejs/angular/services/persistence';
3
4
  export * from '@sdcorejs/angular/services/notify';
4
5
  export * from '@sdcorejs/angular/services/confirm';
5
6
  export * from '@sdcorejs/angular/services/api';
6
7
  export * from '@sdcorejs/angular/services/loading';
7
8
  export * from '@sdcorejs/angular/services/excel';
8
9
  export * from '@sdcorejs/angular/services/docx';
10
+ export * from '@sdcorejs/angular/services/viewport';
11
+ export * from '@sdcorejs/angular/services/unsaved-changes';
12
+ export * from '@sdcorejs/angular/services/task';
9
13
 
10
14
  /**
11
15
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services.mjs","sources":["../../../projects/sdcorejs-angular/services/sdcorejs-angular-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"sdcorejs-angular-services.mjs","sources":["../../../projects/sdcorejs-angular/services/sdcorejs-angular-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;AAEG"}
@@ -1,4 +1,4 @@
1
- import { AfterViewInit, ElementRef, EventEmitter, OnDestroy, OnInit, TemplateRef } from '@angular/core';
1
+ import { ElementRef, EventEmitter, OnDestroy, OnInit, TemplateRef } from '@angular/core';
2
2
  import { FormControl, FormGroup, FormGroupDirective, NgForm } from '@angular/forms';
3
3
  import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
4
4
  import { ErrorStateMatcher } from '@angular/material/core';
@@ -12,7 +12,7 @@ declare class SdAutocompleteErrotStateMatcher implements ErrorStateMatcher {
12
12
  constructor(formControl: FormControl);
13
13
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;
14
14
  }
15
- export declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, AfterViewInit {
15
+ export declare class SdAutocomplete<T = any> implements OnInit, OnDestroy {
16
16
  #private;
17
17
  id: string;
18
18
  inputRef: import("@angular/core").Signal<ElementRef<HTMLInputElement> | undefined>;
@@ -72,7 +72,7 @@ export declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, After
72
72
  valueModel: import("@angular/core").ModelSignal<string | number | null | undefined>;
73
73
  sdChange: import("@angular/core").OutputEmitterRef<string | number | null>;
74
74
  sdSelection: import("@angular/core").OutputEmitterRef<SdSelectionData<any>>;
75
- sdAdd: EventEmitter<void>;
75
+ readonly sdAdd: EventEmitter<void>;
76
76
  loading: import("@angular/core").WritableSignal<boolean>;
77
77
  isFocused: boolean;
78
78
  isTyping: import("@angular/core").WritableSignal<boolean>;
@@ -87,7 +87,6 @@ export declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, After
87
87
  getNestedValue: (obj: any, path: string | undefined) => any;
88
88
  constructor();
89
89
  ngOnInit(): void;
90
- ngAfterViewInit(): void;
91
90
  ngOnDestroy(): void;
92
91
  onSelect: (item: T) => void;
93
92
  onFocus: () => void;
@@ -1,15 +1,14 @@
1
- import { AfterViewInit, OnDestroy } from '@angular/core';
2
- import { FormControl, FormGroup } from '@angular/forms';
3
- import { SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
1
+ import { FormControl } from '@angular/forms';
2
+ import { SdViewed, SdViewedInput, ɵSdFormControlParent } from '@sdcorejs/angular/forms/models';
4
3
  import { Color } from '@sdcorejs/utils/models';
5
4
  import * as i0 from "@angular/core";
6
- export declare class SdCheckbox implements OnDestroy, AfterViewInit {
5
+ export declare class SdCheckbox {
7
6
  #private;
8
7
  id: string;
9
8
  formControl: FormControl<any>;
10
9
  readonly autoIdInput: import("@angular/core").InputSignalWithTransform<string | undefined, string | null | undefined>;
11
10
  readonly name: import("@angular/core").InputSignalWithTransform<string | undefined, string | null | undefined>;
12
- readonly form: import("@angular/core").InputSignalWithTransform<FormGroup<any> | undefined, any>;
11
+ readonly form: import("@angular/core").InputSignal<ɵSdFormControlParent>;
13
12
  readonly label: import("@angular/core").InputSignalWithTransform<string | undefined, string | null | undefined>;
14
13
  readonly color: import("@angular/core").InputSignalWithTransform<Color, Color | null | undefined>;
15
14
  readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
@@ -24,9 +23,6 @@ export declare class SdCheckbox implements OnDestroy, AfterViewInit {
24
23
  readonly dataDisabled: import("@angular/core").Signal<"true" | "false">;
25
24
  readonly dataEmpty: import("@angular/core").Signal<"true" | "false">;
26
25
  readonly dataValue: import("@angular/core").Signal<string>;
27
- constructor();
28
- ngAfterViewInit(): void;
29
- ngOnDestroy(): void;
30
26
  static ɵfac: i0.ɵɵFactoryDeclaration<SdCheckbox, never>;
31
27
  static ɵcmp: i0.ɵɵ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>;
32
28
  }
@@ -6,6 +6,7 @@ import { SdLabelDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms
6
6
  import { SdFormControl, SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
7
7
  import { Size } from '@sdcorejs/utils/models';
8
8
  import * as i0 from "@angular/core";
9
+ type SdDateModelValue = string | number | Date | undefined | null;
9
10
  export declare class SdDate implements OnDestroy, OnInit {
10
11
  #private;
11
12
  id: string;
@@ -61,14 +62,13 @@ export declare class SdDate implements OnDestroy, OnInit {
61
62
  maxInput: import("@angular/core").InputSignal<any>;
62
63
  maxDateInput: import("@angular/core").InputSignal<any>;
63
64
  resolvedMax: import("@angular/core").Signal<Date | null>;
64
- valueModel: import("@angular/core").ModelSignal<string | number | Date | null | undefined>;
65
+ valueModel: import("@angular/core").ModelSignal<SdDateModelValue>;
65
66
  sdChange: import("@angular/core").OutputEmitterRef<any>;
66
67
  sdFocus: import("@angular/core").OutputEmitterRef<void>;
67
68
  isMobileOrTablet: boolean;
68
69
  formControl: SdFormControl;
69
70
  isFocused: boolean;
70
71
  isValid?: boolean;
71
- constructor();
72
72
  ngOnInit(): void;
73
73
  ngOnDestroy(): void;
74
74
  onFocus: () => void;
@@ -86,3 +86,4 @@ export declare class SdDate implements OnDestroy, OnInit {
86
86
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDate, never>;
87
87
  static ɵcmp: i0.ɵɵComponentDeclaration<SdDate, "sd-date", 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; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "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; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "minDateInput": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "maxDateInput": { "alias": "maxDate"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef", "sdLabelDef"], ["[sdLabel]"], true, never>;
88
88
  }
89
+ export {};
@@ -1,4 +1,4 @@
1
- import { OnDestroy, OnInit, TemplateRef } from '@angular/core';
1
+ import { TemplateRef } from '@angular/core';
2
2
  import { FormControl, FormGroup } from '@angular/forms';
3
3
  import { MatDatepickerInputEvent, MatDateRangePicker } from '@angular/material/datepicker';
4
4
  import { FloatLabelType, MatFormFieldAppearance } from '@angular/material/form-field';
@@ -6,11 +6,11 @@ import { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
6
6
  import { SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
7
7
  import { Size } from '@sdcorejs/utils/models';
8
8
  import * as i0 from "@angular/core";
9
- interface Daterange {
9
+ export interface SdDateRangeValue {
10
10
  from?: string | null;
11
11
  to?: string | null;
12
12
  }
13
- export declare class SdDateRange implements OnDestroy, OnInit {
13
+ export declare class SdDateRange {
14
14
  #private;
15
15
  id1: string;
16
16
  id2: string;
@@ -67,15 +67,13 @@ export declare class SdDateRange implements OnDestroy, OnInit {
67
67
  resolvedMin: import("@angular/core").Signal<Date | null>;
68
68
  maxInput: import("@angular/core").InputSignal<any>;
69
69
  resolvedMax: import("@angular/core").Signal<Date | null>;
70
- valueModel: import("@angular/core").ModelSignal<Daterange | null | undefined>;
71
- sdChange: import("@angular/core").OutputEmitterRef<Daterange | null | undefined>;
70
+ valueModel: import("@angular/core").ModelSignal<SdDateRangeValue | null | undefined>;
71
+ sdChange: import("@angular/core").OutputEmitterRef<SdDateRangeValue | null | undefined>;
72
72
  isMobileOrTablet: boolean;
73
73
  formControl: FormControl<any>;
74
74
  control1: FormControl<any>;
75
75
  control2: FormControl<any>;
76
76
  constructor();
77
- ngOnInit(): void;
78
- ngOnDestroy(): void;
79
77
  onStartChange: (event: MatDatepickerInputEvent<Date>) => void;
80
78
  onEndChange: (event: MatDatepickerInputEvent<Date>) => void;
81
79
  clear: () => void;
@@ -87,4 +85,3 @@ export declare class SdDateRange implements OnDestroy, OnInit {
87
85
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDateRange, never>;
88
86
  static ɵcmp: i0.ɵɵComponentDeclaration<SdDateRange, "sd-date-range", 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; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; }, ["sdLabelDef", "sdValueTemplate"], never, true, never>;
89
87
  }
90
- export {};
@@ -5,6 +5,7 @@ import { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';
5
5
  import { SdFormControl, SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
6
6
  import { Size } from '@sdcorejs/utils/models';
7
7
  import * as i0 from "@angular/core";
8
+ type SdDatetimeModelValue = string | number | Date | undefined | null;
8
9
  export declare class SdDatetime implements OnDestroy, OnInit {
9
10
  #private;
10
11
  id: string;
@@ -62,7 +63,7 @@ export declare class SdDatetime implements OnDestroy, OnInit {
62
63
  maxInput: import("@angular/core").InputSignal<any>;
63
64
  maxDateInput: import("@angular/core").InputSignal<any>;
64
65
  resolvedMax: import("@angular/core").Signal<Date | null>;
65
- valueModel: import("@angular/core").ModelSignal<string | number | Date | null | undefined>;
66
+ valueModel: import("@angular/core").ModelSignal<SdDatetimeModelValue>;
66
67
  viewedDate: import("@angular/core").Signal<Date | null>;
67
68
  sdChange: import("@angular/core").OutputEmitterRef<any>;
68
69
  sdFocus: import("@angular/core").OutputEmitterRef<void>;
@@ -72,7 +73,6 @@ export declare class SdDatetime implements OnDestroy, OnInit {
72
73
  isValid?: boolean;
73
74
  /** State popup — true khi picker package đang mở. */
74
75
  pickerOpened: import("@angular/core").Signal<boolean>;
75
- constructor();
76
76
  ngOnInit(): void;
77
77
  ngOnDestroy(): void;
78
78
  /** Mở popup chọn datetime, neo vào input. */
@@ -96,3 +96,4 @@ export declare class SdDatetime implements OnDestroy, OnInit {
96
96
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDatetime, never>;
97
97
  static ɵcmp: i0.ɵɵComponentDeclaration<SdDatetime, "sd-datetime", 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; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "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; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "minDateInput": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "maxDateInput": { "alias": "maxDate"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef"], ["[sdLabel]"], true, never>;
98
98
  }
99
+ export {};
@@ -0,0 +1 @@
1
+ export * from './src/entity-picker.component';