@hmcts/opal-frontend-common 0.0.89 → 0.0.91

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 (127) hide show
  1. package/fesm2022/{hmcts-opal-frontend-common-access-denied.component-DNNxndx-.mjs → hmcts-opal-frontend-common-access-denied.component-BCLRLZqh.mjs} +4 -4
  2. package/fesm2022/{hmcts-opal-frontend-common-account-created.component-3MER1dhS.mjs → hmcts-opal-frontend-common-account-created.component-D0g9FjWl.mjs} +4 -4
  3. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-account-summary-base.mjs +3 -3
  4. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-creditor-details-base.mjs +3 -3
  5. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.mjs +3 -3
  6. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-array-base.mjs +3 -3
  7. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-array-removal-base.mjs +3 -3
  8. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-base.mjs +3 -3
  9. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-nested-form-base.mjs +3 -3
  10. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table-pagination.mjs +3 -3
  11. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.mjs +3 -3
  12. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-table-filter.mjs +3 -3
  13. package/fesm2022/hmcts-opal-frontend-common-components-alphagov-alphagov-accessible-autocomplete.mjs +3 -3
  14. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item-custom-account-information-item-label.mjs +3 -3
  15. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item-custom-account-information-item-value.mjs +3 -3
  16. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item.mjs +3 -3
  17. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information.mjs +3 -3
  18. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-action-links.mjs +3 -3
  19. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-horizontal-scroll-pane.mjs +3 -3
  20. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-page-header.mjs +3 -3
  21. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes-custom-scrollable-panes-inner-pane.mjs +3 -3
  22. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes.mjs +3 -3
  23. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item-custom-summary-metric-bar-item-label.mjs +3 -3
  24. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item-custom-summary-metric-bar-item-value.mjs +3 -3
  25. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item.mjs +3 -3
  26. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar.mjs +3 -3
  27. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-inner-pane.mjs +3 -3
  28. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-outer-pane.mjs +3 -3
  29. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane.mjs +3 -3
  30. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-accordion.mjs +3 -3
  31. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-back-link.mjs +3 -3
  32. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-button.mjs +3 -3
  33. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-cancel-link.mjs +3 -3
  34. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-checkboxes.mjs +12 -12
  35. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-date-input.mjs +3 -3
  36. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-details.mjs +3 -3
  37. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-error-summary.mjs +3 -3
  38. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-footer.mjs +3 -3
  39. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-header.mjs +6 -6
  40. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-heading-with-caption.mjs +3 -3
  41. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-inset-text.mjs +3 -3
  42. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list-govuk-list-link.mjs +3 -3
  43. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list.mjs +3 -3
  44. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-notification-banner.mjs +3 -3
  45. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-pagination.mjs +3 -3
  46. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-panel.mjs +3 -3
  47. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-radio.mjs +12 -12
  48. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-select.mjs +3 -3
  49. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-card-list.mjs +6 -6
  50. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-list.mjs +12 -12
  51. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-table.mjs +12 -12
  52. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-list-item.mjs +3 -3
  53. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-panel.mjs +3 -3
  54. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs.mjs +3 -3
  55. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tag.mjs +3 -3
  56. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-task-list.mjs +6 -6
  57. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-area.mjs +3 -3
  58. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input-prefix-suffix.mjs +3 -3
  59. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input.mjs +3 -3
  60. package/fesm2022/hmcts-opal-frontend-common-components-hod-hod-loading-spinner.mjs +3 -3
  61. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-alert.mjs +21 -21
  62. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-badge.mjs +3 -3
  63. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu-moj-button-menu-item.mjs +3 -3
  64. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu.mjs +3 -3
  65. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-date-picker.mjs +3 -3
  66. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-header.mjs +3 -3
  67. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-option-moj-filter-panel-option-form-group-item.mjs +3 -3
  68. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-option-moj-filter-panel-option-form-group-keyword.mjs +3 -3
  69. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-option.mjs +3 -3
  70. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-selected-moj-filter-panel-selected-tag.mjs +3 -3
  71. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-selected.mjs +3 -3
  72. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel.mjs +3 -3
  73. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter.mjs +3 -3
  74. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-header.mjs +6 -6
  75. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-inset-text.mjs +3 -3
  76. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-notification-badge.mjs +3 -3
  77. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-page-header.mjs +3 -3
  78. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-pagination.mjs +3 -3
  79. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-primary-navigation.mjs +6 -6
  80. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sortable-table.mjs +18 -18
  81. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sub-navigation.mjs +6 -6
  82. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-ticket-panel.mjs +3 -3
  83. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-timeline.mjs +6 -6
  84. package/fesm2022/{hmcts-opal-frontend-common-concurrency-failure.component-UnC_Qex5.mjs → hmcts-opal-frontend-common-concurrency-failure.component-CdkYMvv-.mjs} +4 -4
  85. package/fesm2022/hmcts-opal-frontend-common-directives-capitalisation.mjs +3 -3
  86. package/fesm2022/hmcts-opal-frontend-common-directives-govuk-button.mjs +3 -3
  87. package/fesm2022/hmcts-opal-frontend-common-directives-moj-multi-select.mjs +6 -6
  88. package/fesm2022/hmcts-opal-frontend-common-interceptors-http-retry-constants.mjs +16 -0
  89. package/fesm2022/hmcts-opal-frontend-common-interceptors-http-retry-interfaces.mjs +4 -0
  90. package/fesm2022/hmcts-opal-frontend-common-interceptors-http-retry.mjs +162 -0
  91. package/fesm2022/{hmcts-opal-frontend-common-internal-server-error.component-Cj-ueGWj.mjs → hmcts-opal-frontend-common-internal-server-error.component-CinCBLVo.mjs} +4 -4
  92. package/fesm2022/{hmcts-opal-frontend-common-pages-access-denied.component-DNNxndx-.mjs → hmcts-opal-frontend-common-pages-access-denied.component-BCLRLZqh.mjs} +4 -4
  93. package/fesm2022/{hmcts-opal-frontend-common-pages-account-created.component-3MER1dhS.mjs → hmcts-opal-frontend-common-pages-account-created.component-D0g9FjWl.mjs} +4 -4
  94. package/fesm2022/{hmcts-opal-frontend-common-pages-concurrency-failure.component-UnC_Qex5.mjs → hmcts-opal-frontend-common-pages-concurrency-failure.component-CdkYMvv-.mjs} +4 -4
  95. package/fesm2022/hmcts-opal-frontend-common-pages-dashboard-page.mjs +3 -3
  96. package/fesm2022/{hmcts-opal-frontend-common-pages-internal-server-error.component-Cj-ueGWj.mjs → hmcts-opal-frontend-common-pages-internal-server-error.component-CinCBLVo.mjs} +4 -4
  97. package/fesm2022/{hmcts-opal-frontend-common-pages-permission-denied.component-ClXrjyA5.mjs → hmcts-opal-frontend-common-pages-permission-denied.component-BPb5CZQD.mjs} +4 -4
  98. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in-stub.component-Cxvc5NV2.mjs → hmcts-opal-frontend-common-pages-sign-in-stub.component-Cnlwqv_f.mjs} +4 -4
  99. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in.component-dBd0gJTr.mjs → hmcts-opal-frontend-common-pages-sign-in.component-DWLTU9wd.mjs} +4 -4
  100. package/fesm2022/hmcts-opal-frontend-common-pages.mjs +6 -6
  101. package/fesm2022/{hmcts-opal-frontend-common-permission-denied.component-ClXrjyA5.mjs → hmcts-opal-frontend-common-permission-denied.component-BPb5CZQD.mjs} +4 -4
  102. package/fesm2022/hmcts-opal-frontend-common-pipes-date-format.mjs +3 -3
  103. package/fesm2022/hmcts-opal-frontend-common-pipes-days-ago.mjs +3 -3
  104. package/fesm2022/hmcts-opal-frontend-common-pipes-monetary.mjs +3 -3
  105. package/fesm2022/hmcts-opal-frontend-common-pipes-national-insurance.mjs +3 -3
  106. package/fesm2022/hmcts-opal-frontend-common-resolvers-title.mjs +3 -3
  107. package/fesm2022/hmcts-opal-frontend-common-services-app-initializer-service.mjs +3 -3
  108. package/fesm2022/hmcts-opal-frontend-common-services-app-insights-service.mjs +3 -3
  109. package/fesm2022/hmcts-opal-frontend-common-services-auth-service.mjs +3 -3
  110. package/fesm2022/hmcts-opal-frontend-common-services-date-service.mjs +3 -3
  111. package/fesm2022/hmcts-opal-frontend-common-services-history-transformation-service.mjs +3 -3
  112. package/fesm2022/hmcts-opal-frontend-common-services-launch-darkly-service.mjs +3 -3
  113. package/fesm2022/hmcts-opal-frontend-common-services-opal-user-service.mjs +119 -10
  114. package/fesm2022/hmcts-opal-frontend-common-services-permissions-service.mjs +3 -3
  115. package/fesm2022/hmcts-opal-frontend-common-services-session-service.mjs +3 -3
  116. package/fesm2022/hmcts-opal-frontend-common-services-sort-service.mjs +3 -3
  117. package/fesm2022/hmcts-opal-frontend-common-services-transfer-state-service.mjs +3 -3
  118. package/fesm2022/hmcts-opal-frontend-common-services-transformation-service.mjs +3 -3
  119. package/fesm2022/hmcts-opal-frontend-common-services-utils-service.mjs +3 -3
  120. package/fesm2022/{hmcts-opal-frontend-common-sign-in-stub.component-Cxvc5NV2.mjs → hmcts-opal-frontend-common-sign-in-stub.component-Cnlwqv_f.mjs} +4 -4
  121. package/fesm2022/{hmcts-opal-frontend-common-sign-in.component-jf34_3Vv.mjs → hmcts-opal-frontend-common-sign-in.component-DIZlLA6t.mjs} +4 -4
  122. package/fesm2022/hmcts-opal-frontend-common.mjs +6 -6
  123. package/package.json +16 -1
  124. package/types/hmcts-opal-frontend-common-interceptors-http-retry-constants.d.ts +11 -0
  125. package/types/hmcts-opal-frontend-common-interceptors-http-retry-interfaces.d.ts +10 -0
  126. package/types/hmcts-opal-frontend-common-interceptors-http-retry.d.ts +27 -0
  127. package/types/hmcts-opal-frontend-common-services-opal-user-service.d.ts +56 -4
@@ -2,13 +2,13 @@ import * as i0 from '@angular/core';
2
2
  import { ChangeDetectionStrategy, Component } from '@angular/core';
3
3
 
4
4
  class ConcurrencyFailureComponent {
5
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ConcurrencyFailureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: ConcurrencyFailureComponent, isStandalone: true, selector: "opal-lib-concurrency-failure", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Sorry, there is a problem</h1>\n <p class=\"govuk-body\">Something else was changed while you were doing this.</p>\n <p class=\"govuk-body\">Your changes have not been saved. You will need to start again.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
5
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ConcurrencyFailureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: ConcurrencyFailureComponent, isStandalone: true, selector: "opal-lib-concurrency-failure", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Sorry, there is a problem</h1>\n <p class=\"govuk-body\">Something else was changed while you were doing this.</p>\n <p class=\"govuk-body\">Your changes have not been saved. You will need to start again.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
7
7
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ConcurrencyFailureComponent, decorators: [{
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ConcurrencyFailureComponent, decorators: [{
9
9
  type: Component,
10
10
  args: [{ selector: 'opal-lib-concurrency-failure', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Sorry, there is a problem</h1>\n <p class=\"govuk-body\">Something else was changed while you were doing this.</p>\n <p class=\"govuk-body\">Your changes have not been saved. You will need to start again.</p>\n</div>\n" }]
11
11
  }] });
12
12
 
13
13
  export { ConcurrencyFailureComponent };
14
- //# sourceMappingURL=hmcts-opal-frontend-common-pages-concurrency-failure.component-UnC_Qex5.mjs.map
14
+ //# sourceMappingURL=hmcts-opal-frontend-common-pages-concurrency-failure.component-CdkYMvv-.mjs.map
@@ -44,10 +44,10 @@ class DashboardPage {
44
44
  }))
45
45
  .filter((group) => group.links.length > 0);
46
46
  }
47
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
48
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DashboardPage, isStandalone: true, selector: "opal-lib-dashboard-page", inputs: { dashboardConfig: "dashboardConfig" }, ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">{{ dashboardConfig.title }}</h1>\n @if (visibleHighlights.length > 0) {\n <ul class=\"govuk-list\">\n @for (highlight of visibleHighlights; track highlight.id) {\n <li>\n @if (highlight.style) {\n <opal-lib-moj-inset-text [id]=\"highlight.id\" [classes]=\"highlight.style\">\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: highlight }\"></ng-container>\n </opal-lib-moj-inset-text>\n } @else {\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: highlight }\"></ng-container>\n }\n </li>\n }\n </ul>\n }\n @if (visibleGroups.length > 0) {\n @for (group of visibleGroups; track group.id) {\n <h2 class=\"govuk-heading-m\">{{ group.title }}</h2>\n <ul class=\"govuk-list\">\n @for (link of group.links; track link.id) {\n <li>\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: link }\"></ng-container>\n </li>\n }\n </ul>\n }\n }\n</div>\n\n<ng-template #dashboardPageLink let-highlight=\"highlight\">\n <a\n class=\"govuk-link govuk-link--no-visited-state\"\n [routerLink]=\"highlight.routerLink\"\n [id]=\"highlight.id\"\n [target]=\"highlight.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"highlight.newTab ? 'noopener noreferrer' : null\"\n [fragment]=\"highlight.fragment\"\n >{{ highlight.text }}</a\n >\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: MojInsetTextComponent, selector: "opal-lib-moj-inset-text", inputs: ["id", "classes"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DashboardPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
48
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: DashboardPage, isStandalone: true, selector: "opal-lib-dashboard-page", inputs: { dashboardConfig: "dashboardConfig" }, ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">{{ dashboardConfig.title }}</h1>\n @if (visibleHighlights.length > 0) {\n <ul class=\"govuk-list\">\n @for (highlight of visibleHighlights; track highlight.id) {\n <li>\n @if (highlight.style) {\n <opal-lib-moj-inset-text [id]=\"highlight.id\" [classes]=\"highlight.style\">\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: highlight }\"></ng-container>\n </opal-lib-moj-inset-text>\n } @else {\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: highlight }\"></ng-container>\n }\n </li>\n }\n </ul>\n }\n @if (visibleGroups.length > 0) {\n @for (group of visibleGroups; track group.id) {\n <h2 class=\"govuk-heading-m\">{{ group.title }}</h2>\n <ul class=\"govuk-list\">\n @for (link of group.links; track link.id) {\n <li>\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: link }\"></ng-container>\n </li>\n }\n </ul>\n }\n }\n</div>\n\n<ng-template #dashboardPageLink let-highlight=\"highlight\">\n <a\n class=\"govuk-link govuk-link--no-visited-state\"\n [routerLink]=\"highlight.routerLink\"\n [id]=\"highlight.id\"\n [target]=\"highlight.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"highlight.newTab ? 'noopener noreferrer' : null\"\n [fragment]=\"highlight.fragment\"\n >{{ highlight.text }}</a\n >\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: MojInsetTextComponent, selector: "opal-lib-moj-inset-text", inputs: ["id", "classes"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
49
49
  }
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardPage, decorators: [{
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DashboardPage, decorators: [{
51
51
  type: Component,
52
52
  args: [{ selector: 'opal-lib-dashboard-page', imports: [RouterModule, MojInsetTextComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">{{ dashboardConfig.title }}</h1>\n @if (visibleHighlights.length > 0) {\n <ul class=\"govuk-list\">\n @for (highlight of visibleHighlights; track highlight.id) {\n <li>\n @if (highlight.style) {\n <opal-lib-moj-inset-text [id]=\"highlight.id\" [classes]=\"highlight.style\">\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: highlight }\"></ng-container>\n </opal-lib-moj-inset-text>\n } @else {\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: highlight }\"></ng-container>\n }\n </li>\n }\n </ul>\n }\n @if (visibleGroups.length > 0) {\n @for (group of visibleGroups; track group.id) {\n <h2 class=\"govuk-heading-m\">{{ group.title }}</h2>\n <ul class=\"govuk-list\">\n @for (link of group.links; track link.id) {\n <li>\n <ng-container *ngTemplateOutlet=\"dashboardPageLink; context: { highlight: link }\"></ng-container>\n </li>\n }\n </ul>\n }\n }\n</div>\n\n<ng-template #dashboardPageLink let-highlight=\"highlight\">\n <a\n class=\"govuk-link govuk-link--no-visited-state\"\n [routerLink]=\"highlight.routerLink\"\n [id]=\"highlight.id\"\n [target]=\"highlight.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"highlight.newTab ? 'noopener noreferrer' : null\"\n [fragment]=\"highlight.fragment\"\n >{{ highlight.text }}</a\n >\n</ng-template>\n" }]
53
53
  }], propDecorators: { dashboardConfig: [{
@@ -14,13 +14,13 @@ class InternalServerErrorComponent {
14
14
  const operationId = [queryParamOperationId, navigationState?.operationId, persistedState?.operationId].find((id) => id?.trim());
15
15
  return operationId?.trim() ?? 'Unavailable';
16
16
  }, ...(ngDevMode ? [{ debugName: "operationIdDisplay" }] : /* istanbul ignore next */ []));
17
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: InternalServerErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: InternalServerErrorComponent, isStandalone: true, selector: "opal-lib-internal-server-error", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Sorry, there is a problem with the service</h1>\n <p class=\"govuk-body\" data-testid=\"error-code\">Error code: {{ operationIdDisplay() }}.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
17
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: InternalServerErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: InternalServerErrorComponent, isStandalone: true, selector: "opal-lib-internal-server-error", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Sorry, there is a problem with the service</h1>\n <p class=\"govuk-body\" data-testid=\"error-code\">Error code: {{ operationIdDisplay() }}.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
19
19
  }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: InternalServerErrorComponent, decorators: [{
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: InternalServerErrorComponent, decorators: [{
21
21
  type: Component,
22
22
  args: [{ selector: 'opal-lib-internal-server-error', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Sorry, there is a problem with the service</h1>\n <p class=\"govuk-body\" data-testid=\"error-code\">Error code: {{ operationIdDisplay() }}.</p>\n</div>\n" }]
23
23
  }] });
24
24
 
25
25
  export { InternalServerErrorComponent };
26
- //# sourceMappingURL=hmcts-opal-frontend-common-pages-internal-server-error.component-Cj-ueGWj.mjs.map
26
+ //# sourceMappingURL=hmcts-opal-frontend-common-pages-internal-server-error.component-CinCBLVo.mjs.map
@@ -2,13 +2,13 @@ import * as i0 from '@angular/core';
2
2
  import { ChangeDetectionStrategy, Component } from '@angular/core';
3
3
 
4
4
  class PermissionDeniedComponent {
5
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionDeniedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: PermissionDeniedComponent, isStandalone: true, selector: "opal-lib-permission-denied", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">You do not have permission for this</h1>\n <p class=\"govuk-body\">This may be because:</p>\n <ul class=\"govuk-list govuk-list--bullet\">\n <li>the account is outside your business unit and some features are restricted</li>\n <li>you are not permitted to use this feature</li>\n </ul>\n <p class=\"govuk-body\">If you think this is incorrect, contact your line manager.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
5
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionDeniedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: PermissionDeniedComponent, isStandalone: true, selector: "opal-lib-permission-denied", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">You do not have permission for this</h1>\n <p class=\"govuk-body\">This may be because:</p>\n <ul class=\"govuk-list govuk-list--bullet\">\n <li>the account is outside your business unit and some features are restricted</li>\n <li>you are not permitted to use this feature</li>\n </ul>\n <p class=\"govuk-body\">If you think this is incorrect, contact your line manager.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
7
7
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionDeniedComponent, decorators: [{
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionDeniedComponent, decorators: [{
9
9
  type: Component,
10
10
  args: [{ selector: 'opal-lib-permission-denied', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">You do not have permission for this</h1>\n <p class=\"govuk-body\">This may be because:</p>\n <ul class=\"govuk-list govuk-list--bullet\">\n <li>the account is outside your business unit and some features are restricted</li>\n <li>you are not permitted to use this feature</li>\n </ul>\n <p class=\"govuk-body\">If you think this is incorrect, contact your line manager.</p>\n</div>\n" }]
11
11
  }] });
12
12
 
13
13
  export { PermissionDeniedComponent };
14
- //# sourceMappingURL=hmcts-opal-frontend-common-pages-permission-denied.component-ClXrjyA5.mjs.map
14
+ //# sourceMappingURL=hmcts-opal-frontend-common-pages-permission-denied.component-BPb5CZQD.mjs.map
@@ -28,10 +28,10 @@ class SignInStubComponent {
28
28
  ngOnInit() {
29
29
  this.setupSignInForm();
30
30
  }
31
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SignInStubComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: SignInStubComponent, isStandalone: true, selector: "opal-lib-sign-in-stub", outputs: { signInFormSubmit: "signInFormSubmit" }, ngImport: i0, template: "<form (submit)=\"handleFormSubmit()\">\n <div class=\"govuk-grid-column-two-thirds\">\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--m\">\n <h1 class=\"govuk-fieldset__heading\">Sign in</h1>\n </legend>\n\n <div [formGroup]=\"signInForm\">\n <opal-lib-govuk-text-input\n labelText=\"Email\"\n inputId=\"email\"\n inputName=\"email\"\n inputClasses=\"govuk-!-width-one-half\"\n [control]=\"signInForm.controls['email']\"\n ></opal-lib-govuk-text-input>\n </div>\n </fieldset>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-one-third\">\n <opal-lib-govuk-button buttonId=\"submitForm\" type=\"submit\"> Sign in</opal-lib-govuk-button>\n </div>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: GovukTextInputComponent, selector: "opal-lib-govuk-text-input", inputs: ["labelText", "labelClasses", "inputId", "inputName", "inputClasses", "hintText", "hintHtml", "errors", "control"] }, { kind: "component", type: GovukButtonComponent, selector: "opal-lib-govuk-button", inputs: ["buttonId", "type", "buttonClasses"], outputs: ["buttonClickEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SignInStubComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: SignInStubComponent, isStandalone: true, selector: "opal-lib-sign-in-stub", outputs: { signInFormSubmit: "signInFormSubmit" }, ngImport: i0, template: "<form (submit)=\"handleFormSubmit()\">\n <div class=\"govuk-grid-column-two-thirds\">\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--m\">\n <h1 class=\"govuk-fieldset__heading\">Sign in</h1>\n </legend>\n\n <div [formGroup]=\"signInForm\">\n <opal-lib-govuk-text-input\n labelText=\"Email\"\n inputId=\"email\"\n inputName=\"email\"\n inputClasses=\"govuk-!-width-one-half\"\n [control]=\"signInForm.controls['email']\"\n ></opal-lib-govuk-text-input>\n </div>\n </fieldset>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-one-third\">\n <opal-lib-govuk-button buttonId=\"submitForm\" type=\"submit\"> Sign in</opal-lib-govuk-button>\n </div>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: GovukTextInputComponent, selector: "opal-lib-govuk-text-input", inputs: ["labelText", "labelClasses", "inputId", "inputName", "inputClasses", "hintText", "hintHtml", "errors", "control"] }, { kind: "component", type: GovukButtonComponent, selector: "opal-lib-govuk-button", inputs: ["buttonId", "type", "buttonClasses"], outputs: ["buttonClickEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
33
33
  }
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SignInStubComponent, decorators: [{
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SignInStubComponent, decorators: [{
35
35
  type: Component,
36
36
  args: [{ selector: 'opal-lib-sign-in-stub', imports: [FormsModule, ReactiveFormsModule, GovukTextInputComponent, GovukButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form (submit)=\"handleFormSubmit()\">\n <div class=\"govuk-grid-column-two-thirds\">\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--m\">\n <h1 class=\"govuk-fieldset__heading\">Sign in</h1>\n </legend>\n\n <div [formGroup]=\"signInForm\">\n <opal-lib-govuk-text-input\n labelText=\"Email\"\n inputId=\"email\"\n inputName=\"email\"\n inputClasses=\"govuk-!-width-one-half\"\n [control]=\"signInForm.controls['email']\"\n ></opal-lib-govuk-text-input>\n </div>\n </fieldset>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-one-third\">\n <opal-lib-govuk-button buttonId=\"submitForm\" type=\"submit\"> Sign in</opal-lib-govuk-button>\n </div>\n </div>\n </div>\n</form>\n" }]
37
37
  }], propDecorators: { signInFormSubmit: [{
@@ -39,4 +39,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
39
39
  }] } });
40
40
 
41
41
  export { SignInStubComponent };
42
- //# sourceMappingURL=hmcts-opal-frontend-common-pages-sign-in-stub.component-Cxvc5NV2.mjs.map
42
+ //# sourceMappingURL=hmcts-opal-frontend-common-pages-sign-in-stub.component-Cnlwqv_f.mjs.map
@@ -16,13 +16,13 @@ class SignInComponent {
16
16
  handleStubSignInFormSubmit(formData) {
17
17
  this.document.location.href = `${SSO_ENDPOINTS.login}?email=${formData.email}`;
18
18
  }
19
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SignInComponent, isStandalone: true, selector: "opal-lib-sign-in", ngImport: i0, template: "@defer (when !globalStore.ssoEnabled()) {\n <opal-lib-sign-in-stub (signInFormSubmit)=\"handleStubSignInFormSubmit($event)\"></opal-lib-sign-in-stub>\n}\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [import('./hmcts-opal-frontend-common-pages-sign-in-stub.component-Cxvc5NV2.mjs').then(m => m.SignInStubComponent)]] });
19
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: SignInComponent, isStandalone: true, selector: "opal-lib-sign-in", ngImport: i0, template: "@defer (when !globalStore.ssoEnabled()) {\n <opal-lib-sign-in-stub (signInFormSubmit)=\"handleStubSignInFormSubmit($event)\"></opal-lib-sign-in-stub>\n}\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [import('./hmcts-opal-frontend-common-pages-sign-in-stub.component-Cnlwqv_f.mjs').then(m => m.SignInStubComponent)]] });
21
21
  }
22
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.2.17", ngImport: i0, type: SignInComponent, resolveDeferredDeps: () => [import('./hmcts-opal-frontend-common-pages-sign-in-stub.component-Cxvc5NV2.mjs').then(m => m.SignInStubComponent)], resolveMetadata: SignInStubComponent => ({ decorators: [{
22
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.2.18", ngImport: i0, type: SignInComponent, resolveDeferredDeps: () => [import('./hmcts-opal-frontend-common-pages-sign-in-stub.component-Cnlwqv_f.mjs').then(m => m.SignInStubComponent)], resolveMetadata: SignInStubComponent => ({ decorators: [{
23
23
  type: Component,
24
24
  args: [{ selector: 'opal-lib-sign-in', imports: [SignInStubComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@defer (when !globalStore.ssoEnabled()) {\n <opal-lib-sign-in-stub (signInFormSubmit)=\"handleStubSignInFormSubmit($event)\"></opal-lib-sign-in-stub>\n}\n" }]
25
25
  }], ctorParameters: null, propDecorators: null }) });
26
26
 
27
27
  export { SignInComponent };
28
- //# sourceMappingURL=hmcts-opal-frontend-common-pages-sign-in.component-dBd0gJTr.mjs.map
28
+ //# sourceMappingURL=hmcts-opal-frontend-common-pages-sign-in.component-DWLTU9wd.mjs.map
@@ -8,39 +8,39 @@ const routing = [
8
8
  { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
9
9
  {
10
10
  path: PAGES_ROUTING_PATHS.children.accessDenied,
11
- loadComponent: () => import('./hmcts-opal-frontend-common-pages-access-denied.component-DNNxndx-.mjs').then((c) => c.AccessDeniedComponent),
11
+ loadComponent: () => import('./hmcts-opal-frontend-common-pages-access-denied.component-BCLRLZqh.mjs').then((c) => c.AccessDeniedComponent),
12
12
  canActivate: [authGuard, accountGuard],
13
13
  data: { title: PAGES_ROUTING_TITLES.children.accessDenied },
14
14
  resolve: { title: TitleResolver },
15
15
  },
16
16
  {
17
17
  path: PAGES_ROUTING_PATHS.children.concurrencyFailure,
18
- loadComponent: () => import('./hmcts-opal-frontend-common-pages-concurrency-failure.component-UnC_Qex5.mjs').then((c) => c.ConcurrencyFailureComponent),
18
+ loadComponent: () => import('./hmcts-opal-frontend-common-pages-concurrency-failure.component-CdkYMvv-.mjs').then((c) => c.ConcurrencyFailureComponent),
19
19
  data: { title: PAGES_ROUTING_TITLES.children.concurrencyFailure },
20
20
  resolve: { title: TitleResolver },
21
21
  },
22
22
  {
23
23
  path: PAGES_ROUTING_PATHS.children.permissionDenied,
24
- loadComponent: () => import('./hmcts-opal-frontend-common-pages-permission-denied.component-ClXrjyA5.mjs').then((c) => c.PermissionDeniedComponent),
24
+ loadComponent: () => import('./hmcts-opal-frontend-common-pages-permission-denied.component-BPb5CZQD.mjs').then((c) => c.PermissionDeniedComponent),
25
25
  data: { title: PAGES_ROUTING_TITLES.children.permissionDenied },
26
26
  resolve: { title: TitleResolver },
27
27
  },
28
28
  {
29
29
  path: PAGES_ROUTING_PATHS.children.internalServerError,
30
- loadComponent: () => import('./hmcts-opal-frontend-common-pages-internal-server-error.component-Cj-ueGWj.mjs').then((c) => c.InternalServerErrorComponent),
30
+ loadComponent: () => import('./hmcts-opal-frontend-common-pages-internal-server-error.component-CinCBLVo.mjs').then((c) => c.InternalServerErrorComponent),
31
31
  data: { title: PAGES_ROUTING_TITLES.children.internalServerError },
32
32
  resolve: { title: TitleResolver },
33
33
  },
34
34
  {
35
35
  path: PAGES_ROUTING_PATHS.children.signIn,
36
- loadComponent: () => import('./hmcts-opal-frontend-common-pages-sign-in.component-dBd0gJTr.mjs').then((c) => c.SignInComponent),
36
+ loadComponent: () => import('./hmcts-opal-frontend-common-pages-sign-in.component-DWLTU9wd.mjs').then((c) => c.SignInComponent),
37
37
  canActivate: [signedInGuard],
38
38
  data: { title: PAGES_ROUTING_TITLES.children.signIn },
39
39
  resolve: { title: TitleResolver },
40
40
  },
41
41
  {
42
42
  path: PAGES_ROUTING_PATHS.children.accountCreated,
43
- loadComponent: () => import('./hmcts-opal-frontend-common-pages-account-created.component-3MER1dhS.mjs').then((c) => c.AccountCreated),
43
+ loadComponent: () => import('./hmcts-opal-frontend-common-pages-account-created.component-D0g9FjWl.mjs').then((c) => c.AccountCreated),
44
44
  canActivate: [authGuard],
45
45
  data: { title: PAGES_ROUTING_TITLES.children.accountCreated },
46
46
  resolve: { title: TitleResolver },
@@ -2,13 +2,13 @@ import * as i0 from '@angular/core';
2
2
  import { ChangeDetectionStrategy, Component } from '@angular/core';
3
3
 
4
4
  class PermissionDeniedComponent {
5
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionDeniedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: PermissionDeniedComponent, isStandalone: true, selector: "opal-lib-permission-denied", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">You do not have permission for this</h1>\n <p class=\"govuk-body\">This may be because:</p>\n <ul class=\"govuk-list govuk-list--bullet\">\n <li>the account is outside your business unit and some features are restricted</li>\n <li>you are not permitted to use this feature</li>\n </ul>\n <p class=\"govuk-body\">If you think this is incorrect, contact your line manager.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
5
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionDeniedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: PermissionDeniedComponent, isStandalone: true, selector: "opal-lib-permission-denied", ngImport: i0, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">You do not have permission for this</h1>\n <p class=\"govuk-body\">This may be because:</p>\n <ul class=\"govuk-list govuk-list--bullet\">\n <li>the account is outside your business unit and some features are restricted</li>\n <li>you are not permitted to use this feature</li>\n </ul>\n <p class=\"govuk-body\">If you think this is incorrect, contact your line manager.</p>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
7
7
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionDeniedComponent, decorators: [{
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionDeniedComponent, decorators: [{
9
9
  type: Component,
10
10
  args: [{ selector: 'opal-lib-permission-denied', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">You do not have permission for this</h1>\n <p class=\"govuk-body\">This may be because:</p>\n <ul class=\"govuk-list govuk-list--bullet\">\n <li>the account is outside your business unit and some features are restricted</li>\n <li>you are not permitted to use this feature</li>\n </ul>\n <p class=\"govuk-body\">If you think this is incorrect, contact your line manager.</p>\n</div>\n" }]
11
11
  }] });
12
12
 
13
13
  export { PermissionDeniedComponent };
14
- //# sourceMappingURL=hmcts-opal-frontend-common-permission-denied.component-ClXrjyA5.mjs.map
14
+ //# sourceMappingURL=hmcts-opal-frontend-common-permission-denied.component-BPb5CZQD.mjs.map
@@ -10,10 +10,10 @@ class DateFormatPipe {
10
10
  const formatted = this.dateService.getFromFormatToFormat(value, inputFormat, outputFormat);
11
11
  return formatted;
12
12
  }
13
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DateFormatPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
14
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: DateFormatPipe, isStandalone: true, name: "dateFormat" });
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DateFormatPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
14
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.18", ngImport: i0, type: DateFormatPipe, isStandalone: true, name: "dateFormat" });
15
15
  }
16
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DateFormatPipe, decorators: [{
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DateFormatPipe, decorators: [{
17
17
  type: Pipe,
18
18
  args: [{
19
19
  name: 'dateFormat',
@@ -22,10 +22,10 @@ class DaysAgoPipe {
22
22
  return 'Invalid date';
23
23
  }
24
24
  }
25
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DaysAgoPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
26
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: DaysAgoPipe, isStandalone: true, name: "daysAgo" });
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DaysAgoPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
26
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.18", ngImport: i0, type: DaysAgoPipe, isStandalone: true, name: "daysAgo" });
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DaysAgoPipe, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DaysAgoPipe, decorators: [{
29
29
  type: Pipe,
30
30
  args: [{
31
31
  name: 'daysAgo',
@@ -15,10 +15,10 @@ class MonetaryPipe {
15
15
  const monetaryValue = this.utilsService.convertToMonetaryString(value);
16
16
  return format === 'remove-minus-symbol' ? monetaryValue.replace(/^-/, '') : monetaryValue;
17
17
  }
18
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: MonetaryPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
19
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: MonetaryPipe, isStandalone: true, name: "monetary" });
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: MonetaryPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
19
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.18", ngImport: i0, type: MonetaryPipe, isStandalone: true, name: "monetary" });
20
20
  }
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: MonetaryPipe, decorators: [{
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: MonetaryPipe, decorators: [{
22
22
  type: Pipe,
23
23
  args: [{
24
24
  name: 'monetary',
@@ -11,10 +11,10 @@ class NationalInsurancePipe {
11
11
  return value;
12
12
  return `${cleaned.slice(0, 2)} ${cleaned.slice(2, 4)} ${cleaned.slice(4, 6)} ${cleaned.slice(6, 8)} ${cleaned.slice(8)}`;
13
13
  }
14
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NationalInsurancePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
15
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: NationalInsurancePipe, isStandalone: true, name: "nationalInsurance" });
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: NationalInsurancePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
15
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.18", ngImport: i0, type: NationalInsurancePipe, isStandalone: true, name: "nationalInsurance" });
16
16
  }
17
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NationalInsurancePipe, decorators: [{
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: NationalInsurancePipe, decorators: [{
18
18
  type: Pipe,
19
19
  args: [{
20
20
  name: 'nationalInsurance',
@@ -8,10 +8,10 @@ class TitleResolver {
8
8
  const title = route.data['title'] ?? 'Frontend';
9
9
  this.titleService.setTitle(`OPAL - ${title}`);
10
10
  }
11
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TitleResolver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TitleResolver, providedIn: 'root' });
11
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TitleResolver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TitleResolver, providedIn: 'root' });
13
13
  }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TitleResolver, decorators: [{
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TitleResolver, decorators: [{
15
15
  type: Injectable,
16
16
  args: [{
17
17
  providedIn: 'root',
@@ -56,10 +56,10 @@ class AppInitializerService {
56
56
  this.initializeFeatureFlagConfig();
57
57
  await this.appInsightsService.initialize();
58
58
  }
59
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppInitializerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
60
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppInitializerService, providedIn: 'root' });
59
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AppInitializerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
60
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AppInitializerService, providedIn: 'root' });
61
61
  }
62
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppInitializerService, decorators: [{
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AppInitializerService, decorators: [{
63
63
  type: Injectable,
64
64
  args: [{
65
65
  providedIn: 'root',
@@ -48,10 +48,10 @@ class AppInsightsService {
48
48
  async initialize() {
49
49
  await this.initializeAppInsights();
50
50
  }
51
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppInsightsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
52
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppInsightsService, providedIn: 'root' });
51
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AppInsightsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
52
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AppInsightsService, providedIn: 'root' });
53
53
  }
54
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppInsightsService, decorators: [{
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AppInsightsService, decorators: [{
55
55
  type: Injectable,
56
56
  args: [{
57
57
  providedIn: 'root',
@@ -25,10 +25,10 @@ class AuthService {
25
25
  return throwError(() => error);
26
26
  }));
27
27
  }
28
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
29
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AuthService, providedIn: 'root' });
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
29
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AuthService, providedIn: 'root' });
30
30
  }
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AuthService, decorators: [{
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: AuthService, decorators: [{
32
32
  type: Injectable,
33
33
  args: [{
34
34
  providedIn: 'root',
@@ -216,10 +216,10 @@ class DateService {
216
216
  to: this.toFormat(this.getFromIso(dateTo), format),
217
217
  };
218
218
  }
219
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
220
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DateService, providedIn: 'root' });
219
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
220
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DateService, providedIn: 'root' });
221
221
  }
222
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DateService, decorators: [{
222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DateService, decorators: [{
223
223
  type: Injectable,
224
224
  args: [{
225
225
  providedIn: 'root',
@@ -311,10 +311,10 @@ class HistoryTransformationService {
311
311
  transformItems(items, config) {
312
312
  return transformHistoryItems(items, config);
313
313
  }
314
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: HistoryTransformationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
315
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: HistoryTransformationService, providedIn: 'root' });
314
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: HistoryTransformationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
315
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: HistoryTransformationService, providedIn: 'root' });
316
316
  }
317
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: HistoryTransformationService, decorators: [{
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: HistoryTransformationService, decorators: [{
318
318
  type: Injectable,
319
319
  args: [{
320
320
  providedIn: 'root',
@@ -98,10 +98,10 @@ class LaunchDarklyService {
98
98
  ngOnDestroy() {
99
99
  this.closeLaunchDarklyClient();
100
100
  }
101
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: LaunchDarklyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
102
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: LaunchDarklyService, providedIn: 'root' });
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: LaunchDarklyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
102
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: LaunchDarklyService, providedIn: 'root' });
103
103
  }
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: LaunchDarklyService, decorators: [{
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: LaunchDarklyService, decorators: [{
105
105
  type: Injectable,
106
106
  args: [{
107
107
  providedIn: 'root',
@@ -2,7 +2,7 @@ import { HttpClient } from '@angular/common/http';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Injectable } from '@angular/core';
4
4
  import { GlobalStore } from '@hmcts/opal-frontend-common/stores/global';
5
- import { map, tap } from 'rxjs';
5
+ import { of, map, filter, tap, catchError, throwError, finalize, shareReplay } from 'rxjs';
6
6
 
7
7
  const OPAL_USER_PATHS = {
8
8
  loggedInUserState: '/api/user-state',
@@ -22,12 +22,28 @@ const OPAL_USER_STATE_RESPONSE_STATUS = {
22
22
  DEACTIVATED: 'deactivated',
23
23
  };
24
24
 
25
+ const USER_STATE_CACHE_TTL_HEADER = 'X-OPAL-User-State-Cache-TTL-Ms';
25
26
  class OpalUserService {
26
27
  http = inject(HttpClient);
27
28
  globalStore = inject(GlobalStore);
29
+ inFlightUserState$;
30
+ userStateRequestGeneration = 0;
31
+ userStateCacheExpiresAtMilliseconds = 0;
32
+ /**
33
+ * Converts the user-state API status into the service domain status.
34
+ *
35
+ * @param status - The status value returned by the user-state API.
36
+ * @returns The mapped domain status, or null when the API status is null.
37
+ */
28
38
  toOpalUserStatus(status) {
29
39
  return status ? OPAL_USER_STATE_RESPONSE_STATUS[status] : null;
30
40
  }
41
+ /**
42
+ * Gets the configured user-state domain from the global store.
43
+ *
44
+ * @returns The trimmed user-state domain.
45
+ * @throws When no non-blank user-state domain has been configured.
46
+ */
31
47
  getUserStateDomain() {
32
48
  const userStateDomain = this.globalStore.userStateDomain();
33
49
  if (typeof userStateDomain === 'string' && userStateDomain.trim()) {
@@ -37,6 +53,10 @@ class OpalUserService {
37
53
  }
38
54
  /**
39
55
  * Maps the Redis-backed user state response into the existing domain-specific user state shape.
56
+ *
57
+ * @param userState - The raw user-state API response.
58
+ * @returns The mapped user state for the configured domain.
59
+ * @throws When the response does not include the configured domain.
40
60
  */
41
61
  toOpalUserState(userState) {
42
62
  const userStateDomain = this.getUserStateDomain();
@@ -53,37 +73,126 @@ class OpalUserService {
53
73
  business_unit_users: userStateDomainState.business_unit_users,
54
74
  };
55
75
  }
76
+ /**
77
+ * Extracts the body from the observed user-state HTTP response.
78
+ *
79
+ * @param response - The full HTTP response from the user-state endpoint.
80
+ * @returns The response body.
81
+ * @throws When the response body is empty.
82
+ */
83
+ getUserStateResponseBody(response) {
84
+ if (!response.body) {
85
+ throw new Error('User state response body is required.');
86
+ }
87
+ return response.body;
88
+ }
89
+ /**
90
+ * Checks whether a user state can be used as a cached logged-in user.
91
+ *
92
+ * @param userState - The user state currently held in the global store.
93
+ * @returns True when the user state contains a positive numeric user ID.
94
+ */
95
+ isValidCachedUserState(userState) {
96
+ return typeof userState.user_id === 'number' && userState.user_id > 0;
97
+ }
98
+ /**
99
+ * Gets the current cached user state when it is populated and unexpired.
100
+ *
101
+ * @returns The cached user state, or null when the cache is empty or expired.
102
+ */
103
+ getCachedUserState() {
104
+ const userState = this.globalStore.userState();
105
+ if (this.isValidCachedUserState(userState) && Date.now() < this.userStateCacheExpiresAtMilliseconds) {
106
+ return userState;
107
+ }
108
+ return null;
109
+ }
110
+ /**
111
+ * Calculates the local cache TTL from the response header and configured maximum TTL.
112
+ *
113
+ * @param response - The full HTTP response from the user-state endpoint.
114
+ * @returns The TTL in milliseconds. A zero response header expires the local cache immediately.
115
+ */
116
+ getUserStateCacheTtlMilliseconds(response) {
117
+ const configuredTtlMilliseconds = this.globalStore.userStateCacheExpirationMilliseconds();
118
+ const responseTtlHeader = response.headers.get(USER_STATE_CACHE_TTL_HEADER);
119
+ if (responseTtlHeader === null) {
120
+ return configuredTtlMilliseconds;
121
+ }
122
+ const responseTtlMilliseconds = Number(responseTtlHeader);
123
+ if (Number.isFinite(responseTtlMilliseconds) && responseTtlMilliseconds >= 0) {
124
+ return Math.min(responseTtlMilliseconds, configuredTtlMilliseconds);
125
+ }
126
+ return configuredTtlMilliseconds;
127
+ }
128
+ /**
129
+ * Invalidates local cache controls and marks existing in-flight requests as stale.
130
+ */
131
+ clearLocalUserStateCache() {
132
+ this.userStateRequestGeneration += 1;
133
+ this.userStateCacheExpiresAtMilliseconds = 0;
134
+ this.inFlightUserState$ = undefined;
135
+ }
56
136
  /**
57
137
  * Retrieves the logged-in user's state as an observable.
58
138
  *
59
- * The frontend user-state endpoint is backed by Redis, so this service does not maintain its own cache.
139
+ * Uses the global store as a local cache until the effective user-state TTL expires, shares concurrent HTTP
140
+ * requests, and ignores stale responses after the local cache has been invalidated.
60
141
  *
61
142
  * @returns {Observable<IOpalUserState>} An observable that emits the logged-in user's state.
62
143
  */
63
144
  getLoggedInUserState() {
64
- return this.http.get(OPAL_USER_PATHS.loggedInUserState).pipe(map((userState) => this.toOpalUserState(userState)), tap((userState) => this.globalStore.setUserState(userState)));
145
+ const cachedUserState = this.getCachedUserState();
146
+ if (cachedUserState) {
147
+ return of(cachedUserState);
148
+ }
149
+ if (this.inFlightUserState$) {
150
+ return this.inFlightUserState$;
151
+ }
152
+ const requestGeneration = this.userStateRequestGeneration;
153
+ this.inFlightUserState$ = this.http
154
+ .get(OPAL_USER_PATHS.loggedInUserState, { observe: 'response' })
155
+ .pipe(map((response) => ({
156
+ userState: this.toOpalUserState(this.getUserStateResponseBody(response)),
157
+ userStateCacheTtlMilliseconds: this.getUserStateCacheTtlMilliseconds(response),
158
+ requestGeneration,
159
+ })), filter(({ requestGeneration }) => requestGeneration === this.userStateRequestGeneration), tap(({ userState, userStateCacheTtlMilliseconds }) => {
160
+ this.globalStore.setUserState(userState);
161
+ this.userStateCacheExpiresAtMilliseconds = Date.now() + userStateCacheTtlMilliseconds;
162
+ }), map(({ userState }) => userState), catchError((error) => {
163
+ if (requestGeneration === this.userStateRequestGeneration) {
164
+ this.userStateCacheExpiresAtMilliseconds = 0;
165
+ }
166
+ return throwError(() => error);
167
+ }), finalize(() => {
168
+ if (requestGeneration === this.userStateRequestGeneration) {
169
+ this.inFlightUserState$ = undefined;
170
+ }
171
+ }), shareReplay(1));
172
+ return this.inFlightUserState$;
65
173
  }
66
174
  /**
67
- * Resets the global store user to an empty object.
175
+ * Clears the global store user state and invalidates local user-state cache controls.
68
176
  *
69
- * Useful for logout/identity switches to avoid reusing stale state.
177
+ * Useful for logout and identity switches to avoid reusing stale state or accepting stale in-flight responses.
70
178
  */
71
179
  clearUserStateCache() {
72
180
  this.globalStore.setUserState({});
181
+ this.clearLocalUserStateCache();
73
182
  }
74
183
  /**
75
- * Fetches the latest user state from the Redis-backed frontend endpoint.
184
+ * Fetches the latest user state from the Redis-backed frontend endpoint, bypassing the current local cache.
76
185
  *
77
186
  * @returns An Observable that emits the current {@link IOpalUserState}.
78
187
  */
79
188
  refreshUserState() {
80
- this.clearUserStateCache();
189
+ this.clearLocalUserStateCache();
81
190
  return this.getLoggedInUserState();
82
191
  }
83
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: OpalUserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
84
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: OpalUserService, providedIn: 'root' });
192
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: OpalUserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
193
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: OpalUserService, providedIn: 'root' });
85
194
  }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: OpalUserService, decorators: [{
195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: OpalUserService, decorators: [{
87
196
  type: Injectable,
88
197
  args: [{ providedIn: 'root' }]
89
198
  }] });
@@ -51,10 +51,10 @@ class PermissionsService {
51
51
  // if we don't have any roles, we can't have any permissions
52
52
  return true;
53
53
  }
54
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
55
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionsService, providedIn: 'root' });
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
55
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionsService, providedIn: 'root' });
56
56
  }
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PermissionsService, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: PermissionsService, decorators: [{
58
58
  type: Injectable,
59
59
  args: [{
60
60
  providedIn: 'root',