@sdcorejs/angular 19.1.2 → 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.
- package/README.md +127 -807
- package/components/anchor/src/index.d.ts +1 -1
- package/components/anchor/src/models/index.d.ts +1 -1
- package/components/audit-diff/index.d.ts +2 -0
- package/components/audit-diff/src/audit-diff.component.d.ts +30 -0
- package/components/audit-diff/src/audit-diff.engine.d.ts +40 -0
- package/components/badge/src/badge.component.d.ts +1 -1
- package/components/breadcrumb/index.d.ts +1 -0
- package/components/breadcrumb/src/breadcrumb.component.d.ts +50 -0
- package/components/data-state/index.d.ts +1 -0
- package/components/data-state/src/data-state.component.d.ts +40 -0
- package/components/document-builder/index.d.ts +2 -2
- package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +1 -2
- package/components/document-builder/src/document-builder.component.d.ts +4 -4
- package/components/document-builder/src/plugins/index.d.ts +1 -1
- package/components/editor/index.d.ts +1 -1
- package/components/editor/src/models/index.d.ts +2 -2
- package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +7 -8
- package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +4 -5
- package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +1 -2
- package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +6 -5
- package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +4 -5
- package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +9 -9
- package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +8 -7
- package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +8 -7
- package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +3 -4
- package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +5 -6
- package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +1 -2
- package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +4 -5
- package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +2 -2
- package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +6 -5
- package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +7 -6
- package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +7 -8
- package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +3 -4
- package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +25 -2
- package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +7 -7
- package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +6 -6
- package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +6 -7
- package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +6 -7
- package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +8 -8
- package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +4 -4
- package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +8 -9
- package/components/form-generic/src/configurations/index.d.ts +1 -1
- package/components/form-generic/src/models/form-render/index.d.ts +2 -2
- package/components/form-generic/src/models/index.d.ts +6 -6
- package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +2 -3
- package/components/form-generic/src/pipes/html.pipe.d.ts +2 -2
- package/components/form-generic/src/services/form-render.service.d.ts +2 -2
- package/components/import-excel/index.d.ts +1 -1
- package/components/import-excel/src/import-excel.component.d.ts +4 -7
- package/components/import-excel/src/pipes/column-transform.pipe.d.ts +3 -2
- package/components/index.d.ts +4 -0
- package/components/job-progress/index.d.ts +1 -0
- package/components/job-progress/src/job-progress.component.d.ts +34 -0
- package/components/mini-editor/index.d.ts +1 -1
- package/components/mini-editor/src/mini-editor.component.d.ts +7 -7
- package/components/modal/src/modal.component.d.ts +6 -1
- package/components/org-chart/index.d.ts +1 -1
- package/components/preview/index.d.ts +5 -2
- package/components/preview/src/preview-pdf/preview-pdf.browser.d.ts +28 -0
- package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +61 -23
- package/components/preview/src/preview-pdf/preview-pdf.pdfjs.d.ts +77 -0
- package/components/preview/src/preview-pdf/preview-pdf.print.d.ts +10 -0
- package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +11 -9
- package/components/side-drawer/src/side-drawer.component.d.ts +6 -1
- package/components/tab/src/tab-group.component.d.ts +1 -0
- package/components/tab/src/tab.component.d.ts +7 -1
- package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +3 -4
- package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
- package/components/tab-router/src/services/tab-decorator.service.d.ts +2 -1
- package/components/table/index.d.ts +1 -1
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -1
- package/components/table/src/components/popup-export/popup-export.component.d.ts +6 -6
- package/components/table/src/models/index.d.ts +4 -4
- package/components/table/src/models/table-column.model.d.ts +1 -1
- package/components/table/src/services/config.service.d.ts +3 -2
- package/components/table/src/services/table-filter/table-filter.model.d.ts +1 -1
- package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
- package/components/tree/index.d.ts +1 -1
- package/components/tree/src/tree.component.d.ts +13 -2
- package/components/tree/src/tree.model.d.ts +11 -0
- package/components/upload-file/src/components/preview/preview.component.d.ts +4 -4
- package/directives/src/sd-hover-copy.directive.d.ts +6 -5
- package/directives/src/sd-href.directive.d.ts +2 -2
- package/directives/src/sd-scroll.directive.d.ts +3 -2
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
- package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
- package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
- package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs +16 -21
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +600 -853
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +25 -40
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
- package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +9 -19
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +60 -3
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +1437 -217
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +9 -17
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +38 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +76 -52
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +47 -3
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +121 -87
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +187 -17
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +16 -22
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components.mjs +4 -0
- package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
- package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +9 -8
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -73
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +8 -4
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +8 -4
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +18 -14
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +48 -70
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +63 -529
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs +4 -2
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +15 -10
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +296 -58
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -68
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +8 -21
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -66
- package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +8 -6
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs +279 -0
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-time.mjs +309 -0
- package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
- package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
- package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +859 -78
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules.mjs +0 -1
- package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
- package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
- package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
- package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
- package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-loading.mjs +340 -66
- package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
- package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
- package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
- package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
- package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
- package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
- package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services.mjs +4 -0
- package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
- package/forms/autocomplete/src/autocomplete.component.d.ts +3 -4
- package/forms/checkbox/src/checkbox.component.d.ts +4 -8
- package/forms/date/src/date.component.d.ts +4 -3
- package/forms/date-range/src/date-range.component.d.ts +5 -8
- package/forms/datetime/src/datetime.component.d.ts +4 -3
- package/forms/entity-picker/index.d.ts +1 -0
- package/forms/entity-picker/src/entity-picker.component.d.ts +123 -0
- package/forms/index.d.ts +6 -0
- package/forms/input/index.d.ts +1 -0
- package/forms/input/src/input-mask.d.ts +43 -0
- package/forms/input/src/input.component.d.ts +28 -9
- package/forms/input-color/src/input-color.component.d.ts +3 -1
- package/forms/input-number/src/input-number.component.d.ts +4 -2
- package/forms/models/index.d.ts +3 -2
- package/forms/models/src/sd-form-control-connector.d.ts +86 -0
- package/forms/radio/src/radio.component.d.ts +12 -8
- package/forms/src/forms.module.d.ts +9 -5
- package/forms/switch/src/switch.component.d.ts +4 -7
- package/forms/time/index.d.ts +3 -0
- package/forms/time/src/time-picker.adapter.d.ts +13 -0
- package/forms/time/src/time-value.d.ts +19 -0
- package/forms/time/src/time.component.d.ts +78 -0
- package/forms/time-range/index.d.ts +2 -0
- package/forms/time-range/src/time-range-value.d.ts +14 -0
- package/forms/time-range/src/time-range.component.d.ts +80 -0
- package/forms/tree-select/index.d.ts +1 -0
- package/forms/tree-select/src/tree-select.component.d.ts +71 -0
- package/i18n/src/en.d.ts +68 -2
- package/interceptors/no-internet/no-internet.interceptor.d.ts +2 -3
- package/interceptors/unauthorized/unauthorized.interceptor.d.ts +2 -2
- package/modules/auth/services/index.d.ts +1 -1
- package/modules/icon/src/icon.model.d.ts +1 -2
- package/modules/icon/src/icon.provider.d.ts +1 -1
- package/modules/index.d.ts +0 -1
- package/modules/layout/components/index.d.ts +6 -0
- package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -2
- package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +28 -0
- package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +25 -0
- package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +27 -0
- package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +28 -0
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +3 -4
- package/modules/layout/components/sidebar-v1/main.component.d.ts +2 -2
- package/modules/layout/components/sidebar-v2/main.component.d.ts +36 -0
- package/modules/layout/components/sidebar-v3/main.component.d.ts +29 -0
- package/modules/layout/configurations/layout.configuration.d.ts +36 -2
- package/modules/layout/index.d.ts +1 -0
- package/modules/layout/pipes/menu.pipe.d.ts +2 -2
- package/modules/layout/services/index.d.ts +4 -1
- package/modules/layout/services/layout.service.d.ts +2 -2
- package/modules/layout/services/menu/menu.utils.d.ts +6 -0
- package/modules/layout/services/navigation-state/navigation-state.service.d.ts +18 -0
- package/modules/layout/services/responsive/responsive.service.d.ts +12 -0
- package/modules/layout/services/storage/storage.service.d.ts +21 -8
- package/package.json +50 -5
- package/pipes/src/safe-html.pipe.d.ts +2 -2
- package/services/api/src/api.model.d.ts +54 -15
- package/services/api/src/api.service.d.ts +13 -8
- package/services/api/src/interceptors/api.interceptor.d.ts +1 -1
- package/services/cache/src/cache.model.d.ts +46 -13
- package/services/cache/src/cache.service.d.ts +5 -2
- package/services/confirm/src/lib/confirm.service.d.ts +2 -2
- package/services/docx/src/lib/docx.service.d.ts +2 -3
- package/services/excel/src/public-api.d.ts +1 -1
- package/services/index.d.ts +4 -0
- package/services/loading/src/loading.service.d.ts +15 -8
- package/services/notify/src/components/toast/toast.component.d.ts +2 -3
- package/services/persistence/index.d.ts +5 -0
- package/services/persistence/src/graph-serializer.d.ts +16 -0
- package/services/persistence/src/persistence-envelope.d.ts +28 -0
- package/services/persistence/src/persistence-key.d.ts +17 -0
- package/services/persistence/src/persistence.model.d.ts +63 -0
- package/services/persistence/src/storage-adapter.d.ts +29 -0
- package/services/storage/src/storage.model.d.ts +20 -5
- package/services/storage/src/storage.service.d.ts +6 -3
- package/services/task/index.d.ts +3 -0
- package/services/task/src/task.model.d.ts +75 -0
- package/services/task/src/task.service.d.ts +14 -0
- package/services/task/src/task.tokens.d.ts +12 -0
- package/services/unsaved-changes/index.d.ts +4 -0
- package/services/unsaved-changes/src/unsaved-changes.adapters.d.ts +15 -0
- package/services/unsaved-changes/src/unsaved-changes.model.d.ts +41 -0
- package/services/unsaved-changes/src/unsaved-changes.service.d.ts +16 -0
- package/services/unsaved-changes/src/unsaved-changes.tokens.d.ts +9 -0
- package/services/viewport/index.d.ts +3 -0
- package/services/viewport/src/viewport.model.d.ts +12 -0
- package/services/viewport/src/viewport.service.d.ts +18 -0
- package/services/viewport/src/viewport.tokens.d.ts +6 -0
- package/utilities/models/index.d.ts +7 -7
- package/fesm2022/sdcorejs-angular-modules-authom.mjs +0 -360
- package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +0 -1
- package/forms/datetime/src/material-datetime/index.d.ts +0 -14
- package/forms/datetime/src/material-datetime/lib/core/date-adapter.d.ts +0 -10
- package/forms/datetime/src/material-datetime/lib/core/date-formats.d.ts +0 -18
- package/forms/datetime/src/material-datetime/lib/core/default-options.d.ts +0 -13
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-actions.component.d.ts +0 -5
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-apply.directive.d.ts +0 -7
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-cancel.directive.d.ts +0 -7
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-input.directive.d.ts +0 -24
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-now.directive.d.ts +0 -7
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-toggle.directive.d.ts +0 -8
- package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker.component.d.ts +0 -39
- package/forms/datetime/src/material-datetime/lib/native/native-date-adapter.d.ts +0 -15
- package/forms/datetime/src/material-datetime/lib/native/native-date-formats.d.ts +0 -2
- package/forms/datetime/src/material-datetime/lib/native/provide-native.d.ts +0 -3
- package/forms/datetime/src/material-datetime/lib/time-spinner/time-spinner.component.d.ts +0 -31
- package/modules/authom/authom.configuration.d.ts +0 -17
- package/modules/authom/authom.interceptor.d.ts +0 -3
- package/modules/authom/authom.module.d.ts +0 -16
- package/modules/authom/authom.service.d.ts +0 -32
- package/modules/authom/index.d.ts +0 -35
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { InjectionToken, inject, DestroyRef, signal, computed, Injectable } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
function isSdTaskTerminal(status) {
|
|
6
|
+
return status === 'succeeded' || status === 'failed' || status === 'cancelled';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const SD_TASK_EVENT_SOURCE_FACTORY = new InjectionToken('SD_TASK_EVENT_SOURCE_FACTORY', {
|
|
10
|
+
factory: () => {
|
|
11
|
+
const windowRef = inject(DOCUMENT).defaultView;
|
|
12
|
+
if (!windowRef?.EventSource)
|
|
13
|
+
return null;
|
|
14
|
+
return {
|
|
15
|
+
create: (url, init) => new windowRef.EventSource(url, init),
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const SD_TASK_RANDOM = new InjectionToken('SD_TASK_RANDOM', {
|
|
20
|
+
factory: () => Math.random,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const DEFAULT_POLL_INTERVAL_MS = 2000;
|
|
24
|
+
const DEFAULT_RETRY_POLICY = {
|
|
25
|
+
maxAttempts: 3,
|
|
26
|
+
initialDelayMs: 1000,
|
|
27
|
+
backoff: 2,
|
|
28
|
+
maxDelayMs: 30_000,
|
|
29
|
+
jitter: 0.2,
|
|
30
|
+
};
|
|
31
|
+
const MAX_TIMER_MS = 2_147_483_647;
|
|
32
|
+
class SdTaskService {
|
|
33
|
+
#eventSourceFactory = inject(SD_TASK_EVENT_SOURCE_FACTORY);
|
|
34
|
+
#random = inject(SD_TASK_RANDOM);
|
|
35
|
+
#destroyRef = inject(DestroyRef);
|
|
36
|
+
#entries = signal(new Map());
|
|
37
|
+
tasks = computed(() => [...this.#entries().values()].map(entry => entry.view));
|
|
38
|
+
constructor() {
|
|
39
|
+
this.#destroyRef.onDestroy(() => {
|
|
40
|
+
for (const entry of this.#entries().values()) {
|
|
41
|
+
entry.destroyed = true;
|
|
42
|
+
this.#stop(entry);
|
|
43
|
+
}
|
|
44
|
+
this.#entries.set(new Map());
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
watch(options) {
|
|
48
|
+
const existing = this.#entries().get(options.id);
|
|
49
|
+
if (existing) {
|
|
50
|
+
existing.subscriberCountSignal.update(count => count + 1);
|
|
51
|
+
return this.#createLease(existing);
|
|
52
|
+
}
|
|
53
|
+
const initialState = normalizeState(options.id, options.initialState ?? { id: options.id, status: 'queued' });
|
|
54
|
+
const stateSignal = signal(initialState);
|
|
55
|
+
const connectionSignal = signal(options.source.mode === 'manual' ? 'idle' : 'connecting');
|
|
56
|
+
const errorSignal = signal(null);
|
|
57
|
+
const subscriberCountSignal = signal(1);
|
|
58
|
+
const pendingCancelSignal = signal(false);
|
|
59
|
+
const entry = {};
|
|
60
|
+
const view = {
|
|
61
|
+
id: options.id,
|
|
62
|
+
state: stateSignal.asReadonly(),
|
|
63
|
+
connection: connectionSignal.asReadonly(),
|
|
64
|
+
error: errorSignal.asReadonly(),
|
|
65
|
+
subscriberCount: subscriberCountSignal.asReadonly(),
|
|
66
|
+
canCancel: computed(() => {
|
|
67
|
+
const status = stateSignal().status;
|
|
68
|
+
return !pendingCancelSignal() && (status === 'queued' || status === 'running');
|
|
69
|
+
}),
|
|
70
|
+
canRetry: computed(() => {
|
|
71
|
+
const status = stateSignal().status;
|
|
72
|
+
return connectionSignal() === 'error' || status === 'failed' || status === 'cancelled';
|
|
73
|
+
}),
|
|
74
|
+
cancel: () => this.#cancel(entry),
|
|
75
|
+
retry: () => this.#retry(entry),
|
|
76
|
+
};
|
|
77
|
+
Object.assign(entry, {
|
|
78
|
+
id: options.id,
|
|
79
|
+
source: options.source,
|
|
80
|
+
stateSignal,
|
|
81
|
+
connectionSignal,
|
|
82
|
+
errorSignal,
|
|
83
|
+
subscriberCountSignal,
|
|
84
|
+
pendingCancelSignal,
|
|
85
|
+
view,
|
|
86
|
+
messageQueue: Promise.resolve(),
|
|
87
|
+
generation: 0,
|
|
88
|
+
failures: 0,
|
|
89
|
+
requestAttempt: 0,
|
|
90
|
+
destroyed: false,
|
|
91
|
+
});
|
|
92
|
+
this.#entries.update(entries => new Map(entries).set(options.id, entry));
|
|
93
|
+
if (!isSdTaskTerminal(initialState.status))
|
|
94
|
+
this.#start(entry);
|
|
95
|
+
else
|
|
96
|
+
connectionSignal.set('closed');
|
|
97
|
+
return this.#createLease(entry);
|
|
98
|
+
}
|
|
99
|
+
get(id) {
|
|
100
|
+
return this.#entries().get(id)?.view;
|
|
101
|
+
}
|
|
102
|
+
update(id, patch) {
|
|
103
|
+
const entry = this.#entries().get(id);
|
|
104
|
+
if (!entry)
|
|
105
|
+
return false;
|
|
106
|
+
this.#applyState(entry, { ...entry.stateSignal(), ...patch, id });
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
cancel(id) {
|
|
110
|
+
const entry = this.#entries().get(id);
|
|
111
|
+
return entry ? this.#cancel(entry) : Promise.resolve(false);
|
|
112
|
+
}
|
|
113
|
+
retry(id) {
|
|
114
|
+
const entry = this.#entries().get(id);
|
|
115
|
+
if (!entry)
|
|
116
|
+
return false;
|
|
117
|
+
this.#retry(entry);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
#createLease(entry) {
|
|
121
|
+
const destroyed = signal(false);
|
|
122
|
+
return {
|
|
123
|
+
...entry.view,
|
|
124
|
+
destroyed: destroyed.asReadonly(),
|
|
125
|
+
destroy: () => {
|
|
126
|
+
if (destroyed())
|
|
127
|
+
return;
|
|
128
|
+
destroyed.set(true);
|
|
129
|
+
entry.subscriberCountSignal.update(count => Math.max(0, count - 1));
|
|
130
|
+
if (entry.subscriberCountSignal() > 0)
|
|
131
|
+
return;
|
|
132
|
+
entry.destroyed = true;
|
|
133
|
+
this.#stop(entry);
|
|
134
|
+
this.#entries.update(entries => {
|
|
135
|
+
if (entries.get(entry.id) !== entry)
|
|
136
|
+
return entries;
|
|
137
|
+
const next = new Map(entries);
|
|
138
|
+
next.delete(entry.id);
|
|
139
|
+
return next;
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
#start(entry) {
|
|
145
|
+
if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status))
|
|
146
|
+
return;
|
|
147
|
+
this.#stop(entry);
|
|
148
|
+
entry.destroyed = false;
|
|
149
|
+
entry.failures = 0;
|
|
150
|
+
entry.requestAttempt = 0;
|
|
151
|
+
entry.errorSignal.set(null);
|
|
152
|
+
const generation = entry.generation;
|
|
153
|
+
if (entry.source.mode === 'manual') {
|
|
154
|
+
entry.connectionSignal.set('idle');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
entry.connectionSignal.set('connecting');
|
|
158
|
+
if (entry.source.mode === 'poll')
|
|
159
|
+
void this.#runPoll(entry, generation);
|
|
160
|
+
else
|
|
161
|
+
this.#openSse(entry, generation);
|
|
162
|
+
}
|
|
163
|
+
#stop(entry) {
|
|
164
|
+
entry.generation += 1;
|
|
165
|
+
if (entry.timer)
|
|
166
|
+
clearTimeout(entry.timer);
|
|
167
|
+
entry.timer = undefined;
|
|
168
|
+
entry.controller?.abort();
|
|
169
|
+
entry.controller = undefined;
|
|
170
|
+
entry.eventSource?.close();
|
|
171
|
+
entry.eventSource = undefined;
|
|
172
|
+
}
|
|
173
|
+
async #runPoll(entry, generation) {
|
|
174
|
+
if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'poll')
|
|
175
|
+
return;
|
|
176
|
+
const controller = new AbortController();
|
|
177
|
+
entry.controller = controller;
|
|
178
|
+
const attempt = ++entry.requestAttempt;
|
|
179
|
+
try {
|
|
180
|
+
const state = await Promise.resolve(entry.source.load({ id: entry.id, signal: controller.signal, attempt, state: entry.stateSignal() }));
|
|
181
|
+
if (!this.#isCurrent(entry, generation) || controller.signal.aborted)
|
|
182
|
+
return;
|
|
183
|
+
entry.controller = undefined;
|
|
184
|
+
entry.failures = 0;
|
|
185
|
+
entry.errorSignal.set(null);
|
|
186
|
+
entry.connectionSignal.set('open');
|
|
187
|
+
this.#applyState(entry, state);
|
|
188
|
+
if (!this.#isCurrent(entry, generation) || isSdTaskTerminal(entry.stateSignal().status))
|
|
189
|
+
return;
|
|
190
|
+
this.#schedule(entry, normalizeTimer(entry.source.intervalMs, DEFAULT_POLL_INTERVAL_MS), () => this.#runPoll(entry, generation));
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (!this.#isCurrent(entry, generation) || controller.signal.aborted)
|
|
194
|
+
return;
|
|
195
|
+
entry.controller = undefined;
|
|
196
|
+
this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#runPoll(entry, generation));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
#openSse(entry, generation) {
|
|
200
|
+
if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'sse')
|
|
201
|
+
return;
|
|
202
|
+
if (!this.#eventSourceFactory) {
|
|
203
|
+
entry.connectionSignal.set('error');
|
|
204
|
+
entry.errorSignal.set(new Error('EventSource is unavailable in this environment.'));
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
let eventSource;
|
|
208
|
+
try {
|
|
209
|
+
const url = typeof entry.source.url === 'function' ? entry.source.url() : entry.source.url;
|
|
210
|
+
eventSource = this.#eventSourceFactory.create(url, entry.source.eventSourceInit);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
entry.eventSource = eventSource;
|
|
217
|
+
eventSource.onopen = () => {
|
|
218
|
+
if (!this.#isCurrentEventSource(entry, generation, eventSource))
|
|
219
|
+
return;
|
|
220
|
+
entry.failures = 0;
|
|
221
|
+
entry.errorSignal.set(null);
|
|
222
|
+
entry.connectionSignal.set('open');
|
|
223
|
+
};
|
|
224
|
+
eventSource.onmessage = event => {
|
|
225
|
+
entry.messageQueue = entry.messageQueue.then(() => this.#handleSseMessage(entry, generation, eventSource, event));
|
|
226
|
+
};
|
|
227
|
+
eventSource.onerror = event => {
|
|
228
|
+
if (!this.#isCurrentEventSource(entry, generation, eventSource))
|
|
229
|
+
return;
|
|
230
|
+
eventSource.close();
|
|
231
|
+
entry.eventSource = undefined;
|
|
232
|
+
this.#handleConnectionFailure(entry, generation, event, entry.source.mode === 'sse' ? entry.source.retry : undefined, () => this.#openSse(entry, generation));
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
async #handleSseMessage(entry, generation, eventSource, event) {
|
|
236
|
+
if (!this.#isCurrentEventSource(entry, generation, eventSource) || entry.source.mode !== 'sse')
|
|
237
|
+
return;
|
|
238
|
+
try {
|
|
239
|
+
const state = entry.source.parse
|
|
240
|
+
? await Promise.resolve(entry.source.parse(event))
|
|
241
|
+
: JSON.parse(event.data);
|
|
242
|
+
if (!this.#isCurrentEventSource(entry, generation, eventSource))
|
|
243
|
+
return;
|
|
244
|
+
entry.errorSignal.set(null);
|
|
245
|
+
this.#applyState(entry, state);
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
if (!this.#isCurrentEventSource(entry, generation, eventSource))
|
|
249
|
+
return;
|
|
250
|
+
eventSource.close();
|
|
251
|
+
entry.eventSource = undefined;
|
|
252
|
+
this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
#handleConnectionFailure(entry, generation, error, policy, retry) {
|
|
256
|
+
if (!this.#isCurrent(entry, generation))
|
|
257
|
+
return;
|
|
258
|
+
entry.failures += 1;
|
|
259
|
+
entry.errorSignal.set(error);
|
|
260
|
+
const normalized = normalizeRetryPolicy(policy);
|
|
261
|
+
if (entry.failures > normalized.maxAttempts) {
|
|
262
|
+
entry.connectionSignal.set('error');
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
entry.connectionSignal.set('reconnecting');
|
|
266
|
+
this.#schedule(entry, this.#retryDelay(normalized, entry.failures), retry);
|
|
267
|
+
}
|
|
268
|
+
#retryDelay(policy, failure) {
|
|
269
|
+
const exponential = Math.min(policy.maxDelayMs, policy.initialDelayMs * Math.pow(policy.backoff, failure - 1));
|
|
270
|
+
const jitter = exponential * policy.jitter * (this.#random() * 2 - 1);
|
|
271
|
+
return Math.max(0, Math.min(policy.maxDelayMs, Math.round(exponential + jitter)));
|
|
272
|
+
}
|
|
273
|
+
#schedule(entry, delayMs, callback) {
|
|
274
|
+
if (entry.timer)
|
|
275
|
+
clearTimeout(entry.timer);
|
|
276
|
+
entry.timer = setTimeout(() => {
|
|
277
|
+
entry.timer = undefined;
|
|
278
|
+
void callback();
|
|
279
|
+
}, normalizeTimer(delayMs, 0));
|
|
280
|
+
}
|
|
281
|
+
#applyState(entry, state) {
|
|
282
|
+
const normalized = normalizeState(entry.id, state);
|
|
283
|
+
entry.stateSignal.set(normalized);
|
|
284
|
+
if (!isSdTaskTerminal(normalized.status))
|
|
285
|
+
return;
|
|
286
|
+
this.#stop(entry);
|
|
287
|
+
entry.connectionSignal.set('closed');
|
|
288
|
+
}
|
|
289
|
+
#cancel(entry) {
|
|
290
|
+
if (entry.pendingCancel)
|
|
291
|
+
return entry.pendingCancel;
|
|
292
|
+
if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status)) {
|
|
293
|
+
return Promise.resolve(false);
|
|
294
|
+
}
|
|
295
|
+
const generation = entry.generation;
|
|
296
|
+
entry.pendingCancelSignal.set(true);
|
|
297
|
+
let actionResult;
|
|
298
|
+
try {
|
|
299
|
+
actionResult = entry.source.cancel?.({ id: entry.id, state: entry.stateSignal() });
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
entry.pendingCancelSignal.set(false);
|
|
303
|
+
entry.errorSignal.set(error);
|
|
304
|
+
return Promise.resolve(false);
|
|
305
|
+
}
|
|
306
|
+
const pending = Promise.resolve(actionResult)
|
|
307
|
+
.then(result => {
|
|
308
|
+
if (result === false)
|
|
309
|
+
return false;
|
|
310
|
+
if (!this.#isCurrent(entry, generation))
|
|
311
|
+
return true;
|
|
312
|
+
if (result && typeof result === 'object')
|
|
313
|
+
this.#applyState(entry, result);
|
|
314
|
+
else
|
|
315
|
+
this.#applyState(entry, { ...entry.stateSignal(), id: entry.id, status: 'cancelled' });
|
|
316
|
+
return true;
|
|
317
|
+
})
|
|
318
|
+
.catch((error) => {
|
|
319
|
+
if (this.#isCurrent(entry, generation))
|
|
320
|
+
entry.errorSignal.set(error);
|
|
321
|
+
return false;
|
|
322
|
+
})
|
|
323
|
+
.finally(() => {
|
|
324
|
+
if (entry.pendingCancel === pending) {
|
|
325
|
+
entry.pendingCancel = undefined;
|
|
326
|
+
entry.pendingCancelSignal.set(false);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
entry.pendingCancel = pending;
|
|
330
|
+
return pending;
|
|
331
|
+
}
|
|
332
|
+
#retry(entry) {
|
|
333
|
+
if (entry.destroyed || entry.subscriberCountSignal() === 0 || entry.stateSignal().status === 'succeeded')
|
|
334
|
+
return;
|
|
335
|
+
const status = entry.stateSignal().status;
|
|
336
|
+
if (entry.connectionSignal() !== 'error' && status !== 'failed' && status !== 'cancelled')
|
|
337
|
+
return;
|
|
338
|
+
if (status === 'failed' || status === 'cancelled') {
|
|
339
|
+
entry.stateSignal.set({ ...entry.stateSignal(), status: 'queued', progress: undefined, error: undefined });
|
|
340
|
+
}
|
|
341
|
+
this.#start(entry);
|
|
342
|
+
}
|
|
343
|
+
#isCurrent(entry, generation) {
|
|
344
|
+
return !entry.destroyed && entry.subscriberCountSignal() > 0 && entry.generation === generation;
|
|
345
|
+
}
|
|
346
|
+
#isCurrentEventSource(entry, generation, eventSource) {
|
|
347
|
+
return this.#isCurrent(entry, generation) && entry.eventSource === eventSource;
|
|
348
|
+
}
|
|
349
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTaskService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
350
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTaskService, providedIn: 'root' });
|
|
351
|
+
}
|
|
352
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTaskService, decorators: [{
|
|
353
|
+
type: Injectable,
|
|
354
|
+
args: [{ providedIn: 'root' }]
|
|
355
|
+
}], ctorParameters: () => [] });
|
|
356
|
+
function normalizeState(id, state) {
|
|
357
|
+
const progress = state.progress;
|
|
358
|
+
return {
|
|
359
|
+
...state,
|
|
360
|
+
id,
|
|
361
|
+
progress: progress === undefined || !Number.isFinite(progress) ? undefined : Math.max(0, Math.min(100, progress)),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function normalizeRetryPolicy(policy) {
|
|
365
|
+
return {
|
|
366
|
+
maxAttempts: normalizeInteger(policy?.maxAttempts, DEFAULT_RETRY_POLICY.maxAttempts, 0, 100),
|
|
367
|
+
initialDelayMs: normalizeTimer(policy?.initialDelayMs, DEFAULT_RETRY_POLICY.initialDelayMs),
|
|
368
|
+
backoff: normalizeNumber(policy?.backoff, DEFAULT_RETRY_POLICY.backoff, 1, 100),
|
|
369
|
+
maxDelayMs: normalizeTimer(policy?.maxDelayMs, DEFAULT_RETRY_POLICY.maxDelayMs),
|
|
370
|
+
jitter: normalizeNumber(policy?.jitter, DEFAULT_RETRY_POLICY.jitter, 0, 1),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function normalizeTimer(value, fallback) {
|
|
374
|
+
return normalizeInteger(value, fallback, 0, MAX_TIMER_MS);
|
|
375
|
+
}
|
|
376
|
+
function normalizeInteger(value, fallback, min, max) {
|
|
377
|
+
return Math.round(normalizeNumber(value, fallback, min, max));
|
|
378
|
+
}
|
|
379
|
+
function normalizeNumber(value, fallback, min, max) {
|
|
380
|
+
const normalized = typeof value === 'number' && Number.isFinite(value) ? value : fallback;
|
|
381
|
+
return Math.max(min, Math.min(max, normalized));
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Generated bundle index. Do not edit.
|
|
386
|
+
*/
|
|
387
|
+
|
|
388
|
+
export { SD_TASK_EVENT_SOURCE_FACTORY, SD_TASK_RANDOM, SdTaskService, isSdTaskTerminal };
|
|
389
|
+
//# sourceMappingURL=sdcorejs-angular-services-task.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-services-task.mjs","sources":["../../../projects/sdcorejs-angular/services/task/src/task.model.ts","../../../projects/sdcorejs-angular/services/task/src/task.tokens.ts","../../../projects/sdcorejs-angular/services/task/src/task.service.ts","../../../projects/sdcorejs-angular/services/task/sdcorejs-angular-services-task.ts"],"sourcesContent":["import { Signal } from '@angular/core';\n\nexport type SdTaskMaybeAsync<T> = T | PromiseLike<T>;\nexport type SdTaskStatus = 'idle' | 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';\nexport type SdTaskConnectionState = 'idle' | 'connecting' | 'open' | 'reconnecting' | 'closed' | 'error';\n\nexport interface SdTaskState<TResult = unknown> {\n readonly id: string;\n readonly status: SdTaskStatus;\n readonly progress?: number;\n readonly title?: string;\n readonly message?: string;\n readonly error?: unknown;\n readonly result?: TResult;\n readonly updatedAt?: number | Date;\n}\n\nexport interface SdTaskRetryPolicy {\n readonly maxAttempts?: number;\n readonly initialDelayMs?: number;\n readonly backoff?: number;\n readonly maxDelayMs?: number;\n readonly jitter?: number;\n}\n\nexport interface SdTaskLoadContext<TResult = unknown> {\n readonly id: string;\n readonly signal: AbortSignal;\n readonly attempt: number;\n readonly state: SdTaskState<TResult>;\n}\n\nexport interface SdTaskActionContext<TResult = unknown> {\n readonly id: string;\n readonly state: SdTaskState<TResult>;\n}\n\nexport type SdTaskCancelResult<TResult = unknown> = void | boolean | SdTaskState<TResult>;\nexport type SdTaskCancelHandler<TResult = unknown> = (\n context: SdTaskActionContext<TResult>\n) => SdTaskMaybeAsync<SdTaskCancelResult<TResult>>;\n\ninterface SdTaskSourceBase<TResult> {\n readonly cancel?: SdTaskCancelHandler<TResult>;\n}\n\nexport interface SdTaskManualSource<TResult = unknown> extends SdTaskSourceBase<TResult> {\n readonly mode: 'manual';\n}\n\nexport interface SdTaskPollingSource<TResult = unknown> extends SdTaskSourceBase<TResult> {\n readonly mode: 'poll';\n readonly load: (context: SdTaskLoadContext<TResult>) => SdTaskMaybeAsync<SdTaskState<TResult>>;\n readonly intervalMs?: number;\n readonly retry?: SdTaskRetryPolicy;\n}\n\nexport interface SdTaskSseSource<TResult = unknown> extends SdTaskSourceBase<TResult> {\n readonly mode: 'sse';\n readonly url: string | (() => string);\n readonly eventSourceInit?: EventSourceInit;\n readonly parse?: (event: MessageEvent<string>) => SdTaskMaybeAsync<SdTaskState<TResult>>;\n readonly retry?: SdTaskRetryPolicy;\n}\n\nexport type SdTaskSource<TResult = unknown> = SdTaskManualSource<TResult> | SdTaskPollingSource<TResult> | SdTaskSseSource<TResult>;\n\nexport interface SdTaskWatchOptions<TResult = unknown> {\n readonly id: string;\n readonly initialState?: SdTaskState<TResult>;\n readonly source: SdTaskSource<TResult>;\n}\n\nexport interface SdTaskView<TResult = unknown> {\n readonly id: string;\n readonly state: Signal<SdTaskState<TResult>>;\n readonly connection: Signal<SdTaskConnectionState>;\n readonly error: Signal<unknown | null>;\n readonly subscriberCount: Signal<number>;\n readonly canCancel: Signal<boolean>;\n readonly canRetry: Signal<boolean>;\n cancel(): Promise<boolean>;\n retry(): void;\n}\n\nexport interface SdTaskSubscription<TResult = unknown> extends SdTaskView<TResult> {\n readonly destroyed: Signal<boolean>;\n destroy(): void;\n}\n\nexport function isSdTaskTerminal(status: SdTaskStatus): boolean {\n return status === 'succeeded' || status === 'failed' || status === 'cancelled';\n}\n","import { DOCUMENT } from '@angular/common';\nimport { InjectionToken, inject } from '@angular/core';\n\nexport interface SdTaskEventSource {\n onopen: ((event: Event) => void) | null;\n onmessage: ((event: MessageEvent<string>) => void) | null;\n onerror: ((event: Event) => void) | null;\n close(): void;\n}\n\nexport interface SdTaskEventSourceFactory {\n create(url: string, init?: EventSourceInit): SdTaskEventSource;\n}\n\nexport const SD_TASK_EVENT_SOURCE_FACTORY = new InjectionToken<SdTaskEventSourceFactory | null>('SD_TASK_EVENT_SOURCE_FACTORY', {\n factory: () => {\n const windowRef = inject(DOCUMENT).defaultView;\n if (!windowRef?.EventSource) return null;\n return {\n create: (url: string, init?: EventSourceInit): SdTaskEventSource => new windowRef.EventSource(url, init),\n };\n },\n});\n\nexport const SD_TASK_RANDOM = new InjectionToken<() => number>('SD_TASK_RANDOM', {\n factory: () => Math.random,\n});\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport {\n SdTaskConnectionState,\n SdTaskRetryPolicy,\n SdTaskSource,\n SdTaskState,\n SdTaskSubscription,\n SdTaskView,\n SdTaskWatchOptions,\n isSdTaskTerminal,\n} from './task.model';\nimport { SD_TASK_EVENT_SOURCE_FACTORY, SD_TASK_RANDOM, SdTaskEventSource } from './task.tokens';\n\nconst DEFAULT_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_RETRY_POLICY: Required<SdTaskRetryPolicy> = {\n maxAttempts: 3,\n initialDelayMs: 1000,\n backoff: 2,\n maxDelayMs: 30_000,\n jitter: 0.2,\n};\nconst MAX_TIMER_MS = 2_147_483_647;\n\ninterface TaskEntry<TResult = unknown> {\n readonly id: string;\n readonly source: SdTaskSource<TResult>;\n readonly stateSignal: ReturnType<typeof signal<SdTaskState<TResult>>>;\n readonly connectionSignal: ReturnType<typeof signal<SdTaskConnectionState>>;\n readonly errorSignal: ReturnType<typeof signal<unknown | null>>;\n readonly subscriberCountSignal: ReturnType<typeof signal<number>>;\n readonly view: SdTaskView<TResult>;\n timer?: ReturnType<typeof setTimeout>;\n controller?: AbortController;\n eventSource?: SdTaskEventSource;\n pendingCancel?: Promise<boolean>;\n readonly pendingCancelSignal: ReturnType<typeof signal<boolean>>;\n messageQueue: Promise<void>;\n generation: number;\n failures: number;\n requestAttempt: number;\n destroyed: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdTaskService {\n readonly #eventSourceFactory = inject(SD_TASK_EVENT_SOURCE_FACTORY);\n readonly #random = inject(SD_TASK_RANDOM);\n readonly #destroyRef = inject(DestroyRef);\n readonly #entries = signal<ReadonlyMap<string, TaskEntry>>(new Map());\n\n readonly tasks = computed(() => [...this.#entries().values()].map(entry => entry.view));\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n for (const entry of this.#entries().values()) {\n entry.destroyed = true;\n this.#stop(entry);\n }\n this.#entries.set(new Map());\n });\n }\n\n watch<TResult = unknown>(options: SdTaskWatchOptions<TResult>): SdTaskSubscription<TResult> {\n const existing = this.#entries().get(options.id) as TaskEntry<TResult> | undefined;\n if (existing) {\n existing.subscriberCountSignal.update(count => count + 1);\n return this.#createLease(existing);\n }\n\n const initialState = normalizeState(options.id, options.initialState ?? { id: options.id, status: 'queued' });\n const stateSignal = signal(initialState);\n const connectionSignal = signal<SdTaskConnectionState>(options.source.mode === 'manual' ? 'idle' : 'connecting');\n const errorSignal = signal<unknown | null>(null);\n const subscriberCountSignal = signal(1);\n const pendingCancelSignal = signal(false);\n const entry = {} as TaskEntry<TResult>;\n const view: SdTaskView<TResult> = {\n id: options.id,\n state: stateSignal.asReadonly(),\n connection: connectionSignal.asReadonly(),\n error: errorSignal.asReadonly(),\n subscriberCount: subscriberCountSignal.asReadonly(),\n canCancel: computed(() => {\n const status = stateSignal().status;\n return !pendingCancelSignal() && (status === 'queued' || status === 'running');\n }),\n canRetry: computed(() => {\n const status = stateSignal().status;\n return connectionSignal() === 'error' || status === 'failed' || status === 'cancelled';\n }),\n cancel: () => this.#cancel(entry),\n retry: () => this.#retry(entry),\n };\n Object.assign(entry, {\n id: options.id,\n source: options.source,\n stateSignal,\n connectionSignal,\n errorSignal,\n subscriberCountSignal,\n pendingCancelSignal,\n view,\n messageQueue: Promise.resolve(),\n generation: 0,\n failures: 0,\n requestAttempt: 0,\n destroyed: false,\n });\n this.#entries.update(entries => new Map(entries).set(options.id, entry as unknown as TaskEntry));\n\n if (!isSdTaskTerminal(initialState.status)) this.#start(entry);\n else connectionSignal.set('closed');\n return this.#createLease(entry);\n }\n\n get<TResult = unknown>(id: string): SdTaskView<TResult> | undefined {\n return this.#entries().get(id)?.view as SdTaskView<TResult> | undefined;\n }\n\n update<TResult = unknown>(id: string, patch: Partial<Omit<SdTaskState<TResult>, 'id'>>): boolean {\n const entry = this.#entries().get(id) as TaskEntry<TResult> | undefined;\n if (!entry) return false;\n this.#applyState(entry, { ...entry.stateSignal(), ...patch, id });\n return true;\n }\n\n cancel(id: string): Promise<boolean> {\n const entry = this.#entries().get(id);\n return entry ? this.#cancel(entry) : Promise.resolve(false);\n }\n\n retry(id: string): boolean {\n const entry = this.#entries().get(id);\n if (!entry) return false;\n this.#retry(entry);\n return true;\n }\n\n #createLease<TResult>(entry: TaskEntry<TResult>): SdTaskSubscription<TResult> {\n const destroyed = signal(false);\n return {\n ...entry.view,\n destroyed: destroyed.asReadonly(),\n destroy: () => {\n if (destroyed()) return;\n destroyed.set(true);\n entry.subscriberCountSignal.update(count => Math.max(0, count - 1));\n if (entry.subscriberCountSignal() > 0) return;\n entry.destroyed = true;\n this.#stop(entry);\n this.#entries.update(entries => {\n if (entries.get(entry.id) !== entry) return entries;\n const next = new Map(entries);\n next.delete(entry.id);\n return next;\n });\n },\n };\n }\n\n #start<TResult>(entry: TaskEntry<TResult>): void {\n if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status)) return;\n this.#stop(entry);\n entry.destroyed = false;\n entry.failures = 0;\n entry.requestAttempt = 0;\n entry.errorSignal.set(null);\n const generation = entry.generation;\n\n if (entry.source.mode === 'manual') {\n entry.connectionSignal.set('idle');\n return;\n }\n entry.connectionSignal.set('connecting');\n if (entry.source.mode === 'poll') void this.#runPoll(entry, generation);\n else this.#openSse(entry, generation);\n }\n\n #stop<TResult>(entry: TaskEntry<TResult>): void {\n entry.generation += 1;\n if (entry.timer) clearTimeout(entry.timer);\n entry.timer = undefined;\n entry.controller?.abort();\n entry.controller = undefined;\n entry.eventSource?.close();\n entry.eventSource = undefined;\n }\n\n async #runPoll<TResult>(entry: TaskEntry<TResult>, generation: number): Promise<void> {\n if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'poll') return;\n const controller = new AbortController();\n entry.controller = controller;\n const attempt = ++entry.requestAttempt;\n\n try {\n const state = await Promise.resolve(\n entry.source.load({ id: entry.id, signal: controller.signal, attempt, state: entry.stateSignal() })\n );\n if (!this.#isCurrent(entry, generation) || controller.signal.aborted) return;\n entry.controller = undefined;\n entry.failures = 0;\n entry.errorSignal.set(null);\n entry.connectionSignal.set('open');\n this.#applyState(entry, state);\n if (!this.#isCurrent(entry, generation) || isSdTaskTerminal(entry.stateSignal().status)) return;\n this.#schedule(entry, normalizeTimer(entry.source.intervalMs, DEFAULT_POLL_INTERVAL_MS), () => this.#runPoll(entry, generation));\n } catch (error) {\n if (!this.#isCurrent(entry, generation) || controller.signal.aborted) return;\n entry.controller = undefined;\n this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#runPoll(entry, generation));\n }\n }\n\n #openSse<TResult>(entry: TaskEntry<TResult>, generation: number): void {\n if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'sse') return;\n if (!this.#eventSourceFactory) {\n entry.connectionSignal.set('error');\n entry.errorSignal.set(new Error('EventSource is unavailable in this environment.'));\n return;\n }\n\n let eventSource: SdTaskEventSource;\n try {\n const url = typeof entry.source.url === 'function' ? entry.source.url() : entry.source.url;\n eventSource = this.#eventSourceFactory.create(url, entry.source.eventSourceInit);\n } catch (error) {\n this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));\n return;\n }\n entry.eventSource = eventSource;\n\n eventSource.onopen = () => {\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n entry.failures = 0;\n entry.errorSignal.set(null);\n entry.connectionSignal.set('open');\n };\n eventSource.onmessage = event => {\n entry.messageQueue = entry.messageQueue.then(() => this.#handleSseMessage(entry, generation, eventSource, event));\n };\n eventSource.onerror = event => {\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n eventSource.close();\n entry.eventSource = undefined;\n this.#handleConnectionFailure(entry, generation, event, entry.source.mode === 'sse' ? entry.source.retry : undefined, () =>\n this.#openSse(entry, generation)\n );\n };\n }\n\n async #handleSseMessage<TResult>(\n entry: TaskEntry<TResult>,\n generation: number,\n eventSource: SdTaskEventSource,\n event: MessageEvent<string>\n ): Promise<void> {\n if (!this.#isCurrentEventSource(entry, generation, eventSource) || entry.source.mode !== 'sse') return;\n try {\n const state = entry.source.parse\n ? await Promise.resolve(entry.source.parse(event))\n : (JSON.parse(event.data) as SdTaskState<TResult>);\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n entry.errorSignal.set(null);\n this.#applyState(entry, state);\n } catch (error) {\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n eventSource.close();\n entry.eventSource = undefined;\n this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));\n }\n }\n\n #handleConnectionFailure<TResult>(\n entry: TaskEntry<TResult>,\n generation: number,\n error: unknown,\n policy: SdTaskRetryPolicy | undefined,\n retry: () => void | Promise<void>\n ): void {\n if (!this.#isCurrent(entry, generation)) return;\n entry.failures += 1;\n entry.errorSignal.set(error);\n const normalized = normalizeRetryPolicy(policy);\n if (entry.failures > normalized.maxAttempts) {\n entry.connectionSignal.set('error');\n return;\n }\n entry.connectionSignal.set('reconnecting');\n this.#schedule(entry, this.#retryDelay(normalized, entry.failures), retry);\n }\n\n #retryDelay(policy: Required<SdTaskRetryPolicy>, failure: number): number {\n const exponential = Math.min(policy.maxDelayMs, policy.initialDelayMs * Math.pow(policy.backoff, failure - 1));\n const jitter = exponential * policy.jitter * (this.#random() * 2 - 1);\n return Math.max(0, Math.min(policy.maxDelayMs, Math.round(exponential + jitter)));\n }\n\n #schedule<TResult>(entry: TaskEntry<TResult>, delayMs: number, callback: () => void | Promise<void>): void {\n if (entry.timer) clearTimeout(entry.timer);\n entry.timer = setTimeout(\n () => {\n entry.timer = undefined;\n void callback();\n },\n normalizeTimer(delayMs, 0)\n );\n }\n\n #applyState<TResult>(entry: TaskEntry<TResult>, state: SdTaskState<TResult>): void {\n const normalized = normalizeState(entry.id, state);\n entry.stateSignal.set(normalized);\n if (!isSdTaskTerminal(normalized.status)) return;\n this.#stop(entry);\n entry.connectionSignal.set('closed');\n }\n\n #cancel<TResult>(entry: TaskEntry<TResult>): Promise<boolean> {\n if (entry.pendingCancel) return entry.pendingCancel;\n if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status)) {\n return Promise.resolve(false);\n }\n\n const generation = entry.generation;\n entry.pendingCancelSignal.set(true);\n let actionResult: ReturnType<NonNullable<typeof entry.source.cancel>> | undefined;\n try {\n actionResult = entry.source.cancel?.({ id: entry.id, state: entry.stateSignal() });\n } catch (error) {\n entry.pendingCancelSignal.set(false);\n entry.errorSignal.set(error);\n return Promise.resolve(false);\n }\n\n const pending = Promise.resolve(actionResult)\n .then(result => {\n if (result === false) return false;\n if (!this.#isCurrent(entry, generation)) return true;\n if (result && typeof result === 'object') this.#applyState(entry, result);\n else this.#applyState(entry, { ...entry.stateSignal(), id: entry.id, status: 'cancelled' });\n return true;\n })\n .catch((error: unknown) => {\n if (this.#isCurrent(entry, generation)) entry.errorSignal.set(error);\n return false;\n })\n .finally(() => {\n if (entry.pendingCancel === pending) {\n entry.pendingCancel = undefined;\n entry.pendingCancelSignal.set(false);\n }\n });\n entry.pendingCancel = pending;\n return pending;\n }\n\n #retry<TResult>(entry: TaskEntry<TResult>): void {\n if (entry.destroyed || entry.subscriberCountSignal() === 0 || entry.stateSignal().status === 'succeeded') return;\n const status = entry.stateSignal().status;\n if (entry.connectionSignal() !== 'error' && status !== 'failed' && status !== 'cancelled') return;\n if (status === 'failed' || status === 'cancelled') {\n entry.stateSignal.set({ ...entry.stateSignal(), status: 'queued', progress: undefined, error: undefined });\n }\n this.#start(entry);\n }\n\n #isCurrent<TResult>(entry: TaskEntry<TResult>, generation: number): boolean {\n return !entry.destroyed && entry.subscriberCountSignal() > 0 && entry.generation === generation;\n }\n\n #isCurrentEventSource<TResult>(entry: TaskEntry<TResult>, generation: number, eventSource: SdTaskEventSource): boolean {\n return this.#isCurrent(entry, generation) && entry.eventSource === eventSource;\n }\n}\n\nfunction normalizeState<TResult>(id: string, state: SdTaskState<TResult>): SdTaskState<TResult> {\n const progress = state.progress;\n return {\n ...state,\n id,\n progress: progress === undefined || !Number.isFinite(progress) ? undefined : Math.max(0, Math.min(100, progress)),\n };\n}\n\nfunction normalizeRetryPolicy(policy: SdTaskRetryPolicy | undefined): Required<SdTaskRetryPolicy> {\n return {\n maxAttempts: normalizeInteger(policy?.maxAttempts, DEFAULT_RETRY_POLICY.maxAttempts, 0, 100),\n initialDelayMs: normalizeTimer(policy?.initialDelayMs, DEFAULT_RETRY_POLICY.initialDelayMs),\n backoff: normalizeNumber(policy?.backoff, DEFAULT_RETRY_POLICY.backoff, 1, 100),\n maxDelayMs: normalizeTimer(policy?.maxDelayMs, DEFAULT_RETRY_POLICY.maxDelayMs),\n jitter: normalizeNumber(policy?.jitter, DEFAULT_RETRY_POLICY.jitter, 0, 1),\n };\n}\n\nfunction normalizeTimer(value: number | undefined, fallback: number): number {\n return normalizeInteger(value, fallback, 0, MAX_TIMER_MS);\n}\n\nfunction normalizeInteger(value: number | undefined, fallback: number, min: number, max: number): number {\n return Math.round(normalizeNumber(value, fallback, min, max));\n}\n\nfunction normalizeNumber(value: number | undefined, fallback: number, min: number, max: number): number {\n const normalized = typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n return Math.max(min, Math.min(max, normalized));\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|